From 0ad9230ddf91966be166437426fc366a452fceba Mon Sep 17 00:00:00 2001 From: christiankerl Date: Mon, 27 Jul 2015 17:52:26 +0200 Subject: [PATCH 1/8] changed minimal opengl version to 3.1 --- examples/protonect/src/flextGL.c | 12 +++--- examples/protonect/src/flextGL.h | 23 +++++------ .../src/opengl_depth_packet_processor.cpp | 38 ++++++++++++++++--- examples/protonect/src/shader/debug.fs | 10 ++--- examples/protonect/src/shader/default.vs | 14 +++---- examples/protonect/src/shader/filter1.fs | 16 ++++---- examples/protonect/src/shader/filter2.fs | 12 +++--- examples/protonect/src/shader/stage1.fs | 20 +++++----- examples/protonect/src/shader/stage2.fs | 14 +++---- 9 files changed, 88 insertions(+), 71 deletions(-) diff --git a/examples/protonect/src/flextGL.c b/examples/protonect/src/flextGL.c index a462628b3..e42652e9c 100644 --- a/examples/protonect/src/flextGL.c +++ b/examples/protonect/src/flextGL.c @@ -24,8 +24,8 @@ int flextInit(GLFWwindow* window, OpenGLBindings *bindings) /* --- Check for minimal version and profile --- */ - if (major * 10 + minor < 33) { - fprintf(stderr, "Error: OpenGL version 3.3 not supported.\n"); + if (major * 10 + minor < 31) { + fprintf(stderr, "Error: OpenGL version 3.1 not supported.\n"); fprintf(stderr, " Your version is %d.%d.\n", major, minor); fprintf(stderr, " Try updating your graphics driver.\n"); return GL_FALSE; @@ -306,7 +306,7 @@ void flextLoadOpenGLFunctions(OpenGLBindings *bindings) bindings->glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDING_PROC*)glfwGetProcAddress("glUniformBlockBinding"); /* GL_VERSION_3_2 */ - +/* bindings->glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEX_PROC*)glfwGetProcAddress("glDrawElementsBaseVertex"); bindings->glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEX_PROC*)glfwGetProcAddress("glDrawRangeElementsBaseVertex"); bindings->glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEX_PROC*)glfwGetProcAddress("glDrawElementsInstancedBaseVertex"); @@ -326,9 +326,9 @@ void flextLoadOpenGLFunctions(OpenGLBindings *bindings) bindings->glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLE_PROC*)glfwGetProcAddress("glTexImage3DMultisample"); bindings->glGetMultisamplefv = (PFNGLGETMULTISAMPLEFV_PROC*)glfwGetProcAddress("glGetMultisamplefv"); bindings->glSampleMaski = (PFNGLSAMPLEMASKI_PROC*)glfwGetProcAddress("glSampleMaski"); - +*/ /* GL_VERSION_3_3 */ - +/* bindings->glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXED_PROC*)glfwGetProcAddress("glBindFragDataLocationIndexed"); bindings->glGetFragDataIndex = (PFNGLGETFRAGDATAINDEX_PROC*)glfwGetProcAddress("glGetFragDataIndex"); bindings->glGenSamplers = (PFNGLGENSAMPLERS_PROC*)glfwGetProcAddress("glGenSamplers"); @@ -357,7 +357,7 @@ void flextLoadOpenGLFunctions(OpenGLBindings *bindings) bindings->glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIV_PROC*)glfwGetProcAddress("glVertexAttribP3uiv"); bindings->glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UI_PROC*)glfwGetProcAddress("glVertexAttribP4ui"); bindings->glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIV_PROC*)glfwGetProcAddress("glVertexAttribP4uiv"); - +*/ } /* ----------------------- Extension flag definitions ---------------------- */ diff --git a/examples/protonect/src/flextGL.h b/examples/protonect/src/flextGL.h index 3da3d1c9c..2cb5cb310 100644 --- a/examples/protonect/src/flextGL.h +++ b/examples/protonect/src/flextGL.h @@ -841,7 +841,7 @@ typedef struct __GLsync *GLsync; #define GL_INVALID_INDEX 0xFFFFFFFFu /* GL_VERSION_3_2 */ - +/* #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 #define GL_LINES_ADJACENCY 0x000A @@ -906,9 +906,9 @@ typedef struct __GLsync *GLsync; #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F #define GL_MAX_INTEGER_SAMPLES 0x9110 - +*/ /* GL_VERSION_3_3 */ - +/* #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE #define GL_SRC1_COLOR 0x88F9 #define GL_ONE_MINUS_SRC1_COLOR 0x88FA @@ -925,7 +925,7 @@ typedef struct __GLsync *GLsync; #define GL_TIME_ELAPSED 0x88BF #define GL_TIMESTAMP 0x8E28 #define GL_INT_2_10_10_10_REV 0x8D9F - +*/ /* --------------------------- FUNCTION PROTOTYPES --------------------------- */ @@ -1258,7 +1258,7 @@ typedef void (APIENTRY PFNGLGETACTIVEUNIFORMBLOCKNAME_PROC (GLuint program, GLui typedef void (APIENTRY PFNGLUNIFORMBLOCKBINDING_PROC (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)); /* GL_VERSION_3_2 */ - +/* typedef void (APIENTRY PFNGLDRAWELEMENTSBASEVERTEX_PROC (GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex)); typedef void (APIENTRY PFNGLDRAWRANGEELEMENTSBASEVERTEX_PROC (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex)); typedef void (APIENTRY PFNGLDRAWELEMENTSINSTANCEDBASEVERTEX_PROC (GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex)); @@ -1278,9 +1278,9 @@ typedef void (APIENTRY PFNGLTEXIMAGE2DMULTISAMPLE_PROC (GLenum target, GLsizei s typedef void (APIENTRY PFNGLTEXIMAGE3DMULTISAMPLE_PROC (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)); typedef void (APIENTRY PFNGLGETMULTISAMPLEFV_PROC (GLenum pname, GLuint index, GLfloat * val)); typedef void (APIENTRY PFNGLSAMPLEMASKI_PROC (GLuint maskNumber, GLbitfield mask)); - +*/ /* GL_VERSION_3_3 */ - +/* typedef void (APIENTRY PFNGLBINDFRAGDATALOCATIONINDEXED_PROC (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name)); typedef GLint (APIENTRY PFNGLGETFRAGDATAINDEX_PROC (GLuint program, const GLchar * name)); typedef void (APIENTRY PFNGLGENSAMPLERS_PROC (GLsizei count, GLuint * samplers)); @@ -1309,7 +1309,7 @@ typedef void (APIENTRY PFNGLVERTEXATTRIBP3UI_PROC (GLuint index, GLenum type, GL typedef void (APIENTRY PFNGLVERTEXATTRIBP3UIV_PROC (GLuint index, GLenum type, GLboolean normalized, const GLuint * value)); typedef void (APIENTRY PFNGLVERTEXATTRIBP4UI_PROC (GLuint index, GLenum type, GLboolean normalized, GLuint value)); typedef void (APIENTRY PFNGLVERTEXATTRIBP4UIV_PROC (GLuint index, GLenum type, GLboolean normalized, const GLuint * value)); - +*/ struct OpenGLBindings { @@ -1574,7 +1574,7 @@ struct OpenGLBindings PFNGLUNIFORMBLOCKBINDING_PROC* glUniformBlockBinding; /* GL_VERSION_3_2 */ - +/* PFNGLDRAWELEMENTSBASEVERTEX_PROC* glDrawElementsBaseVertex; PFNGLDRAWRANGEELEMENTSBASEVERTEX_PROC* glDrawRangeElementsBaseVertex; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEX_PROC* glDrawElementsInstancedBaseVertex; @@ -1594,9 +1594,9 @@ struct OpenGLBindings PFNGLTEXIMAGE3DMULTISAMPLE_PROC* glTexImage3DMultisample; PFNGLGETMULTISAMPLEFV_PROC* glGetMultisamplefv; PFNGLSAMPLEMASKI_PROC* glSampleMaski; - +*/ /* GL_VERSION_3_3 */ - +/* PFNGLBINDFRAGDATALOCATIONINDEXED_PROC* glBindFragDataLocationIndexed; PFNGLGETFRAGDATAINDEX_PROC* glGetFragDataIndex; PFNGLGENSAMPLERS_PROC* glGenSamplers; @@ -1625,6 +1625,7 @@ struct OpenGLBindings PFNGLVERTEXATTRIBP3UIV_PROC* glVertexAttribP3uiv; PFNGLVERTEXATTRIBP4UI_PROC* glVertexAttribP4ui; PFNGLVERTEXATTRIBP4UIV_PROC* glVertexAttribP4uiv; +*/ }; typedef struct OpenGLBindings OpenGLBindings; diff --git a/examples/protonect/src/opengl_depth_packet_processor.cpp b/examples/protonect/src/opengl_depth_packet_processor.cpp index e42b0f73b..2b34117d9 100644 --- a/examples/protonect/src/opengl_depth_packet_processor.cpp +++ b/examples/protonect/src/opengl_depth_packet_processor.cpp @@ -32,7 +32,8 @@ #include #include - +#include +#include #include @@ -117,6 +118,8 @@ bool loadBufferFromFile(const std::string& filename, unsigned char *buffer, size struct ShaderProgram : public WithOpenGLBindings { + typedef std::map FragDataMap; + FragDataMap frag_data_map_; GLuint program, vertex_shader, fragment_shader; char error_buffer[2048]; @@ -144,6 +147,11 @@ struct ShaderProgram : public WithOpenGLBindings gl()->glShaderSource(fragment_shader, 1, &src_, &length_); } + void bindFragDataLocation(const std::string &name, int output) + { + frag_data_map_[name] = output; + } + void build() { GLint status; @@ -172,6 +180,11 @@ struct ShaderProgram : public WithOpenGLBindings gl()->glAttachShader(program, vertex_shader); gl()->glAttachShader(program, fragment_shader); + for(FragDataMap::iterator it = frag_data_map_.begin(); it != frag_data_map_.end(); ++it) + { + gl()->glBindFragDataLocation(program, it->second, it->first.c_str()); + } + gl()->glLinkProgram(program); gl()->glGetProgramiv(program, GL_LINK_STATUS, &status); @@ -469,24 +482,39 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe stage1.setVertexShader(loadShaderSource(shader_folder + "default.vs")); stage1.setFragmentShader(loadShaderSource(shader_folder + "stage1.fs")); + stage1.bindFragDataLocation("Debug", 0); + stage1.bindFragDataLocation("A", 1); + stage1.bindFragDataLocation("B", 2); + stage1.bindFragDataLocation("Norm", 3); + stage1.bindFragDataLocation("Infrared", 4); stage1.build(); filter1.setVertexShader(loadShaderSource(shader_folder + "default.vs")); filter1.setFragmentShader(loadShaderSource(shader_folder + "filter1.fs")); + filter1.bindFragDataLocation("Debug", 0); + filter1.bindFragDataLocation("FilterA", 1); + filter1.bindFragDataLocation("FilterB", 2); + filter1.bindFragDataLocation("MaxEdgeTest", 3); filter1.build(); stage2.setVertexShader(loadShaderSource(shader_folder + "default.vs")); stage2.setFragmentShader(loadShaderSource(shader_folder + "stage2.fs")); + stage2.bindFragDataLocation("Debug", 0); + stage2.bindFragDataLocation("Depth", 1); + stage2.bindFragDataLocation("DepthAndIrSum", 2); stage2.build(); filter2.setVertexShader(loadShaderSource(shader_folder + "default.vs")); filter2.setFragmentShader(loadShaderSource(shader_folder + "filter2.fs")); + filter2.bindFragDataLocation("Debug", 0); + filter2.bindFragDataLocation("FilterDepth", 1); filter2.build(); if(do_debug) { debug.setVertexShader(loadShaderSource(shader_folder + "default.vs")); debug.setFragmentShader(loadShaderSource(shader_folder + "debug.fs")); + debug.bindFragDataLocation("Debug", 0); debug.build(); } @@ -545,11 +573,11 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe gl()->glBindBuffer(GL_ARRAY_BUFFER, square_vbo); gl()->glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - GLint position_attr = stage1.getAttributeLocation("Position"); + GLint position_attr = stage1.getAttributeLocation("InputPosition"); gl()->glVertexAttribPointer(position_attr, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)0); gl()->glEnableVertexAttribArray(position_attr); - GLint texcoord_attr = stage1.getAttributeLocation("TexCoord"); + GLint texcoord_attr = stage1.getAttributeLocation("InputTexCoord"); gl()->glVertexAttribPointer(texcoord_attr, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)(2 * sizeof(float))); gl()->glEnableVertexAttribArray(texcoord_attr); } @@ -751,11 +779,11 @@ OpenGLDepthPacketProcessor::OpenGLDepthPacketProcessor(void *parent_opengl_conte // setup context glfwDefaultWindowHints(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); #ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #endif - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_ANY_PROFILE); glfwWindowHint(GLFW_VISIBLE, debug ? GL_TRUE : GL_FALSE); GLFWwindow* window = glfwCreateWindow(1024, 848, "OpenGLDepthPacketProcessor", 0, parent_window); diff --git a/examples/protonect/src/shader/debug.fs b/examples/protonect/src/shader/debug.fs index 34dac1298..f7fce5b49 100644 --- a/examples/protonect/src/shader/debug.fs +++ b/examples/protonect/src/shader/debug.fs @@ -1,16 +1,14 @@ -#version 330 +#version 140 uniform sampler2DRect Data; -in VertexData { - vec2 TexCoord; -} FragmentIn; +in vec2 TexCoord; -layout(location = 0) out vec4 Color; +out vec4 Color; void main(void) { - ivec2 uv = ivec2(FragmentIn.TexCoord.x, FragmentIn.TexCoord.y); + ivec2 uv = ivec2(TexCoord.x, TexCoord.y); Color = texelFetch(Data, uv); } \ No newline at end of file diff --git a/examples/protonect/src/shader/default.vs b/examples/protonect/src/shader/default.vs index 8cb838b5a..62e0b8408 100644 --- a/examples/protonect/src/shader/default.vs +++ b/examples/protonect/src/shader/default.vs @@ -1,14 +1,12 @@ -#version 330 +#version 140 -in vec2 Position; -in vec2 TexCoord; +in vec2 InputPosition; +in vec2 InputTexCoord; -out VertexData { - vec2 TexCoord; -} VertexOut; +out vec2 TexCoord; void main(void) { - gl_Position = vec4(Position, 0.0, 1.0); - VertexOut.TexCoord = TexCoord; + gl_Position = vec4(InputPosition, 0.0, 1.0); + TexCoord = InputTexCoord; } \ No newline at end of file diff --git a/examples/protonect/src/shader/filter1.fs b/examples/protonect/src/shader/filter1.fs index 2fb526f6b..d83308b90 100644 --- a/examples/protonect/src/shader/filter1.fs +++ b/examples/protonect/src/shader/filter1.fs @@ -1,4 +1,4 @@ -#version 330 +#version 140 struct Parameters { @@ -40,14 +40,12 @@ uniform sampler2DRect Norm; uniform Parameters Params; -in VertexData { - vec2 TexCoord; -} FragmentIn; +in vec2 TexCoord; -layout(location = 0) out vec4 Debug; -layout(location = 1) out vec3 FilterA; -layout(location = 2) out vec3 FilterB; -layout(location = 3) out uint MaxEdgeTest; +/*layout(location = 0)*/ out vec4 Debug; +/*layout(location = 1)*/ out vec3 FilterA; +/*layout(location = 2)*/ out vec3 FilterB; +/*layout(location = 3)*/ out uint MaxEdgeTest; void applyBilateralFilter(ivec2 uv) { @@ -115,7 +113,7 @@ void applyBilateralFilter(ivec2 uv) void main(void) { - ivec2 uv = ivec2(FragmentIn.TexCoord.x, FragmentIn.TexCoord.y); + ivec2 uv = ivec2(TexCoord.x, TexCoord.y); applyBilateralFilter(uv); diff --git a/examples/protonect/src/shader/filter2.fs b/examples/protonect/src/shader/filter2.fs index 03355e4a7..f7c83c8f3 100644 --- a/examples/protonect/src/shader/filter2.fs +++ b/examples/protonect/src/shader/filter2.fs @@ -1,4 +1,4 @@ -#version 330 +#version 140 struct Parameters { @@ -39,12 +39,10 @@ uniform usampler2DRect MaxEdgeTest; uniform Parameters Params; -in VertexData { - vec2 TexCoord; -} FragmentIn; +in vec2 TexCoord; -layout(location = 0) out vec4 Debug; -layout(location = 1) out float FilterDepth; +/*layout(location = 0)*/ out vec4 Debug; +/*layout(location = 1)*/ out float FilterDepth; void applyEdgeAwareFilter(ivec2 uv) { @@ -126,7 +124,7 @@ void applyEdgeAwareFilter(ivec2 uv) void main(void) { - ivec2 uv = ivec2(FragmentIn.TexCoord.x, FragmentIn.TexCoord.y); + ivec2 uv = ivec2(TexCoord.x, TexCoord.y); applyEdgeAwareFilter(uv); diff --git a/examples/protonect/src/shader/stage1.fs b/examples/protonect/src/shader/stage1.fs index d2fcd0e78..42d6d5c58 100644 --- a/examples/protonect/src/shader/stage1.fs +++ b/examples/protonect/src/shader/stage1.fs @@ -1,4 +1,4 @@ -#version 330 +#version 140 struct Parameters { @@ -43,16 +43,14 @@ uniform sampler2DRect ZTable; uniform Parameters Params; -in VertexData { - vec2 TexCoord; -} FragmentIn; +in vec2 TexCoord; -layout(location = 0) out vec4 Debug; - -layout(location = 1) out vec3 A; -layout(location = 2) out vec3 B; -layout(location = 3) out vec3 Norm; -layout(location = 4) out float Infrared; +/*layout(location = 0)*/ out vec4 Debug; +/* */ +/*layout(location = 1)*/ out vec3 A; +/*layout(location = 2)*/ out vec3 B; +/*layout(location = 3)*/ out vec3 Norm; +/*layout(location = 4)*/ out float Infrared; #define M_PI 3.1415926535897932384626433832795 @@ -97,7 +95,7 @@ vec2 processMeasurementTriple(in ivec2 uv, in usampler2DRect p0table, in int off void main(void) { - ivec2 uv = ivec2(FragmentIn.TexCoord.x, FragmentIn.TexCoord.y); + ivec2 uv = ivec2(TexCoord.x, TexCoord.y); bool valid_pixel = 0.0 < texelFetch(ZTable, uv).x; bvec3 saturated = bvec3(valid_pixel); diff --git a/examples/protonect/src/shader/stage2.fs b/examples/protonect/src/shader/stage2.fs index a06c28f13..12ee8d289 100644 --- a/examples/protonect/src/shader/stage2.fs +++ b/examples/protonect/src/shader/stage2.fs @@ -1,4 +1,4 @@ -#version 330 +#version 140 struct Parameters { @@ -41,19 +41,17 @@ uniform sampler2DRect ZTable; uniform Parameters Params; -in VertexData { - vec2 TexCoord; -} FragmentIn; +in vec2 TexCoord; -layout(location = 0) out vec4 Debug; -layout(location = 1) out float Depth; -layout(location = 2) out vec2 DepthAndIrSum; +/*layout(location = 0)*/ out vec4 Debug; +/*layout(location = 1)*/ out float Depth; +/*layout(location = 2)*/ out vec2 DepthAndIrSum; #define M_PI 3.1415926535897932384626433832795 void main(void) { - ivec2 uv = ivec2(FragmentIn.TexCoord.x, FragmentIn.TexCoord.y); + ivec2 uv = ivec2(TexCoord.x, TexCoord.y); vec3 a = texelFetch(A, uv).xyz; vec3 b = texelFetch(B, uv).xyz; From e99312e8cf16c93cdb2dd833a2661e7ec235b98b Mon Sep 17 00:00:00 2001 From: Lingzhu Xiang Date: Wed, 19 Aug 2015 21:46:33 +0000 Subject: [PATCH 2/8] opengl: Limit texture size to 4k on Intel Intel/Mesa has GL_MAX_RECTANGLE_TEXTURE_SIZE=4096, but this was asking for 424*10. Drop the 10th frame which seems useless now, so the texture size works for Intel/Mesa. --- .../protonect/src/opengl_depth_packet_processor.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/protonect/src/opengl_depth_packet_processor.cpp b/examples/protonect/src/opengl_depth_packet_processor.cpp index 2b34117d9..d715abf51 100644 --- a/examples/protonect/src/opengl_depth_packet_processor.cpp +++ b/examples/protonect/src/opengl_depth_packet_processor.cpp @@ -279,6 +279,14 @@ struct Texture : public WithOpenGLBindings void allocate(size_t new_width, size_t new_height) { + GLint max_size; + glGetIntegerv(GL_MAX_RECTANGLE_TEXTURE_SIZE, &max_size); + if (new_width > max_size || new_height > max_size) + { + LOG_ERROR << "GL_MAX_RECTANGLE_TEXTURE_SIZE is too small: " << max_size; + exit(-1); + } + width = new_width; height = new_height; size = height * width * bytes_per_pixel; @@ -459,7 +467,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe } gl(b); - input_data.allocate(352, 424 * 10); + input_data.allocate(352, 424 * 9); for(int i = 0; i < 3; ++i) stage1_data[i].allocate(512, 424); @@ -942,7 +950,7 @@ void OpenGLDepthPacketProcessor::process(const DepthPacket &packet) glfwMakeContextCurrent(impl_->opengl_context_ptr); - std::copy(packet.buffer, packet.buffer + packet.buffer_length, impl_->input_data.data); + std::copy(packet.buffer, packet.buffer + packet.buffer_length/10*9, impl_->input_data.data); impl_->input_data.upload(); impl_->run(has_listener ? &ir : 0, has_listener ? &depth : 0); From 2b8d356ac796b4b31f14e29d099dbbb86b61a48c Mon Sep 17 00:00:00 2001 From: Lingzhu Xiang Date: Wed, 19 Aug 2015 22:04:23 +0000 Subject: [PATCH 3/8] opengl: Fix unsupported F32C3 format on Intel/Mesa F32C3 format is not supported on Intel/Mesa making FBOs incomplete. Just change F32C3 to F32C4, and vec3 output automatically expands to vec4. Also add completeness checks to each FBO. --- .../src/opengl_depth_packet_processor.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/examples/protonect/src/opengl_depth_packet_processor.cpp b/examples/protonect/src/opengl_depth_packet_processor.cpp index d715abf51..45e7f0d49 100644 --- a/examples/protonect/src/opengl_depth_packet_processor.cpp +++ b/examples/protonect/src/opengl_depth_packet_processor.cpp @@ -365,10 +365,10 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe Texture input_data; Texture stage1_debug; - Texture stage1_data[3]; + Texture stage1_data[3]; Texture stage1_infrared; - Texture filter1_data[2]; + Texture filter1_data[2]; Texture filter1_max_edge_test; Texture filter1_debug; @@ -455,6 +455,16 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe debug.gl(b); } + void checkFBO(GLenum target) + { + GLenum status = gl()->glCheckFramebufferStatus(target); + if (status != GL_FRAMEBUFFER_COMPLETE) + { + LOG_ERROR << "incomplete FBO " << status; + exit(-1); + } + } + void initialize() { ChangeCurrentOpenGLContext ctx(opengl_context_ptr); @@ -539,6 +549,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_RECTANGLE, stage1_data[1].texture, 0); gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_RECTANGLE, stage1_data[2].texture, 0); gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT4, GL_TEXTURE_RECTANGLE, stage1_infrared.texture, 0); + checkFBO(GL_DRAW_FRAMEBUFFER); gl()->glGenFramebuffers(1, &filter1_framebuffer); gl()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, filter1_framebuffer); @@ -550,6 +561,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_RECTANGLE, filter1_data[0].texture, 0); gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_RECTANGLE, filter1_data[1].texture, 0); gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_RECTANGLE, filter1_max_edge_test.texture, 0); + checkFBO(GL_DRAW_FRAMEBUFFER); gl()->glGenFramebuffers(1, &stage2_framebuffer); gl()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, stage2_framebuffer); @@ -560,6 +572,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe if(do_debug) gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE, stage2_debug.texture, 0); gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_RECTANGLE, stage2_depth.texture, 0); gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_RECTANGLE, stage2_depth_and_ir_sum.texture, 0); + checkFBO(GL_DRAW_FRAMEBUFFER); gl()->glGenFramebuffers(1, &filter2_framebuffer); gl()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, filter2_framebuffer); @@ -569,6 +582,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe if(do_debug) gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE, filter2_debug.texture, 0); gl()->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_RECTANGLE, filter2_depth.texture, 0); + checkFBO(GL_DRAW_FRAMEBUFFER); Vertex bl = {-1.0f, -1.0f, 0.0f, 0.0f }, br = { 1.0f, -1.0f, 512.0f, 0.0f }, tl = {-1.0f, 1.0f, 0.0f, 424.0f }, tr = { 1.0f, 1.0f, 512.0f, 424.0f }; Vertex vertices[] = { From e2f90c14ba0bbaa6e004a773c3156a437a1e6974 Mon Sep 17 00:00:00 2001 From: Lingzhu Xiang Date: Thu, 20 Aug 2015 15:39:02 -0400 Subject: [PATCH 4/8] opengl: Work around buggy booleans in Mesa Mesa 10.2.9 and older versions are oblivious to a behavior change in the CMP instruction on Intel CPU SandyBridge and newer. On SandyBridge and newer ones, CMP instruction sets all bits to one in dst register (-1) as boolean true value. Before that, only the LSB is set to one with other bits being undefined. Mesa 10.2.9 and older use XOR instruction on the LSB for the logical not operator, which produces -2 as boolean value for !true. The value is then used by SEL instruction in mix(), which compares the value with zero and does not clear high bits before that, selecting wrong components. A macro MESA_BUGGY_BOOL_CMP is added to forcibly convert -1 to 1 for Mesa 10.2.9 and older before logical not result is used for mix(). The rest of comparison operators and conditionals are safe from this behavior. I could not independently reproduce this behavior in a seperate standalone problem. It is possibly because instruction generation varies from optimization. This behavior was fixed in Mesa upstream 2e51dc838be177a09f60958da7d1d904f1038d9c, only appearing in 10.3+. --- .../src/opengl_depth_packet_processor.cpp | 39 ++++++++++++++++--- examples/protonect/src/shader/debug.fs | 4 +- examples/protonect/src/shader/default.vs | 4 +- examples/protonect/src/shader/filter1.fs | 4 +- examples/protonect/src/shader/filter2.fs | 2 - examples/protonect/src/shader/stage1.fs | 5 ++- examples/protonect/src/shader/stage2.fs | 4 +- 7 files changed, 40 insertions(+), 22 deletions(-) diff --git a/examples/protonect/src/opengl_depth_packet_processor.cpp b/examples/protonect/src/opengl_depth_packet_processor.cpp index 45e7f0d49..96735f798 100644 --- a/examples/protonect/src/opengl_depth_packet_processor.cpp +++ b/examples/protonect/src/opengl_depth_packet_processor.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include @@ -124,27 +125,53 @@ struct ShaderProgram : public WithOpenGLBindings char error_buffer[2048]; + std::string defines; + bool is_mesa_checked; + ShaderProgram() : program(0), + is_mesa_checked(false), vertex_shader(0), fragment_shader(0) { } + void checkMesaBug() + { + if (is_mesa_checked) + return; + is_mesa_checked = true; + std::string ren((const char*)glGetString(GL_RENDERER)); + std::string ver((const char*)glGetString(GL_VERSION)); + if (ren.find("Mesa DRI Intel") == 0) + { + size_t mesa_pos = ver.rfind("Mesa "); + if (mesa_pos != std::string::npos) + { + double mesa_ver = atof(ver.substr(mesa_pos + 5).c_str()); + if (mesa_ver < 10.3) + { + defines += "#define MESA_BUGGY_BOOL_CMP\n"; + LOG_WARNING << "Working around buggy boolean instructions in your Mesa driver. Mesa DRI 10.3+ is recommended."; + } + } + } + } + void setVertexShader(const std::string& src) { - const char* src_ = src.c_str(); - int length_ = src.length(); + checkMesaBug(); + const GLchar *sources[] = {"#version 140\n", defines.c_str(), src.c_str()}; vertex_shader = gl()->glCreateShader(GL_VERTEX_SHADER); - gl()->glShaderSource(vertex_shader, 1, &src_, &length_); + gl()->glShaderSource(vertex_shader, 3, sources, NULL); } void setFragmentShader(const std::string& src) { - const char* src_ = src.c_str(); - int length_ = src.length(); + checkMesaBug(); + const GLchar *sources[] = {"#version 140\n", defines.c_str(), src.c_str()}; fragment_shader = gl()->glCreateShader(GL_FRAGMENT_SHADER); - gl()->glShaderSource(fragment_shader, 1, &src_, &length_); + gl()->glShaderSource(fragment_shader, 3, sources, NULL); } void bindFragDataLocation(const std::string &name, int output) diff --git a/examples/protonect/src/shader/debug.fs b/examples/protonect/src/shader/debug.fs index f7fce5b49..226e9d216 100644 --- a/examples/protonect/src/shader/debug.fs +++ b/examples/protonect/src/shader/debug.fs @@ -1,5 +1,3 @@ -#version 140 - uniform sampler2DRect Data; in vec2 TexCoord; @@ -11,4 +9,4 @@ void main(void) ivec2 uv = ivec2(TexCoord.x, TexCoord.y); Color = texelFetch(Data, uv); -} \ No newline at end of file +} diff --git a/examples/protonect/src/shader/default.vs b/examples/protonect/src/shader/default.vs index 62e0b8408..f8c02096c 100644 --- a/examples/protonect/src/shader/default.vs +++ b/examples/protonect/src/shader/default.vs @@ -1,5 +1,3 @@ -#version 140 - in vec2 InputPosition; in vec2 InputTexCoord; @@ -9,4 +7,4 @@ void main(void) { gl_Position = vec4(InputPosition, 0.0, 1.0); TexCoord = InputTexCoord; -} \ No newline at end of file +} diff --git a/examples/protonect/src/shader/filter1.fs b/examples/protonect/src/shader/filter1.fs index d83308b90..50e1d5dae 100644 --- a/examples/protonect/src/shader/filter1.fs +++ b/examples/protonect/src/shader/filter1.fs @@ -1,5 +1,3 @@ -#version 140 - struct Parameters { float ab_multiplier; @@ -121,4 +119,4 @@ void main(void) float i = min(dot(norm, vec3(0.333333333 * Params.ab_multiplier * Params.ab_output_multiplier)), 65535.0); Debug = vec4(vec3(i, i, i) / 65535.0, 1); -} \ No newline at end of file +} diff --git a/examples/protonect/src/shader/filter2.fs b/examples/protonect/src/shader/filter2.fs index f7c83c8f3..d1618a0ea 100644 --- a/examples/protonect/src/shader/filter2.fs +++ b/examples/protonect/src/shader/filter2.fs @@ -1,5 +1,3 @@ -#version 140 - struct Parameters { float ab_multiplier; diff --git a/examples/protonect/src/shader/stage1.fs b/examples/protonect/src/shader/stage1.fs index 42d6d5c58..cb6473401 100644 --- a/examples/protonect/src/shader/stage1.fs +++ b/examples/protonect/src/shader/stage1.fs @@ -1,5 +1,3 @@ -#version 140 - struct Parameters { float ab_multiplier; @@ -104,6 +102,9 @@ void main(void) vec2 ab1 = processMeasurementTriple(uv, P0Table1, 3, Params.ab_multiplier_per_frq.y, saturated.y); vec2 ab2 = processMeasurementTriple(uv, P0Table2, 6, Params.ab_multiplier_per_frq.z, saturated.z); +#ifdef MESA_BUGGY_BOOL_CMP + valid_pixel = valid_pixel ? true : false; +#endif bvec3 invalid_pixel = bvec3(!valid_pixel); A = mix(vec3(ab0.x, ab1.x, ab2.x), vec3(0.0), invalid_pixel); diff --git a/examples/protonect/src/shader/stage2.fs b/examples/protonect/src/shader/stage2.fs index 12ee8d289..c31472cca 100644 --- a/examples/protonect/src/shader/stage2.fs +++ b/examples/protonect/src/shader/stage2.fs @@ -1,5 +1,3 @@ -#version 140 - struct Parameters { float ab_multiplier; @@ -154,4 +152,4 @@ void main(void) DepthAndIrSum = vec2(Depth, ir_sum); Debug = vec4(vec3(Depth / Params.max_depth), 1.0); -} \ No newline at end of file +} From c4aabadd07e2a12e5fa7150a6618aa4f72bdd4d5 Mon Sep 17 00:00:00 2001 From: Lingzhu Xiang Date: Sat, 22 Aug 2015 00:43:07 +0000 Subject: [PATCH 5/8] opengl: Add error reporting at major positions --- .../src/opengl_depth_packet_processor.cpp | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/examples/protonect/src/opengl_depth_packet_processor.cpp b/examples/protonect/src/opengl_depth_packet_processor.cpp index 96735f798..17a0bc5d1 100644 --- a/examples/protonect/src/opengl_depth_packet_processor.cpp +++ b/examples/protonect/src/opengl_depth_packet_processor.cpp @@ -38,6 +38,11 @@ #include +#define CHECKGL() do { \ +for (GLenum glerror = glGetError(); glerror != GL_NO_ERROR; glerror = glGetError()) \ + LOG_ERROR << "line " << __LINE__ << ": GL error " << glerror; \ +} while(0) + namespace libfreenect2 { @@ -164,6 +169,7 @@ struct ShaderProgram : public WithOpenGLBindings const GLchar *sources[] = {"#version 140\n", defines.c_str(), src.c_str()}; vertex_shader = gl()->glCreateShader(GL_VERTEX_SHADER); gl()->glShaderSource(vertex_shader, 3, sources, NULL); + CHECKGL(); } void setFragmentShader(const std::string& src) @@ -172,6 +178,7 @@ struct ShaderProgram : public WithOpenGLBindings const GLchar *sources[] = {"#version 140\n", defines.c_str(), src.c_str()}; fragment_shader = gl()->glCreateShader(GL_FRAGMENT_SHADER); gl()->glShaderSource(fragment_shader, 3, sources, NULL); + CHECKGL(); } void bindFragDataLocation(const std::string &name, int output) @@ -221,6 +228,7 @@ struct ShaderProgram : public WithOpenGLBindings gl()->glGetProgramInfoLog(program, sizeof(error_buffer), NULL, error_buffer); LOG_ERROR << "failed to link shader program!" << std::endl << error_buffer; } + CHECKGL(); } GLint getAttributeLocation(const std::string& name) @@ -234,6 +242,7 @@ struct ShaderProgram : public WithOpenGLBindings if(idx == -1) return; gl()->glUniform1i(idx, value); + CHECKGL(); } void setUniform(const std::string& name, GLfloat value) @@ -242,6 +251,7 @@ struct ShaderProgram : public WithOpenGLBindings if(idx == -1) return; gl()->glUniform1f(idx, value); + CHECKGL(); } void setUniformVector3(const std::string& name, GLfloat value[3]) @@ -250,6 +260,7 @@ struct ShaderProgram : public WithOpenGLBindings if(idx == -1) return; gl()->glUniform3fv(idx, 1, value); + CHECKGL(); } void setUniformMatrix3(const std::string& name, GLfloat value[9]) @@ -258,11 +269,13 @@ struct ShaderProgram : public WithOpenGLBindings if(idx == -1) return; gl()->glUniformMatrix3fv(idx, 1, false, value); + CHECKGL(); } void use() { gl()->glUseProgram(program); + CHECKGL(); } }; @@ -302,6 +315,7 @@ struct Texture : public WithOpenGLBindings { gl()->glActiveTexture(unit); glBindTexture(GL_TEXTURE_RECTANGLE, texture); + CHECKGL(); } void allocate(size_t new_width, size_t new_height) @@ -326,6 +340,7 @@ struct Texture : public WithOpenGLBindings glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_RECTANGLE, 0, FormatT::InternalFormat, width, height, 0, FormatT::Format, FormatT::Type, 0); + CHECKGL(); } void upload() @@ -333,6 +348,7 @@ struct Texture : public WithOpenGLBindings bindToUnit(GL_TEXTURE0); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexSubImage2D(GL_TEXTURE_RECTANGLE, /*level*/0, /*xoffset*/0, /*yoffset*/0, width, height, FormatT::Format, FormatT::Type, data); + CHECKGL(); } void download() @@ -343,6 +359,7 @@ struct Texture : public WithOpenGLBindings void downloadToBuffer(unsigned char *data) { glReadPixels(0, 0, width, height, FormatT::Format, FormatT::Type, data); + CHECKGL(); } void flipY() @@ -482,6 +499,11 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe debug.gl(b); } + static void glfwErrorCallback(int error, const char* description) + { + LOG_ERROR << "GLFW error " << error << " " << description; + } + void checkFBO(GLenum target) { GLenum status = gl()->glCheckFramebufferStatus(target); @@ -490,6 +512,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe LOG_ERROR << "incomplete FBO " << status; exit(-1); } + CHECKGL(); } void initialize() @@ -629,6 +652,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe GLint texcoord_attr = stage1.getAttributeLocation("InputTexCoord"); gl()->glVertexAttribPointer(texcoord_attr, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)(2 * sizeof(float))); gl()->glEnableVertexAttribArray(texcoord_attr); + CHECKGL(); } void deinitialize() @@ -696,6 +720,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe gl()->glBindVertexArray(square_vao); glDrawArrays(GL_TRIANGLES, 0, 6); + CHECKGL(); if(ir != 0) { @@ -729,6 +754,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe stage2.use(); updateShaderParametersForProgram(stage2); + CHECKGL(); if(config.EnableBilateralFilter) { @@ -749,6 +775,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe gl()->glBindVertexArray(square_vao); glDrawArrays(GL_TRIANGLES, 0, 6); + CHECKGL(); if(config.EnableEdgeAwareFilter) { @@ -782,6 +809,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe *depth = stage2_depth.downloadToNewFrame(); } } + CHECKGL(); if(do_debug) { @@ -809,6 +837,7 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe glDrawArrays(GL_TRIANGLES, 0, 6); } + CHECKGL(); params_need_update = false; } @@ -818,6 +847,10 @@ OpenGLDepthPacketProcessor::OpenGLDepthPacketProcessor(void *parent_opengl_conte { GLFWwindow* parent_window = (GLFWwindow *)parent_opengl_context_ptr; + GLFWerrorfun prev_func = glfwSetErrorCallback(&OpenGLDepthPacketProcessorImpl::glfwErrorCallback); + if (prev_func) + glfwSetErrorCallback(prev_func); + // init glfw - if already initialized nothing happens if (glfwInit() == GL_FALSE) { From 183a7d6b9f348c89a2df908fc0ffb0f9871dc85d Mon Sep 17 00:00:00 2001 From: Lingzhu Xiang Date: Sat, 22 Aug 2015 00:51:56 +0000 Subject: [PATCH 6/8] opengl: Clean up flextGL definitions Remove commented definitions. They can be found in commit history. Move OpenGL version check out of flextGL, and use LOG_* macros for error reporting. --- examples/protonect/src/flextGL.c | 90 +------- examples/protonect/src/flextGL.h | 206 +----------------- .../src/opengl_depth_packet_processor.cpp | 14 +- examples/protonect/viewer.cpp | 2 +- 4 files changed, 14 insertions(+), 298 deletions(-) diff --git a/examples/protonect/src/flextGL.c b/examples/protonect/src/flextGL.c index e42652e9c..5828eff44 100644 --- a/examples/protonect/src/flextGL.c +++ b/examples/protonect/src/flextGL.c @@ -1,46 +1,11 @@ -/* WARNING: This file was automatically generated */ -/* Do not edit. */ - #include "flextGL.h" #include "GLFW/glfw3.h" -#include - - #ifdef __cplusplus extern "C" { #endif - -void flextLoadOpenGLFunctions(OpenGLBindings *bindings); - -int flextInit(GLFWwindow* window, OpenGLBindings *bindings) -{ - - int major = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR); - int minor = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MINOR); - - flextLoadOpenGLFunctions(bindings); - - /* --- Check for minimal version and profile --- */ - - if (major * 10 + minor < 31) { - fprintf(stderr, "Error: OpenGL version 3.1 not supported.\n"); - fprintf(stderr, " Your version is %d.%d.\n", major, minor); - fprintf(stderr, " Try updating your graphics driver.\n"); - return GL_FALSE; - } - - - /* --- Check for extensions --- */ - - - return GL_TRUE; -} - - - -void flextLoadOpenGLFunctions(OpenGLBindings *bindings) +void flextInit(OpenGLBindings *bindings) { /* --- Function pointer loading --- */ @@ -305,59 +270,6 @@ void flextLoadOpenGLFunctions(OpenGLBindings *bindings) bindings->glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAME_PROC*)glfwGetProcAddress("glGetActiveUniformBlockName"); bindings->glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDING_PROC*)glfwGetProcAddress("glUniformBlockBinding"); - /* GL_VERSION_3_2 */ -/* - bindings->glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEX_PROC*)glfwGetProcAddress("glDrawElementsBaseVertex"); - bindings->glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEX_PROC*)glfwGetProcAddress("glDrawRangeElementsBaseVertex"); - bindings->glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEX_PROC*)glfwGetProcAddress("glDrawElementsInstancedBaseVertex"); - bindings->glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEX_PROC*)glfwGetProcAddress("glMultiDrawElementsBaseVertex"); - bindings->glProvokingVertex = (PFNGLPROVOKINGVERTEX_PROC*)glfwGetProcAddress("glProvokingVertex"); - bindings->glFenceSync = (PFNGLFENCESYNC_PROC*)glfwGetProcAddress("glFenceSync"); - bindings->glIsSync = (PFNGLISSYNC_PROC*)glfwGetProcAddress("glIsSync"); - bindings->glDeleteSync = (PFNGLDELETESYNC_PROC*)glfwGetProcAddress("glDeleteSync"); - bindings->glClientWaitSync = (PFNGLCLIENTWAITSYNC_PROC*)glfwGetProcAddress("glClientWaitSync"); - bindings->glWaitSync = (PFNGLWAITSYNC_PROC*)glfwGetProcAddress("glWaitSync"); - bindings->glGetInteger64v = (PFNGLGETINTEGER64V_PROC*)glfwGetProcAddress("glGetInteger64v"); - bindings->glGetSynciv = (PFNGLGETSYNCIV_PROC*)glfwGetProcAddress("glGetSynciv"); - bindings->glGetInteger64i_v = (PFNGLGETINTEGER64I_V_PROC*)glfwGetProcAddress("glGetInteger64i_v"); - bindings->glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64V_PROC*)glfwGetProcAddress("glGetBufferParameteri64v"); - bindings->glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTURE_PROC*)glfwGetProcAddress("glFramebufferTexture"); - bindings->glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLE_PROC*)glfwGetProcAddress("glTexImage2DMultisample"); - bindings->glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLE_PROC*)glfwGetProcAddress("glTexImage3DMultisample"); - bindings->glGetMultisamplefv = (PFNGLGETMULTISAMPLEFV_PROC*)glfwGetProcAddress("glGetMultisamplefv"); - bindings->glSampleMaski = (PFNGLSAMPLEMASKI_PROC*)glfwGetProcAddress("glSampleMaski"); -*/ - /* GL_VERSION_3_3 */ -/* - bindings->glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXED_PROC*)glfwGetProcAddress("glBindFragDataLocationIndexed"); - bindings->glGetFragDataIndex = (PFNGLGETFRAGDATAINDEX_PROC*)glfwGetProcAddress("glGetFragDataIndex"); - bindings->glGenSamplers = (PFNGLGENSAMPLERS_PROC*)glfwGetProcAddress("glGenSamplers"); - bindings->glDeleteSamplers = (PFNGLDELETESAMPLERS_PROC*)glfwGetProcAddress("glDeleteSamplers"); - bindings->glIsSampler = (PFNGLISSAMPLER_PROC*)glfwGetProcAddress("glIsSampler"); - bindings->glBindSampler = (PFNGLBINDSAMPLER_PROC*)glfwGetProcAddress("glBindSampler"); - bindings->glSamplerParameteri = (PFNGLSAMPLERPARAMETERI_PROC*)glfwGetProcAddress("glSamplerParameteri"); - bindings->glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIV_PROC*)glfwGetProcAddress("glSamplerParameteriv"); - bindings->glSamplerParameterf = (PFNGLSAMPLERPARAMETERF_PROC*)glfwGetProcAddress("glSamplerParameterf"); - bindings->glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFV_PROC*)glfwGetProcAddress("glSamplerParameterfv"); - bindings->glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIV_PROC*)glfwGetProcAddress("glSamplerParameterIiv"); - bindings->glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIV_PROC*)glfwGetProcAddress("glSamplerParameterIuiv"); - bindings->glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIV_PROC*)glfwGetProcAddress("glGetSamplerParameteriv"); - bindings->glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIV_PROC*)glfwGetProcAddress("glGetSamplerParameterIiv"); - bindings->glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFV_PROC*)glfwGetProcAddress("glGetSamplerParameterfv"); - bindings->glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIV_PROC*)glfwGetProcAddress("glGetSamplerParameterIuiv"); - bindings->glQueryCounter = (PFNGLQUERYCOUNTER_PROC*)glfwGetProcAddress("glQueryCounter"); - bindings->glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64V_PROC*)glfwGetProcAddress("glGetQueryObjecti64v"); - bindings->glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64V_PROC*)glfwGetProcAddress("glGetQueryObjectui64v"); - bindings->glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOR_PROC*)glfwGetProcAddress("glVertexAttribDivisor"); - bindings->glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UI_PROC*)glfwGetProcAddress("glVertexAttribP1ui"); - bindings->glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIV_PROC*)glfwGetProcAddress("glVertexAttribP1uiv"); - bindings->glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UI_PROC*)glfwGetProcAddress("glVertexAttribP2ui"); - bindings->glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIV_PROC*)glfwGetProcAddress("glVertexAttribP2uiv"); - bindings->glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UI_PROC*)glfwGetProcAddress("glVertexAttribP3ui"); - bindings->glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIV_PROC*)glfwGetProcAddress("glVertexAttribP3uiv"); - bindings->glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UI_PROC*)glfwGetProcAddress("glVertexAttribP4ui"); - bindings->glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIV_PROC*)glfwGetProcAddress("glVertexAttribP4uiv"); -*/ } /* ----------------------- Extension flag definitions ---------------------- */ diff --git a/examples/protonect/src/flextGL.h b/examples/protonect/src/flextGL.h index 2cb5cb310..807d742fc 100644 --- a/examples/protonect/src/flextGL.h +++ b/examples/protonect/src/flextGL.h @@ -1,6 +1,3 @@ -/* WARNING: This file was automatically generated */ -/* Do not edit. */ - #ifndef __gl_h_ #define __gl_h_ @@ -840,92 +837,6 @@ typedef struct __GLsync *GLsync; #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_INVALID_INDEX 0xFFFFFFFFu -/* GL_VERSION_3_2 */ -/* -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 -#define GL_DEPTH_CLAMP 0x864F -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 -*/ -/* GL_VERSION_3_3 */ -/* -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_SRC1_COLOR 0x88F9 -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#define GL_SAMPLER_BINDING 0x8919 -#define GL_RGB10_A2UI 0x906F -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 -#define GL_INT_2_10_10_10_REV 0x8D9F -*/ /* --------------------------- FUNCTION PROTOTYPES --------------------------- */ @@ -1257,59 +1168,6 @@ typedef void (APIENTRY PFNGLGETACTIVEUNIFORMBLOCKIV_PROC (GLuint program, GLuint typedef void (APIENTRY PFNGLGETACTIVEUNIFORMBLOCKNAME_PROC (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName)); typedef void (APIENTRY PFNGLUNIFORMBLOCKBINDING_PROC (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)); -/* GL_VERSION_3_2 */ -/* -typedef void (APIENTRY PFNGLDRAWELEMENTSBASEVERTEX_PROC (GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex)); -typedef void (APIENTRY PFNGLDRAWRANGEELEMENTSBASEVERTEX_PROC (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex)); -typedef void (APIENTRY PFNGLDRAWELEMENTSINSTANCEDBASEVERTEX_PROC (GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex)); -typedef void (APIENTRY PFNGLMULTIDRAWELEMENTSBASEVERTEX_PROC (GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex)); -typedef void (APIENTRY PFNGLPROVOKINGVERTEX_PROC (GLenum mode)); -typedef GLsync (APIENTRY PFNGLFENCESYNC_PROC (GLenum condition, GLbitfield flags)); -typedef GLboolean (APIENTRY PFNGLISSYNC_PROC (GLsync sync)); -typedef void (APIENTRY PFNGLDELETESYNC_PROC (GLsync sync)); -typedef GLenum (APIENTRY PFNGLCLIENTWAITSYNC_PROC (GLsync sync, GLbitfield flags, GLuint64 timeout)); -typedef void (APIENTRY PFNGLWAITSYNC_PROC (GLsync sync, GLbitfield flags, GLuint64 timeout)); -typedef void (APIENTRY PFNGLGETINTEGER64V_PROC (GLenum pname, GLint64 * data)); -typedef void (APIENTRY PFNGLGETSYNCIV_PROC (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * values)); -typedef void (APIENTRY PFNGLGETINTEGER64I_V_PROC (GLenum target, GLuint index, GLint64 * data)); -typedef void (APIENTRY PFNGLGETBUFFERPARAMETERI64V_PROC (GLenum target, GLenum pname, GLint64 * params)); -typedef void (APIENTRY PFNGLFRAMEBUFFERTEXTURE_PROC (GLenum target, GLenum attachment, GLuint texture, GLint level)); -typedef void (APIENTRY PFNGLTEXIMAGE2DMULTISAMPLE_PROC (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)); -typedef void (APIENTRY PFNGLTEXIMAGE3DMULTISAMPLE_PROC (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)); -typedef void (APIENTRY PFNGLGETMULTISAMPLEFV_PROC (GLenum pname, GLuint index, GLfloat * val)); -typedef void (APIENTRY PFNGLSAMPLEMASKI_PROC (GLuint maskNumber, GLbitfield mask)); -*/ -/* GL_VERSION_3_3 */ -/* -typedef void (APIENTRY PFNGLBINDFRAGDATALOCATIONINDEXED_PROC (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name)); -typedef GLint (APIENTRY PFNGLGETFRAGDATAINDEX_PROC (GLuint program, const GLchar * name)); -typedef void (APIENTRY PFNGLGENSAMPLERS_PROC (GLsizei count, GLuint * samplers)); -typedef void (APIENTRY PFNGLDELETESAMPLERS_PROC (GLsizei count, const GLuint * samplers)); -typedef GLboolean (APIENTRY PFNGLISSAMPLER_PROC (GLuint sampler)); -typedef void (APIENTRY PFNGLBINDSAMPLER_PROC (GLuint unit, GLuint sampler)); -typedef void (APIENTRY PFNGLSAMPLERPARAMETERI_PROC (GLuint sampler, GLenum pname, GLint param)); -typedef void (APIENTRY PFNGLSAMPLERPARAMETERIV_PROC (GLuint sampler, GLenum pname, const GLint * param)); -typedef void (APIENTRY PFNGLSAMPLERPARAMETERF_PROC (GLuint sampler, GLenum pname, GLfloat param)); -typedef void (APIENTRY PFNGLSAMPLERPARAMETERFV_PROC (GLuint sampler, GLenum pname, const GLfloat * param)); -typedef void (APIENTRY PFNGLSAMPLERPARAMETERIIV_PROC (GLuint sampler, GLenum pname, const GLint * param)); -typedef void (APIENTRY PFNGLSAMPLERPARAMETERIUIV_PROC (GLuint sampler, GLenum pname, const GLuint * param)); -typedef void (APIENTRY PFNGLGETSAMPLERPARAMETERIV_PROC (GLuint sampler, GLenum pname, GLint * params)); -typedef void (APIENTRY PFNGLGETSAMPLERPARAMETERIIV_PROC (GLuint sampler, GLenum pname, GLint * params)); -typedef void (APIENTRY PFNGLGETSAMPLERPARAMETERFV_PROC (GLuint sampler, GLenum pname, GLfloat * params)); -typedef void (APIENTRY PFNGLGETSAMPLERPARAMETERIUIV_PROC (GLuint sampler, GLenum pname, GLuint * params)); -typedef void (APIENTRY PFNGLQUERYCOUNTER_PROC (GLuint id, GLenum target)); -typedef void (APIENTRY PFNGLGETQUERYOBJECTI64V_PROC (GLuint id, GLenum pname, GLint64 * params)); -typedef void (APIENTRY PFNGLGETQUERYOBJECTUI64V_PROC (GLuint id, GLenum pname, GLuint64 * params)); -typedef void (APIENTRY PFNGLVERTEXATTRIBDIVISOR_PROC (GLuint index, GLuint divisor)); -typedef void (APIENTRY PFNGLVERTEXATTRIBP1UI_PROC (GLuint index, GLenum type, GLboolean normalized, GLuint value)); -typedef void (APIENTRY PFNGLVERTEXATTRIBP1UIV_PROC (GLuint index, GLenum type, GLboolean normalized, const GLuint * value)); -typedef void (APIENTRY PFNGLVERTEXATTRIBP2UI_PROC (GLuint index, GLenum type, GLboolean normalized, GLuint value)); -typedef void (APIENTRY PFNGLVERTEXATTRIBP2UIV_PROC (GLuint index, GLenum type, GLboolean normalized, const GLuint * value)); -typedef void (APIENTRY PFNGLVERTEXATTRIBP3UI_PROC (GLuint index, GLenum type, GLboolean normalized, GLuint value)); -typedef void (APIENTRY PFNGLVERTEXATTRIBP3UIV_PROC (GLuint index, GLenum type, GLboolean normalized, const GLuint * value)); -typedef void (APIENTRY PFNGLVERTEXATTRIBP4UI_PROC (GLuint index, GLenum type, GLboolean normalized, GLuint value)); -typedef void (APIENTRY PFNGLVERTEXATTRIBP4UIV_PROC (GLuint index, GLenum type, GLboolean normalized, const GLuint * value)); -*/ struct OpenGLBindings { @@ -1573,59 +1431,6 @@ struct OpenGLBindings PFNGLGETACTIVEUNIFORMBLOCKNAME_PROC* glGetActiveUniformBlockName; PFNGLUNIFORMBLOCKBINDING_PROC* glUniformBlockBinding; - /* GL_VERSION_3_2 */ -/* - PFNGLDRAWELEMENTSBASEVERTEX_PROC* glDrawElementsBaseVertex; - PFNGLDRAWRANGEELEMENTSBASEVERTEX_PROC* glDrawRangeElementsBaseVertex; - PFNGLDRAWELEMENTSINSTANCEDBASEVERTEX_PROC* glDrawElementsInstancedBaseVertex; - PFNGLMULTIDRAWELEMENTSBASEVERTEX_PROC* glMultiDrawElementsBaseVertex; - PFNGLPROVOKINGVERTEX_PROC* glProvokingVertex; - PFNGLFENCESYNC_PROC* glFenceSync; - PFNGLISSYNC_PROC* glIsSync; - PFNGLDELETESYNC_PROC* glDeleteSync; - PFNGLCLIENTWAITSYNC_PROC* glClientWaitSync; - PFNGLWAITSYNC_PROC* glWaitSync; - PFNGLGETINTEGER64V_PROC* glGetInteger64v; - PFNGLGETSYNCIV_PROC* glGetSynciv; - PFNGLGETINTEGER64I_V_PROC* glGetInteger64i_v; - PFNGLGETBUFFERPARAMETERI64V_PROC* glGetBufferParameteri64v; - PFNGLFRAMEBUFFERTEXTURE_PROC* glFramebufferTexture; - PFNGLTEXIMAGE2DMULTISAMPLE_PROC* glTexImage2DMultisample; - PFNGLTEXIMAGE3DMULTISAMPLE_PROC* glTexImage3DMultisample; - PFNGLGETMULTISAMPLEFV_PROC* glGetMultisamplefv; - PFNGLSAMPLEMASKI_PROC* glSampleMaski; -*/ - /* GL_VERSION_3_3 */ -/* - PFNGLBINDFRAGDATALOCATIONINDEXED_PROC* glBindFragDataLocationIndexed; - PFNGLGETFRAGDATAINDEX_PROC* glGetFragDataIndex; - PFNGLGENSAMPLERS_PROC* glGenSamplers; - PFNGLDELETESAMPLERS_PROC* glDeleteSamplers; - PFNGLISSAMPLER_PROC* glIsSampler; - PFNGLBINDSAMPLER_PROC* glBindSampler; - PFNGLSAMPLERPARAMETERI_PROC* glSamplerParameteri; - PFNGLSAMPLERPARAMETERIV_PROC* glSamplerParameteriv; - PFNGLSAMPLERPARAMETERF_PROC* glSamplerParameterf; - PFNGLSAMPLERPARAMETERFV_PROC* glSamplerParameterfv; - PFNGLSAMPLERPARAMETERIIV_PROC* glSamplerParameterIiv; - PFNGLSAMPLERPARAMETERIUIV_PROC* glSamplerParameterIuiv; - PFNGLGETSAMPLERPARAMETERIV_PROC* glGetSamplerParameteriv; - PFNGLGETSAMPLERPARAMETERIIV_PROC* glGetSamplerParameterIiv; - PFNGLGETSAMPLERPARAMETERFV_PROC* glGetSamplerParameterfv; - PFNGLGETSAMPLERPARAMETERIUIV_PROC* glGetSamplerParameterIuiv; - PFNGLQUERYCOUNTER_PROC* glQueryCounter; - PFNGLGETQUERYOBJECTI64V_PROC* glGetQueryObjecti64v; - PFNGLGETQUERYOBJECTUI64V_PROC* glGetQueryObjectui64v; - PFNGLVERTEXATTRIBDIVISOR_PROC* glVertexAttribDivisor; - PFNGLVERTEXATTRIBP1UI_PROC* glVertexAttribP1ui; - PFNGLVERTEXATTRIBP1UIV_PROC* glVertexAttribP1uiv; - PFNGLVERTEXATTRIBP2UI_PROC* glVertexAttribP2ui; - PFNGLVERTEXATTRIBP2UIV_PROC* glVertexAttribP2uiv; - PFNGLVERTEXATTRIBP3UI_PROC* glVertexAttribP3ui; - PFNGLVERTEXATTRIBP3UIV_PROC* glVertexAttribP3uiv; - PFNGLVERTEXATTRIBP4UI_PROC* glVertexAttribP4ui; - PFNGLVERTEXATTRIBP4UIV_PROC* glVertexAttribP4uiv; -*/ }; typedef struct OpenGLBindings OpenGLBindings; @@ -1642,20 +1447,13 @@ typedef struct OpenGLBindings OpenGLBindings; #define GL_VERSION_2_1 #define GL_VERSION_3_0 #define GL_VERSION_3_1 -#define GL_VERSION_3_2 -#define GL_VERSION_3_3 /* ---------------------- Flags for optional extensions ---------------------- */ - - -struct GLFWwindow; -typedef struct GLFWwindow GLFWwindow; - -int flextInit(GLFWwindow* window, OpenGLBindings *bindings); +void flextInit(OpenGLBindings *bindings); #define FLEXT_MAJOR_VERSION 3 -#define FLEXT_MINOR_VERSION 3 +#define FLEXT_MINOR_VERSION 1 #define FLEXT_CORE_PROFILE 1 #ifdef __cplusplus diff --git a/examples/protonect/src/opengl_depth_packet_processor.cpp b/examples/protonect/src/opengl_depth_packet_processor.cpp index 17a0bc5d1..1710cd859 100644 --- a/examples/protonect/src/opengl_depth_packet_processor.cpp +++ b/examples/protonect/src/opengl_depth_packet_processor.cpp @@ -519,12 +519,18 @@ struct OpenGLDepthPacketProcessorImpl : public WithOpenGLBindings, public WithPe { ChangeCurrentOpenGLContext ctx(opengl_context_ptr); - OpenGLBindings *b = new OpenGLBindings(); - if (flextInit(opengl_context_ptr, b) == 0) - { - LOG_ERROR << "Failed to initialize flextGL."; + int major = glfwGetWindowAttrib(opengl_context_ptr, GLFW_CONTEXT_VERSION_MAJOR); + int minor = glfwGetWindowAttrib(opengl_context_ptr, GLFW_CONTEXT_VERSION_MINOR); + + if (major * 10 + minor < 31) { + LOG_ERROR << "OpenGL version 3.1 not supported."; + LOG_ERROR << "Your version is " << major << "." << minor; + LOG_ERROR << "Try updating your graphics driver."; exit(-1); } + + OpenGLBindings *b = new OpenGLBindings(); + flextInit(b); gl(b); input_data.allocate(352, 424 * 9); diff --git a/examples/protonect/viewer.cpp b/examples/protonect/viewer.cpp index 71801f702..6b086228b 100644 --- a/examples/protonect/viewer.cpp +++ b/examples/protonect/viewer.cpp @@ -22,7 +22,7 @@ void Viewer::initialize() window = glfwCreateWindow(1280, 800, "Viewer", 0, NULL); glfwMakeContextCurrent(window); OpenGLBindings *b = new OpenGLBindings(); - flextInit(window, b); + flextInit(b); gl(b); std::string vertexshadersrc = "" From 704ed41d40b845ee86724a18603e8ede0019b099 Mon Sep 17 00:00:00 2001 From: Lingzhu Xiang Date: Sat, 22 Aug 2015 02:51:30 -0400 Subject: [PATCH 7/8] usb: Improve error reporting --- .../protonect/src/command_transaction.cpp | 6 +- examples/protonect/src/libfreenect2.cpp | 57 ++++++++++++++++--- examples/protonect/src/transfer_pool.cpp | 14 ++++- examples/protonect/src/usb_control.cpp | 2 +- 4 files changed, 65 insertions(+), 14 deletions(-) diff --git a/examples/protonect/src/command_transaction.cpp b/examples/protonect/src/command_transaction.cpp index 716dd32e2..ec81d109e 100644 --- a/examples/protonect/src/command_transaction.cpp +++ b/examples/protonect/src/command_transaction.cpp @@ -29,6 +29,8 @@ #include +#define WRITE_LIBUSB_ERROR(__RESULT) libusb_error_name(__RESULT) << " " << libusb_strerror((libusb_error)__RESULT) + namespace libfreenect2 { namespace protocol @@ -135,7 +137,7 @@ CommandTransaction::ResultCode CommandTransaction::send(const CommandBase& comma if(r != LIBUSB_SUCCESS) { - LOG_ERROR << "bulk transfer failed! libusb error " << r << ": " << libusb_error_name(r); + LOG_ERROR << "bulk transfer failed: " << WRITE_LIBUSB_ERROR(r); code = Error; } @@ -157,7 +159,7 @@ void CommandTransaction::receive(CommandTransaction::Result& result) if(r != LIBUSB_SUCCESS) { - LOG_ERROR << "bulk transfer failed! libusb error " << r << ": " << libusb_error_name(r); + LOG_ERROR << "bulk transfer failed: " << WRITE_LIBUSB_ERROR(r); result.code = Error; } } diff --git a/examples/protonect/src/libfreenect2.cpp b/examples/protonect/src/libfreenect2.cpp index 88d52b225..a441e11ba 100644 --- a/examples/protonect/src/libfreenect2.cpp +++ b/examples/protonect/src/libfreenect2.cpp @@ -28,6 +28,7 @@ #include #include #include +#define WRITE_LIBUSB_ERROR(__RESULT) libusb_error_name(__RESULT) << " " << libusb_strerror((libusb_error)__RESULT) #include @@ -101,13 +102,16 @@ class Freenect2DeviceImpl : public Freenect2Device struct PrintBusAndDevice { libusb_device *dev_; + int status_; - PrintBusAndDevice(libusb_device *dev) : dev_(dev) {} + PrintBusAndDevice(libusb_device *dev, int status = 0) : dev_(dev), status_(status) {} }; std::ostream &operator<<(std::ostream &out, const PrintBusAndDevice& dev) { out << "@" << int(libusb_get_bus_number(dev.dev_)) << ":" << int(libusb_get_device_address(dev.dev_)); + if (dev.status_) + out << " " << WRITE_LIBUSB_ERROR(dev.status_); return out; } @@ -130,26 +134,39 @@ class Freenect2Impl UsbDeviceVector enumerated_devices_; DeviceVector devices_; + bool initialized; + Freenect2Impl(void *usb_context) : managed_usb_context_(usb_context == 0), usb_context_(reinterpret_cast(usb_context)), + initialized(false), has_device_enumeration_(false) { + if (libusb_get_version()->nano < 10952) + { + LOG_ERROR << "Your libusb does not support large iso buffer!"; + return; + } + if(managed_usb_context_) { int r = libusb_init(&usb_context_); - // TODO: error handling if(r != 0) { - LOG_ERROR << "failed to create usb context!"; + LOG_ERROR << "failed to create usb context: " << WRITE_LIBUSB_ERROR(r); + return; } } usb_event_loop_.start(usb_context_); + initialized = true; } ~Freenect2Impl() { + if (!initialized) + return; + clearDevices(); clearDeviceEnumeration(); @@ -165,11 +182,17 @@ class Freenect2Impl void addDevice(Freenect2DeviceImpl *device) { + if (!initialized) + return; + devices_.push_back(device); } void removeDevice(Freenect2DeviceImpl *device) { + if (!initialized) + return; + DeviceVector::iterator it = std::find(devices_.begin(), devices_.end(), device); if(it != devices_.end()) @@ -184,6 +207,9 @@ class Freenect2Impl bool tryGetDevice(libusb_device *usb_device, Freenect2DeviceImpl **device) { + if (!initialized) + return false; + for(DeviceVector::iterator it = devices_.begin(); it != devices_.end(); ++it) { if((*it)->isSameUsbDevice(usb_device)) @@ -198,6 +224,9 @@ class Freenect2Impl void clearDevices() { + if (!initialized) + return; + DeviceVector devices(devices_.begin(), devices_.end()); for(DeviceVector::iterator it = devices.begin(); it != devices.end(); ++it) @@ -213,6 +242,9 @@ class Freenect2Impl void clearDeviceEnumeration() { + if (!initialized) + return; + // free enumerated device pointers, this should not affect opened devices for(UsbDeviceVector::iterator it = enumerated_devices_.begin(); it != enumerated_devices_.end(); ++it) { @@ -225,6 +257,9 @@ class Freenect2Impl void enumerateDevices() { + if (!initialized) + return; + LOG_INFO << "enumerating devices..."; libusb_device **device_list; int num_devices = libusb_get_device_list(usb_context_, &device_list); @@ -277,14 +312,14 @@ class Freenect2Impl } else { - LOG_ERROR << "failed to get serial number of Kinect v2 " << PrintBusAndDevice(dev) << "!"; + LOG_ERROR << "failed to get serial number of Kinect v2: " << PrintBusAndDevice(dev, r); } libusb_close(dev_handle); } else { - LOG_ERROR << "failed to open Kinect v2 " << PrintBusAndDevice(dev) << "!"; + LOG_ERROR << "failed to open Kinect v2: " << PrintBusAndDevice(dev, r); } } } @@ -300,6 +335,9 @@ class Freenect2Impl int getNumDevices() { + if (!initialized) + return 0; + if(!has_device_enumeration_) { enumerateDevices(); @@ -654,6 +692,9 @@ int Freenect2::enumerateDevices() std::string Freenect2::getDeviceSerialNumber(int idx) { + if (!impl_->initialized) + return std::string(); + return impl_->enumerated_devices_[idx].serial; } @@ -701,7 +742,7 @@ Freenect2Device *Freenect2::openDevice(int idx, const PacketPipeline *pipeline, if(r != LIBUSB_SUCCESS) { - LOG_ERROR << "failed to open Kinect v2 " << PrintBusAndDevice(dev.dev) << "!"; + LOG_ERROR << "failed to open Kinect v2: " << PrintBusAndDevice(dev.dev, r); delete pipeline; return device; @@ -740,7 +781,7 @@ Freenect2Device *Freenect2::openDevice(int idx, const PacketPipeline *pipeline, } else if(r != LIBUSB_SUCCESS) { - LOG_ERROR << "failed to reset Kinect v2 " << PrintBusAndDevice(dev.dev) << "!"; + LOG_ERROR << "failed to reset Kinect v2: " << PrintBusAndDevice(dev.dev, r); delete pipeline; return device; @@ -755,7 +796,7 @@ Freenect2Device *Freenect2::openDevice(int idx, const PacketPipeline *pipeline, delete device; device = 0; - LOG_ERROR << "failed to open Kinect v2 " << PrintBusAndDevice(dev.dev) << "!"; + LOG_ERROR << "failed to open Kinect v2: " << PrintBusAndDevice(dev.dev); } return device; diff --git a/examples/protonect/src/transfer_pool.cpp b/examples/protonect/src/transfer_pool.cpp index dfe70921e..31b36f143 100644 --- a/examples/protonect/src/transfer_pool.cpp +++ b/examples/protonect/src/transfer_pool.cpp @@ -27,6 +27,8 @@ #include #include +#define WRITE_LIBUSB_ERROR(__RESULT) libusb_error_name(__RESULT) << " " << libusb_strerror((libusb_error)__RESULT) + namespace libfreenect2 { namespace usb @@ -84,8 +86,10 @@ void TransferPool::submit(size_t num_parallel_transfers) if(transfers_.size() < num_parallel_transfers) { LOG_ERROR << "too few idle transfers!"; + return; } + size_t failcount = 0; for(size_t i = 0; i < num_parallel_transfers; ++i) { libusb_transfer *transfer = transfers_[i].transfer; @@ -95,10 +99,14 @@ void TransferPool::submit(size_t num_parallel_transfers) if(r != LIBUSB_SUCCESS) { - LOG_ERROR << "failed to submit transfer: " << libusb_error_name(r); + LOG_ERROR << "failed to submit transfer: " << WRITE_LIBUSB_ERROR(r); transfers_[i].setStopped(true); + failcount++; } } + + if (failcount == num_parallel_transfers) + LOG_ERROR << "all submissions failed. Try debugging with environment variable: LIBUSB_DEBUG=4."; } void TransferPool::cancel() @@ -109,7 +117,7 @@ void TransferPool::cancel() if(r != LIBUSB_SUCCESS && r != LIBUSB_ERROR_NOT_FOUND) { - LOG_ERROR << "failed to cancel transfer: " << libusb_error_name(r); + LOG_ERROR << "failed to cancel transfer: " << WRITE_LIBUSB_ERROR(r); } } @@ -186,7 +194,7 @@ void TransferPool::onTransferComplete(TransferPool::Transfer* t) if(r != LIBUSB_SUCCESS) { - LOG_ERROR << "failed to submit transfer: " << libusb_error_name(r); + LOG_ERROR << "failed to submit transfer: " << WRITE_LIBUSB_ERROR(r); t->setStopped(true); } } diff --git a/examples/protonect/src/usb_control.cpp b/examples/protonect/src/usb_control.cpp index 00e3e5da6..8cbdda148 100644 --- a/examples/protonect/src/usb_control.cpp +++ b/examples/protonect/src/usb_control.cpp @@ -188,7 +188,7 @@ UsbControl::~UsbControl() } #define CHECK_LIBUSB_RESULT(__CODE, __RESULT) if((__CODE = (__RESULT == LIBUSB_SUCCESS ? Success : Error)) == Error) LOG_ERROR -#define WRITE_LIBUSB_ERROR(__RESULT) "libusb error " << __RESULT << ": " << libusb_error_name(__RESULT) +#define WRITE_LIBUSB_ERROR(__RESULT) libusb_error_name(__RESULT) << " " << libusb_strerror((libusb_error)__RESULT) << ". Try debugging with environment variable: export LIBUSB_DEBUG=4 ." UsbControl::ResultCode UsbControl::setConfiguration() { From 520b55d00b1971a4222569073f4097a68eab9c2c Mon Sep 17 00:00:00 2001 From: Lingzhu Xiang Date: Sat, 22 Aug 2015 03:47:16 -0400 Subject: [PATCH 8/8] Output less warnings in depth stream parser Assembly errors and lost packets should not flood the log output. --- .../libfreenect2/depth_packet_stream_parser.h | 1 + .../src/depth_packet_stream_parser.cpp | 22 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/examples/protonect/include/libfreenect2/depth_packet_stream_parser.h b/examples/protonect/include/libfreenect2/depth_packet_stream_parser.h index 7773cadc4..7258d3685 100644 --- a/examples/protonect/include/libfreenect2/depth_packet_stream_parser.h +++ b/examples/protonect/include/libfreenect2/depth_packet_stream_parser.h @@ -68,6 +68,7 @@ class LIBFREENECT2_API DepthPacketStreamParser : public DataCallback uint32_t current_sequence_; uint32_t current_subsequence_; + uint32_t processed_packets_; }; } /* namespace libfreenect2 */ diff --git a/examples/protonect/src/depth_packet_stream_parser.cpp b/examples/protonect/src/depth_packet_stream_parser.cpp index a90f1ed70..a3ddfa097 100644 --- a/examples/protonect/src/depth_packet_stream_parser.cpp +++ b/examples/protonect/src/depth_packet_stream_parser.cpp @@ -33,6 +33,7 @@ namespace libfreenect2 DepthPacketStreamParser::DepthPacketStreamParser() : processor_(noopProcessor()), + processed_packets_(-1), current_sequence_(0), current_subsequence_(0) { @@ -79,7 +80,7 @@ void DepthPacketStreamParser::onDataReceived(unsigned char* buffer, size_t in_le if(wb.length + in_length > wb.capacity) { - LOG_ERROR << "subpacket too large"; + LOG_DEBUG << "subpacket too large"; wb.length = 0; return; } @@ -91,7 +92,7 @@ void DepthPacketStreamParser::onDataReceived(unsigned char* buffer, size_t in_le { if(footer->length != wb.length) { - LOG_ERROR << "image data too short!"; + LOG_DEBUG << "image data too short!"; } else { @@ -110,15 +111,26 @@ void DepthPacketStreamParser::onDataReceived(unsigned char* buffer, size_t in_le packet.buffer_length = buffer_.back().length; processor_->process(packet); + + processed_packets_++; + if (processed_packets_ == 0) + processed_packets_ = current_sequence_; + int diff = current_sequence_ - processed_packets_; + const int interval = 30; + if (current_sequence_ % interval == 0 && diff != 0) + { + LOG_INFO << diff << " of " << interval << " packets were lost"; + processed_packets_ = current_sequence_; + } } else { - LOG_WARNING << "skipping depth packet"; + LOG_DEBUG << "skipping depth packet"; } } else { - LOG_ERROR << "not all subsequences received " << current_subsequence_; + LOG_DEBUG << "not all subsequences received " << current_subsequence_; } current_sequence_ = footer->sequence; @@ -132,7 +144,7 @@ void DepthPacketStreamParser::onDataReceived(unsigned char* buffer, size_t in_le if(footer->subsequence * footer->length > fb.length) { - LOG_ERROR << "front buffer too short! subsequence number is " << footer->subsequence; + LOG_DEBUG << "front buffer too short! subsequence number is " << footer->subsequence; } else {