Blame c++/contourgl/contourgl.cpp

f2b8c4
/*
f2b8c4
    ......... 2015 Ivan Mahonin
f2b8c4
f2b8c4
    This program is free software: you can redistribute it and/or modify
f2b8c4
    it under the terms of the GNU General Public License as published by
f2b8c4
    the Free Software Foundation, either version 3 of the License, or
f2b8c4
    (at your option) any later version.
f2b8c4
f2b8c4
    This program is distributed in the hope that it will be useful,
f2b8c4
    but WITHOUT ANY WARRANTY; without even the implied warranty of
f2b8c4
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
f2b8c4
    GNU General Public License for more details.
f2b8c4
f2b8c4
    You should have received a copy of the GNU General Public License
f2b8c4
    along with this program.  If not, see <http: licenses="" www.gnu.org="">.</http:>
f2b8c4
*/
f2b8c4
a80036
#include <ctime></ctime>
93cbac
#include <cassert></cassert>
f2b8c4
f2b8c4
#include <iostream></iostream>
a80036
#include <iomanip></iomanip>
f2b8c4
f2b8c4
#include <gl gl.h=""></gl>
f2b8c4
#include <gl glext.h=""></gl>
f2b8c4
#include <gl glx.h=""></gl>
f2b8c4
c76ce8
#include "clcontext.h"
93cbac
#include "test.h"
7c6b57
#include "shaders.h"
93cbac
f2b8c4
f2b8c4
#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
f2b8c4
#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
f2b8c4
typedef GLXContext (*GLXCREATECONTEXTATTRIBSARBPROC)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
f2b8c4
f2b8c4
f2b8c4
using namespace std;
f2b8c4
f2b8c4
a80036
clock_t get_clock() {
a80036
	return clock();
a80036
}
a80036
f2b8c4
int main() {
f2b8c4
	// open display (we will use default display and screen 0)
f2b8c4
	Display *display = XOpenDisplay(NULL);
f2b8c4
	assert(display);
f2b8c4
f2b8c4
	// choose config
f2b8c4
	int config_attribs[] = {
f2b8c4
		GLX_DOUBLEBUFFER,      False,
f2b8c4
		GLX_RED_SIZE,          8,
f2b8c4
		GLX_GREEN_SIZE,        8,
f2b8c4
		GLX_BLUE_SIZE,         8,
f2b8c4
		GLX_ALPHA_SIZE,        8,
f2b8c4
		GLX_DEPTH_SIZE,        24,
f2b8c4
		GLX_STENCIL_SIZE,      8,
f2b8c4
		GLX_ACCUM_RED_SIZE,    8,
f2b8c4
		GLX_ACCUM_GREEN_SIZE,  8,
f2b8c4
		GLX_ACCUM_BLUE_SIZE,   8,
f2b8c4
		GLX_ACCUM_ALPHA_SIZE,  8,
f2b8c4
		GLX_DRAWABLE_TYPE,     GLX_PBUFFER_BIT,
f2b8c4
		None };
f2b8c4
	int nelements = 0;
f2b8c4
	GLXFBConfig *configs = glXChooseFBConfig(display, 0, config_attribs, &nelements);
f2b8c4
	assert(configs != NULL && nelements > 0);
f2b8c4
	GLXFBConfig config = configs[0];
f2b8c4
	assert(config);
f2b8c4
f2b8c4
	// create pbuffer
1e9fdb
	int pbuffer_width = 256;
1e9fdb
	int pbuffer_height = 256;
f2b8c4
	int pbuffer_attribs[] = {
f2b8c4
		GLX_PBUFFER_WIDTH, pbuffer_width,
f2b8c4
		GLX_PBUFFER_HEIGHT, pbuffer_height,
f2b8c4
		None };
f2b8c4
	GLXPbuffer pbuffer = glXCreatePbuffer(display, config, pbuffer_attribs);
f2b8c4
	assert(pbuffer);
f2b8c4
f2b8c4
	// create context
f2b8c4
	int context_attribs[] = {
7c6b57
		GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
7c6b57
		GLX_CONTEXT_MINOR_VERSION_ARB, 3,
f2b8c4
		None };
f2b8c4
	GLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = (GLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB");
f2b8c4
	GLXContext context = glXCreateContextAttribsARB(display, config, NULL, True, context_attribs);
f2b8c4
	assert(context);
f2b8c4
f2b8c4
	// make context current
f2b8c4
	glXMakeContextCurrent(display, pbuffer, pbuffer, context);
f2b8c4
1e9fdb
	// frame buffer
7704aa
	int framebuffer_width = 512;
7704aa
	int framebuffer_height = 512;
9edf2e
	int framebuffer_samples = 16;
c76ce8
	bool antialising = false;
c76ce8
	bool hdr = false;
c76ce8
c76ce8
	GLenum internal_format = hdr ? GL_RGBA16F : GL_RGBA;
c76ce8
	GLenum color_type = hdr ? GL_FLOAT : GL_UNSIGNED_BYTE;
7704aa
7704aa
	GLuint multisample_texture_id = 0;
7704aa
	glGenTextures(1, &multisample_texture_id);
7704aa
	glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, multisample_texture_id);
c76ce8
	glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, framebuffer_samples, internal_format, framebuffer_width, framebuffer_height, GL_TRUE);
7704aa
7704aa
	GLuint multisample_renderbuffer_id = 0;
7704aa
	glGenRenderbuffers(1, &multisample_renderbuffer_id);
7704aa
	glBindRenderbuffer(GL_RENDERBUFFER, multisample_renderbuffer_id);
9edf2e
	glRenderbufferStorageMultisample(GL_RENDERBUFFER, framebuffer_samples, GL_STENCIL_INDEX8, framebuffer_width, framebuffer_height);
7704aa
7704aa
	GLuint multisample_framebuffer_id = 0;
7704aa
	glGenFramebuffers(1, &multisample_framebuffer_id);
7704aa
	glBindFramebuffer(GL_DRAW_FRAMEBUFFER, multisample_framebuffer_id);
9edf2e
	glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, multisample_renderbuffer_id);
7704aa
	glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, multisample_texture_id, 0);
1e9fdb
1e9fdb
	GLuint texture_id = 0;
1e9fdb
	glGenTextures(1, &texture_id);
1e9fdb
	glBindTexture(GL_TEXTURE_2D, texture_id);
c76ce8
	glTexImage2D(GL_TEXTURE_2D, 0, internal_format, framebuffer_width, framebuffer_height, 0, GL_RGBA, color_type, NULL);
1e9fdb
9edf2e
	GLuint renderbuffer_id = 0;
9edf2e
	glGenRenderbuffers(1, &renderbuffer_id);
9edf2e
	glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_id);
9edf2e
	glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, framebuffer_width, framebuffer_height);
9edf2e
1e9fdb
	GLuint framebuffer_id = 0;
1e9fdb
	glGenFramebuffers(1, &framebuffer_id);
1e9fdb
	glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer_id);
9edf2e
	glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuffer_id);
7704aa
	glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0);
7704aa
7704aa
	cout << "Framebuffer status:" << setbase(16)
7704aa
		 << " 0x" << glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER)
7704aa
		 << " 0x" << glCheckFramebufferStatus(GL_READ_FRAMEBUFFER)
7704aa
		 << setbase(10) << endl;
1e9fdb
f2b8c4
	// set view port
1e9fdb
	glViewport(0, 0, framebuffer_width, framebuffer_height);
f2b8c4
9edf2e
	if (antialising)
9edf2e
		glEnable(GL_MULTISAMPLE);
9edf2e
	else
9edf2e
		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer_id);
7704aa
7c6b57
	Shaders::initialize();
7c6b57
f2b8c4
	// do something
7c6b57
	//Test::test1();
9edf2e
	//Test::test2();
9edf2e
	//Test::test3();
c76ce8
	//Test::test4();
c76ce8
c76ce8
	ClContext().hello();
f2b8c4
7c6b57
	Shaders::deinitialize();
7c6b57
f2b8c4
	// deinitialization
1e9fdb
	glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
1e9fdb
	glDeleteFramebuffers(1, &framebuffer_id);
1e9fdb
1e9fdb
	glBindTexture(GL_TEXTURE_2D, 0);
1e9fdb
	glDeleteTextures(1, &texture_id);
1e9fdb
7704aa
	glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
7704aa
	glDeleteFramebuffers(1, &multisample_framebuffer_id);
7704aa
7704aa
	glBindRenderbuffer(GL_RENDERBUFFER, 0);
7704aa
	glDeleteRenderbuffers(1, &multisample_renderbuffer_id);
7704aa
7704aa
	glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
7704aa
	glDeleteTextures(1, &multisample_texture_id);
7704aa
f2b8c4
	glXMakeContextCurrent(display, None, None, NULL);
f2b8c4
	glXDestroyContext(display, context);
f2b8c4
	glXDestroyPbuffer(display, pbuffer);
f2b8c4
	XCloseDisplay(display);
f2b8c4
f2b8c4
	cout << "done" << endl;
f2b8c4
	return 0;
f2b8c4
}