diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 8cf5b85155..7205a63944 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -354,6 +354,8 @@ GLAPI void glBindTexture(GLenum target, GLuint texture); GLAPI void glActiveTexture(GLenum texture); GLAPI void glGetFloatv(GLenum pname, GLfloat* params); GLAPI void glDepthMask(GLboolean flag); +GLAPI void glEnableClientState(GLenum cap); +GLAPI void glDisableClientState(GLenum cap); #ifdef __cplusplus } diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index f518e8ab47..e542c50816 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -64,6 +64,8 @@ public: virtual void gl_active_texture(GLenum texture) = 0; virtual void gl_get_floatv(GLenum pname, GLfloat* params) = 0; virtual void gl_depth_mask(GLboolean flag) = 0; + virtual void gl_enable_client_state(GLenum cap) = 0; + virtual void gl_disable_client_state(GLenum cap) = 0; virtual void present() = 0; }; diff --git a/Userland/Libraries/LibGL/GLUtils.cpp b/Userland/Libraries/LibGL/GLUtils.cpp index bdd374a410..77abfd8d11 100644 --- a/Userland/Libraries/LibGL/GLUtils.cpp +++ b/Userland/Libraries/LibGL/GLUtils.cpp @@ -94,3 +94,13 @@ void glDepthMask(GLboolean flag) { g_gl_context->gl_depth_mask(flag); } + +void glEnableClientState(GLenum cap) +{ + g_gl_context->gl_enable_client_state(cap); +} + +void glDisableClientState(GLenum cap) +{ + g_gl_context->gl_disable_client_state(cap); +} diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index c50fece334..c87e5016a2 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -1403,6 +1403,50 @@ void SoftwareGLContext::gl_depth_mask(GLboolean flag) m_rasterizer.set_options(options); } +void SoftwareGLContext::gl_enable_client_state(GLenum cap) +{ + RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); + + switch (cap) { + case GL_VERTEX_ARRAY: + m_client_side_vertex_array_enabled = true; + break; + + case GL_COLOR_ARRAY: + m_client_side_color_array_enabled = true; + break; + + case GL_TEXTURE_COORD_ARRAY: + m_client_side_texture_coord_array_enabled = true; + break; + + default: + RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM); + } +} + +void SoftwareGLContext::gl_disable_client_state(GLenum cap) +{ + RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); + + switch (cap) { + case GL_VERTEX_ARRAY: + m_client_side_vertex_array_enabled = false; + break; + + case GL_COLOR_ARRAY: + m_client_side_color_array_enabled = false; + break; + + case GL_TEXTURE_COORD_ARRAY: + m_client_side_texture_coord_array_enabled = false; + break; + + default: + RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM); + } +} + void SoftwareGLContext::present() { m_rasterizer.blit_to(*m_frontbuffer); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index 02dade49ed..b2a75fabd3 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -74,6 +74,8 @@ public: virtual void gl_active_texture(GLenum texture) override; virtual void gl_get_floatv(GLenum pname, GLfloat* params) override; virtual void gl_depth_mask(GLboolean flag) override; + virtual void gl_enable_client_state(GLenum cap) override; + virtual void gl_disable_client_state(GLenum cap) override; virtual void present() override; @@ -134,6 +136,11 @@ private: GLenum m_current_read_buffer = GL_BACK; + // Client side arrays + bool m_client_side_vertex_array_enabled = false; + bool m_client_side_color_array_enabled = false; + bool m_client_side_texture_coord_array_enabled = false; + NonnullRefPtr m_frontbuffer; Clipper m_clipper;