wined3d: Clip planes with vertex shaders.

This commit is contained in:
Stefan Dösinger 2007-02-27 23:11:15 +01:00 committed by Alexandre Julliard
parent 409aa73132
commit 5afbfd0359
1 changed files with 37 additions and 0 deletions

View File

@ -388,6 +388,22 @@ static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
DWORD enable = 0xFFFFFFFF; DWORD enable = 0xFFFFFFFF;
DWORD disable = 0x00000000; DWORD disable = 0x00000000;
if(stateblock->vertexShader) {
/* The spec says that opengl clipping planes are disabled when using shaders. Direct3D planes aren't,
* so that is an issue. The MacOS ATI driver keeps clipping planes activated with shaders in some
* contitions I got sick of tracking down. The shader state handler disables all clip planes because
* of that - don't do anything here and keep them disabled
*/
if(stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]) {
static BOOL warned = FALSE;
if(!warned) {
FIXME("Clipping not supported with vertex shaders\n");
warned = TRUE;
}
}
return;
}
/* TODO: Keep track of previously enabled clipplanes to avoid unneccessary resetting /* TODO: Keep track of previously enabled clipplanes to avoid unneccessary resetting
* of already set values * of already set values
*/ */
@ -2924,11 +2940,32 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, W
if(!isStateDirty(context, STATE_RENDER(WINED3DRS_COLORVERTEX))) { if(!isStateDirty(context, STATE_RENDER(WINED3DRS_COLORVERTEX))) {
state_colormat(STATE_RENDER(WINED3DRS_COLORVERTEX), stateblock, context); state_colormat(STATE_RENDER(WINED3DRS_COLORVERTEX), stateblock, context);
} }
if(context->last_was_vshader && !isStateDirty(context, STATE_RENDER(WINED3DRS_CLIPPLANEENABLE))) {
state_clipping(STATE_RENDER(WINED3DRS_CLIPPLANEENABLE), stateblock, context);
}
} else { } else {
/* We compile the shader here because we need the vertex declaration /* We compile the shader here because we need the vertex declaration
* in order to determine if we need to do any swizzling for D3DCOLOR * in order to determine if we need to do any swizzling for D3DCOLOR
* registers. If the shader is already compiled this call will do nothing. */ * registers. If the shader is already compiled this call will do nothing. */
IWineD3DVertexShader_CompileShader(stateblock->vertexShader); IWineD3DVertexShader_CompileShader(stateblock->vertexShader);
if(!context->last_was_vshader) {
int i;
static BOOL warned = FALSE;
/* Disable all clip planes to get defined results on all drivers. See comment in the
* state_clipping state handler
*/
for(i = 0; i < GL_LIMITS(clipplanes); i++) {
glDisable(GL_CLIP_PLANE0 + i);
checkGLcall("glDisable(GL_CLIP_PLANE0 + i)");
}
if(!warned && stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]) {
FIXME("Clipping not supported with vertex shaders\n");
warned = TRUE;
}
}
} }
/* Vertex and pixel shaders are applied together for now, so let the last dirty state do the /* Vertex and pixel shaders are applied together for now, so let the last dirty state do the