From 11fea6b597959fa8c66cb715cf67bef39aca573e Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Wed, 1 Dec 2021 14:34:26 +0100 Subject: [PATCH] LibGL: Implement `glListBase` --- Userland/Libraries/LibGL/GL/gl.h | 1 + Userland/Libraries/LibGL/GLContext.h | 1 + Userland/Libraries/LibGL/GLLists.cpp | 5 +++++ Userland/Libraries/LibGL/SoftwareGLContext.cpp | 11 ++++++++++- Userland/Libraries/LibGL/SoftwareGLContext.h | 2 ++ 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 79aeb5be76..2be8dc296c 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -393,6 +393,7 @@ GLAPI GLuint glGenLists(GLsizei range); GLAPI void glCallList(GLuint list); GLAPI void glCallLists(GLsizei n, GLenum type, void const* lists); GLAPI void glDeleteLists(GLuint list, GLsizei range); +GLAPI void glListBase(GLuint base); GLAPI void glEndList(void); GLAPI void glNewList(GLuint list, GLenum mode); GLAPI void glFlush(); diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index ba170a2cae..c7590cdc2d 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -50,6 +50,7 @@ public: virtual void gl_call_list(GLuint list) = 0; virtual void gl_call_lists(GLsizei n, GLenum type, void const* lists) = 0; virtual void gl_delete_lists(GLuint list, GLsizei range) = 0; + virtual void gl_list_base(GLuint base) = 0; virtual void gl_end_list(void) = 0; virtual void gl_new_list(GLuint list, GLenum mode) = 0; virtual void gl_flush() = 0; diff --git a/Userland/Libraries/LibGL/GLLists.cpp b/Userland/Libraries/LibGL/GLLists.cpp index bf6fe17bdf..e1b34ec691 100644 --- a/Userland/Libraries/LibGL/GLLists.cpp +++ b/Userland/Libraries/LibGL/GLLists.cpp @@ -29,6 +29,11 @@ void glDeleteLists(GLuint list, GLsizei range) return g_gl_context->gl_delete_lists(list, range); } +void glListBase(GLuint base) +{ + return g_gl_context->gl_list_base(base); +} + void glEndList(void) { return g_gl_context->gl_end_list(); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index 323850811e..efb526cf1e 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -926,7 +926,7 @@ void SoftwareGLContext::gl_call_lists(GLsizei n, GLenum type, void const* lists) auto invoke_all_lists = [&](T const* lists) { for (int i = 0; i < n; ++i) { auto list = static_cast(lists[i]); - invoke_list(list); + invoke_list(m_list_base + list); } }; switch (type) { @@ -970,6 +970,15 @@ void SoftwareGLContext::gl_delete_lists(GLuint list, GLsizei range) entry.entries.clear_with_capacity(); } +void SoftwareGLContext::gl_list_base(GLuint base) +{ + APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_list_base, base); + + RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); + + m_list_base = base; +} + void SoftwareGLContext::gl_end_list() { RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index c99c3fe91a..6bc51700b3 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -61,6 +61,7 @@ public: virtual void gl_call_list(GLuint list) override; virtual void gl_call_lists(GLsizei n, GLenum type, void const* lists) override; virtual void gl_delete_lists(GLuint list, GLsizei range) override; + virtual void gl_list_base(GLuint base) override; virtual void gl_end_list(void) override; virtual void gl_new_list(GLuint list, GLenum mode) override; virtual void gl_flush() override; @@ -254,6 +255,7 @@ private: static constexpr size_t max_allowed_gl_call_depth { 128 }; size_t m_gl_call_depth { 0 }; Vector m_listings; + size_t m_list_base { 0 }; struct CurrentListing { Listing listing; size_t index { 0 };