Stefan Dösinger : wined3d: Give ATIFS a pixel shader handler.
Alexandre Julliard
julliard at winehq.org
Mon Dec 15 08:26:57 CST 2008
Module: wine
Branch: master
Commit: c93727826222bd5ea99226e6cd8d36ac5ef71a01
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c93727826222bd5ea99226e6cd8d36ac5ef71a01
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Sat Dec 13 20:07:16 2008 +0100
wined3d: Give ATIFS a pixel shader handler.
---
dlls/wined3d/ati_fragment_shader.c | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/dlls/wined3d/ati_fragment_shader.c b/dlls/wined3d/ati_fragment_shader.c
index 1933476..b4c5334 100644
--- a/dlls/wined3d/ati_fragment_shader.c
+++ b/dlls/wined3d/ati_fragment_shader.c
@@ -881,6 +881,30 @@ static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3
}
}
+static void atifs_apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+ IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
+ BOOL use_vshader = use_vs(device);
+
+ /* The ATIFS code does not support pixel shaders currently, but we have to provide a state handler
+ * to call shader_select to select a vertex shader if one is applied because the vertex shader state
+ * may defer calling the shader backend if the pshader state is dirty.
+ *
+ * In theory the application should not be able to mark the pixel shader dirty because it cannot
+ * create a shader, and thus has no way to set the state to something != NULL. However, a different
+ * pipeline part may link a different state to its pixelshader handler, thus a pshader state exists
+ * and can be dirtified. Also the pshader is always dirtified at startup, and blitting disables all
+ * shaders and dirtifies all shader states. If atifs can deal with this it keeps the rest of the code
+ * simpler.
+ */
+ if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
+ device->shader_backend->shader_select((IWineD3DDevice *)stateblock->wineD3DDevice, FALSE, use_vshader);
+
+ if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && use_vshader) {
+ device->StateTable[STATE_VERTEXSHADERCONSTANT].apply(STATE_VERTEXSHADERCONSTANT, stateblock, context);
+ }
+ }
+}
+
#undef GLINFO_LOCATION
static const struct StateEntryTemplate atifs_fragmentstate_template[] = {
@@ -1005,6 +1029,7 @@ static const struct StateEntryTemplate atifs_fragmentstate_template[] = {
{STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
{STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
{STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
+ {STATE_PIXELSHADER, { STATE_PIXELSHADER, atifs_apply_pixelshader }, 0 },
{0 /* Terminate */, { 0, 0 }, 0 },
};
More information about the wine-cvs
mailing list