diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 1f8bb6e461..b6fde8fc62 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -1290,13 +1290,29 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderConstant(LPDIRECT3DDEV return IWineD3DDevice_GetVertexShaderConstantF(This->WineD3DDevice, Register, (float *)pConstantData, ConstantCount); } +/* FIXME: There currently isn't a proper way to retrieve the declaration from + * the wined3d shader. However, rather than simply adding this, the relation + * between d3d8 and wined3d shaders should be fixed. A d3d8 vertex shader + * should contain both a wined3d vertex shader and a wined3d vertex + * declaration, and eg. SetVertexShader in d3d8 should set both of them in + * wined3d. This would also allow us to get rid of the vertexDeclaration field + * in IWineD3DVertexShaderImpl */ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderDeclaration(LPDIRECT3DDEVICE8 iface, DWORD pVertexShader, void* pData, DWORD* pSizeOfData) { - IDirect3DVertexShader8Impl *This = (IDirect3DVertexShader8Impl *)pVertexShader; + IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; + IDirect3DVertexShader8Impl *shader = NULL; - TRACE("(%p) : Relay\n", This); -/* return IWineD3DVertexShader_GetDeclaration(This->wineD3DVertexShader, pData, (UINT *)pSizeOfData); */ + TRACE("(%p) : pVertexShader %#x, pData %p, pSizeOfData %p\n", This, pVertexShader, pData, pSizeOfData); + + if (pVertexShader <= VS_HIGHESTFIXEDFXF || This->allocated_shader_handles <= pVertexShader - (VS_HIGHESTFIXEDFXF + 1)) { + ERR("Passed an invalid shader handle.\n"); + return D3DERR_INVALIDCALL; + } + + shader = This->shader_handles[pVertexShader - (VS_HIGHESTFIXEDFXF + 1)]; + FIXME("Unimplemented, returning D3DERR_INVALIDCALL\n"); return D3DERR_INVALIDCALL; } + static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderFunction(LPDIRECT3DDEVICE8 iface, DWORD pVertexShader, void* pData, DWORD* pSizeOfData) { IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IDirect3DVertexShader8Impl *shader = NULL;