Implement a pixel shader parser and cross compiler. All version of

shaders up to 3 should be parsed correctly, but only shaders 1-1.4
will be cross compiled.
This commit is contained in:
Oliver Stieber 2005-11-21 16:27:55 +00:00 committed by Alexandre Julliard
parent 893987b871
commit 932815d6f0
4 changed files with 1741 additions and 39 deletions

View File

@ -1621,23 +1621,23 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexShader(IWineD3DDevice *iface, CON
return D3D_OK; return D3D_OK;
} }
HRESULT WINAPI IWineD3DDeviceImpl_CreatePixelShader(IWineD3DDevice* iface, CONST DWORD* pFunction, IWineD3DPixelShader** ppPixelShader, IUnknown *parent) { HRESULT WINAPI IWineD3DDeviceImpl_CreatePixelShader(IWineD3DDevice *iface, CONST DWORD *pFunction, IWineD3DPixelShader **ppPixelShader, IUnknown *parent) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DPixelShaderImpl *object; /* NOTE: impl allowed, this is a create */ IWineD3DPixelShaderImpl *object; /* NOTE: impl allowed, this is a create */
HRESULT hr = D3D_OK;
D3DCREATEOBJECTINSTANCE(object, PixelShader) D3DCREATEOBJECTINSTANCE(object, PixelShader)
#if 1 hr = IWineD3DPixelShader_SetFunction(*ppPixelShader, pFunction);
object->function = pFunction; if (D3D_OK == hr) {
#else /* TODO: pixel shader set function */ TRACE("(%p) : Created Pixel shader %p\n", This, *ppPixelShader);
IWineD3DPixelShaderImpl_SetFuction(*ppPixelShader, pFunction); } else {
#endif WARN("(%p) : Failed to create pixel shader\n", This);
FIXME("(%p) : STUB: Created Pixel shader %p\n", This, ppPixelShader); }
return D3D_OK;
return hr;
} }
HRESULT WINAPI IWineD3DDeviceImpl_GetDirect3D(IWineD3DDevice* iface, IWineD3D** ppD3D) { HRESULT WINAPI IWineD3DDeviceImpl_GetDirect3D(IWineD3DDevice *iface, IWineD3D **ppD3D) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
*ppD3D= This->wineD3D; *ppD3D= This->wineD3D;
TRACE("(%p) : wineD3D returning %p\n", This, *ppD3D); TRACE("(%p) : wineD3D returning %p\n", This, *ppD3D);
@ -3906,7 +3906,6 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3D
IUnknown *parent; IUnknown *parent;
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DPixelShader *oldpShader = This->updateStateBlock->pixelShader; IWineD3DPixelShader *oldpShader = This->updateStateBlock->pixelShader;
static BOOL showFixmes = TRUE;
This->updateStateBlock->pixelShader = pShader; This->updateStateBlock->pixelShader = pShader;
This->updateStateBlock->changed.pixelShader = TRUE; This->updateStateBlock->changed.pixelShader = TRUE;
@ -3915,11 +3914,6 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3D
if (pShader == NULL) { if (pShader == NULL) {
/* clear down the shader */ /* clear down the shader */
TRACE("Clear down the shader\n"); TRACE("Clear down the shader\n");
}else{
if (showFixmes) {
FIXME("(%p) : stub pShader(%p)\n", This, pShader);
showFixmes = FALSE;
}
} }
/* Handle recording of state blocks */ /* Handle recording of state blocks */
@ -3948,7 +3942,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3D
HRESULT WINAPI IWineD3DDeviceImpl_GetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader **ppShader) { HRESULT WINAPI IWineD3DDeviceImpl_GetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader **ppShader) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
if (ppShader == NULL) { if (NULL == ppShader) {
WARN("(%p) : PShader is NULL, returning INVALIDCALL\n", This); WARN("(%p) : PShader is NULL, returning INVALIDCALL\n", This);
return D3DERR_INVALIDCALL; return D3DERR_INVALIDCALL;
} }
@ -3972,9 +3966,7 @@ memcpy(pConstantData, This->updateStateBlock->_pixelshaderconstant + (StartRegis
int count = min(_count, MAX_PSHADER_CONSTANTS - (StartRegister + 1)); \ int count = min(_count, MAX_PSHADER_CONSTANTS - (StartRegister + 1)); \
if (NULL == pConstantData || count < 0 /* || _count != count */ ) \ if (NULL == pConstantData || count < 0 /* || _count != count */ ) \
return D3DERR_INVALIDCALL; \ return D3DERR_INVALIDCALL; \
memcpy(This->updateStateBlock->_pixelshaderconstant + (StartRegister * _sizecount), pConstantData, count * (sizeof(*pConstantData) * _sizecount)); \ memcpy(This->updateStateBlock->_pixelshaderconstant + (StartRegister * _sizecount), pConstantData, count * (sizeof(*pConstantData) * _sizecount));
This->updateStateBlock->changed.pixelShader = TRUE; \
This->updateStateBlock->set.pixelShader = TRUE;
HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShaderConstantB(IWineD3DDevice *iface, UINT StartRegister, CONST BOOL *pConstantData, UINT BoolCount) { HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShaderConstantB(IWineD3DDevice *iface, UINT StartRegister, CONST BOOL *pConstantData, UINT BoolCount) {
@ -3999,13 +3991,17 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetPixelShaderConstantB(IWineD3DDevice *iface,
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
int i, count; int i, count;
/* populate the bitmap that says which constant type we should load */ /* verify that the requested shader constant was populated with a integer */
for (i = StartRegister; i < BoolCount + StartRegister; ++i) { for (i = StartRegister; i < BoolCount; ++i) {
This->updateStateBlock->changed.pixelShaderConstants[i] = TRUE; if (WINESHADERCNST_BOOL != This->updateStateBlock->pixelShaderConstantT[i]) {
This->updateStateBlock->set.pixelShaderConstants[i] = TRUE;
This->updateStateBlock->pixelShaderConstantT[i] = WINESHADERCNST_BOOL; /* the constant for this register isn't a boolean */
TRACE("(%p) : Setting psb %d to %d\n", This->updateStateBlock, i, pConstantData[i - StartRegister]); WARN("(%p) : Caller requested a integer where stateblock (%p) entry is a %s. Returning D3DERR_INVALIDCALL\n", This, This->updateStateBlock,
WINESHADERCNST_INTEGER == This->updateStateBlock->vertexShaderConstantT[i] ? "integer" : "float");
return D3DERR_INVALIDCALL;
} }
}
GET_SHADER_CONSTANT(pixelShaderConstantB, BoolCount, 1); GET_SHADER_CONSTANT(pixelShaderConstantB, BoolCount, 1);

File diff suppressed because it is too large Load Diff

View File

@ -1192,9 +1192,11 @@ typedef struct IWineD3DPixelShaderImpl {
CONST DWORD *function; CONST DWORD *function;
UINT functionLength; UINT functionLength;
DWORD version; DWORD version;
CHAR constants[WINED3D_PSHADER_MAX_CONSTANTS];
/* run time data */ /* run time data */
PSHADERDATA *data; PSHADERDATA *data;
GLuint prgId;
#if 0 /* needs reworking */ #if 0 /* needs reworking */
PSHADERINPUTDATA input; PSHADERINPUTDATA input;

View File

@ -1298,10 +1298,8 @@ DECLARE_INTERFACE_(IWineD3DPixelShader,IUnknown)
STDMETHOD(GetParent)(THIS_ IUnknown **pParent) PURE; STDMETHOD(GetParent)(THIS_ IUnknown **pParent) PURE;
STDMETHOD(GetDevice)(THIS_ IWineD3DDevice** ppDevice) PURE; STDMETHOD(GetDevice)(THIS_ IWineD3DDevice** ppDevice) PURE;
STDMETHOD(GetFunction)(THIS_ VOID* pData, UINT* pSizeOfData) PURE; STDMETHOD(GetFunction)(THIS_ VOID* pData, UINT* pSizeOfData) PURE;
STDMETHOD(SetConstantF)(THIS_ UINT StartRegister, CONST FLOAT* pConstantData, UINT Vector4fCount) PURE;
STDMETHOD(GetConstantF)(THIS_ UINT StartRegister, FLOAT* pConstantData, UINT Vector4fCount) PURE;
/* Internal Interfaces */ /* Internal Interfaces */
STDMETHOD_(DWORD, GetVersion)(THIS) PURE; STDMETHOD(SetFunction)(THIS_ CONST DWORD *pFunction) PURE;
}; };
#undef INTERFACE #undef INTERFACE
@ -1314,9 +1312,7 @@ DECLARE_INTERFACE_(IWineD3DPixelShader,IUnknown)
#define IWineD3DPixelShader_GetParent(p,a) (p)->lpVtbl->GetParent(p,a) #define IWineD3DPixelShader_GetParent(p,a) (p)->lpVtbl->GetParent(p,a)
#define IWineD3DPixelShader_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a) #define IWineD3DPixelShader_GetDevice(p,a) (p)->lpVtbl->GetDevice(p,a)
#define IWineD3DPixelShader_GetFunction(p,a,b) (p)->lpVtbl->GetFunction(p,a,b) #define IWineD3DPixelShader_GetFunction(p,a,b) (p)->lpVtbl->GetFunction(p,a,b)
#define IWineD3DPixelShader_SetConstantF(p,a,b,c) (p)->lpVtbl->SetConstantF(p,a,b,c) #define IWineD3DPixelShader_SetFunction(p,a) (p)->lpVtbl->SetFunction(p,a)
#define IWineD3DPixelShader_GetConstantF(p,a,b,c) (p)->lpVtbl->GetConstantF(p,a,b,c)
#define IWineD3DPixelShader_GetVersion(p) (p)->lpVtbl->GetVersion(p)
#endif #endif
#if 0 /* FIXME: During porting in from d3d8 - the following will be used */ #if 0 /* FIXME: During porting in from d3d8 - the following will be used */