[01/10] d3dx9: Correctly handle D3DUSAGE_AUTOGENMIPMAP in D3DXCheckTextureRequirements.
Józef Kucia
joseph.kucia at gmail.com
Fri May 18 08:50:08 CDT 2012
---
dlls/d3dx9_36/tests/texture.c | 56 +++++++++++++++++++++++++++++++++++++++++
dlls/d3dx9_36/texture.c | 7 ++++-
2 files changed, 62 insertions(+), 1 deletions(-)
diff --git a/dlls/d3dx9_36/tests/texture.c b/dlls/d3dx9_36/tests/texture.c
index 5663bfa..80311e6 100644
--- a/dlls/d3dx9_36/tests/texture.c
+++ b/dlls/d3dx9_36/tests/texture.c
@@ -85,6 +85,29 @@ static const unsigned char dds_volume_map[] = {
0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x84,0xef,0x7b,0xaa,0xab,0xab,0xab
};
+static BOOL is_autogenmipmap_supported(IDirect3DDevice9 *device, D3DRESOURCETYPE resource_type)
+{
+ HRESULT hr;
+ D3DCAPS9 caps;
+ IDirect3D9 *d3d9;
+ D3DDISPLAYMODE mode;
+ D3DDEVICE_CREATION_PARAMETERS params;
+
+ IDirect3DDevice9_GetDeviceCaps(device, &caps);
+ IDirect3DDevice9_GetDirect3D(device, &d3d9);
+ IDirect3DDevice9_GetCreationParameters(device, ¶ms);
+ IDirect3DDevice9_GetDisplayMode(device, 0, &mode);
+
+ if (!(caps.Caps2 & D3DCAPS2_CANAUTOGENMIPMAP))
+ return FALSE;
+
+ hr = IDirect3D9_CheckDeviceFormat(d3d9, params.AdapterOrdinal, params.DeviceType,
+ mode.Format, D3DUSAGE_AUTOGENMIPMAP, resource_type, D3DFMT_A8R8G8B8);
+
+ IDirect3D9_Release(d3d9);
+ return SUCCEEDED(hr);
+}
+
static void test_D3DXCheckTextureRequirements(IDirect3DDevice9 *device)
{
UINT width, height, mipmaps;
@@ -199,6 +222,29 @@ static void test_D3DXCheckTextureRequirements(IDirect3DDevice9 *device)
ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9);
+ /* mipmaps when D3DUSAGE_AUTOGENMIPMAP is set */
+ if (is_autogenmipmap_supported(device, D3DRTYPE_TEXTURE))
+ {
+ mipmaps = 0;
+ hr = D3DXCheckTextureRequirements(device, NULL, NULL, &mipmaps, D3DUSAGE_AUTOGENMIPMAP, NULL, D3DPOOL_DEFAULT);
+ ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+ ok(mipmaps == 0, "Returned mipmaps %d, expected %d\n", mipmaps, 0);
+ mipmaps = 1;
+ hr = D3DXCheckTextureRequirements(device, NULL, NULL, &mipmaps, D3DUSAGE_AUTOGENMIPMAP, NULL, D3DPOOL_DEFAULT);
+ ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+ ok(mipmaps == 1, "Returned mipmaps %d, expected %d\n", mipmaps, 1);
+ mipmaps = 2;
+ hr = D3DXCheckTextureRequirements(device, NULL, NULL, &mipmaps, D3DUSAGE_AUTOGENMIPMAP, NULL, D3DPOOL_DEFAULT);
+ ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+ ok(mipmaps == 0, "Returned mipmaps %d, expected %d\n", mipmaps, 0);
+ mipmaps = 6;
+ hr = D3DXCheckTextureRequirements(device, NULL, NULL, &mipmaps, D3DUSAGE_AUTOGENMIPMAP, NULL, D3DPOOL_DEFAULT);
+ ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+ ok(mipmaps == 0, "Returned mipmaps %d, expected %d\n", mipmaps, 0);
+ }
+ else
+ skip("No D3DUSAGE_AUTOGENMIPMAP support for textures\n");
+
/* usage */
hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_WRITEONLY, NULL, D3DPOOL_DEFAULT);
ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n");
@@ -322,6 +368,16 @@ static void test_D3DXCheckCubeTextureRequirements(IDirect3DDevice9 *device)
ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9);
+ if (is_autogenmipmap_supported(device, D3DRTYPE_CUBETEXTURE))
+ {
+ mipmaps = 3;
+ hr = D3DXCheckCubeTextureRequirements(device, NULL, &mipmaps, D3DUSAGE_AUTOGENMIPMAP, NULL, D3DPOOL_DEFAULT);
+ ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
+ ok(mipmaps == 0, "Returned mipmaps %d, expected %d\n", mipmaps, 0);
+ }
+ else
+ skip("No D3DUSAGE_AUTOGENMIPMAP support for cube textures\n");
+
/* usage */
hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, D3DUSAGE_WRITEONLY, NULL, D3DPOOL_DEFAULT);
ok(hr == D3DERR_INVALIDCALL, "D3DXCheckCubeTextureRequirements succeeded, but should've failed.\n");
diff --git a/dlls/d3dx9_36/texture.c b/dlls/d3dx9_36/texture.c
index 6a33547..89cc078 100644
--- a/dlls/d3dx9_36/texture.c
+++ b/dlls/d3dx9_36/texture.c
@@ -216,7 +216,12 @@ HRESULT WINAPI D3DXCheckTextureRequirements(LPDIRECT3DDEVICE9 device,
*height = h;
/* miplevels */
- if (miplevels)
+ if (miplevels && (usage & D3DUSAGE_AUTOGENMIPMAP))
+ {
+ if (*miplevels > 1)
+ *miplevels = 0;
+ }
+ else if (miplevels)
{
UINT max_mipmaps = 1;
--
1.7.8.6
More information about the wine-patches
mailing list