From 61bd1890d215dccdbdddcc9d541424299d457319 Mon Sep 17 00:00:00 2001 From: Erik Biederstadt Date: Tue, 8 Jun 2021 21:34:50 -0600 Subject: [PATCH] LibGL: Implement very basic version of glGetFloatv This is a very basic implementation of glGetfloatv. It will only give a result when used with GL_MODELVIEW_MATRIX. In the future we can update and extend it's functionality. --- Userland/Libraries/LibGL/GL/gl.h | 4 +++ Userland/Libraries/LibGL/GLContext.h | 1 + Userland/Libraries/LibGL/GLUtils.cpp | 5 +++ .../Libraries/LibGL/SoftwareGLContext.cpp | 32 +++++++++++++++++++ Userland/Libraries/LibGL/SoftwareGLContext.h | 1 + 5 files changed, 43 insertions(+) diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 62af06aab0bc32..5b6325061601e3 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -201,6 +201,9 @@ extern "C" { #define GL_NEAREST_MIPMAP_LINEAR 0x2602 #define GL_REPEAT 0x2603 +// OpenGL State & GLGet +#define GL_MODELVIEW_MATRIX 0x0BA6 + // // OpenGL typedefs // @@ -294,6 +297,7 @@ GLAPI void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsize GLAPI void glTexCoord2f(GLfloat s, GLfloat t); GLAPI void glBindTexture(GLenum target, GLuint texture); GLAPI void glActiveTexture(GLenum texture); +GLAPI void glGetFloatv(GLenum pname, GLfloat* params); #ifdef __cplusplus } diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index 7f0279f8bd288a..a352ef85961c3f 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -61,6 +61,7 @@ class GLContext { virtual void gl_tex_coord(GLfloat s, GLfloat t, GLfloat r, GLfloat q) = 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 present() = 0; }; diff --git a/Userland/Libraries/LibGL/GLUtils.cpp b/Userland/Libraries/LibGL/GLUtils.cpp index 46ccd7f1dc6510..732315fdd041c9 100644 --- a/Userland/Libraries/LibGL/GLUtils.cpp +++ b/Userland/Libraries/LibGL/GLUtils.cpp @@ -84,3 +84,8 @@ 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); +} diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index c26e462d824a20..ec5c9dad33f266 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -1291,6 +1291,38 @@ 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. + TODO(); + } +} + void SoftwareGLContext::present() { m_rasterizer.blit_to(*m_frontbuffer); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index 40ab70c0ed414f..d41d92fbd77dbd 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -71,6 +71,7 @@ class SoftwareGLContext : public GLContext { virtual void gl_tex_coord(GLfloat s, GLfloat t, GLfloat r, GLfloat q) 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 present() override;