diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index fed22b9269..dc310e6721 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -168,6 +168,8 @@ Optional SoftwareGLContext::get_context_parameter(GLenum name) return ContextParameter { .type = GL_INT, .value = { .integer_value = 0 } }; case GL_PACK_SWAP_BYTES: return ContextParameter { .type = GL_BOOL, .value = { .boolean_value = false } }; + case GL_POLYGON_OFFSET_FILL: + return ContextParameter { .type = GL_BOOL, .is_capability = true, .value = { .boolean_value = m_depth_offset_enabled } }; case GL_RED_BITS: return ContextParameter { .type = GL_INT, .value = { .integer_value = sizeof(float) * 8 } }; case GL_SCISSOR_BOX: { @@ -723,6 +725,11 @@ void SoftwareGLContext::gl_enable(GLenum capability) rasterizer_options.normalization_enabled = true; update_rasterizer_options = true; break; + case GL_POLYGON_OFFSET_FILL: + m_depth_offset_enabled = true; + rasterizer_options.depth_offset_enabled = true; + update_rasterizer_options = true; + break; case GL_SCISSOR_TEST: rasterizer_options.scissor_enabled = true; update_rasterizer_options = true; @@ -836,6 +843,11 @@ void SoftwareGLContext::gl_disable(GLenum capability) rasterizer_options.normalization_enabled = false; update_rasterizer_options = true; break; + case GL_POLYGON_OFFSET_FILL: + m_depth_offset_enabled = false; + rasterizer_options.depth_offset_enabled = false; + update_rasterizer_options = true; + break; case GL_SCISSOR_TEST: rasterizer_options.scissor_enabled = false; update_rasterizer_options = true; diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index ce4ebd73f5..bd0b5fb579 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -212,7 +212,8 @@ private: GLenum m_error = GL_NO_ERROR; bool m_in_draw_state = false; - bool m_depth_test_enabled = false; + bool m_depth_test_enabled { false }; + bool m_depth_offset_enabled { false }; bool m_cull_faces = false; GLenum m_front_face = GL_CCW; diff --git a/Userland/Libraries/LibSoftGPU/Device.cpp b/Userland/Libraries/LibSoftGPU/Device.cpp index 1268342006..444a3d365f 100644 --- a/Userland/Libraries/LibSoftGPU/Device.cpp +++ b/Userland/Libraries/LibSoftGPU/Device.cpp @@ -413,7 +413,8 @@ void Device::rasterize_triangle(const Triangle& triangle) quad.depth = interpolate(vertex0.window_coordinates.z(), vertex1.window_coordinates.z(), vertex2.window_coordinates.z(), quad.barycentrics); // FIXME: Also apply depth_offset_factor which depends on the depth gradient - quad.depth += m_options.depth_offset_constant * NumericLimits::epsilon(); + if (m_options.depth_offset_enabled) + quad.depth += m_options.depth_offset_constant * NumericLimits::epsilon(); i32x4 depth_test_passed; switch (m_options.depth_func) { diff --git a/Userland/Libraries/LibSoftGPU/Device.h b/Userland/Libraries/LibSoftGPU/Device.h index d8de64fe3b..79246ce56a 100644 --- a/Userland/Libraries/LibSoftGPU/Device.h +++ b/Userland/Libraries/LibSoftGPU/Device.h @@ -66,6 +66,7 @@ struct RasterizerOptions { bool enable_color_write { true }; float depth_offset_factor { 0 }; float depth_offset_constant { 0 }; + bool depth_offset_enabled { false }; bool enable_culling { false }; WindingOrder front_face { WindingOrder::CounterClockwise }; bool cull_back { true };