wined3d: Untie culling and offscreen rendering.
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index c7622cb..403acdf 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -706,11 +706,11 @@
IWineD3DSwapChain_Release(swapchain);
if(oldRenderOffscreen) {
- Context_MarkStateDirty(context, WINED3DRS_CULLMODE);
Context_MarkStateDirty(context, WINED3DTS_PROJECTION);
Context_MarkStateDirty(context, STATE_VDECL);
Context_MarkStateDirty(context, STATE_VIEWPORT);
Context_MarkStateDirty(context, STATE_SCISSORRECT);
+ Context_MarkStateDirty(context, STATE_FRONTFACE);
}
} else {
@@ -794,11 +794,11 @@
}
if(!oldRenderOffscreen) {
- Context_MarkStateDirty(context, WINED3DRS_CULLMODE);
Context_MarkStateDirty(context, WINED3DTS_PROJECTION);
Context_MarkStateDirty(context, STATE_VDECL);
Context_MarkStateDirty(context, STATE_VIEWPORT);
Context_MarkStateDirty(context, STATE_SCISSORRECT);
+ Context_MarkStateDirty(context, STATE_FRONTFACE);
}
}
if (readTexture) {
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index da2fb3c..b248d00 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -132,11 +132,9 @@
}
static void state_cullmode(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
- /* TODO: Put this into the offscreen / onscreen rendering block due to device->render_offscreen */
-
- /* If we are culling "back faces with clockwise vertices" then
- set front faces to be counter clockwise and enable culling
- of back faces */
+ /* glFrontFace() is set in context.c at context init and on an offscreen / onscreen rendering
+ * switch
+ */
switch ((WINED3DCULL) stateblock->renderState[WINED3DRS_CULLMODE]) {
case WINED3DCULL_NONE:
glDisable(GL_CULL_FACE);
@@ -145,26 +143,14 @@
case WINED3DCULL_CW:
glEnable(GL_CULL_FACE);
checkGLcall("glEnable GL_CULL_FACE");
- if (stateblock->wineD3DDevice->render_offscreen) {
- glFrontFace(GL_CW);
- checkGLcall("glFrontFace GL_CW");
- } else {
- glFrontFace(GL_CCW);
- checkGLcall("glFrontFace GL_CCW");
- }
- glCullFace(GL_BACK);
+ glCullFace(GL_FRONT);
+ checkGLcall("glCullFace(GL_FRONT)");
break;
case WINED3DCULL_CCW:
glEnable(GL_CULL_FACE);
checkGLcall("glEnable GL_CULL_FACE");
- if (stateblock->wineD3DDevice->render_offscreen) {
- glFrontFace(GL_CCW);
- checkGLcall("glFrontFace GL_CCW");
- } else {
- glFrontFace(GL_CW);
- checkGLcall("glFrontFace GL_CW");
- }
glCullFace(GL_BACK);
+ checkGLcall("glCullFace(GL_BACK)");
break;
default:
FIXME("Unrecognized/Unhandled WINED3DCULL value %d\n", stateblock->renderState[WINED3DRS_CULLMODE]);
@@ -3605,6 +3591,16 @@
}
}
+static void frontface(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+ if(stateblock->wineD3DDevice->render_offscreen) {
+ glFrontFace(GL_CCW);
+ checkGLcall("glFrontFace(GL_CCW)");
+ } else {
+ glFrontFace(GL_CW);
+ checkGLcall("glFrontFace(GL_CW)");
+ }
+}
+
const struct StateEntry StateTable[] =
{
/* State name representative, apply function */
@@ -4676,4 +4672,5 @@
{ /* STATE_CLIPPLANE(31) */ STATE_CLIPPLANE(31), clipplane },
{ /* STATE_MATERIAL */ STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable},
+ { /* STATE_FRONTFACE */ STATE_FRONTFACE, frontface },
};
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8b71e03..b7e08fc 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -481,7 +481,9 @@
#define STATE_MATERIAL (STATE_CLIPPLANE(MAX_CLIPPLANES))
-#define STATE_HIGHEST (STATE_MATERIAL)
+#define STATE_FRONTFACE (STATE_MATERIAL + 1)
+
+#define STATE_HIGHEST (STATE_FRONTFACE)
struct StateEntry
{