From 5f863016ca82b643b98f3759469e2f0b38f83485 Mon Sep 17 00:00:00 2001 From: Stephan Unverwerth Date: Fri, 13 Aug 2021 01:06:26 +0200 Subject: [PATCH] LibGL: Implement glDepthMask --- Userland/Libraries/LibGL/GL/gl.h | 2 ++ Userland/Libraries/LibGL/GLContext.h | 1 + Userland/Libraries/LibGL/GLUtils.cpp | 5 +++++ Userland/Libraries/LibGL/SoftwareGLContext.cpp | 11 +++++++++++ Userland/Libraries/LibGL/SoftwareGLContext.h | 4 +++- Userland/Libraries/LibGL/SoftwareRasterizer.cpp | 4 +++- Userland/Libraries/LibGL/SoftwareRasterizer.h | 1 + 7 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 7ccf501a636..8cf5b85155e 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -263,6 +263,7 @@ typedef char GLchar; typedef char GLbyte; typedef unsigned char GLuchar; typedef unsigned char GLubyte; +typedef unsigned char GLboolean; typedef short GLshort; typedef unsigned short GLushort; typedef int GLint; @@ -352,6 +353,7 @@ GLAPI void glTexParameterf(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 glDepthMask(GLboolean flag); #ifdef __cplusplus } diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index cf4966a4f01..f518e8ab478 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -63,6 +63,7 @@ public: 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 present() = 0; }; diff --git a/Userland/Libraries/LibGL/GLUtils.cpp b/Userland/Libraries/LibGL/GLUtils.cpp index 732315fdd04..bdd374a4104 100644 --- a/Userland/Libraries/LibGL/GLUtils.cpp +++ b/Userland/Libraries/LibGL/GLUtils.cpp @@ -89,3 +89,8 @@ void glGetFloatv(GLenum pname, GLfloat* params) { g_gl_context->gl_get_floatv(pname, params); } + +void glDepthMask(GLboolean flag) +{ + g_gl_context->gl_depth_mask(flag); +} diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index d1b5bc4c5d4..c50fece3343 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -1392,6 +1392,17 @@ void SoftwareGLContext::gl_get_floatv(GLenum pname, GLfloat* params) } } +void SoftwareGLContext::gl_depth_mask(GLboolean flag) +{ + APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_depth_mask, flag); + + RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); + + auto options = m_rasterizer.options(); + options.enable_depth_write = (flag != GL_FALSE); + m_rasterizer.set_options(options); +} + void SoftwareGLContext::present() { m_rasterizer.blit_to(*m_frontbuffer); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index 4192fa8cde8..02dade49ed8 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -73,6 +73,7 @@ public: 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 present() override; @@ -196,7 +197,8 @@ private: decltype(&SoftwareGLContext::gl_alpha_func), decltype(&SoftwareGLContext::gl_hint), decltype(&SoftwareGLContext::gl_read_buffer), - decltype(&SoftwareGLContext::gl_tex_parameter)>; + decltype(&SoftwareGLContext::gl_tex_parameter), + decltype(&SoftwareGLContext::gl_depth_mask)>; using ExtraSavedArguments = Variant< FloatMatrix4x4>; diff --git a/Userland/Libraries/LibGL/SoftwareRasterizer.cpp b/Userland/Libraries/LibGL/SoftwareRasterizer.cpp index a320a13ce41..61c17aa173f 100644 --- a/Userland/Libraries/LibGL/SoftwareRasterizer.cpp +++ b/Userland/Libraries/LibGL/SoftwareRasterizer.cpp @@ -265,7 +265,9 @@ static void rasterize_triangle(const RasterizerOptions& options, Gfx::Bitmap& re continue; } - *depth = z; + if (options.enable_depth_write) + *depth = z; + z_pass_count++; } } diff --git a/Userland/Libraries/LibGL/SoftwareRasterizer.h b/Userland/Libraries/LibGL/SoftwareRasterizer.h index 19f7ce1c84f..6d4d15f2cf5 100644 --- a/Userland/Libraries/LibGL/SoftwareRasterizer.h +++ b/Userland/Libraries/LibGL/SoftwareRasterizer.h @@ -21,6 +21,7 @@ namespace GL { struct RasterizerOptions { bool shade_smooth { true }; bool enable_depth_test { false }; + bool enable_depth_write { true }; bool enable_alpha_test { false }; GLenum alpha_test_func { GL_ALWAYS }; float alpha_test_ref_value { 0 };