From 40724a426f76a3f560b12d55e8f4e4bfcd53aa02 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Wed, 1 Dec 2021 13:07:30 +0100 Subject: [PATCH] LibGL: Implement `glGetDoublev` --- Userland/Libraries/LibGL/GL/gl.h | 3 +- Userland/Libraries/LibGL/GLContext.h | 3 +- Userland/Libraries/LibGL/GLUtils.cpp | 15 ++-- .../Libraries/LibGL/SoftwareGLContext.cpp | 74 +++++++++++-------- Userland/Libraries/LibGL/SoftwareGLContext.h | 6 +- 5 files changed, 61 insertions(+), 40 deletions(-) diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 9dcca68f56..0a2cf84ad6 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/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); diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index d085c737ed..ddd7d9e296 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/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; diff --git a/Userland/Libraries/LibGL/GLUtils.cpp b/Userland/Libraries/LibGL/GLUtils.cpp index 5afd172f5b..348b2b269e 100644 --- a/Userland/Libraries/LibGL/GLUtils.cpp +++ b/Userland/Libraries/LibGL/GLUtils.cpp @@ -100,16 +100,21 @@ 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) -{ - g_gl_context->gl_get_floatv(pname, params); -} - void glGetBooleanv(GLenum pname, GLboolean* data) { g_gl_context->gl_get_booleanv(pname, data); } +void glGetDoublev(GLenum pname, GLdouble* params) +{ + 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) { g_gl_context->gl_get_integerv(pname, data); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index d64a328ba8..495e29401c 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/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 = [¶ms](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 +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 = [¶ms](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(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); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index 2faf5bd7b0..c95a125a1b 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/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 { forward(args)... }); } + template + 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; }