Matteo Bruni : d3dx9: Implement D3DXCheckVolumeTextureRequirements.

Alexandre Julliard julliard at winehq.org
Tue Nov 9 13:13:23 CST 2010


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

Author: Matteo Bruni <mbruni at codeweavers.com>
Date:   Mon Nov  8 19:56:15 2010 +0100

d3dx9: Implement D3DXCheckVolumeTextureRequirements.

---

 dlls/d3dx9_36/d3dx9_36.spec   |    2 +-
 dlls/d3dx9_36/tests/texture.c |  109 +++++++++++++++++++++++++++++++++++++++++
 dlls/d3dx9_36/texture.c       |   74 ++++++++++++++++++++++++++++
 3 files changed, 184 insertions(+), 1 deletions(-)

diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec
index 50bf64d..c20e2f9 100644
--- a/dlls/d3dx9_36/d3dx9_36.spec
+++ b/dlls/d3dx9_36/d3dx9_36.spec
@@ -7,7 +7,7 @@
 @ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr ptr)
 @ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr ptr)
 @ stdcall D3DXCheckVersion(long long)
-@ stub D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr ptr)
 @ stub D3DXCleanMesh
 @ stdcall D3DXColorAdjustContrast(ptr ptr float)
 @ stdcall D3DXColorAdjustSaturation(ptr ptr float)
diff --git a/dlls/d3dx9_36/tests/texture.c b/dlls/d3dx9_36/tests/texture.c
index 73f13d7..177b4c7 100644
--- a/dlls/d3dx9_36/tests/texture.c
+++ b/dlls/d3dx9_36/tests/texture.c
@@ -278,6 +278,114 @@ static void test_D3DXCheckCubeTextureRequirements(IDirect3DDevice9 *device)
     ok(format == D3DFMT_X8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_X8R8G8B8);
 }
 
+static void test_D3DXCheckVolumeTextureRequirements(IDirect3DDevice9 *device)
+{
+    UINT width, height, depth, mipmaps;
+    D3DFORMAT format;
+    D3DCAPS9 caps;
+    HRESULT hr;
+
+    IDirect3DDevice9_GetDeviceCaps(device, &caps);
+
+    if (!(caps.TextureCaps & D3DPTEXTURECAPS_VOLUMEMAP))
+    {
+        skip("No volume textures support\n");
+        return;
+    }
+
+    /* general tests */
+    hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+
+    hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, D3DX_DEFAULT, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+
+    hr = D3DXCheckVolumeTextureRequirements(NULL, NULL, NULL, NULL, NULL, D3DX_DEFAULT, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3DERR_INVALIDCALL, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+
+    /* width, height, depth */
+    width = height = depth = D3DX_DEFAULT;
+    hr = D3DXCheckVolumeTextureRequirements(device, &width, &height, &depth, NULL, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(width == 256, "Returned width %d, expected %d\n", width, 256);
+    ok(height == 256, "Returned height %d, expected %d\n", height, 256);
+    ok(depth == 1, "Returned depth %d, expected %d\n", depth, 1);
+
+    width = D3DX_DEFAULT;
+    hr = D3DXCheckVolumeTextureRequirements(device, &width, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(width == 256, "Returned width %d, expected %d\n", width, 256);
+
+    width = D3DX_DEFAULT; height = 0; depth = 0;
+    hr = D3DXCheckVolumeTextureRequirements(device, &width, &height, &depth, NULL, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(width == 1, "Returned width %d, expected %d\n", width, 1);
+    ok(height == 1, "Returned height %d, expected %d\n", height, 1);
+    ok(depth == 1, "Returned height %d, expected %d\n", depth, 1);
+
+    width = 0; height = 0; depth = 0;
+    hr = D3DXCheckVolumeTextureRequirements(device, &width, &height, &depth, NULL, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(width == 1, "Returned width %d, expected %d\n", width, 1);
+    ok(height == 1, "Returned height %d, expected %d\n", height, 1);
+    ok(depth == 1, "Returned height %d, expected %d\n", depth, 1);
+
+    width = 0;
+    hr = D3DXCheckVolumeTextureRequirements(device, &width, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(width == 1, "Returned width %d, expected %d\n", width, 1);
+
+    width = 0xFFFFFFFE;
+    hr = D3DXCheckVolumeTextureRequirements(device, &width, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(width == caps.MaxVolumeExtent, "Returned width %d, expected %d\n", width, caps.MaxVolumeExtent);
+
+    /* format */
+    hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+
+    format = D3DFMT_UNKNOWN;
+    hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8);
+
+    format = D3DX_DEFAULT;
+    hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8);
+
+    format = D3DFMT_R8G8B8;
+    hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(format == D3DFMT_X8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_X8R8G8B8);
+
+    /* mipmaps */
+    if (!(caps.TextureCaps & D3DPTEXTURECAPS_MIPVOLUMEMAP))
+    {
+        skip("No volume textures mipmapping support\n");
+        return;
+    }
+
+    width = height = depth = 64;
+    mipmaps = 9;
+    hr = D3DXCheckVolumeTextureRequirements(device, &width, &height, &depth, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(mipmaps == 7, "Returned mipmaps %d, expected %d\n", mipmaps, 7);
+
+    width = 284;
+    height = 143;
+    depth = 55;
+    mipmaps = 20;
+    hr = D3DXCheckVolumeTextureRequirements(device, &width, &height, &depth, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(mipmaps == 10, "Returned mipmaps %d, expected %d\n", mipmaps, 10);
+
+    mipmaps = 0;
+    hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
+    ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+    ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9);
+}
+
 static void test_D3DXCreateTexture(IDirect3DDevice9 *device)
 {
     IDirect3DTexture9 *texture;
@@ -581,6 +689,7 @@ START_TEST(texture)
 
     test_D3DXCheckTextureRequirements(device);
     test_D3DXCheckCubeTextureRequirements(device);
+    test_D3DXCheckVolumeTextureRequirements(device);
     test_D3DXCreateTexture(device);
     test_D3DXFilterTexture(device);
 
diff --git a/dlls/d3dx9_36/texture.c b/dlls/d3dx9_36/texture.c
index 42d52d7..b191a34 100644
--- a/dlls/d3dx9_36/texture.c
+++ b/dlls/d3dx9_36/texture.c
@@ -383,6 +383,80 @@ HRESULT WINAPI D3DXCheckCubeTextureRequirements(LPDIRECT3DDEVICE9 device,
     return hr;
 }
 
+HRESULT WINAPI D3DXCheckVolumeTextureRequirements(LPDIRECT3DDEVICE9 device,
+                                                  UINT *width,
+                                                  UINT *height,
+                                                  UINT *depth,
+                                                  UINT *miplevels,
+                                                  DWORD usage,
+                                                  D3DFORMAT *format,
+                                                  D3DPOOL pool)
+{
+    D3DCAPS9 caps;
+    UINT w = width ? *width : D3DX_DEFAULT;
+    UINT h = height ? *height : D3DX_DEFAULT;
+    UINT d = (depth && *depth) ? *depth : 1;
+    HRESULT hr;
+
+    TRACE("(%p, %p, %p, %p, %p, %u, %p, %u)\n", device, width, height, depth, miplevels,
+          usage, format, pool);
+
+    if (!device || FAILED(IDirect3DDevice9_GetDeviceCaps(device, &caps)))
+        return D3DERR_INVALIDCALL;
+
+    if (!(caps.TextureCaps & D3DPTEXTURECAPS_VOLUMEMAP))
+        return D3DERR_NOTAVAILABLE;
+
+    hr = D3DXCheckTextureRequirements(device, &w, &h, NULL, usage, format, pool);
+    if (d == D3DX_DEFAULT)
+        d = 1;
+
+    /* ensure width/height is power of 2 */
+    if ((caps.TextureCaps & D3DPTEXTURECAPS_VOLUMEMAP_POW2) &&
+        (!is_pow2(w) || !is_pow2(h) || !is_pow2(d)))
+    {
+        w = make_pow2(w);
+        h = make_pow2(h);
+        d = make_pow2(d);
+    }
+
+    if (w > caps.MaxVolumeExtent)
+        w = caps.MaxVolumeExtent;
+    if (h > caps.MaxVolumeExtent)
+        h = caps.MaxVolumeExtent;
+    if (d > caps.MaxVolumeExtent)
+        d = caps.MaxVolumeExtent;
+
+    if (miplevels)
+    {
+        if (!(caps.TextureCaps & D3DPTEXTURECAPS_MIPVOLUMEMAP))
+            *miplevels = 1;
+        else
+        {
+            UINT max_mipmaps = 1;
+            UINT max_dimen = max(max(w, h), d);
+
+            while (max_dimen > 1)
+            {
+                max_dimen >>= 1;
+                max_mipmaps++;
+            }
+
+            if (*miplevels == 0 || *miplevels > max_mipmaps)
+                *miplevels = max_mipmaps;
+        }
+    }
+
+    if (width)
+        *width = w;
+    if (height)
+        *height = h;
+    if (depth)
+        *depth = d;
+
+    return hr;
+}
+
 HRESULT WINAPI D3DXCreateTexture(LPDIRECT3DDEVICE9 pDevice,
                                  UINT width,
                                  UINT height,




More information about the wine-cvs mailing list