ChangeSet ID: 21550 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/11/29 10:41:26
Modified files: dlls/wined3d : device.c drawprim.c stateblock.c wined3d_private.h include/wine : wined3d_interface.h
Log message: Oliver Stieber oliver_stieber@yahoo.co.uk Added support for vertex and pixel shader constants that have no type i.e. they haven't been set yet or are clear.
Patch: http://cvs.winehq.org/patch.py?id=21550
Old revision New revision Changes Path 1.101 1.102 +30 -1 wine/dlls/wined3d/device.c 1.34 1.35 +5 -3 wine/dlls/wined3d/drawprim.c 1.27 1.28 +6 -0 wine/dlls/wined3d/stateblock.c 1.70 1.71 +4 -3 wine/dlls/wined3d/wined3d_private.h 1.46 1.47 +4 -0 wine/include/wine/wined3d_interface.h
Index: wine/dlls/wined3d/device.c diff -u -p wine/dlls/wined3d/device.c:1.101 wine/dlls/wined3d/device.c:1.102 --- wine/dlls/wined3d/device.c:1.101 29 Nov 2005 16:41:26 -0000 +++ wine/dlls/wined3d/device.c 29 Nov 2005 16:41:26 -0000 @@ -3899,10 +3899,22 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetVer return D3D_OK; }
+HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShaderConstantN(IWineD3DDevice *iface, UINT StartRegister, UINT VectorNCount){ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + int i; + /* populate the bitmap that says which constant type we should load */ + for (i = StartRegister; i < StartRegister + VectorNCount; ++i) { + This->updateStateBlock->changed.vertexShaderConstants[i] = TRUE; + This->updateStateBlock->set.vertexShaderConstants[i] = TRUE; + This->updateStateBlock->vertexShaderConstantT[i] = WINESHADERCNST_NONE; + TRACE("(%p) : Setting vsf %d\n", This, i); + } + return D3D_OK; +} + #undef SET_SHADER_CONSTANT #undef GET_SHADER_CONSTANT
- HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader *pShader) { IUnknown *parent; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; @@ -4082,6 +4094,21 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetPix return D3D_OK; }
+HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShaderConstantN(IWineD3DDevice *iface, UINT StartRegister, UINT VectorNCount){ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + int i; + + /* populate the bitmap that says which constant type we should load */ + for (i = StartRegister; i < StartRegister + VectorNCount; ++i) { + This->updateStateBlock->changed.pixelShaderConstants[i] = TRUE; + This->updateStateBlock->set.pixelShaderConstants[i] = TRUE; + This->updateStateBlock->pixelShaderConstantT[i] = WINESHADERCNST_NONE; + TRACE("(%p) : Setting vsf %d\n", This, i); + } + + return D3D_OK; +} + #undef SET_SHADER_CONSTANT #undef GET_SHADER_CONSTANT
@@ -6443,6 +6470,7 @@ const IWineD3DDeviceVtbl IWineD3DDevice_ IWineD3DDeviceImpl_GetPixelShaderConstantI, IWineD3DDeviceImpl_SetPixelShaderConstantF, IWineD3DDeviceImpl_GetPixelShaderConstantF, + IWineD3DDeviceImpl_SetPixelShaderConstantN, IWineD3DDeviceImpl_SetRenderState, IWineD3DDeviceImpl_GetRenderState, IWineD3DDeviceImpl_SetRenderTarget, @@ -6473,6 +6501,7 @@ const IWineD3DDeviceVtbl IWineD3DDevice_ IWineD3DDeviceImpl_GetVertexShaderConstantI, IWineD3DDeviceImpl_SetVertexShaderConstantF, IWineD3DDeviceImpl_GetVertexShaderConstantF, + IWineD3DDeviceImpl_SetVertexShaderConstantN, IWineD3DDeviceImpl_SetViewport, IWineD3DDeviceImpl_GetViewport, IWineD3DDeviceImpl_MultiplyTransform, Index: wine/dlls/wined3d/drawprim.c diff -u -p wine/dlls/wined3d/drawprim.c:1.34 wine/dlls/wined3d/drawprim.c:1.35 --- wine/dlls/wined3d/drawprim.c:1.34 29 Nov 2005 16:41:26 -0000 +++ wine/dlls/wined3d/drawprim.c 29 Nov 2005 16:41:26 -0000 @@ -1743,9 +1743,11 @@ UINT numberOfvertices, UINT numberOfIndi /* Update the constants */ for (i = 0; i < WINED3D_VSHADER_MAX_CONSTANTS; i++) { /* TODO: add support for Integer and Boolean constants */ - GL_EXTCALL(glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, i, &This->stateBlock->vertexShaderConstantF[i * 4])); - TRACE_(d3d_shader)("Loading constants %u = %f %f %f %f\n",i, This->stateBlock->vertexShaderConstantF[i *4 ], This->stateBlock->vertexShaderConstantF[i * 4 + 1], This->stateBlock->vertexShaderConstantF[i *4 + 2], This->stateBlock->vertexShaderConstantF[i * 4 + 3]); - checkGLcall("glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB"); + if (WINESHADERCNST_FLOAT == This->stateBlock->vertexShaderConstantT[i]) { + GL_EXTCALL(glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, i, &This->stateBlock->vertexShaderConstantF[i * 4])); + TRACE_(d3d_shader)("Loading constants %u = %f %f %f %f\n",i, This->stateBlock->vertexShaderConstantF[i *4 ], This->stateBlock->vertexShaderConstantF[i * 4 + 1], This->stateBlock->vertexShaderConstantF[i *4 + 2], This->stateBlock->vertexShaderConstantF[i * 4 + 3]); + checkGLcall("glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB"); + } } /* TODO: Vertex Shader 8 constants*/
Index: wine/dlls/wined3d/stateblock.c diff -u -p wine/dlls/wined3d/stateblock.c:1.27 wine/dlls/wined3d/stateblock.c:1.28 --- wine/dlls/wined3d/stateblock.c:1.27 29 Nov 2005 16:41:26 -0000 +++ wine/dlls/wined3d/stateblock.c 29 Nov 2005 16:41:26 -0000 @@ -393,6 +393,9 @@ should really perform a delta so that on case WINESHADERCNST_INTEGER: IWineD3DDevice_SetVertexShaderConstantI(pDevice, i, This->vertexShaderConstantI + i * 4, 1); break; + case WINESHADERCNST_NONE: + IWineD3DDevice_SetVertexShaderConstantN(pDevice, i, 1); + break; } } } @@ -419,6 +422,9 @@ should really perform a delta so that on case WINESHADERCNST_INTEGER: IWineD3DDevice_SetPixelShaderConstantI(pDevice, i, This->pixelShaderConstantI + i * 4, 1); break; + case WINESHADERCNST_NONE: + IWineD3DDevice_SetPixelShaderConstantN(pDevice, i, 1); + break; } } } Index: wine/dlls/wined3d/wined3d_private.h diff -u -p wine/dlls/wined3d/wined3d_private.h:1.70 wine/dlls/wined3d/wined3d_private.h:1.71 --- wine/dlls/wined3d/wined3d_private.h:1.70 29 Nov 2005 16:41:26 -0000 +++ wine/dlls/wined3d/wined3d_private.h 29 Nov 2005 16:41:26 -0000 @@ -888,9 +888,10 @@ typedef struct SAVEDSTATES { } SAVEDSTATES;
typedef enum { - WINESHADERCNST_FLOAT = 0, - WINESHADERCNST_INTEGER = 1, - WINESHADERCNST_BOOL = 2 + WINESHADERCNST_NONE = 0, + WINESHADERCNST_FLOAT = 1, + WINESHADERCNST_INTEGER = 2, + WINESHADERCNST_BOOL = 3 } WINESHADERCNST;
struct IWineD3DStateBlockImpl Index: wine/include/wine/wined3d_interface.h diff -u -p wine/include/wine/wined3d_interface.h:1.46 wine/include/wine/wined3d_interface.h:1.47 --- wine/include/wine/wined3d_interface.h:1.46 29 Nov 2005 16:41:26 -0000 +++ wine/include/wine/wined3d_interface.h 29 Nov 2005 16:41:26 -0000 @@ -332,6 +332,7 @@ DECLARE_INTERFACE_(IWineD3DDevice,IUnkno STDMETHOD(GetPixelShaderConstantI)(THIS_ UINT StartRegister, int* pConstantData, UINT Vector4iCount) PURE; STDMETHOD(SetPixelShaderConstantF)(THIS_ UINT StartRegister, CONST float* pConstantData, UINT Vector4fCount) PURE; STDMETHOD(GetPixelShaderConstantF)(THIS_ UINT StartRegister, float* pConstantData, UINT Vector4fCount) PURE; + STDMETHOD(SetPixelShaderConstantN)(THIS_ UINT StartRegister, UINT VectorNCount) PURE; STDMETHOD(SetRenderState)(THIS_ D3DRENDERSTATETYPE State,DWORD Value) PURE; STDMETHOD(GetRenderState)(THIS_ D3DRENDERSTATETYPE State,DWORD * pValue) PURE; STDMETHOD(SetRenderTarget)(THIS_ DWORD RenderTargetIndex, struct IWineD3DSurface* pRenderTarget) PURE; @@ -362,6 +363,7 @@ DECLARE_INTERFACE_(IWineD3DDevice,IUnkno STDMETHOD(GetVertexShaderConstantI)(THIS_ UINT StartRegister, int* pConstantData, UINT Vector4iCount) PURE; STDMETHOD(SetVertexShaderConstantF)(THIS_ UINT StartRegister, CONST float* pConstantData, UINT Vector4fCount) PURE; STDMETHOD(GetVertexShaderConstantF)(THIS_ UINT StartRegister, float* pConstantData, UINT Vector4fCount) PURE; + STDMETHOD(SetVertexShaderConstantN)(THIS_ UINT StartRegister, UINT VectorNCount) PURE; STDMETHOD(SetViewport)(THIS_ CONST WINED3DVIEWPORT * pViewport) PURE; STDMETHOD(GetViewport)(THIS_ WINED3DVIEWPORT * pViewport) PURE; STDMETHOD(MultiplyTransform)(THIS_ D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX * pMatrix) PURE; @@ -460,6 +462,7 @@ DECLARE_INTERFACE_(IWineD3DDevice,IUnkno #define IWineD3DDevice_GetPixelShaderConstantI(p,a,b,c) (p)->lpVtbl->GetPixelShaderConstantI(p,a,b,c) #define IWineD3DDevice_SetPixelShaderConstantF(p,a,b,c) (p)->lpVtbl->SetPixelShaderConstantF(p,a,b,c) #define IWineD3DDevice_GetPixelShaderConstantF(p,a,b,c) (p)->lpVtbl->GetPixelShaderConstantF(p,a,b,c) +#define IWineD3DDevice_SetPixelShaderConstantN(p,a,b) (p)->lpVtbl->SetPixelShaderConstantN(p,a,b) #define IWineD3DDevice_GetRasterStatus(p,a,b) (p)->lpVtbl->GetRasterStatus(p,a,b) #define IWineD3DDevice_SetRenderState(p,a,b) (p)->lpVtbl->SetRenderState(p,a,b) #define IWineD3DDevice_GetRenderState(p,a,b) (p)->lpVtbl->GetRenderState(p,a,b) @@ -492,6 +495,7 @@ DECLARE_INTERFACE_(IWineD3DDevice,IUnkno #define IWineD3DDevice_GetVertexShaderConstantI(p,a,b,c) (p)->lpVtbl->GetVertexShaderConstantI(p,a,b,c) #define IWineD3DDevice_SetVertexShaderConstantF(p,a,b,c) (p)->lpVtbl->SetVertexShaderConstantF(p,a,b,c) #define IWineD3DDevice_GetVertexShaderConstantF(p,a,b,c) (p)->lpVtbl->GetVertexShaderConstantF(p,a,b,c) +#define IWineD3DDevice_SetVertexShaderConstantN(p,a,b) (p)->lpVtbl->SetVertexShaderConstantN(p,a,b) #define IWineD3DDevice_SetViewport(p,a) (p)->lpVtbl->SetViewport(p,a) #define IWineD3DDevice_GetViewport(p,a) (p)->lpVtbl->GetViewport(p,a) #define IWineD3DDevice_MultiplyTransform(p,a,b) (p)->lpVtbl->MultiplyTransform(p,a,b)