From c1843c8779e9cfecfb38520f6cb435b05829151e Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Mon, 8 Nov 2010 19:56:15 +0100 Subject: [PATCH] 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 deletion(-) diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index 50bf64d5205..c20e2f98857 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 73f13d7fc3a..177b4c7b21f 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 42d52d70b13..b191a348083 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,