From 044582b0ce9c9ad60c298d27a4838b5ddd006b7c Mon Sep 17 00:00:00 2001 From: Stephan Unverwerth Date: Sat, 15 Jan 2022 18:08:14 +0100 Subject: [PATCH] LibGL: Add stubs for multitexturing and announce GL_ARB_multitexture This makes glquake recognize multitexture support and choose the multitexture rendering path. --- Userland/Libraries/LibGL/GL/gl.h | 5 +++++ Userland/Libraries/LibGL/GLContext.h | 2 ++ Userland/Libraries/LibGL/GLUtils.cpp | 10 ++++++++++ Userland/Libraries/LibGL/GLVert.cpp | 10 ++++++++++ Userland/Libraries/LibGL/SoftwareGLContext.cpp | 16 +++++++++++++++- Userland/Libraries/LibGL/SoftwareGLContext.h | 2 ++ 6 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 06c46d5463..a025c9136e 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -571,6 +571,8 @@ GLAPI void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r); GLAPI void glTexCoord3fv(GLfloat const* v); GLAPI void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q); GLAPI void glTexCoord4fv(const GLfloat* v); +GLAPI void glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t); +GLAPI void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t); GLAPI void glTexParameteri(GLenum target, GLenum pname, GLint param); GLAPI void glTexParameterf(GLenum target, GLenum pname, GLfloat param); GLAPI void glTexEnvf(GLenum target, GLenum pname, GLfloat param); @@ -586,6 +588,9 @@ GLAPI void glGetIntegerv(GLenum pname, GLint* data); GLAPI void glDepthMask(GLboolean flag); GLAPI void glEnableClientState(GLenum cap); GLAPI void glDisableClientState(GLenum cap); +GLAPI void glClientActiveTextureARB(GLenum target); +GLAPI void glClientActiveTexture(GLenum target); + GLAPI void glVertexPointer(GLint size, GLenum type, GLsizei stride, const void* pointer); GLAPI void glColorPointer(GLint size, GLenum type, GLsizei stride, const void* pointer); GLAPI void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void* pointer); diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index 1eecd49830..d4949d1123 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -69,6 +69,7 @@ public: virtual void gl_tex_sub_image_2d(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* data) = 0; virtual void gl_tex_parameter(GLenum target, GLenum pname, GLfloat param) = 0; virtual void gl_tex_coord(GLfloat s, GLfloat t, GLfloat r, GLfloat q) = 0; + virtual void gl_multi_tex_coord(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) = 0; virtual void gl_tex_env(GLenum target, GLenum pname, GLfloat param) = 0; virtual void gl_bind_texture(GLenum target, GLuint texture) = 0; virtual GLboolean gl_is_texture(GLuint texture) = 0; @@ -76,6 +77,7 @@ public: 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; + virtual void gl_client_active_texture(GLenum target) = 0; virtual void gl_vertex_pointer(GLint size, GLenum type, GLsizei stride, const void* pointer) = 0; virtual void gl_color_pointer(GLint size, GLenum type, GLsizei stride, const void* pointer) = 0; virtual void gl_tex_coord_pointer(GLint size, GLenum type, GLsizei stride, const void* pointer) = 0; diff --git a/Userland/Libraries/LibGL/GLUtils.cpp b/Userland/Libraries/LibGL/GLUtils.cpp index b580730c72..1ba627d5bc 100644 --- a/Userland/Libraries/LibGL/GLUtils.cpp +++ b/Userland/Libraries/LibGL/GLUtils.cpp @@ -135,6 +135,16 @@ void glDisableClientState(GLenum cap) g_gl_context->gl_disable_client_state(cap); } +void glClientActiveTextureARB(GLenum target) +{ + glClientActiveTexture(target); +} + +void glClientActiveTexture(GLenum target) +{ + g_gl_context->gl_client_active_texture(target); +} + void glDepthRange(GLdouble min, GLdouble max) { g_gl_context->gl_depth_range(min, max); diff --git a/Userland/Libraries/LibGL/GLVert.cpp b/Userland/Libraries/LibGL/GLVert.cpp index 15fde5d54f..a0a40e9082 100644 --- a/Userland/Libraries/LibGL/GLVert.cpp +++ b/Userland/Libraries/LibGL/GLVert.cpp @@ -195,6 +195,16 @@ void glTexCoord4fv(const GLfloat* v) g_gl_context->gl_tex_coord(v[0], v[1], v[2], v[3]); } +void glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t) +{ + glMultiTexCoord2f(target, s, t); +} + +void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t) +{ + g_gl_context->gl_multi_tex_coord(target, s, t, 0.0f, 1.0f); +} + void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) { g_gl_context->gl_normal(nx, ny, nz); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index f7e777235b..ee5669941f 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -621,7 +621,6 @@ void SoftwareGLContext::gl_vertex(GLdouble x, GLdouble y, GLdouble z, GLdouble w m_vertex_list.append(vertex); } -// FIXME: We need to add `r` and `q` to our GLVertex?! void SoftwareGLContext::gl_tex_coord(GLfloat s, GLfloat t, GLfloat r, GLfloat q) { APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_tex_coord, s, t, r, q); @@ -629,6 +628,13 @@ void SoftwareGLContext::gl_tex_coord(GLfloat s, GLfloat t, GLfloat r, GLfloat q) m_current_vertex_tex_coord = { s, t, r, q }; } +void SoftwareGLContext::gl_multi_tex_coord(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) +{ + APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_multi_tex_coord, target, s, t, r, q); + + m_current_vertex_tex_coord = { s, t, r, q }; +} + void SoftwareGLContext::gl_viewport(GLint x, GLint y, GLsizei width, GLsizei height) { APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_viewport, x, y, width, height); @@ -2031,6 +2037,11 @@ void SoftwareGLContext::gl_disable_client_state(GLenum cap) } } +void SoftwareGLContext::gl_client_active_texture(GLenum target) +{ + (void)target; +} + void SoftwareGLContext::gl_vertex_pointer(GLint size, GLenum type, GLsizei stride, const void* pointer) { RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); @@ -3264,6 +3275,9 @@ void SoftwareGLContext::build_extension_string() if (m_device_info.supports_npot_textures) extensions.append("GL_ARB_texture_non_power_of_two"); + if (m_device_info.num_texture_units > 1) + extensions.append("GL_ARB_multitexture"); + m_extensions = String::join(" ", extensions); } diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index 8448098990..de07d5efd7 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -100,6 +100,7 @@ public: virtual void gl_tex_sub_image_2d(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* data) override; virtual void gl_tex_parameter(GLenum target, GLenum pname, GLfloat param) override; virtual void gl_tex_coord(GLfloat s, GLfloat t, GLfloat r, GLfloat q) override; + virtual void gl_multi_tex_coord(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) override; virtual void gl_tex_env(GLenum target, GLenum pname, GLfloat param) override; virtual void gl_bind_texture(GLenum target, GLuint texture) override; virtual GLboolean gl_is_texture(GLuint texture) override; @@ -107,6 +108,7 @@ public: 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; + virtual void gl_client_active_texture(GLenum target) override; virtual void gl_vertex_pointer(GLint size, GLenum type, GLsizei stride, const void* pointer) override; virtual void gl_color_pointer(GLint size, GLenum type, GLsizei stride, const void* pointer) override; virtual void gl_tex_coord_pointer(GLint size, GLenum type, GLsizei stride, const void* pointer) override;