Pārlūkot izejas kodu

LibGL: Implement `glGetDoublev`

Jelle Raaijmakers 3 gadi atpakaļ
vecāks
revīzija
40724a426f

+ 2 - 1
Userland/Libraries/LibGL/GL/gl.h

@@ -407,8 +407,9 @@ GLAPI void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
 GLAPI void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
 GLAPI void glBindTexture(GLenum target, GLuint texture);
 GLAPI void glActiveTexture(GLenum texture);
-GLAPI void glGetFloatv(GLenum pname, GLfloat* params);
 GLAPI void glGetBooleanv(GLenum pname, GLboolean* data);
+GLAPI void glGetDoublev(GLenum pname, GLdouble* params);
+GLAPI void glGetFloatv(GLenum pname, GLfloat* params);
 GLAPI void glGetIntegerv(GLenum pname, GLint* data);
 GLAPI void glDepthMask(GLboolean flag);
 GLAPI void glEnableClientState(GLenum cap);

+ 2 - 1
Userland/Libraries/LibGL/GLContext.h

@@ -66,7 +66,6 @@ public:
     virtual void gl_tex_env(GLenum target, GLenum pname, GLfloat param) = 0;
     virtual void gl_bind_texture(GLenum target, GLuint texture) = 0;
     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;
@@ -77,6 +76,8 @@ public:
     virtual void gl_draw_elements(GLenum mode, GLsizei count, GLenum type, const void* indices) = 0;
     virtual void gl_color_mask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = 0;
     virtual void gl_get_booleanv(GLenum pname, GLboolean* data) = 0;
+    virtual void gl_get_doublev(GLenum pname, GLdouble* params) = 0;
+    virtual void gl_get_floatv(GLenum pname, GLfloat* params) = 0;
     virtual void gl_get_integerv(GLenum pname, GLint* data) = 0;
     virtual void gl_depth_range(GLdouble min, GLdouble max) = 0;
     virtual void gl_depth_func(GLenum func) = 0;

+ 9 - 4
Userland/Libraries/LibGL/GLUtils.cpp

@@ -100,14 +100,19 @@ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format
     g_gl_context->gl_read_pixels(x, y, width, height, format, type, pixels);
 }
 
-void glGetFloatv(GLenum pname, GLfloat* params)
+void glGetBooleanv(GLenum pname, GLboolean* data)
 {
-    g_gl_context->gl_get_floatv(pname, params);
+    g_gl_context->gl_get_booleanv(pname, data);
 }
 
-void glGetBooleanv(GLenum pname, GLboolean* data)
+void glGetDoublev(GLenum pname, GLdouble* params)
 {
-    g_gl_context->gl_get_booleanv(pname, data);
+    g_gl_context->gl_get_doublev(pname, params);
+}
+
+void glGetFloatv(GLenum pname, GLfloat* params)
+{
+    g_gl_context->gl_get_floatv(pname, params);
 }
 
 void glGetIntegerv(GLenum pname, GLint* data)

+ 42 - 32
Userland/Libraries/LibGL/SoftwareGLContext.cpp

@@ -1442,38 +1442,6 @@ void SoftwareGLContext::gl_active_texture(GLenum texture)
     m_active_texture_unit = &m_texture_units.at(texture - GL_TEXTURE0);
 }
 
-void SoftwareGLContext::gl_get_floatv(GLenum pname, GLfloat* params)
-{
-    RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
-
-    auto flatten_and_assign_matrix = [&params](const FloatMatrix4x4& matrix) {
-        auto elements = matrix.elements();
-
-        for (size_t i = 0; i < 4; ++i) {
-            for (size_t j = 0; j < 4; ++j) {
-                params[i * 4 + j] = elements[i][j];
-            }
-        }
-    };
-
-    switch (pname) {
-    case GL_MODELVIEW_MATRIX:
-        if (m_current_matrix_mode == GL_MODELVIEW)
-            flatten_and_assign_matrix(m_model_view_matrix);
-        else {
-            if (m_model_view_matrix_stack.is_empty())
-                flatten_and_assign_matrix(FloatMatrix4x4::identity());
-            else
-                flatten_and_assign_matrix(m_model_view_matrix_stack.last());
-        }
-        break;
-    default:
-        // FIXME: Because glQuake only requires GL_MODELVIEW_MATRIX, that is the only parameter
-        // that we currently support. More parameters should be supported.
-        RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM);
-    }
-}
-
 void SoftwareGLContext::gl_get_booleanv(GLenum pname, GLboolean* data)
 {
     RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
@@ -1510,6 +1478,48 @@ void SoftwareGLContext::gl_get_booleanv(GLenum pname, GLboolean* data)
     }
 }
 
+void SoftwareGLContext::gl_get_doublev(GLenum pname, GLdouble* params)
+{
+    get_floating_point(pname, params);
+}
+
+void SoftwareGLContext::gl_get_floatv(GLenum pname, GLfloat* params)
+{
+    get_floating_point(pname, params);
+}
+
+template<typename T>
+void SoftwareGLContext::get_floating_point(GLenum pname, T* params)
+{
+    RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
+
+    auto flatten_and_assign_matrix = [&params](const FloatMatrix4x4& matrix) {
+        auto elements = matrix.elements();
+
+        for (size_t i = 0; i < 4; ++i) {
+            for (size_t j = 0; j < 4; ++j) {
+                params[i * 4 + j] = static_cast<T>(elements[i][j]);
+            }
+        }
+    };
+
+    switch (pname) {
+    case GL_MODELVIEW_MATRIX:
+        if (m_current_matrix_mode == GL_MODELVIEW)
+            flatten_and_assign_matrix(m_model_view_matrix);
+        else {
+            if (m_model_view_matrix_stack.is_empty())
+                flatten_and_assign_matrix(FloatMatrix4x4::identity());
+            else
+                flatten_and_assign_matrix(m_model_view_matrix_stack.last());
+        }
+        break;
+    default:
+        dbgln_if(GL_DEBUG, "FIXME: unimplemented floating point parameter {:#x}", pname);
+        RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM);
+    }
+}
+
 void SoftwareGLContext::gl_get_integerv(GLenum pname, GLint* data)
 {
     RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);

+ 5 - 1
Userland/Libraries/LibGL/SoftwareGLContext.h

@@ -77,7 +77,6 @@ public:
     virtual void gl_tex_env(GLenum target, GLenum pname, GLfloat param) override;
     virtual void gl_bind_texture(GLenum target, GLuint texture) override;
     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;
@@ -88,6 +87,8 @@ public:
     virtual void gl_draw_elements(GLenum mode, GLsizei count, GLenum type, const void* indices) override;
     virtual void gl_color_mask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) override;
     virtual void gl_get_booleanv(GLenum pname, GLboolean* data) override;
+    virtual void gl_get_doublev(GLenum pname, GLdouble* params) override;
+    virtual void gl_get_floatv(GLenum pname, GLfloat* params) override;
     virtual void gl_get_integerv(GLenum pname, GLint* data) override;
     virtual void gl_depth_range(GLdouble min, GLdouble max) override;
     virtual void gl_depth_func(GLenum func) override;
@@ -117,6 +118,9 @@ private:
         m_current_listing_index->listing.entries.empend(member, Listing::ArgumentsFor<member> { forward<Args>(args)... });
     }
 
+    template<typename T>
+    void get_floating_point(GLenum pname, T* params);
+
     [[nodiscard]] bool should_append_to_listing() const { return m_current_listing_index.has_value(); }
     [[nodiscard]] bool should_execute_after_appending_to_listing() const { return m_current_listing_index.has_value() && m_current_listing_index->mode == GL_COMPILE_AND_EXECUTE; }