diff --git a/game/graphics/opengl_renderer/DirectRenderer.cpp b/game/graphics/opengl_renderer/DirectRenderer.cpp index 343b6c8633..0bcb603e48 100644 --- a/game/graphics/opengl_renderer/DirectRenderer.cpp +++ b/game/graphics/opengl_renderer/DirectRenderer.cpp @@ -83,6 +83,10 @@ void DirectRenderer::flush_pending(SharedRenderState* render_state) { // glEnable(GL_DEPTH_TEST); // glDepthFunc(GL_ALWAYS); + GLuint vao; + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + // render! // update buffers: glBindBuffer(GL_ARRAY_BUFFER, m_ogl.vertex_buffer); @@ -130,8 +134,11 @@ void DirectRenderer::flush_pending(SharedRenderState* render_state) { } // assert(false); glDrawArrays(GL_TRIANGLES, 0, m_prim_buffer.vert_count); + glBindVertexArray(0); m_triangles += m_prim_buffer.vert_count / 3; m_prim_buffer.vert_count = 0; + + glDeleteVertexArrays(1, &vao); } void DirectRenderer::update_gl_prim(SharedRenderState* render_state) { @@ -775,4 +782,4 @@ void DirectRenderer::PrimitiveBuffer::push(const math::Vector& rgba, verts[vert_count] = vert; sts[vert_count] = st; vert_count++; -} \ No newline at end of file +} diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index 22cc5209ed..588145991d 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -10,24 +10,37 @@ /*! * OpenGL Error callback. If we do something invalid, this will be called. */ -void GLAPIENTRY opengl_error_callback(GLenum /*source*/, - GLenum /*type*/, - GLuint /*id*/, +void GLAPIENTRY opengl_error_callback(GLenum source, + GLenum type, + GLuint id, GLenum severity, GLsizei /*length*/, const GLchar* message, const void* /*userParam*/) { if (severity == GL_DEBUG_SEVERITY_NOTIFICATION) { return; + } else if (severity == GL_DEBUG_SEVERITY_LOW) { + lg::info("OpenGL message 0x{:X} S{:X} T{:X}: {}", id, source, type, message); + } else if (severity == GL_DEBUG_SEVERITY_MEDIUM) { + lg::warn("OpenGL warn 0x{:X} S{:X} T{:X}: {}", id, source, type, message); + } else if (severity == GL_DEBUG_SEVERITY_HIGH) { + lg::error("OpenGL error 0x{:X} S{:X} T{:X}: {}", id, source, type, message); } - lg::error("OpenGL error: {}", message); } OpenGLRenderer::OpenGLRenderer(std::shared_ptr texture_pool) : m_render_state(texture_pool) { // setup OpenGL errors + + // disable specific errors + const GLuint l_gl_error_ignores[1] = { + 0x64 // [API-PERFORMANCE] glDrawArrays uses non-native input attribute type + }; glEnable(GL_DEBUG_OUTPUT); glDebugMessageCallback(opengl_error_callback, nullptr); + // filter + glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_PERFORMANCE, GL_DONT_CARE, 1, + &l_gl_error_ignores[0], GL_FALSE); // initialize all renderers init_bucket_renderers(); @@ -125,10 +138,13 @@ void OpenGLRenderer::draw_test_triangle() { ////////// // create "buffer object names" - GLuint vertex_buffer, color_buffer; + GLuint vertex_buffer, color_buffer, vao; glGenBuffers(1, &vertex_buffer); glGenBuffers(1, &color_buffer); + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + // set vertex data glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); const float verts[9] = {0.0, 0.8, 0, -0.5, -0.5 * .866, 0, 0.5, -0.5 * .866, 0}; @@ -161,6 +177,7 @@ void OpenGLRenderer::draw_test_triangle() { glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)0); glDrawArrays(GL_TRIANGLES, 0, 3); + glBindVertexArray(0); //////////// // Clean Up @@ -168,4 +185,5 @@ void OpenGLRenderer::draw_test_triangle() { // delete buffer glDeleteBuffers(1, &color_buffer); glDeleteBuffers(1, &vertex_buffer); + glDeleteVertexArrays(1, &vao); } diff --git a/game/graphics/pipelines/opengl.cpp b/game/graphics/pipelines/opengl.cpp index 8d7035a5f5..b89b49fb41 100644 --- a/game/graphics/pipelines/opengl.cpp +++ b/game/graphics/pipelines/opengl.cpp @@ -77,9 +77,11 @@ static int gl_init() { return 1; } - // request OpenGL 3.0 (placeholder) - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + // request Debug OpenGL 3.3 Core + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 3.3 + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE); // debug + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // core profile, not compat return 0; } diff --git a/game/runtime.cpp b/game/runtime.cpp index 4743e1940a..93c34153cc 100644 --- a/game/runtime.cpp +++ b/game/runtime.cpp @@ -255,7 +255,7 @@ void dmac_runner(SystemThreadInterface& iface) { while (!iface.get_want_exit() && !VM::vm_want_exit()) { for (int i = 0; i < 10; ++i) { if (VM::dmac_ch[i]->chcr.str) { - lg::info("DMA detected on channel {}, clearing", i); + // lg::info("DMA detected on channel {}, clearing", i); VM::dmac_ch[i]->chcr.str = 0; } } diff --git a/scripts/batch/gc.bat b/scripts/batch/gc.bat index 1ae4ba22db..41c045d531 100644 --- a/scripts/batch/gc.bat +++ b/scripts/batch/gc.bat @@ -1,3 +1,4 @@ @echo off cd ..\.. out\build\Release\bin\goalc -v -auto-lt +pause diff --git a/scripts/batch/gk-display.bat b/scripts/batch/gk-display.bat index 331d19cb32..2bbd74e3eb 100644 --- a/scripts/batch/gk-display.bat +++ b/scripts/batch/gk-display.bat @@ -1,3 +1,4 @@ @echo off cd ..\.. out\build\Release\bin\gk -fakeiso -debug -v +pause diff --git a/scripts/batch/gk.bat b/scripts/batch/gk.bat index a30edec307..b020e3bb0d 100644 --- a/scripts/batch/gk.bat +++ b/scripts/batch/gk.bat @@ -1,3 +1,4 @@ @echo off cd ..\.. out\build\Release\bin\gk -fakeiso -debug -v -nodisplay +pause