Henri Verbeet : d3d10core: Implement D3D10CoreRegisterLayers.

Alexandre Julliard julliard at winehq.org
Thu Nov 13 08:51:42 CST 2008


Module: wine
Branch: master
Commit: 4ba8261a93f5f0ef28fecb8001141564b9d52b59
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4ba8261a93f5f0ef28fecb8001141564b9d52b59

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Nov 12 15:43:46 2008 +0100

d3d10core: Implement D3D10CoreRegisterLayers.

---

 dlls/d3d10core/Makefile.in         |    2 +-
 dlls/d3d10core/d3d10core.spec      |    2 +-
 dlls/d3d10core/d3d10core_main.c    |   67 ++++++++++++++++++++++++++++++++++++
 dlls/d3d10core/d3d10core_private.h |   34 ++++++++++++++++++
 4 files changed, 103 insertions(+), 2 deletions(-)

diff --git a/dlls/d3d10core/Makefile.in b/dlls/d3d10core/Makefile.in
index e2e8d7d..a55b591 100644
--- a/dlls/d3d10core/Makefile.in
+++ b/dlls/d3d10core/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = d3d10core.dll
-IMPORTS   = dxguid uuid kernel32
+IMPORTS   = dxguid uuid dxgi kernel32
 
 C_SRCS = \
 	d3d10core_main.c \
diff --git a/dlls/d3d10core/d3d10core.spec b/dlls/d3d10core/d3d10core.spec
index 1143f78..26c4ab3 100644
--- a/dlls/d3d10core/d3d10core.spec
+++ b/dlls/d3d10core/d3d10core.spec
@@ -1 +1 @@
-@ stub D3D10CoreRegisterLayers
+@ stdcall D3D10CoreRegisterLayers()
diff --git a/dlls/d3d10core/d3d10core_main.c b/dlls/d3d10core/d3d10core_main.c
index 14dd099..e0b1eb6 100644
--- a/dlls/d3d10core/d3d10core_main.c
+++ b/dlls/d3d10core/d3d10core_main.c
@@ -37,3 +37,70 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
 
     return TRUE;
 }
+
+static HRESULT WINAPI layer_init(enum dxgi_device_layer_id id, DWORD *count, DWORD *values)
+{
+    TRACE("id %#x, count %p, values %p\n", id, count, values);
+
+    if (id != DXGI_DEVICE_LAYER_D3D10_DEVICE)
+    {
+        WARN("Unknown layer id %#x\n", id);
+        return E_NOTIMPL;
+    }
+
+    return S_OK;
+}
+
+static UINT WINAPI layer_get_size(enum dxgi_device_layer_id id, struct layer_get_size_args *args, DWORD unknown0)
+{
+    TRACE("id %#x, args %p, unknown0 %#x\n", id, args, unknown0);
+
+    if (id != DXGI_DEVICE_LAYER_D3D10_DEVICE)
+    {
+        WARN("Unknown layer id %#x\n", id);
+        return 0;
+    }
+
+    return sizeof(struct d3d10_device);
+}
+
+static HRESULT WINAPI layer_create(enum dxgi_device_layer_id id, void **layer_base, DWORD unknown0,
+        void *device_object, REFIID riid, void **device_layer)
+{
+    struct d3d10_device *object;
+
+    TRACE("id %#x, layer_base %p, unknown0 %#x, device_object %p, riid %s, device_layer %p\n",
+            id, layer_base, unknown0, device_object, debugstr_guid(riid), device_layer);
+
+    if (id != DXGI_DEVICE_LAYER_D3D10_DEVICE)
+    {
+        WARN("Unknown layer id %#x\n", id);
+        *device_layer = NULL;
+        return E_NOTIMPL;
+    }
+
+    object = (struct d3d10_device *)*layer_base;
+
+    object->vtbl = &d3d10_device_vtbl;
+    object->inner_unknown_vtbl = &d3d10_device_inner_unkown_vtbl;
+    object->refcount = 1;
+
+    object->outer_unknown = device_object;
+    *device_layer = &object->inner_unknown_vtbl;
+
+    TRACE("Created d3d10 device at %p\n", object);
+
+    return S_OK;
+}
+
+HRESULT WINAPI D3D10CoreRegisterLayers(void)
+{
+    const struct dxgi_device_layer layers[] =
+    {
+        {DXGI_DEVICE_LAYER_D3D10_DEVICE, layer_init, layer_get_size, layer_create},
+    };
+
+    DXGID3D10RegisterLayers(layers, sizeof(layers)/sizeof(*layers));
+
+    return S_OK;
+}
diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h
index a3e2755..16a4e71 100644
--- a/dlls/d3d10core/d3d10core_private.h
+++ b/dlls/d3d10core/d3d10core_private.h
@@ -43,4 +43,38 @@ struct d3d10_device
     LONG refcount;
 };
 
+/* Layered device */
+enum dxgi_device_layer_id
+{
+    DXGI_DEVICE_LAYER_DEBUG1        = 0x8,
+    DXGI_DEVICE_LAYER_THREAD_SAFE   = 0x10,
+    DXGI_DEVICE_LAYER_DEBUG2        = 0x20,
+    DXGI_DEVICE_LAYER_SWITCH_TO_REF = 0x30,
+    DXGI_DEVICE_LAYER_D3D10_DEVICE  = 0xffffffff,
+};
+
+struct layer_get_size_args
+{
+    DWORD unknown0;
+    DWORD unknown1;
+    DWORD *unknown2;
+    DWORD *unknown3;
+    IDXGIAdapter *adapter;
+    WORD interface_major;
+    WORD interface_minor;
+    WORD version_build;
+    WORD version_revision;
+};
+
+struct dxgi_device_layer
+{
+    enum dxgi_device_layer_id id;
+    HRESULT (WINAPI *init)(enum dxgi_device_layer_id id, DWORD *count, DWORD *values);
+    UINT (WINAPI *get_size)(enum dxgi_device_layer_id id, struct layer_get_size_args *args, DWORD unknown0);
+    HRESULT (WINAPI *create)(enum dxgi_device_layer_id id, void **layer_base, DWORD unknown0,
+            void *device_object, REFIID riid, void **device_layer);
+};
+
+HRESULT WINAPI DXGID3D10RegisterLayers(const struct dxgi_device_layer *layers, UINT layer_count);
+
 #endif /* __WINE_D3D10CORE_PRIVATE_H */




More information about the wine-cvs mailing list