Based on a patch by Michael Müller.
Signed-off-by: Zebediah Figura z.figura12@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