void glCheckError(GL *gl, struct mp_log *log, const char *info) { for (;;) { GLenum error = gl->GetError(); if (error == GL_NO_ERROR) break; mp_msg(log, MSGL_ERR, "%s: OpenGL error %s.\n", info, gl_error_to_string(error)); } }
static void dump_and_clear_opengl_errors(std::ostream &out, GLenum first_error = GL_NO_ERROR) { GLenum err = ((first_error == GL_NO_ERROR) ? glGetError() : first_error); if (err != GL_NO_ERROR) { out << "errors: "; do { out << gl_error_to_string(err) << " "; err = glGetError(); } while (err != GL_NO_ERROR); } }
//////////////////////////////////////////////////////////////////////////////// // on update cb void on_update() { // clear back buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); #ifdef _WIN32 GLenum error = glGetError(); if(error!=GL_NO_ERROR) std::cerr << "caught " << gl_error_to_string(error) << '\n'; #endif // redraw glutSwapBuffers(); glutPostRedisplay(); }
manager::manager(shader_program_ptr shader) { // Reset errors, so we can track errors that happened here. glGetError(); GLint blend_src_mode; GLint blend_dst_mode; // Save current blend mode glGetIntegerv(GL_BLEND_SRC, &blend_src_mode); glGetIntegerv(GL_BLEND_DST, &blend_dst_mode); blend_stack.push(blend_mode(blend_src_mode, blend_dst_mode, glIsEnabled(GL_BLEND) != 0)); GLint atu; glGetIntegerv(GL_ACTIVE_TEXTURE, &atu); active_texture_unit.push(atu); if(shader == NULL || active_shader_program == shader) { return; } if(active_shader_program != shader) { shader_stack.push(active_shader_program); active_shader_program = shader; } ASSERT_LOG(active_shader_program != NULL, "Active shader was NULL"); check_gl_errors(); active_shader_program->prepare_draw(); GLenum err = glGetError(); ASSERT_LOG(err == GL_NONE, "Error in shader code: " << shader->name() << " : 0x" << std::hex << err << ": " << gl_error_to_string(err)); }
//////////////////////////////////////////////////////////////////////////////// // on init cb void on_init() { #ifndef _WIN32 // Configure debug output glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); glDebugMessageCallbackARB( reinterpret_cast<GLDEBUGPROCARB>(&gl_debug_message_callback), NULL ); #endif // gen names glGenBuffers(1, &buffer); glGenTextures(1, &texture); glGenVertexArrays(1, &vertexArray); program = glCreateProgram(); // build buffer std::vector<GLint> bufferData(ELEM_CNT,-1); glBindBuffer(GL_TEXTURE_BUFFER, buffer); glBufferData(GL_TEXTURE_BUFFER, sizeof(GLint)*bufferData.size(), &bufferData[0], GL_STATIC_DRAW); glBindBuffer(GL_TEXTURE_BUFFER, 0); // build texture glBindTexture(GL_TEXTURE_BUFFER, texture); glTexBuffer(GL_TEXTURE_BUFFER, GL_R32I, buffer); // bind as image glBindImageTexture(0, texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32I); // build vao glBindVertexArray(vertexArray); // empty glBindVertexArray(0); // build program GLuint vertex = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex, 5, vertexSrc, NULL); glCompileShader(vertex); glAttachShader(program, vertex); glDeleteShader(vertex); glLinkProgram(program); // set uniforms glProgramUniform1i(program, glGetUniformLocation(program, "imgData"), 0); // draw data glUseProgram(program); glBindVertexArray(vertexArray); glDrawArrays(GL_POINTS, 0, ELEM_CNT); // map buffer and check data validity glBindVertexArray(0); glBindBuffer(GL_TEXTURE_BUFFER, buffer); GLint *dataPtr = (GLint*) glMapBuffer(GL_TEXTURE_BUFFER, GL_READ_ONLY); std::cout << "buffer content : "; for(GLint i = 0; i<ELEM_CNT; ++i) std::cout << dataPtr[i] << ' '; std::cout << std::endl; glUnmapBuffer(GL_TEXTURE_BUFFER); #ifdef _WIN32 GLenum error = glGetError(); if(error!=GL_NO_ERROR) std::cerr << "caught " << gl_error_to_string(error) << '\n'; #endif }
//////////////////////////////////////////////////////////////////////////////// // on init cb void on_init() { // variables GLuint texture=0; GLint iterationCnt=sizeof(internalFormats)/(sizeof(GLenum)); #ifndef _WIN32 // Configure debug output glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); glDebugMessageCallbackARB( reinterpret_cast<GLDEBUGPROCARB>(&gl_debug_message_callback), reinterpret_cast<GLvoid*>(&i) ); #endif for(i=0; i<iterationCnt; ++i) { glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_1D, texture); glTexStorage1D(GL_TEXTURE_1D, 1, internalFormats[i], 1); glBindTexture(GL_TEXTURE_1D, 0); glDeleteTextures(1, &texture); #ifdef _WIN32 GLenum error = glGetError(); if(error!=GL_NO_ERROR) std::cerr << "glTexStorage1D gave " << gl_error_to_string(error) << " (internalformat= " << internalFormatsStr[i] << ")\n"; #endif } std::cerr << '\n'; // 2D tests for(i=0; i<iterationCnt; ++i) { glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexStorage2D(GL_TEXTURE_2D, 1, internalFormats[i], 1, 1); glDeleteTextures(1, &texture); #ifdef _WIN32 GLenum error = glGetError(); if(error!=GL_NO_ERROR) std::cerr << "glTexStorage2D gave " << gl_error_to_string(error) << " (internalformat= " << internalFormatsStr[i] << ")\n"; #endif } std::cerr << '\n'; // 3D tests for(i=0; i<iterationCnt; ++i) { glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_3D, texture); glTexStorage3D(GL_TEXTURE_3D, 1, internalFormats[i], 1, 1, 1); glDeleteTextures(1, &texture); #ifdef _WIN32 GLenum error = glGetError(); if(error!=GL_NO_ERROR) std::cerr << "glTexStorage3D gave " << gl_error_to_string(error) << " (internalformat= " << internalFormatsStr[i] << ")\n"; #endif } }