Stefan Dösinger : wined3d: Untie culling and offscreen rendering.
Alexandre Julliard
julliard at winehq.org
Wed Sep 19 08:16:14 CDT 2007
Module: wine
Branch: master
Commit: 5a63b79a66434e8f56de27cd1616036e9f29fd8c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a63b79a66434e8f56de27cd1616036e9f29fd8c
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Tue Sep 18 11:43:09 2007 +0200
wined3d: Untie culling and offscreen rendering.
---
dlls/wined3d/context.c | 4 ++--
dlls/wined3d/state.c | 37 +++++++++++++++++--------------------
dlls/wined3d/wined3d_private.h | 4 +++-
3 files changed, 22 insertions(+), 23 deletions(-)
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 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
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 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
}
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_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD
}
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 @@ static void state_cullmode(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
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 indexbuffer(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
}
}
+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 @@ const struct StateEntry StateTable[] =
{ /* 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 @@ typedef void (*APPLYSTATEFUNC)(DWORD state, IWineD3DStateBlockImpl *stateblock,
#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
{
More information about the wine-cvs
mailing list