[5/7] d3dx9: Add ID3DXRenderToSurface interface stub.

Józef Kucia joseph.kucia at gmail.com
Tue Jun 5 05:05:43 CDT 2012


---
 dlls/d3dx9_36/render.c     |  131 +++++++++++++++++++++++++++++++++++++++++++-
 dlls/d3dx9_36/tests/core.c |    2 -
 2 files changed, 129 insertions(+), 4 deletions(-)

diff --git a/dlls/d3dx9_36/render.c b/dlls/d3dx9_36/render.c
index 0e8ed7a..4e4adfb 100644
--- a/dlls/d3dx9_36/render.c
+++ b/dlls/d3dx9_36/render.c
@@ -22,6 +22,121 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
 
+struct render_to_surface
+{
+    ID3DXRenderToSurface ID3DXRenderToSurface_iface;
+    LONG ref;
+
+    IDirect3DDevice9 *device;
+};
+
+static inline struct render_to_surface *impl_from_ID3DXRenderToSurface(ID3DXRenderToSurface *iface)
+{
+    return CONTAINING_RECORD(iface, struct render_to_surface, ID3DXRenderToSurface_iface);
+}
+
+static HRESULT WINAPI D3DXRenderToSurface_QueryInterface(ID3DXRenderToSurface *iface,
+                                                         REFIID riid,
+                                                         void **out)
+{
+    TRACE("iface %p, riid %s, out %p\n", iface, debugstr_guid(riid), out);
+
+    if (IsEqualGUID(riid, &IID_ID3DXRenderToSurface)
+            || IsEqualGUID(riid, &IID_IUnknown))
+    {
+        IUnknown_AddRef(iface);
+        *out = iface;
+        return S_OK;
+    }
+
+    WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
+
+    *out = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI D3DXRenderToSurface_AddRef(ID3DXRenderToSurface *iface)
+{
+    struct render_to_surface *render = impl_from_ID3DXRenderToSurface(iface);
+    ULONG ref = InterlockedIncrement(&render->ref);
+
+    TRACE("%p increasing refcount to %u\n", iface, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI D3DXRenderToSurface_Release(ID3DXRenderToSurface *iface)
+{
+    struct render_to_surface *render = impl_from_ID3DXRenderToSurface(iface);
+    ULONG ref = InterlockedDecrement(&render->ref);
+
+    TRACE("%p decreasing refcount to %u\n", iface, ref);
+
+    if (!ref)
+    {
+        IDirect3DDevice9_Release(render->device);
+        HeapFree(GetProcessHeap(), 0, render);
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI D3DXRenderToSurface_GetDevice(ID3DXRenderToSurface *iface,
+                                                    IDirect3DDevice9 **device)
+{
+    FIXME("(%p)->(%p): stub\n", iface, device);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI D3DXRenderToSurface_GetDesc(ID3DXRenderToSurface *iface,
+                                                  D3DXRTS_DESC *desc)
+{
+    FIXME("(%p)->(%p): stub\n", iface, desc);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI D3DXRenderToSurface_BeginScene(ID3DXRenderToSurface *iface,
+                                                     IDirect3DSurface9 *surface,
+                                                     const D3DVIEWPORT9 *viewport)
+{
+    FIXME("(%p)->(%p, %p): stub\n", iface, surface, viewport);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI D3DXRenderToSurface_EndScene(ID3DXRenderToSurface *iface,
+                                                   DWORD mip_filter)
+{
+    FIXME("(%p)->(%#x): stub\n", iface, mip_filter);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI D3DXRenderToSurface_OnLostDevice(ID3DXRenderToSurface *iface)
+{
+    FIXME("(%p)->(): stub\n", iface);
+    return D3D_OK;
+}
+
+static HRESULT WINAPI D3DXRenderToSurface_OnResetDevice(ID3DXRenderToSurface *iface)
+{
+    FIXME("(%p)->(): stub\n", iface);
+    return D3D_OK;
+}
+
+static const ID3DXRenderToSurfaceVtbl d3dx_render_to_surface_vtbl =
+{
+    /* IUnknown methods */
+    D3DXRenderToSurface_QueryInterface,
+    D3DXRenderToSurface_AddRef,
+    D3DXRenderToSurface_Release,
+    /* ID3DXRenderToSurface methods */
+    D3DXRenderToSurface_GetDevice,
+    D3DXRenderToSurface_GetDesc,
+    D3DXRenderToSurface_BeginScene,
+    D3DXRenderToSurface_EndScene,
+    D3DXRenderToSurface_OnLostDevice,
+    D3DXRenderToSurface_OnResetDevice
+};
+
 HRESULT WINAPI D3DXCreateRenderToSurface(IDirect3DDevice9 *device,
                                          UINT width,
                                          UINT height,
@@ -30,10 +145,22 @@ HRESULT WINAPI D3DXCreateRenderToSurface(IDirect3DDevice9 *device,
                                          D3DFORMAT depth_stencil_format,
                                          ID3DXRenderToSurface **out)
 {
-    FIXME("(%p, %u, %u, %#x, %d, %#x, %p): stub\n", device, width, height, format,
+    struct render_to_surface *render;
+
+    FIXME("(%p, %u, %u, %#x, %d, %#x, %p): semi-stub\n", device, width, height, format,
             depth_stencil, depth_stencil_format, out);
 
     if (!device || !out) return D3DERR_INVALIDCALL;
 
-    return E_NOTIMPL;
+    render = HeapAlloc(GetProcessHeap(), 0, sizeof(struct render_to_surface));
+    if (!render) return E_OUTOFMEMORY;
+
+    render->ID3DXRenderToSurface_iface.lpVtbl = &d3dx_render_to_surface_vtbl;
+    render->ref = 1;
+
+    IDirect3DDevice9_AddRef(device);
+    render->device = device;
+
+    *out = &render->ID3DXRenderToSurface_iface;
+    return D3D_OK;
 }
diff --git a/dlls/d3dx9_36/tests/core.c b/dlls/d3dx9_36/tests/core.c
index 2ba56b5..ae60080 100644
--- a/dlls/d3dx9_36/tests/core.c
+++ b/dlls/d3dx9_36/tests/core.c
@@ -459,7 +459,6 @@ void test_D3DXCreateRenderToSurface(IDirect3DDevice9 *device)
     hr = D3DXCreateRenderToSurface(device, 256, 256, D3DFMT_A8R8G8B8, FALSE, D3DFMT_UNKNOWN, NULL /* out */);
     ok(hr == D3DERR_INVALIDCALL, "D3DXCreateRenderToSurface returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
 
-    todo_wine {
     hr = D3DXCreateRenderToSurface(device, 0 /* width */, 256, D3DFMT_A8R8G8B8, FALSE, D3DFMT_UNKNOWN, &render);
     ok(hr == D3D_OK, "D3DXCreateRenderToSurface returned %#x, expected %#x\n", hr, D3D_OK);
     if (SUCCEEDED(hr)) ID3DXRenderToSurface_Release(render);
@@ -481,7 +480,6 @@ void test_D3DXCreateRenderToSurface(IDirect3DDevice9 *device)
     hr = D3DXCreateRenderToSurface(device, 0, 0, D3DFMT_UNKNOWN, FALSE, D3DFMT_UNKNOWN, &render);
     check_ref((IUnknown *)device, ref_count + 1);
     if (SUCCEEDED(hr)) ID3DXRenderToSurface_Release(render);
-    }
 }
 
 START_TEST(core)
-- 
1.7.8.6




More information about the wine-patches mailing list