Owen Rudge : d3dx9: Implement D3DXCreateTexture plus tests.
Alexandre Julliard
julliard at winehq.org
Mon Jul 26 13:22:26 CDT 2010
Module: wine
Branch: master
Commit: 30d5e375e6f432b184ddc76d8d97c630718bd657
URL: http://source.winehq.org/git/wine.git/?a=commit;h=30d5e375e6f432b184ddc76d8d97c630718bd657
Author: Owen Rudge <owen at owenrudge.net>
Date: Thu Jul 22 20:38:23 2010 +0100
d3dx9: Implement D3DXCreateTexture plus tests.
---
dlls/d3dx9_36/tests/texture.c | 161 +++++++++++++++++++++++++++++++++++++++++
dlls/d3dx9_36/texture.c | 12 +++-
2 files changed, 172 insertions(+), 1 deletions(-)
diff --git a/dlls/d3dx9_36/tests/texture.c b/dlls/d3dx9_36/tests/texture.c
index f4c74d7..0eaf649 100644
--- a/dlls/d3dx9_36/tests/texture.c
+++ b/dlls/d3dx9_36/tests/texture.c
@@ -155,6 +155,166 @@ static void test_D3DXCheckTextureRequirements(IDirect3DDevice9 *device)
ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8);
}
+static void test_D3DXCreateTexture(IDirect3DDevice9 *device)
+{
+ IDirect3DTexture9 *texture;
+ D3DSURFACE_DESC desc;
+ D3DCAPS9 caps;
+ UINT mipmaps;
+ HRESULT hr;
+
+ IDirect3DDevice9_GetDeviceCaps(device, &caps);
+
+ hr = D3DXCreateTexture(NULL, 0, 0, 0, 0, D3DX_DEFAULT, 0, D3DPOOL_DEFAULT);
+ ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
+
+ /* width and height tests */
+
+ hr = D3DXCreateTexture(device, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
+
+ if (texture)
+ {
+ hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
+
+ ok(desc.Width == 256, "Returned width %d, expected %d\n", desc.Width, 256);
+ ok(desc.Height == 256, "Returned height %d, expected %d\n", desc.Height, 256);
+
+ IDirect3DTexture9_Release(texture);
+ }
+
+
+ hr = D3DXCreateTexture(device, 0, 0, 0, 0, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
+
+ if (texture)
+ {
+ hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
+
+ ok(desc.Width == 1, "Returned width %d, expected %d\n", desc.Width, 1);
+ ok(desc.Height == 1, "Returned height %d, expected %d\n", desc.Height, 1);
+
+ IDirect3DTexture9_Release(texture);
+ }
+
+
+ if (caps.TextureCaps & D3DPTEXTURECAPS_POW2)
+ skip("Hardware only supports pow2 textures\n");
+ else
+ {
+ hr = D3DXCreateTexture(device, D3DX_DEFAULT, 63, 0, 0, 0, D3DPOOL_DEFAULT, &texture);
+ ok((hr == D3D_OK) ||
+ /* may not work with conditional NPOT */
+ ((hr != D3D_OK) && (caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)),
+ "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
+
+ if (texture)
+ {
+ hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
+
+ /* Conditional NPOT may create a texture with different dimensions, so allow those
+ situations instead of returning a fail */
+
+ ok(desc.Width == 63 ||
+ (caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL),
+ "Returned width %d, expected %d\n", desc.Width, 63);
+
+ ok(desc.Height == 63 ||
+ (caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL),
+ "Returned height %d, expected %d\n", desc.Height, 63);
+
+ IDirect3DTexture9_Release(texture);
+ }
+ }
+
+ /* mipmaps */
+
+ hr = D3DXCreateTexture(device, 64, 63, 9, 0, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
+
+ if (texture)
+ {
+ mipmaps = IDirect3DTexture9_GetLevelCount(texture);
+ ok(mipmaps == 7, "Returned mipmaps %d, expected %d\n", mipmaps, 7);
+
+ IDirect3DTexture9_Release(texture);
+ }
+
+
+ hr = D3DXCreateTexture(device, 284, 137, 9, 0, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
+
+ if (texture)
+ {
+ mipmaps = IDirect3DTexture9_GetLevelCount(texture);
+ ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9);
+
+ IDirect3DTexture9_Release(texture);
+ }
+
+
+ hr = D3DXCreateTexture(device, 0, 0, 20, 0, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
+
+ if (texture)
+ {
+ mipmaps = IDirect3DTexture9_GetLevelCount(texture);
+ ok(mipmaps == 1, "Returned mipmaps %d, expected %d\n", mipmaps, 1);
+
+ IDirect3DTexture9_Release(texture);
+ }
+
+
+ hr = D3DXCreateTexture(device, 64, 64, 1, 0, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
+
+ if (texture)
+ {
+ mipmaps = IDirect3DTexture9_GetLevelCount(texture);
+ ok(mipmaps == 1, "Returned mipmaps %d, expected %d\n", mipmaps, 1);
+
+ IDirect3DTexture9_Release(texture);
+ }
+
+ /* usage */
+
+ hr = D3DXCreateTexture(device, 0, 0, 0, D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture succeeded, but should have failed.\n");
+ hr = D3DXCreateTexture(device, 0, 0, 0, D3DUSAGE_DONOTCLIP, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture succeeded, but should have failed.\n");
+ hr = D3DXCreateTexture(device, 0, 0, 0, D3DUSAGE_POINTS, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture succeeded, but should have failed.\n");
+ hr = D3DXCreateTexture(device, 0, 0, 0, D3DUSAGE_RTPATCHES, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture succeeded, but should have failed.\n");
+ hr = D3DXCreateTexture(device, 0, 0, 0, D3DUSAGE_NPATCHES, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture succeeded, but should have failed.\n");
+
+ /* format */
+
+ hr = D3DXCreateTexture(device, 0, 0, 0, 0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
+
+ if (texture)
+ {
+ hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
+ ok(desc.Format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", desc.Format, D3DFMT_A8R8G8B8);
+
+ IDirect3DTexture9_Release(texture);
+ }
+
+
+ hr = D3DXCreateTexture(device, 0, 0, 0, 0, 0, D3DPOOL_DEFAULT, &texture);
+ ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
+
+ if (texture)
+ {
+ hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
+ ok(desc.Format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", desc.Format, D3DFMT_A8R8G8B8);
+
+ IDirect3DTexture9_Release(texture);
+ }
+}
+
START_TEST(texture)
{
HWND wnd;
@@ -187,6 +347,7 @@ START_TEST(texture)
}
test_D3DXCheckTextureRequirements(device);
+ test_D3DXCreateTexture(device);
IDirect3DDevice9_Release(device);
IDirect3D9_Release(d3d);
diff --git a/dlls/d3dx9_36/texture.c b/dlls/d3dx9_36/texture.c
index ad3a1c2..9d547ce 100644
--- a/dlls/d3dx9_36/texture.c
+++ b/dlls/d3dx9_36/texture.c
@@ -185,9 +185,19 @@ HRESULT WINAPI D3DXCreateTexture(LPDIRECT3DDEVICE9 pDevice,
D3DPOOL pool,
LPDIRECT3DTEXTURE9 *ppTexture)
{
- FIXME("(%p, %u, %u, %u, %x, %x, %x, %p): semi-stub\n", pDevice, width, height, miplevels, usage, format,
+ HRESULT hr;
+
+ TRACE("(%p, %u, %u, %u, %x, %x, %x, %p)\n", pDevice, width, height, miplevels, usage, format,
pool, ppTexture);
+ if (!pDevice || !ppTexture)
+ return D3DERR_INVALIDCALL;
+
+ hr = D3DXCheckTextureRequirements(pDevice, &width, &height, &miplevels, usage, &format, pool);
+
+ if (FAILED(hr))
+ return hr;
+
return IDirect3DDevice9_CreateTexture(pDevice, width, height, miplevels, usage, format, pool, ppTexture, NULL);
}
More information about the wine-cvs
mailing list