From 0d18e35b28a44a0796c9e90b28922f8aaadd77e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rico=20Sch=C3=BCller?= Date: Wed, 21 Jul 2010 20:44:59 +0200 Subject: [PATCH] d3d10: Add a stub ID3D10ReflectShader implementation. --- dlls/d3d10/Makefile.in | 1 + dlls/d3d10/d3d10.spec | 2 +- dlls/d3d10/d3d10_main.c | 23 +++++++ dlls/d3d10/d3d10_private.h | 8 +++ dlls/d3d10/shader.c | 135 +++++++++++++++++++++++++++++++++++++ include/d3d10shader.h | 2 + 6 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 dlls/d3d10/shader.c diff --git a/dlls/d3d10/Makefile.in b/dlls/d3d10/Makefile.in index c872984f3f9..79b2bbcdd87 100644 --- a/dlls/d3d10/Makefile.in +++ b/dlls/d3d10/Makefile.in @@ -9,6 +9,7 @@ IMPORTS = dxguid uuid d3d10core dxgi C_SRCS = \ d3d10_main.c \ effect.c \ + shader.c \ utils.c RC_SRCS = version.rc diff --git a/dlls/d3d10/d3d10.spec b/dlls/d3d10/d3d10.spec index 86e1236a523..97ac7a935ec 100644 --- a/dlls/d3d10/d3d10.spec +++ b/dlls/d3d10/d3d10.spec @@ -17,7 +17,7 @@ @ stub D3D10GetVersion @ stdcall D3D10GetVertexShaderProfile(ptr) @ stub D3D10PreprocessShader -@ stub D3D10ReflectShader +@ stdcall D3D10ReflectShader(ptr long ptr) @ stub D3D10RegisterLayers @ stub D3D10StateBlockMaskDifference @ stub D3D10StateBlockMaskDisableAll diff --git a/dlls/d3d10/d3d10_main.c b/dlls/d3d10/d3d10_main.c index 65ce1e07d5f..2c07bb3f5b5 100644 --- a/dlls/d3d10/d3d10_main.c +++ b/dlls/d3d10/d3d10_main.c @@ -262,3 +262,26 @@ LPCSTR WINAPI D3D10GetPixelShaderProfile(ID3D10Device *device) return "ps_4_0"; } + +HRESULT WINAPI D3D10ReflectShader(const void *data, SIZE_T data_size, ID3D10ShaderReflection **reflector) +{ + struct d3d10_shader_reflection *object; + + FIXME("data %p, data_size %lu, reflector %p stub!\n", data, data_size, reflector); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate D3D10 shader reflection object memory\n"); + return E_OUTOFMEMORY; + } + + object->vtbl = &d3d10_shader_reflection_vtbl; + object->refcount = 1; + + *reflector = (ID3D10ShaderReflection *)object; + + TRACE("Created ID3D10ShaderReflection %p\n", object); + + return S_OK; +} diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h index 2e31f29b0e5..77a35295da2 100644 --- a/dlls/d3d10/d3d10_private.h +++ b/dlls/d3d10/d3d10_private.h @@ -212,6 +212,14 @@ struct d3d10_effect struct d3d10_effect_technique *techniques; }; +/* ID3D10ShaderReflection */ +extern const struct ID3D10ShaderReflectionVtbl d3d10_shader_reflection_vtbl DECLSPEC_HIDDEN; +struct d3d10_shader_reflection +{ + const struct ID3D10ShaderReflectionVtbl *vtbl; + LONG refcount; +}; + HRESULT d3d10_effect_parse(struct d3d10_effect *This, const void *data, SIZE_T data_size) DECLSPEC_HIDDEN; /* D3D10Core */ diff --git a/dlls/d3d10/shader.c b/dlls/d3d10/shader.c new file mode 100644 index 00000000000..d5d9e165507 --- /dev/null +++ b/dlls/d3d10/shader.c @@ -0,0 +1,135 @@ +/* + * Copyright 2009 Henri Verbeet for CodeWeavers + * Copyright 2010 Rico Schüller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +#include "config.h" +#include "wine/port.h" + +#include "d3d10_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d10); + +/* IUnknown methods */ + +static HRESULT STDMETHODCALLTYPE d3d10_shader_reflection_QueryInterface(ID3D10ShaderReflection *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_ID3D10ShaderReflection) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IUnknown_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG STDMETHODCALLTYPE d3d10_shader_reflection_AddRef(ID3D10ShaderReflection *iface) +{ + struct d3d10_shader_reflection *This = (struct d3d10_shader_reflection *)iface; + ULONG refcount = InterlockedIncrement(&This->refcount); + + TRACE("%p increasing refcount to %u\n", This, refcount); + + return refcount; +} + +static ULONG STDMETHODCALLTYPE d3d10_shader_reflection_Release(ID3D10ShaderReflection *iface) +{ + struct d3d10_shader_reflection *This = (struct d3d10_shader_reflection *)iface; + ULONG refcount = InterlockedDecrement(&This->refcount); + + TRACE("%p decreasing refcount to %u\n", This, refcount); + + if (!refcount) + { + HeapFree(GetProcessHeap(), 0, This); + } + + return refcount; +} + +/* ID3D10ShaderReflection methods */ + +static HRESULT STDMETHODCALLTYPE d3d10_shader_reflection_GetDesc(ID3D10ShaderReflection *iface, D3D10_SHADER_DESC *desc) +{ + FIXME("iface %p, desc %p stub!\n", iface, desc); + + return E_NOTIMPL; +} + +static struct ID3D10ShaderReflectionConstantBuffer * STDMETHODCALLTYPE d3d10_shader_reflection_GetConstantBufferByIndex( + ID3D10ShaderReflection *iface, UINT index) +{ + FIXME("iface %p, index %u stub!\n", iface, index); + + return NULL; +} + +static struct ID3D10ShaderReflectionConstantBuffer * STDMETHODCALLTYPE d3d10_shader_reflection_GetConstantBufferByName( + ID3D10ShaderReflection *iface, LPCSTR name) +{ + FIXME("iface %p, name \"%s\" stub!\n", iface, name); + + return NULL; +} + +static HRESULT STDMETHODCALLTYPE d3d10_shader_reflection_GetResourceBindingDesc( + ID3D10ShaderReflection *iface, UINT index, D3D10_SHADER_INPUT_BIND_DESC *desc) +{ + FIXME("iface %p, index %u, desc %p stub!\n", iface, index, desc); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d10_shader_reflection_GetInputParameterDesc( + ID3D10ShaderReflection *iface, UINT index, D3D10_SIGNATURE_PARAMETER_DESC *desc) +{ + FIXME("iface %p, index %u, desc %p stub!\n", iface, index, desc); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d10_shader_reflection_GetOutputParameterDesc( + ID3D10ShaderReflection *iface, UINT index, D3D10_SIGNATURE_PARAMETER_DESC *desc) +{ + FIXME("iface %p, index %u, desc %p stub!\n", iface, index, desc); + + return E_NOTIMPL; +} + +const struct ID3D10ShaderReflectionVtbl d3d10_shader_reflection_vtbl = +{ + /* IUnknown methods */ + d3d10_shader_reflection_QueryInterface, + d3d10_shader_reflection_AddRef, + d3d10_shader_reflection_Release, + /* ID3D10Effect methods */ + d3d10_shader_reflection_GetDesc, + d3d10_shader_reflection_GetConstantBufferByIndex, + d3d10_shader_reflection_GetConstantBufferByName, + d3d10_shader_reflection_GetResourceBindingDesc, + d3d10_shader_reflection_GetInputParameterDesc, + d3d10_shader_reflection_GetOutputParameterDesc, +}; diff --git a/include/d3d10shader.h b/include/d3d10shader.h index 728028c295c..7885bbd5239 100644 --- a/include/d3d10shader.h +++ b/include/d3d10shader.h @@ -277,4 +277,6 @@ LPCSTR WINAPI D3D10GetVertexShaderProfile(ID3D10Device *device); LPCSTR WINAPI D3D10GetGeometryShaderProfile(ID3D10Device *device); LPCSTR WINAPI D3D10GetPixelShaderProfile(ID3D10Device *device); +HRESULT WINAPI D3D10ReflectShader(const void *data, SIZE_T data_size, ID3D10ShaderReflection **reflector); + #endif /* __WINE_D3D10SHADER_H */