From 972221f5eafc7e16052f16d3798087bb5f429ff9 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Wed, 4 Mar 2009 07:07:38 +0100 Subject: [PATCH] d3d10core: Add a stub ID3D10GeometryShader implementation. --- dlls/d3d10core/d3d10core_private.h | 8 +++ dlls/d3d10core/device.c | 16 ++++- dlls/d3d10core/shader.c | 93 ++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h index 64265239d85..e3750682db6 100644 --- a/dlls/d3d10core/d3d10core_private.h +++ b/dlls/d3d10core/d3d10core_private.h @@ -105,6 +105,14 @@ struct d3d10_vertex_shader LONG refcount; }; +/* ID3D10GeometryShader */ +extern const struct ID3D10GeometryShaderVtbl d3d10_geometry_shader_vtbl; +struct d3d10_geometry_shader +{ + const struct ID3D10GeometryShaderVtbl *vtbl; + LONG refcount; +}; + /* Layered device */ enum dxgi_device_layer_id { diff --git a/dlls/d3d10core/device.c b/dlls/d3d10core/device.c index a8b7759a34f..0f66f7980a8 100644 --- a/dlls/d3d10core/device.c +++ b/dlls/d3d10core/device.c @@ -942,10 +942,24 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateVertexShader(ID3D10Device *i static HRESULT STDMETHODCALLTYPE d3d10_device_CreateGeometryShader(ID3D10Device *iface, const void *byte_code, SIZE_T byte_code_length, ID3D10GeometryShader **shader) { + struct d3d10_geometry_shader *object; + FIXME("iface %p, byte_code %p, byte_code_length %lu, shader %p stub!\n", iface, byte_code, byte_code_length, shader); - return E_NOTIMPL; + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate D3D10 geometry shader object memory\n"); + return E_OUTOFMEMORY; + } + + object->vtbl = &d3d10_geometry_shader_vtbl; + object->refcount = 1; + + *shader = (ID3D10GeometryShader *)object; + + return S_OK; } static HRESULT STDMETHODCALLTYPE d3d10_device_CreateGeometryShaderWithStreamOutput(ID3D10Device *iface, diff --git a/dlls/d3d10core/shader.c b/dlls/d3d10core/shader.c index 79e8b9b8c3d..01def340fd1 100644 --- a/dlls/d3d10core/shader.c +++ b/dlls/d3d10core/shader.c @@ -116,3 +116,96 @@ const struct ID3D10VertexShaderVtbl d3d10_vertex_shader_vtbl = d3d10_vertex_shader_SetPrivateData, d3d10_vertex_shader_SetPrivateDataInterface, }; + +/* IUnknown methods */ + +static HRESULT STDMETHODCALLTYPE d3d10_geometry_shader_QueryInterface(ID3D10GeometryShader *iface, + REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_ID3D10GeometryShader) + || IsEqualGUID(riid, &IID_ID3D10DeviceChild) + || 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_geometry_shader_AddRef(ID3D10GeometryShader *iface) +{ + struct d3d10_geometry_shader *This = (struct d3d10_geometry_shader *)iface; + ULONG refcount = InterlockedIncrement(&This->refcount); + + TRACE("%p increasing refcount to %u\n", This, refcount); + + return refcount; +} + +static ULONG STDMETHODCALLTYPE d3d10_geometry_shader_Release(ID3D10GeometryShader *iface) +{ + struct d3d10_geometry_shader *This = (struct d3d10_geometry_shader *)iface; + ULONG refcount = InterlockedDecrement(&This->refcount); + + TRACE("%p decreasing refcount to %u\n", This, refcount); + + if (!refcount) + { + HeapFree(GetProcessHeap(), 0, This); + } + + return refcount; +} + +/* ID3D10DeviceChild methods */ + +static void STDMETHODCALLTYPE d3d10_geometry_shader_GetDevice(ID3D10GeometryShader *iface, ID3D10Device **device) +{ + FIXME("iface %p, device %p stub!\n", iface, device); +} + +static HRESULT STDMETHODCALLTYPE d3d10_geometry_shader_GetPrivateData(ID3D10GeometryShader *iface, + REFGUID guid, UINT *data_size, void *data) +{ + FIXME("iface %p, guid %s, data_size %p, data %p stub!\n", + iface, debugstr_guid(guid), data_size, data); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d10_geometry_shader_SetPrivateData(ID3D10GeometryShader *iface, + REFGUID guid, UINT data_size, const void *data) +{ + FIXME("iface %p, guid %s, data_size %u, data %p stub!\n", + iface, debugstr_guid(guid), data_size, data); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d10_geometry_shader_SetPrivateDataInterface(ID3D10GeometryShader *iface, + REFGUID guid, const IUnknown *data) +{ + FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data); + + return E_NOTIMPL; +} + +const struct ID3D10GeometryShaderVtbl d3d10_geometry_shader_vtbl = +{ + /* IUnknown methods */ + d3d10_geometry_shader_QueryInterface, + d3d10_geometry_shader_AddRef, + d3d10_geometry_shader_Release, + /* ID3D10DeviceChild methods */ + d3d10_geometry_shader_GetDevice, + d3d10_geometry_shader_GetPrivateData, + d3d10_geometry_shader_SetPrivateData, + d3d10_geometry_shader_SetPrivateDataInterface, +};