Commit dbc8702e authored by Stefan Dösinger's avatar Stefan Dösinger Committed by Alexandre Julliard

wined3d: Scale the depthbias factor by the depth buffer's depth.

parent 96b758f7
...@@ -5941,6 +5941,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice * ...@@ -5941,6 +5941,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice *
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZENABLE)); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZENABLE));
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILENABLE)); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILENABLE));
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILWRITEMASK)); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILWRITEMASK));
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_DEPTHBIAS));
}
else if (tmp && tmp->resource.format->depth_size != This->depth_stencil->resource.format->depth_size)
{
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_DEPTHBIAS));
} }
return WINED3D_OK; return WINED3D_OK;
......
...@@ -1743,14 +1743,17 @@ static void state_scissor(DWORD state, struct wined3d_stateblock *stateblock, st ...@@ -1743,14 +1743,17 @@ static void state_scissor(DWORD state, struct wined3d_stateblock *stateblock, st
* convert from D3D to GL we need to divide the D3D depth bias by that value. * convert from D3D to GL we need to divide the D3D depth bias by that value.
* There's no practical way to retrieve that value from a given GL * There's no practical way to retrieve that value from a given GL
* implementation, but the D3D application has essentially the same problem, * implementation, but the D3D application has essentially the same problem,
* which makes a guess of 1e-6f seem reasonable here. Note that * which makes a guess of the depth buffer format's highest possible value a
* SLOPESCALEDEPTHBIAS is a scaling factor for the depth slope, and doesn't * reasonable guess. Note that SLOPESCALEDEPTHBIAS is a scaling factor for the
* need to be scaled. */ * depth slope, and doesn't need to be scaled. */
static void state_depthbias(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) static void state_depthbias(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
{ {
if (stateblock->state.render_states[WINED3DRS_SLOPESCALEDEPTHBIAS] if (stateblock->state.render_states[WINED3DRS_SLOPESCALEDEPTHBIAS]
|| stateblock->state.render_states[WINED3DRS_DEPTHBIAS]) || stateblock->state.render_states[WINED3DRS_DEPTHBIAS])
{ {
IWineD3DSurfaceImpl *depth = stateblock->device->depth_stencil;
float scale;
union union
{ {
DWORD d; DWORD d;
...@@ -1763,7 +1766,21 @@ static void state_depthbias(DWORD state, struct wined3d_stateblock *stateblock, ...@@ -1763,7 +1766,21 @@ static void state_depthbias(DWORD state, struct wined3d_stateblock *stateblock,
glEnable(GL_POLYGON_OFFSET_FILL); glEnable(GL_POLYGON_OFFSET_FILL);
checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL)"); checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL)");
glPolygonOffset(scale_bias.f, const_bias.f * 1e6f); if (depth)
{
const struct wined3d_format *fmt = depth->resource.format;
scale = powf(2, fmt->depth_size) - 1;
TRACE("Depth format %s, using depthbias scale of %f\n",
debug_d3dformat(fmt->id), scale);
}
else
{
/* The context manager will reapply this state on a depth stencil change */
TRACE("No depth stencil, using depthbias scale of 0.0\n");
scale = 0;
}
glPolygonOffset(scale_bias.f, const_bias.f * scale);
checkGLcall("glPolygonOffset(...)"); checkGLcall("glPolygonOffset(...)");
} else { } else {
glDisable(GL_POLYGON_OFFSET_FILL); glDisable(GL_POLYGON_OFFSET_FILL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment