wined3d: Update the vertex shader when the clipplanes are changed.
This commit is contained in:
parent
67320c448b
commit
a27adc478a
|
@ -484,28 +484,59 @@ static void state_alpha(DWORD state, struct wined3d_stateblock *stateblock, stru
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void shaderconstant(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||||
|
{
|
||||||
|
const struct wined3d_state *state = &stateblock->state;
|
||||||
|
struct wined3d_device *device = stateblock->device;
|
||||||
|
|
||||||
|
/* Vertex and pixel shader states will call a shader upload, don't do anything as long one of them
|
||||||
|
* has an update pending
|
||||||
|
*/
|
||||||
|
if(isStateDirty(context, STATE_VDECL) ||
|
||||||
|
isStateDirty(context, STATE_PIXELSHADER)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
device->shader_backend->shader_load_constants(context, use_ps(state), use_vs(state));
|
||||||
|
}
|
||||||
|
|
||||||
static void state_clipping(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
static void state_clipping(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||||
{
|
{
|
||||||
const struct wined3d_state *state = &stateblock->state;
|
const struct wined3d_state *state = &stateblock->state;
|
||||||
DWORD enable = 0xFFFFFFFF;
|
DWORD enable = 0xFFFFFFFF;
|
||||||
DWORD disable = 0x00000000;
|
DWORD disable = 0x00000000;
|
||||||
|
|
||||||
if (!stateblock->device->vs_clipping && use_vs(state))
|
if (use_vs(state))
|
||||||
{
|
{
|
||||||
/* The spec says that opengl clipping planes are disabled when using shaders. Direct3D planes aren't,
|
const struct wined3d_device *device = stateblock->device;
|
||||||
* so that is an issue. The MacOS ATI driver keeps clipping planes activated with shaders in some
|
|
||||||
* conditions I got sick of tracking down. The shader state handler disables all clip planes because
|
if (!device->vs_clipping)
|
||||||
* of that - don't do anything here and keep them disabled
|
|
||||||
*/
|
|
||||||
if (state->render_states[WINED3DRS_CLIPPLANEENABLE])
|
|
||||||
{
|
{
|
||||||
static BOOL warned = FALSE;
|
/* The spec says that opengl clipping planes are disabled when using shaders. Direct3D planes aren't,
|
||||||
if(!warned) {
|
* so that is an issue. The MacOS ATI driver keeps clipping planes activated with shaders in some
|
||||||
FIXME("Clipping not supported with vertex shaders\n");
|
* conditions I got sick of tracking down. The shader state handler disables all clip planes because
|
||||||
warned = TRUE;
|
* of that - don't do anything here and keep them disabled
|
||||||
|
*/
|
||||||
|
if (state->render_states[WINED3DRS_CLIPPLANEENABLE])
|
||||||
|
{
|
||||||
|
static BOOL warned = FALSE;
|
||||||
|
if(!warned) {
|
||||||
|
FIXME("Clipping not supported with vertex shaders\n");
|
||||||
|
warned = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* glEnable(GL_CLIP_PLANEx) doesn't apply to vertex shaders. The enabled / disabled planes are
|
||||||
|
* hardcoded into the shader. Update the shader to update the enabled clipplanes */
|
||||||
|
if (!isStateDirty(context, device->StateTable[STATE_VSHADER].representative))
|
||||||
|
{
|
||||||
|
device->shader_backend->shader_select(context, use_ps(state), TRUE);
|
||||||
|
if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT)) {
|
||||||
|
shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Keep track of previously enabled clipplanes to avoid unnecessary resetting
|
/* TODO: Keep track of previously enabled clipplanes to avoid unnecessary resetting
|
||||||
|
@ -3460,22 +3491,6 @@ static void tex_coordindex(DWORD state, struct wined3d_stateblock *stateblock, s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shaderconstant(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
|
||||||
{
|
|
||||||
const struct wined3d_state *state = &stateblock->state;
|
|
||||||
struct wined3d_device *device = stateblock->device;
|
|
||||||
|
|
||||||
/* Vertex and pixel shader states will call a shader upload, don't do anything as long one of them
|
|
||||||
* has an update pending
|
|
||||||
*/
|
|
||||||
if(isStateDirty(context, STATE_VDECL) ||
|
|
||||||
isStateDirty(context, STATE_PIXELSHADER)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
device->shader_backend->shader_load_constants(context, use_ps(state), use_vs(state));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void tex_bumpenvlscale(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
static void tex_bumpenvlscale(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context)
|
||||||
{
|
{
|
||||||
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
|
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
|
||||||
|
|
Loading…
Reference in New Issue