[PATCH 1/2] d3d11: Implement depth bias clamp.
Zebediah Figura
z.figura12 at gmail.com
Sat Oct 6 21:14:11 CDT 2018
Based on a patch by Michael Müller.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/d3d11/state.c | 1 +
dlls/wined3d/adapter_gl.c | 3 +++
dlls/wined3d/cs.c | 2 ++
dlls/wined3d/state.c | 16 ++++++++++++++--
dlls/wined3d/wined3d_gl.h | 1 +
include/wine/wined3d.h | 1 +
6 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/dlls/d3d11/state.c b/dlls/d3d11/state.c
index c36b87f..6de3502 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 2f2d09d..6240b88 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -183,6 +183,7 @@ static const struct wined3d_extension_map gl_extension_map[] =
{"GL_EXT_packed_depth_stencil", EXT_PACKED_DEPTH_STENCIL },
{"GL_EXT_packed_float", EXT_PACKED_FLOAT },
{"GL_EXT_point_parameters", EXT_POINT_PARAMETERS },
+ {"GL_EXT_polygon_offset_clamp", EXT_POLYGON_OFFSET_CLAMP },
{"GL_EXT_provoking_vertex", EXT_PROVOKING_VERTEX },
{"GL_EXT_secondary_color", EXT_SECONDARY_COLOR },
{"GL_EXT_stencil_two_side", EXT_STENCIL_TWO_SIDE },
@@ -2475,6 +2476,8 @@ static void load_gl_funcs(struct wined3d_gl_info *gl_info)
/* GL_EXT_point_parameters */
USE_GL_FUNC(glPointParameterfEXT)
USE_GL_FUNC(glPointParameterfvEXT)
+ /* GL_EXT_polgyon_offset_clamp */
+ USE_GL_FUNC(glPolygonOffsetClampEXT)
/* GL_EXT_provoking_vertex */
USE_GL_FUNC(glProvokingVertexEXT)
/* GL_EXT_secondary_color */
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index af1dbef..030e80f 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -1135,6 +1135,7 @@ static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const
device_invalidate_state(device, STATE_RENDER(WINED3D_RS_STENCILENABLE));
device_invalidate_state(device, STATE_RENDER(WINED3D_RS_STENCILWRITEMASK));
device_invalidate_state(device, STATE_RENDER(WINED3D_RS_DEPTHBIAS));
+ device_invalidate_state(device, STATE_RASTERIZER);
}
else if (prev && prev->format->depth_bias_scale != op->view->format->depth_bias_scale)
{
@@ -1561,6 +1562,7 @@ static void wined3d_cs_exec_set_rasterizer_state(struct wined3d_cs *cs, const vo
cs->state.rasterizer_state = op->state;
device_invalidate_state(cs->device, STATE_RASTERIZER);
+ device_invalidate_state(cs->device, STATE_RENDER(WINED3D_RS_DEPTHBIAS));
}
void wined3d_cs_emit_set_rasterizer_state(struct wined3d_cs *cs,
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 3b2f845..dc29d54 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
{
@@ -1785,6 +1785,7 @@ static void state_depthbias(struct wined3d_context *context, const struct wined3
scale_bias.d = state->render_states[WINED3D_RS_SLOPESCALEDEPTHBIAS];
const_bias.d = state->render_states[WINED3D_RS_DEPTHBIAS];
+ clamp = state->rasterizer_state->desc.depth_bias_clamp;
if (context->d3d_info->wined3d_creation_flags & WINED3D_LEGACY_DEPTH_BIAS)
{
@@ -1811,7 +1812,18 @@ 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[EXT_POLYGON_OFFSET_CLAMP])
+ {
+ GL_EXTCALL(glPolygonOffsetClampEXT(factor, units, clamp));
+ checkGLcall("glPolygonOffsetClampEXT(...)");
+ }
+ else
+ {
+ if (clamp)
+ WARN("EXT_polygon_offset_clamp extension missing; no support for depth bias clamping.\n");
+
+ gl_info->gl_ops.gl.p_glPolygonOffset(factor, units);
+ }
}
else
{
diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h
index 2a985da..2f6ba64 100644
--- a/dlls/wined3d/wined3d_gl.h
+++ b/dlls/wined3d/wined3d_gl.h
@@ -167,6 +167,7 @@ enum wined3d_gl_extension
EXT_PACKED_DEPTH_STENCIL,
EXT_PACKED_FLOAT,
EXT_POINT_PARAMETERS,
+ EXT_POLYGON_OFFSET_CLAMP,
EXT_PROVOKING_VERTEX,
EXT_SECONDARY_COLOR,
EXT_STENCIL_TWO_SIDE,
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 8197a86..efc2fde 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2013,6 +2013,7 @@ struct wined3d_rasterizer_state_desc
{
BOOL front_ccw;
BOOL depth_clip;
+ float depth_bias_clamp;
};
struct wined3d_sampler_desc
--
2.7.4
More information about the wine-devel
mailing list