=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3dx9: Add ID3DXRenderToEnvMap interface stub.

Alexandre Julliard julliard at winehq.org
Mon Jun 11 15:08:07 CDT 2012


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

Author: Józef Kucia <joseph.kucia at gmail.com>
Date:   Sun Jun 10 21:29:14 2012 +0200

d3dx9: Add ID3DXRenderToEnvMap interface stub.

---

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

diff --git a/dlls/d3dx9_36/render.c b/dlls/d3dx9_36/render.c
index 9b691bc..7994a8b 100644
--- a/dlls/d3dx9_36/render.c
+++ b/dlls/d3dx9_36/render.c
@@ -315,7 +315,7 @@ static HRESULT WINAPI D3DXRenderToSurface_OnResetDevice(ID3DXRenderToSurface *if
     return D3D_OK;
 }
 
-static const ID3DXRenderToSurfaceVtbl d3dx_render_to_surface_vtbl =
+static const ID3DXRenderToSurfaceVtbl render_to_surface_vtbl =
 {
     /* IUnknown methods */
     D3DXRenderToSurface_QueryInterface,
@@ -354,7 +354,7 @@ HRESULT WINAPI D3DXCreateRenderToSurface(IDirect3DDevice9 *device,
     render = HeapAlloc(GetProcessHeap(), 0, sizeof(struct render_to_surface));
     if (!render) return E_OUTOFMEMORY;
 
-    render->ID3DXRenderToSurface_iface.lpVtbl = &d3dx_render_to_surface_vtbl;
+    render->ID3DXRenderToSurface_iface.lpVtbl = &render_to_surface_vtbl;
     render->ref = 1;
 
     render->desc.Width = width;
@@ -387,6 +387,172 @@ HRESULT WINAPI D3DXCreateRenderToSurface(IDirect3DDevice9 *device,
     return D3D_OK;
 }
 
+
+struct render_to_envmap
+{
+    ID3DXRenderToEnvMap ID3DXRenderToEnvMap_iface;
+    LONG ref;
+
+    IDirect3DDevice9 *device;
+    D3DXRTE_DESC desc;
+};
+
+static inline struct render_to_envmap *impl_from_ID3DXRenderToEnvMap(ID3DXRenderToEnvMap *iface)
+{
+    return CONTAINING_RECORD(iface, struct render_to_envmap, ID3DXRenderToEnvMap_iface);
+}
+
+static HRESULT WINAPI D3DXRenderToEnvMap_QueryInterface(ID3DXRenderToEnvMap *iface,
+                                                        REFIID riid,
+                                                        void **out)
+{
+    TRACE("iface %p, riid %s, out %p\n", iface, debugstr_guid(riid), out);
+
+    if (IsEqualGUID(riid, &IID_ID3DXRenderToEnvMap)
+            || 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 D3DXRenderToEnvMap_AddRef(ID3DXRenderToEnvMap *iface)
+{
+    struct render_to_envmap *render = impl_from_ID3DXRenderToEnvMap(iface);
+    ULONG ref = InterlockedIncrement(&render->ref);
+
+    TRACE("%p increasing refcount to %u\n", iface, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI D3DXRenderToEnvMap_Release(ID3DXRenderToEnvMap *iface)
+{
+    struct render_to_envmap *render = impl_from_ID3DXRenderToEnvMap(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 D3DXRenderToEnvMap_GetDevice(ID3DXRenderToEnvMap *iface,
+                                                   IDirect3DDevice9 **device)
+{
+    struct render_to_envmap *render = impl_from_ID3DXRenderToEnvMap(iface);
+
+    TRACE("(%p)->(%p)\n", iface, device);
+
+    if (!device) return D3DERR_INVALIDCALL;
+
+    IDirect3DDevice9_AddRef(render->device);
+    *device = render->device;
+    return D3D_OK;
+}
+
+static HRESULT WINAPI D3DXRenderToEnvMap_GetDesc(ID3DXRenderToEnvMap *iface,
+                                                 D3DXRTE_DESC *desc)
+{
+    struct render_to_envmap *render = impl_from_ID3DXRenderToEnvMap(iface);
+
+    TRACE("(%p)->(%p)\n", iface, desc);
+
+    if (!desc) return D3DERR_INVALIDCALL;
+
+    *desc = render->desc;
+    return D3D_OK;
+}
+
+static HRESULT WINAPI D3DXRenderToEnvMap_BeginCube(ID3DXRenderToEnvMap *iface,
+                                                   IDirect3DCubeTexture9 *texture)
+{
+    FIXME("(%p)->(%p): stub\n", iface, texture);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI D3DXRenderToEnvMap_BeginSphere(ID3DXRenderToEnvMap *iface,
+                                                     IDirect3DTexture9 *texture)
+{
+    FIXME("(%p)->(%p): stub\n", iface, texture);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI D3DXRenderToEnvMap_BeginHemisphere(ID3DXRenderToEnvMap *iface,
+                                                         IDirect3DTexture9 *pos_z_texture,
+                                                         IDirect3DTexture9 *neg_z_texture)
+{
+    FIXME("(%p)->(%p, %p): stub\n", iface, pos_z_texture, neg_z_texture);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI D3DXRenderToEnvMap_BeginParabolic(ID3DXRenderToEnvMap *iface,
+                                                        IDirect3DTexture9 *pos_z_texture,
+                                                        IDirect3DTexture9 *neg_z_texture)
+{
+    FIXME("(%p)->(%p, %p): stub\n", iface, pos_z_texture, neg_z_texture);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI D3DXRenderToEnvMap_Face(ID3DXRenderToEnvMap *iface,
+                                              D3DCUBEMAP_FACES face,
+                                              DWORD filter)
+{
+    FIXME("(%p)->(%u, %#x): stub\n", iface, face, filter);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI D3DXRenderToEnvMap_End(ID3DXRenderToEnvMap *iface,
+                                             DWORD filter)
+{
+    FIXME("(%p)->(%#x): stub\n", iface, filter);
+    return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI D3DXRenderToEnvMap_OnLostDevice(ID3DXRenderToEnvMap *iface)
+{
+    FIXME("(%p)->(): stub\n", iface);
+    return D3D_OK;
+}
+
+static HRESULT WINAPI D3DXRenderToEnvMap_OnResetDevice(ID3DXRenderToEnvMap *iface)
+{
+    FIXME("(%p)->(): stub\n", iface);
+    return D3D_OK;
+}
+
+static const ID3DXRenderToEnvMapVtbl render_to_envmap_vtbl =
+{
+    /* IUnknown methods */
+    D3DXRenderToEnvMap_QueryInterface,
+    D3DXRenderToEnvMap_AddRef,
+    D3DXRenderToEnvMap_Release,
+    /* ID3DXRenderToEnvMap methods */
+    D3DXRenderToEnvMap_GetDevice,
+    D3DXRenderToEnvMap_GetDesc,
+    D3DXRenderToEnvMap_BeginCube,
+    D3DXRenderToEnvMap_BeginSphere,
+    D3DXRenderToEnvMap_BeginHemisphere,
+    D3DXRenderToEnvMap_BeginParabolic,
+    D3DXRenderToEnvMap_Face,
+    D3DXRenderToEnvMap_End,
+    D3DXRenderToEnvMap_OnLostDevice,
+    D3DXRenderToEnvMap_OnResetDevice
+};
+
 HRESULT WINAPI D3DXCreateRenderToEnvMap(IDirect3DDevice9 *device,
                                         UINT size,
                                         UINT mip_levels,
@@ -395,10 +561,33 @@ HRESULT WINAPI D3DXCreateRenderToEnvMap(IDirect3DDevice9 *device,
                                         D3DFORMAT depth_stencil_format,
                                         ID3DXRenderToEnvMap **out)
 {
-    FIXME("(%p, %u, %u, %#x, %d, %#x, %p): stub\n", device, size, mip_levels,
+    HRESULT hr;
+    struct render_to_envmap *render;
+
+    TRACE("(%p, %u, %u, %#x, %d, %#x, %p)\n", device, size, mip_levels,
             format, depth_stencil, depth_stencil_format, out);
 
     if (!device || !out) return D3DERR_INVALIDCALL;
 
-    return E_NOTIMPL;
+    hr = D3DXCheckTextureRequirements(device, &size, &size, &mip_levels,
+            D3DUSAGE_RENDERTARGET, &format, D3DPOOL_DEFAULT);
+    if (FAILED(hr)) return hr;
+
+    render = HeapAlloc(GetProcessHeap(), 0, sizeof(struct render_to_envmap));
+    if (!render) return E_OUTOFMEMORY;
+
+    render->ID3DXRenderToEnvMap_iface.lpVtbl = &render_to_envmap_vtbl;
+    render->ref = 1;
+
+    render->desc.Size = size;
+    render->desc.MipLevels = mip_levels;
+    render->desc.Format = format;
+    render->desc.DepthStencil = depth_stencil;
+    render->desc.DepthStencilFormat = depth_stencil_format;
+
+    IDirect3DDevice9_AddRef(device);
+    render->device = device;
+
+    *out = &render->ID3DXRenderToEnvMap_iface;
+    return D3D_OK;
 }
diff --git a/dlls/d3dx9_36/tests/core.c b/dlls/d3dx9_36/tests/core.c
index 3009f50..fa259ab 100644
--- a/dlls/d3dx9_36/tests/core.c
+++ b/dlls/d3dx9_36/tests/core.c
@@ -908,7 +908,7 @@ void test_D3DXCreateRenderToEnvMap(IDirect3DDevice9 *device)
         const D3DXRTE_DESC *expected  = &tests[i].expected_values;
         hr = D3DXCreateRenderToEnvMap(device, parameters->Size, parameters->MipLevels, parameters->Format,
                 parameters->DepthStencil, parameters->DepthStencilFormat, &render);
-        todo_wine ok(hr == D3D_OK, "%d: D3DXCreateRenderToEnvMap returned %#x, expected %#x\n", i, hr, D3D_OK);
+        ok(hr == D3D_OK, "%d: D3DXCreateRenderToEnvMap returned %#x, expected %#x\n", i, hr, D3D_OK);
         if (SUCCEEDED(hr))
         {
             hr = ID3DXRenderToEnvMap_GetDesc(render, &desc);
@@ -930,7 +930,7 @@ void test_D3DXCreateRenderToEnvMap(IDirect3DDevice9 *device)
     /* check device ref count */
     ref_count = get_ref((IUnknown *)device);
     hr = D3DXCreateRenderToEnvMap(device, 0, 0, D3DFMT_UNKNOWN, FALSE, D3DFMT_UNKNOWN, &render);
-    todo_wine check_ref((IUnknown *)device, ref_count + 1);
+    check_ref((IUnknown *)device, ref_count + 1);
     if (SUCCEEDED(hr)) ID3DXRenderToEnvMap_Release(render);
 }
 




More information about the wine-cvs mailing list