Explorar o código

LibGL: Implement `glListBase`

Jelle Raaijmakers %!s(int64=3) %!d(string=hai) anos
pai
achega
11fea6b597

+ 1 - 0
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();

+ 1 - 0
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;

+ 5 - 0
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();

+ 10 - 1
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 = [&]<typename T>(T const* lists) {
         for (int i = 0; i < n; ++i) {
             auto list = static_cast<size_t>(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);

+ 2 - 0
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<Listing> m_listings;
+    size_t m_list_base { 0 };
     struct CurrentListing {
         Listing listing;
         size_t index { 0 };