From 01a4d58432a52f084dd9614188291a8766da8100 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Sun, 16 Oct 2022 16:10:04 +0200 Subject: [PATCH] LibGL: Do not return early if client-side vertex array is disabled According to the spec, enabling the client-side vertex array should behave as if `glVertex` is executed after all other states such as the normal, color, etc. have changed. We were not changing these states if the client-side vertex array was disabled which probably does not affect a lot of applications, but this seems like the correct thing to do. :^) --- Userland/Libraries/LibGL/Vertex.cpp | 37 ++++++++++++----------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/Userland/Libraries/LibGL/Vertex.cpp b/Userland/Libraries/LibGL/Vertex.cpp index e35c0ab5ff..d8b890d2ef 100644 --- a/Userland/Libraries/LibGL/Vertex.cpp +++ b/Userland/Libraries/LibGL/Vertex.cpp @@ -18,11 +18,6 @@ void GLContext::gl_array_element(GLint i) // individual vertex attribute calls such as `gl_color`, `gl_normal` etc. RETURN_WITH_ERROR_IF(i < 0, GL_INVALID_VALUE); - // This is effectively the same as `gl_draw_elements`, except we only output a single - // vertex (this is done between a `gl_begin/end` call) that is to be rendered. - if (!m_client_side_vertex_array_enabled) - return; - if (m_client_side_color_array_enabled) { float color[4] { 0.f, 0.f, 0.f, 1.f }; read_from_vertex_attribute_pointer(m_client_color_pointer, i, color); @@ -43,9 +38,11 @@ void GLContext::gl_array_element(GLint i) gl_normal(normal[0], normal[1], normal[2]); } - float vertex[4] { 0.f, 0.f, 0.f, 1.f }; - read_from_vertex_attribute_pointer(m_client_vertex_pointer, i, vertex); - gl_vertex(vertex[0], vertex[1], vertex[2], vertex[3]); + if (m_client_side_vertex_array_enabled) { + float vertex[4] { 0.f, 0.f, 0.f, 1.f }; + read_from_vertex_attribute_pointer(m_client_vertex_pointer, i, vertex); + gl_vertex(vertex[0], vertex[1], vertex[2], vertex[3]); + } } void GLContext::gl_color(GLdouble r, GLdouble g, GLdouble b, GLdouble a) @@ -95,10 +92,6 @@ void GLContext::gl_draw_arrays(GLenum mode, GLint first, GLsizei count) RETURN_WITH_ERROR_IF(count < 0, GL_INVALID_VALUE); - // At least the vertex array needs to be enabled - if (!m_client_side_vertex_array_enabled) - return; - auto last = first + count; gl_begin(mode); for (int i = first; i < last; i++) { @@ -122,9 +115,11 @@ void GLContext::gl_draw_arrays(GLenum mode, GLint first, GLsizei count) gl_normal(normal[0], normal[1], normal[2]); } - float vertex[4] { 0.f, 0.f, 0.f, 1.f }; - read_from_vertex_attribute_pointer(m_client_vertex_pointer, i, vertex); - gl_vertex(vertex[0], vertex[1], vertex[2], vertex[3]); + if (m_client_side_vertex_array_enabled) { + float vertex[4] { 0.f, 0.f, 0.f, 1.f }; + read_from_vertex_attribute_pointer(m_client_vertex_pointer, i, vertex); + gl_vertex(vertex[0], vertex[1], vertex[2], vertex[3]); + } } gl_end(); } @@ -151,10 +146,6 @@ void GLContext::gl_draw_elements(GLenum mode, GLsizei count, GLenum type, void c RETURN_WITH_ERROR_IF(count < 0, GL_INVALID_VALUE); - // At least the vertex array needs to be enabled - if (!m_client_side_vertex_array_enabled) - return; - gl_begin(mode); for (int index = 0; index < count; index++) { int i = 0; @@ -190,9 +181,11 @@ void GLContext::gl_draw_elements(GLenum mode, GLsizei count, GLenum type, void c gl_normal(normal[0], normal[1], normal[2]); } - float vertex[4] { 0.f, 0.f, 0.f, 1.f }; - read_from_vertex_attribute_pointer(m_client_vertex_pointer, i, vertex); - gl_vertex(vertex[0], vertex[1], vertex[2], vertex[3]); + if (m_client_side_vertex_array_enabled) { + float vertex[4] { 0.f, 0.f, 0.f, 1.f }; + read_from_vertex_attribute_pointer(m_client_vertex_pointer, i, vertex); + gl_vertex(vertex[0], vertex[1], vertex[2], vertex[3]); + } } gl_end(); }