[PATCH 4/7] wined3d: Implement depth bias clamp.

Henri Verbeet hverbeet at codeweavers.com
Mon Oct 8 13:25:39 CDT 2018


From: Zebediah Figura <z.figura12 at gmail.com>

Based on a patch by Michael Müller.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/d3d11/state.c        |  1 +
 dlls/wined3d/adapter_gl.c |  8 +++++++-
 dlls/wined3d/state.c      | 18 ++++++++++++++++--
 dlls/wined3d/wined3d_gl.h |  1 +
 include/wine/wined3d.h    |  1 +
 5 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/dlls/d3d11/state.c b/dlls/d3d11/state.c
index c36b87fbbd3..6de35029556 100644
--- a/dlls/d3d11/state.c
+++ b/dlls/d3d11/state.c
@@ -1081,6 +1081,7 @@ static HRESULT d3d_rasterizer_state_init(struct d3d_rasterizer_state *state, str
 
     wined3d_desc.front_ccw = desc->FrontCounterClockwise;
     wined3d_desc.depth_clip = desc->DepthClipEnable;
+    wined3d_desc.depth_bias_clamp = desc->DepthBiasClamp;
 
     /* We cannot fail after creating a wined3d_rasterizer_state object. It
      * would lead to double free. */
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index b62c86a8d0c..16a26b88ba6 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -103,6 +103,7 @@ static const struct wined3d_extension_map gl_extension_map[] =
     {"GL_ARB_pixel_buffer_object",          ARB_PIXEL_BUFFER_OBJECT       },
     {"GL_ARB_point_parameters",             ARB_POINT_PARAMETERS          },
     {"GL_ARB_point_sprite",                 ARB_POINT_SPRITE              },
+    {"GL_ARB_polygon_offset_clamp",         ARB_POLYGON_OFFSET_CLAMP      },
     {"GL_ARB_provoking_vertex",             ARB_PROVOKING_VERTEX          },
     {"GL_ARB_query_buffer_object",          ARB_QUERY_BUFFER_OBJECT       },
     {"GL_ARB_sample_shading",               ARB_SAMPLE_SHADING            },
@@ -1254,7 +1255,9 @@ static enum wined3d_feature_level feature_level_from_caps(const struct wined3d_g
     shader_model = min(shader_model, max(shader_caps->hs_version, 4));
     shader_model = min(shader_model, max(shader_caps->ds_version, 4));
 
-    if (gl_info->supported[WINED3D_GL_VERSION_3_2] && gl_info->supported[ARB_SAMPLER_OBJECTS])
+    if (gl_info->supported[WINED3D_GL_VERSION_3_2]
+            && gl_info->supported[ARB_POLYGON_OFFSET_CLAMP]
+            && gl_info->supported[ARB_SAMPLER_OBJECTS])
     {
         if (shader_model >= 5
                 && gl_info->supported[ARB_DRAW_INDIRECT]
@@ -2172,6 +2175,8 @@ static void load_gl_funcs(struct wined3d_gl_info *gl_info)
     /* GL_ARB_point_parameters */
     USE_GL_FUNC(glPointParameterfARB)
     USE_GL_FUNC(glPointParameterfvARB)
+    /* GL_ARB_polgyon_offset_clamp */
+    USE_GL_FUNC(glPolygonOffsetClamp)
     /* GL_ARB_provoking_vertex */
     USE_GL_FUNC(glProvokingVertex)
     /* GL_ARB_sample_shading */
@@ -3316,6 +3321,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
         {ARB_SHADER_TEXTURE_IMAGE_SAMPLES, MAKEDWORD_VERSION(4, 5)},
 
         {ARB_PIPELINE_STATISTICS_QUERY,    MAKEDWORD_VERSION(4, 6)},
+        {ARB_POLYGON_OFFSET_CLAMP,         MAKEDWORD_VERSION(4, 6)},
         {ARB_TEXTURE_FILTER_ANISOTROPIC,   MAKEDWORD_VERSION(4, 6)},
     };
     struct wined3d_driver_info *driver_info = &adapter->driver_info;
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 3b2f84538db..375bc6562ab 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -1775,7 +1775,7 @@ static void state_depthbias(struct wined3d_context *context, const struct wined3
             || state->render_states[WINED3D_RS_DEPTHBIAS])
     {
         const struct wined3d_rendertarget_view *depth = state->fb->depth_stencil;
-        float factor, units, scale;
+        float factor, units, scale, clamp;
 
         union
         {
@@ -1783,6 +1783,7 @@ static void state_depthbias(struct wined3d_context *context, const struct wined3
             float f;
         } scale_bias, const_bias;
 
+        clamp = state->rasterizer_state ? state->rasterizer_state->desc.depth_bias_clamp : 0.0f;
         scale_bias.d = state->render_states[WINED3D_RS_SLOPESCALEDEPTHBIAS];
         const_bias.d = state->render_states[WINED3D_RS_DEPTHBIAS];
 
@@ -1811,7 +1812,16 @@ static void state_depthbias(struct wined3d_context *context, const struct wined3
         }
 
         gl_info->gl_ops.gl.p_glEnable(GL_POLYGON_OFFSET_FILL);
-        gl_info->gl_ops.gl.p_glPolygonOffset(factor, units);
+        if (gl_info->supported[ARB_POLYGON_OFFSET_CLAMP])
+        {
+            gl_info->gl_ops.ext.p_glPolygonOffsetClamp(factor, units, clamp);
+        }
+        else
+        {
+            if (clamp != 0.0f)
+                WARN("Ignoring depth bias clamp %.8e.\n", clamp);
+            gl_info->gl_ops.gl.p_glPolygonOffset(factor, units);
+        }
     }
     else
     {
@@ -4345,6 +4355,8 @@ static void rasterizer(struct wined3d_context *context, const struct wined3d_sta
 
     gl_info->gl_ops.gl.p_glFrontFace(mode);
     checkGLcall("glFrontFace");
+    if (!isStateDirty(context, STATE_RENDER(WINED3D_RS_DEPTHBIAS)))
+        state_depthbias(context, state, STATE_RENDER(WINED3D_RS_DEPTHBIAS));
     depth_clip(state->rasterizer_state, gl_info);
 }
 
@@ -4357,6 +4369,8 @@ static void rasterizer_cc(struct wined3d_context *context, const struct wined3d_
 
     gl_info->gl_ops.gl.p_glFrontFace(mode);
     checkGLcall("glFrontFace");
+    if (!isStateDirty(context, STATE_RENDER(WINED3D_RS_DEPTHBIAS)))
+        state_depthbias(context, state, STATE_RENDER(WINED3D_RS_DEPTHBIAS));
     depth_clip(state->rasterizer_state, gl_info);
 }
 
diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h
index 2a985da9faf..a02073c28af 100644
--- a/dlls/wined3d/wined3d_gl.h
+++ b/dlls/wined3d/wined3d_gl.h
@@ -89,6 +89,7 @@ enum wined3d_gl_extension
     ARB_PIXEL_BUFFER_OBJECT,
     ARB_POINT_PARAMETERS,
     ARB_POINT_SPRITE,
+    ARB_POLYGON_OFFSET_CLAMP,
     ARB_PROVOKING_VERTEX,
     ARB_QUERY_BUFFER_OBJECT,
     ARB_SAMPLE_SHADING,
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 8197a8682ae..c62d3640e58 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2012,6 +2012,7 @@ struct wined3d_blend_state_desc
 struct wined3d_rasterizer_state_desc
 {
     BOOL front_ccw;
+    float depth_bias_clamp;
     BOOL depth_clip;
 };
 
-- 
2.11.0




More information about the wine-devel mailing list