2 * Tests for the D3DX9 texture functions
4 * Copyright 2009 Tony Wasserka
5 * Copyright 2010 Owen Rudge for CodeWeavers
6 * Copyright 2010 Matteo Bruni for CodeWeavers
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include "wine/test.h"
26 #include "resources.h"
28 static void test_D3DXCheckTextureRequirements(IDirect3DDevice9 *device)
30 UINT width, height, mipmaps;
31 D3DFORMAT format, expected;
35 D3DDEVICE_CREATION_PARAMETERS params;
38 IDirect3DDevice9_GetDeviceCaps(device, &caps);
41 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
42 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
44 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DX_DEFAULT, NULL, D3DPOOL_DEFAULT);
45 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
47 hr = D3DXCheckTextureRequirements(NULL, NULL, NULL, NULL, D3DX_DEFAULT, NULL, D3DPOOL_DEFAULT);
48 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
51 width = height = D3DX_DEFAULT;
52 hr = D3DXCheckTextureRequirements(device, &width, &height, NULL, 0, NULL, D3DPOOL_DEFAULT);
53 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
54 ok(width == 256, "Returned width %d, expected %d\n", width, 256);
55 ok(height == 256, "Returned height %d, expected %d\n", height, 256);
58 hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
59 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
60 ok(width == 256, "Returned width %d, expected %d\n", width, 256);
62 if (caps.TextureCaps & D3DPTEXTURECAPS_POW2)
63 skip("Hardware only supports pow2 textures\n");
67 hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
68 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
69 ok(width == 62, "Returned width %d, expected %d\n", width, 62);
71 width = D3DX_DEFAULT; height = 63;
72 hr = D3DXCheckTextureRequirements(device, &width, &height, NULL, 0, NULL, D3DPOOL_DEFAULT);
73 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
74 ok(width == height, "Returned width %d, expected %d\n", width, height);
75 ok(height == 63, "Returned height %d, expected %d\n", height, 63);
78 width = D3DX_DEFAULT; height = 0;
79 hr = D3DXCheckTextureRequirements(device, &width, &height, NULL, 0, NULL, D3DPOOL_DEFAULT);
80 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
81 ok(width == 1, "Returned width %d, expected %d\n", width, 1);
82 ok(height == 1, "Returned height %d, expected %d\n", height, 1);
84 width = 0; height = 0;
85 hr = D3DXCheckTextureRequirements(device, &width, &height, NULL, 0, NULL, D3DPOOL_DEFAULT);
86 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
87 ok(width == 1, "Returned width %d, expected %d\n", width, 1);
88 ok(height == 1, "Returned height %d, expected %d\n", height, 1);
91 hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
92 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
93 ok(width == 1, "Returned width %d, expected %d\n", width, 1);
96 hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
97 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
98 ok(width == caps.MaxTextureWidth, "Returned width %d, expected %d\n", width, caps.MaxTextureWidth);
100 width = caps.MaxTextureWidth-1;
101 hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
102 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
103 ok(width == caps.MaxTextureWidth-1, "Returned width %d, expected %d\n", width, caps.MaxTextureWidth-1);
106 width = 64; height = 63;
108 hr = D3DXCheckTextureRequirements(device, &width, &height, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
109 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
110 ok(mipmaps == 7, "Returned mipmaps %d, expected %d\n", mipmaps, 7);
112 if (!(caps.TextureCaps & D3DPTEXTURECAPS_POW2))
114 width = 284; height = 137;
116 hr = D3DXCheckTextureRequirements(device, &width, &height, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
117 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
118 ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9);
122 hr = D3DXCheckTextureRequirements(device, &width, &height, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
123 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
124 ok(mipmaps == 6, "Returned mipmaps %d, expected %d\n", mipmaps, 6);
127 skip("Skipping some tests, npot2 textures unsupported\n");
130 hr = D3DXCheckTextureRequirements(device, NULL, NULL, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
131 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
132 ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9);
135 hr = D3DXCheckTextureRequirements(device, NULL, NULL, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
136 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
137 ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9);
140 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_WRITEONLY, NULL, D3DPOOL_DEFAULT);
141 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n");
142 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_DONOTCLIP, NULL, D3DPOOL_DEFAULT);
143 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n");
144 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_POINTS, NULL, D3DPOOL_DEFAULT);
145 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n");
146 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_RTPATCHES, NULL, D3DPOOL_DEFAULT);
147 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n");
148 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_NPATCHES, NULL, D3DPOOL_DEFAULT);
149 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n");
152 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
153 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
155 format = D3DFMT_UNKNOWN;
156 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
157 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
158 ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8);
160 format = D3DX_DEFAULT;
161 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
162 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
163 ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8);
165 format = D3DFMT_R8G8B8;
166 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
167 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
168 ok(format == D3DFMT_X8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_X8R8G8B8);
170 IDirect3DDevice9_GetDirect3D(device, &d3d);
171 IDirect3DDevice9_GetCreationParameters(device, ¶ms);
172 IDirect3DDevice9_GetDisplayMode(device, 0, &mode);
174 if (SUCCEEDED(IDirect3D9_CheckDeviceFormat(d3d, params.AdapterOrdinal, params.DeviceType,
175 mode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_R3G3B2)))
176 expected = D3DFMT_R3G3B2;
179 if (SUCCEEDED(IDirect3D9_CheckDeviceFormat(d3d, params.AdapterOrdinal, params.DeviceType,
180 mode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_X4R4G4B4)))
181 expected = D3DFMT_X4R4G4B4;
183 expected = D3DFMT_X1R5G5B5;
186 format = D3DFMT_R3G3B2;
187 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
188 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
189 ok(format == expected, "Returned format %u, expected %u\n", format, expected);
191 if(SUCCEEDED(IDirect3D9_CheckDeviceFormat(d3d, params.AdapterOrdinal, params.DeviceType,
192 mode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_A8R3G3B2)))
193 expected = D3DFMT_A8R3G3B2;
195 expected = D3DFMT_A8R8G8B8;
197 format = D3DFMT_A8R3G3B2;
198 hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
199 ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
200 ok(format == expected, "Returned format %u, expected %u\n", format, expected);
202 IDirect3D9_Release(d3d);
205 static void test_D3DXCheckCubeTextureRequirements(IDirect3DDevice9 *device)
207 UINT size, mipmaps, expected;
212 IDirect3DDevice9_GetDeviceCaps(device, &caps);
214 if (!(caps.TextureCaps & D3DPTEXTURECAPS_CUBEMAP))
216 skip("No cube textures support\n");
221 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
222 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
224 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, D3DX_DEFAULT, NULL, D3DPOOL_DEFAULT);
225 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
227 hr = D3DXCheckCubeTextureRequirements(NULL, NULL, NULL, D3DX_DEFAULT, NULL, D3DPOOL_DEFAULT);
228 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
232 hr = D3DXCheckCubeTextureRequirements(device, &size, NULL, 0, NULL, D3DPOOL_DEFAULT);
233 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
234 ok(size == 256, "Returned size %d, expected %d\n", size, 256);
239 hr = D3DXCheckCubeTextureRequirements(device, &size, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
240 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
241 ok(mipmaps == 7, "Returned mipmaps %d, expected %d\n", mipmaps, 7);
245 expected = caps.TextureCaps & D3DPTEXTURECAPS_CUBEMAP_POW2 ? 10 : 9;
246 hr = D3DXCheckCubeTextureRequirements(device, &size, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
247 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
248 ok(mipmaps == expected, "Returned mipmaps %d, expected %d\n", mipmaps, expected);
252 expected = caps.TextureCaps & D3DPTEXTURECAPS_CUBEMAP_POW2 ? 7 : 6;
253 hr = D3DXCheckCubeTextureRequirements(device, &size, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
254 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
255 ok(mipmaps == expected, "Returned mipmaps %d, expected %d\n", mipmaps, expected);
258 hr = D3DXCheckCubeTextureRequirements(device, NULL, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
259 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
260 ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9);
263 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, D3DUSAGE_WRITEONLY, NULL, D3DPOOL_DEFAULT);
264 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckCubeTextureRequirements succeeded, but should've failed.\n");
265 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, D3DUSAGE_DONOTCLIP, NULL, D3DPOOL_DEFAULT);
266 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckCubeTextureRequirements succeeded, but should've failed.\n");
267 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, D3DUSAGE_POINTS, NULL, D3DPOOL_DEFAULT);
268 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckCubeTextureRequirements succeeded, but should've failed.\n");
269 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, D3DUSAGE_RTPATCHES, NULL, D3DPOOL_DEFAULT);
270 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckCubeTextureRequirements succeeded, but should've failed.\n");
271 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, D3DUSAGE_NPATCHES, NULL, D3DPOOL_DEFAULT);
272 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckCubeTextureRequirements succeeded, but should've failed.\n");
275 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
276 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
278 format = D3DFMT_UNKNOWN;
279 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
280 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
281 ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8);
283 format = D3DX_DEFAULT;
284 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
285 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
286 ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8);
288 format = D3DFMT_R8G8B8;
289 hr = D3DXCheckCubeTextureRequirements(device, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
290 ok(hr == D3D_OK, "D3DXCheckCubeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
291 ok(format == D3DFMT_X8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_X8R8G8B8);
294 static void test_D3DXCheckVolumeTextureRequirements(IDirect3DDevice9 *device)
296 UINT width, height, depth, mipmaps, expected;
301 IDirect3DDevice9_GetDeviceCaps(device, &caps);
303 if (!(caps.TextureCaps & D3DPTEXTURECAPS_VOLUMEMAP))
305 skip("No volume textures support\n");
310 hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
311 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
313 hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, D3DX_DEFAULT, NULL, D3DPOOL_DEFAULT);
314 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
316 hr = D3DXCheckVolumeTextureRequirements(NULL, NULL, NULL, NULL, NULL, D3DX_DEFAULT, NULL, D3DPOOL_DEFAULT);
317 ok(hr == D3DERR_INVALIDCALL, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
319 /* width, height, depth */
320 width = height = depth = D3DX_DEFAULT;
321 hr = D3DXCheckVolumeTextureRequirements(device, &width, &height, &depth, NULL, 0, NULL, D3DPOOL_DEFAULT);
322 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
323 ok(width == 256, "Returned width %d, expected %d\n", width, 256);
324 ok(height == 256, "Returned height %d, expected %d\n", height, 256);
325 ok(depth == 1, "Returned depth %d, expected %d\n", depth, 1);
327 width = D3DX_DEFAULT;
328 hr = D3DXCheckVolumeTextureRequirements(device, &width, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
329 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
330 ok(width == 256, "Returned width %d, expected %d\n", width, 256);
332 width = D3DX_DEFAULT; height = 0; depth = 0;
333 hr = D3DXCheckVolumeTextureRequirements(device, &width, &height, &depth, NULL, 0, NULL, D3DPOOL_DEFAULT);
334 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
335 ok(width == 1, "Returned width %d, expected %d\n", width, 1);
336 ok(height == 1, "Returned height %d, expected %d\n", height, 1);
337 ok(depth == 1, "Returned height %d, expected %d\n", depth, 1);
339 width = 0; height = 0; depth = 0;
340 hr = D3DXCheckVolumeTextureRequirements(device, &width, &height, &depth, NULL, 0, NULL, D3DPOOL_DEFAULT);
341 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
342 ok(width == 1, "Returned width %d, expected %d\n", width, 1);
343 ok(height == 1, "Returned height %d, expected %d\n", height, 1);
344 ok(depth == 1, "Returned height %d, expected %d\n", depth, 1);
347 hr = D3DXCheckVolumeTextureRequirements(device, &width, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
348 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
349 ok(width == 1, "Returned width %d, expected %d\n", width, 1);
352 hr = D3DXCheckVolumeTextureRequirements(device, &width, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
353 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
354 ok(width == caps.MaxVolumeExtent, "Returned width %d, expected %d\n", width, caps.MaxVolumeExtent);
357 hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT);
358 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
360 format = D3DFMT_UNKNOWN;
361 hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
362 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
363 ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8);
365 format = D3DX_DEFAULT;
366 hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
367 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
368 ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8);
370 format = D3DFMT_R8G8B8;
371 hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT);
372 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
373 ok(format == D3DFMT_X8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_X8R8G8B8);
376 if (!(caps.TextureCaps & D3DPTEXTURECAPS_MIPVOLUMEMAP))
378 skip("No volume textures mipmapping support\n");
382 width = height = depth = 64;
384 hr = D3DXCheckVolumeTextureRequirements(device, &width, &height, &depth, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
385 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
386 ok(mipmaps == 7, "Returned mipmaps %d, expected %d\n", mipmaps, 7);
392 expected = caps.TextureCaps & D3DPTEXTURECAPS_VOLUMEMAP_POW2 ? 10 : 9;
393 hr = D3DXCheckVolumeTextureRequirements(device, &width, &height, &depth, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
394 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
395 ok(mipmaps == expected, "Returned mipmaps %d, expected %d\n", mipmaps, expected);
398 hr = D3DXCheckVolumeTextureRequirements(device, NULL, NULL, NULL, &mipmaps, 0, NULL, D3DPOOL_DEFAULT);
399 ok(hr == D3D_OK, "D3DXCheckVolumeTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK);
400 ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9);
403 static void test_D3DXCreateTexture(IDirect3DDevice9 *device)
405 IDirect3DTexture9 *texture;
406 D3DSURFACE_DESC desc;
411 IDirect3DDevice9_GetDeviceCaps(device, &caps);
413 hr = D3DXCreateTexture(NULL, 0, 0, 0, 0, D3DX_DEFAULT, 0, D3DPOOL_DEFAULT);
414 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
416 /* width and height tests */
418 hr = D3DXCreateTexture(device, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, 0, D3DPOOL_DEFAULT, &texture);
419 ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
423 hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
424 ok(hr == D3D_OK, "GetLevelDesc returned %#x, expected %#x\n", hr, D3D_OK);
425 ok(desc.Format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", desc.Format, D3DFMT_A8R8G8B8);
427 ok(desc.Width == 256, "Returned width %d, expected %d\n", desc.Width, 256);
428 ok(desc.Height == 256, "Returned height %d, expected %d\n", desc.Height, 256);
430 IDirect3DTexture9_Release(texture);
434 hr = D3DXCreateTexture(device, 0, 0, 0, 0, 0, D3DPOOL_DEFAULT, &texture);
435 ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
439 hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
440 ok(hr == D3D_OK, "GetLevelDesc returned %#x, expected %#x\n", hr, D3D_OK);
441 ok(desc.Format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", desc.Format, D3DFMT_A8R8G8B8);
443 ok(desc.Width == 1, "Returned width %d, expected %d\n", desc.Width, 1);
444 ok(desc.Height == 1, "Returned height %d, expected %d\n", desc.Height, 1);
446 IDirect3DTexture9_Release(texture);
450 if (caps.TextureCaps & D3DPTEXTURECAPS_POW2)
451 skip("Hardware only supports pow2 textures\n");
454 hr = D3DXCreateTexture(device, D3DX_DEFAULT, 63, 0, 0, 0, D3DPOOL_DEFAULT, &texture);
456 /* may not work with conditional NPOT */
457 ((hr != D3D_OK) && (caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)),
458 "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
462 hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
463 ok(hr == D3D_OK, "GetLevelDesc returned %#x, expected %#x\n", hr, D3D_OK);
464 ok(desc.Format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", desc.Format, D3DFMT_A8R8G8B8);
466 /* Conditional NPOT may create a texture with different dimensions, so allow those
467 situations instead of returning a fail */
469 ok(desc.Width == 63 ||
470 (caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL),
471 "Returned width %d, expected %d\n", desc.Width, 63);
473 ok(desc.Height == 63 ||
474 (caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL),
475 "Returned height %d, expected %d\n", desc.Height, 63);
477 IDirect3DTexture9_Release(texture);
483 hr = D3DXCreateTexture(device, 64, 63, 9, 0, 0, D3DPOOL_DEFAULT, &texture);
484 ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
488 mipmaps = IDirect3DTexture9_GetLevelCount(texture);
489 ok(mipmaps == 7, "Returned mipmaps %d, expected %d\n", mipmaps, 7);
491 IDirect3DTexture9_Release(texture);
495 hr = D3DXCreateTexture(device, 284, 137, 9, 0, 0, D3DPOOL_DEFAULT, &texture);
496 ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
500 mipmaps = IDirect3DTexture9_GetLevelCount(texture);
501 ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9);
503 IDirect3DTexture9_Release(texture);
507 hr = D3DXCreateTexture(device, 0, 0, 20, 0, 0, D3DPOOL_DEFAULT, &texture);
508 ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
512 mipmaps = IDirect3DTexture9_GetLevelCount(texture);
513 ok(mipmaps == 1, "Returned mipmaps %d, expected %d\n", mipmaps, 1);
515 IDirect3DTexture9_Release(texture);
519 hr = D3DXCreateTexture(device, 64, 64, 1, 0, 0, D3DPOOL_DEFAULT, &texture);
520 ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
524 mipmaps = IDirect3DTexture9_GetLevelCount(texture);
525 ok(mipmaps == 1, "Returned mipmaps %d, expected %d\n", mipmaps, 1);
527 IDirect3DTexture9_Release(texture);
532 hr = D3DXCreateTexture(device, 0, 0, 0, D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &texture);
533 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture succeeded, but should have failed.\n");
534 hr = D3DXCreateTexture(device, 0, 0, 0, D3DUSAGE_DONOTCLIP, 0, D3DPOOL_DEFAULT, &texture);
535 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture succeeded, but should have failed.\n");
536 hr = D3DXCreateTexture(device, 0, 0, 0, D3DUSAGE_POINTS, 0, D3DPOOL_DEFAULT, &texture);
537 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture succeeded, but should have failed.\n");
538 hr = D3DXCreateTexture(device, 0, 0, 0, D3DUSAGE_RTPATCHES, 0, D3DPOOL_DEFAULT, &texture);
539 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture succeeded, but should have failed.\n");
540 hr = D3DXCreateTexture(device, 0, 0, 0, D3DUSAGE_NPATCHES, 0, D3DPOOL_DEFAULT, &texture);
541 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTexture succeeded, but should have failed.\n");
545 hr = D3DXCreateTexture(device, 0, 0, 0, 0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, &texture);
546 ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
550 hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
551 ok(hr == D3D_OK, "GetLevelDesc returned %#x, expected %#x\n", hr, D3D_OK);
552 ok(desc.Format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", desc.Format, D3DFMT_A8R8G8B8);
554 IDirect3DTexture9_Release(texture);
558 hr = D3DXCreateTexture(device, 0, 0, 0, 0, 0, D3DPOOL_DEFAULT, &texture);
559 ok(hr == D3D_OK, "D3DXCreateTexture returned %#x, expected %#x\n", hr, D3D_OK);
563 hr = IDirect3DTexture9_GetLevelDesc(texture, 0, &desc);
564 ok(hr == D3D_OK, "GetLevelDesc returned %#x, expected %#x\n", hr, D3D_OK);
565 ok(desc.Format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", desc.Format, D3DFMT_A8R8G8B8);
567 IDirect3DTexture9_Release(texture);
570 /* D3DXCreateTextureFromResource */
572 hr = D3DXCreateTextureFromResourceA(device, NULL, MAKEINTRESOURCEA(IDB_BITMAP_1x1), &texture);
573 ok(hr == D3D_OK, "D3DXCreateTextureFromResource returned %#x, expected %#x\n", hr, D3D_OK);
574 if (SUCCEEDED(hr)) IDirect3DTexture9_Release(texture);
576 hr = D3DXCreateTextureFromResourceA(device, NULL, MAKEINTRESOURCEA(IDD_BITMAPDATA_1x1), &texture);
577 ok(hr == D3D_OK, "D3DXCreateTextureFromResource returned %#x, expected %#x\n", hr, D3D_OK);
578 if (SUCCEEDED(hr)) IDirect3DTexture9_Release(texture);
580 hr = D3DXCreateTextureFromResourceA(device, NULL, MAKEINTRESOURCEA(IDS_STRING), &texture);
581 ok(hr == D3DXERR_INVALIDDATA, "D3DXCreateTextureFromResource returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA);
583 hr = D3DXCreateTextureFromResourceA(NULL, NULL, MAKEINTRESOURCEA(IDD_BITMAPDATA_1x1), &texture);
584 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTextureFromResource returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
586 hr = D3DXCreateTextureFromResourceA(device, NULL, NULL, &texture);
587 ok(hr == D3DXERR_INVALIDDATA, "D3DXCreateTextureFromResource returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA);
589 hr = D3DXCreateTextureFromResourceA(device, NULL, MAKEINTRESOURCEA(IDD_BITMAPDATA_1x1), NULL);
590 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTextureFromResource returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
593 /* D3DXCreateTextureFromResourceEx */
594 hr = D3DXCreateTextureFromResourceExA(device, NULL, MAKEINTRESOURCEA(IDD_BITMAPDATA_1x1), D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &texture);
595 ok(hr == D3D_OK, "D3DXCreateTextureFromResourceEx returned %#x, expected %#x\n", hr, D3D_OK);
596 if (SUCCEEDED(hr)) IDirect3DTexture9_Release(texture);
598 hr = D3DXCreateTextureFromResourceExA(device, NULL, MAKEINTRESOURCEA(IDS_STRING), D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &texture);
599 ok(hr == D3DXERR_INVALIDDATA, "D3DXCreateTextureFromResourceEx returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA);
601 hr = D3DXCreateTextureFromResourceExA(NULL, NULL, MAKEINTRESOURCEA(IDD_BITMAPDATA_1x1), D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &texture);
602 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTextureFromResourceEx returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
604 hr = D3DXCreateTextureFromResourceExA(device, NULL, NULL, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &texture);
605 ok(hr == D3DXERR_INVALIDDATA, "D3DXCreateTextureFromResourceEx returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA);
607 hr = D3DXCreateTextureFromResourceExA(device, NULL, MAKEINTRESOURCEA(IDD_BITMAPDATA_1x1), D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, NULL);
608 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateTextureFromResourceEx returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
611 static void test_D3DXFilterTexture(IDirect3DDevice9 *device)
613 IDirect3DTexture9 *tex;
614 IDirect3DCubeTexture9 *cubetex;
617 hr = IDirect3DDevice9_CreateTexture(device, 256, 256, 5, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &tex, NULL);
621 hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 0, D3DX_FILTER_NONE);
622 ok(hr == D3D_OK, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3D_OK);
624 hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 0, D3DX_FILTER_BOX + 1); /* Invalid filter */
625 ok(hr == D3DERR_INVALIDCALL, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
627 hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 5, D3DX_FILTER_NONE); /* Invalid miplevel */
628 ok(hr == D3DERR_INVALIDCALL, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
631 skip("Failed to create texture\n");
633 IDirect3DTexture9_Release(tex);
635 hr = D3DXFilterTexture(NULL, NULL, 0, D3DX_FILTER_NONE);
636 ok(hr == D3DERR_INVALIDCALL, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
638 /* Test different pools */
639 hr = IDirect3DDevice9_CreateTexture(device, 256, 256, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &tex, NULL);
643 hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 0, D3DX_FILTER_NONE);
644 ok(hr == D3D_OK, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3D_OK);
645 IDirect3DTexture9_Release(tex);
648 skip("Failed to create texture\n");
650 hr = IDirect3DDevice9_CreateTexture(device, 256, 256, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &tex, NULL);
654 hr = D3DXFilterTexture((IDirect3DBaseTexture9*) tex, NULL, 0, D3DX_FILTER_NONE);
655 ok(hr == D3D_OK, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3D_OK);
656 IDirect3DTexture9_Release(tex);
659 skip("Failed to create texture\n");
661 /* Cube texture test */
662 hr = IDirect3DDevice9_CreateCubeTexture(device, 256, 5, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &cubetex, NULL);
666 hr = D3DXFilterTexture((IDirect3DBaseTexture9*) cubetex, NULL, 0, D3DX_FILTER_NONE);
667 ok(hr == D3D_OK, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3D_OK);
669 hr = D3DXFilterTexture((IDirect3DBaseTexture9*) cubetex, NULL, 0, D3DX_FILTER_BOX + 1); /* Invalid filter */
670 ok(hr == D3DERR_INVALIDCALL, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
672 hr = D3DXFilterTexture((IDirect3DBaseTexture9*) cubetex, NULL, 5, D3DX_FILTER_NONE); /* Invalid miplevel */
673 ok(hr == D3DERR_INVALIDCALL, "D3DXFilterTexture returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
676 skip("Failed to create texture\n");
678 IDirect3DCubeTexture9_Release(cubetex);
681 static BOOL color_match(const DWORD *value, const DWORD *expected)
685 for (i = 0; i < 4; i++)
687 DWORD diff = value[i] > expected[i] ? value[i] - expected[i] : expected[i] - value[i];
688 if (diff > 1) return FALSE;
693 static void WINAPI fillfunc(D3DXVECTOR4 *value, const D3DXVECTOR2 *texcoord,
694 const D3DXVECTOR2 *texelsize, void *data)
696 value->x = texcoord->x;
697 value->y = texcoord->y;
698 value->z = texelsize->x;
702 static void test_D3DXFillTexture(IDirect3DDevice9 *device)
704 IDirect3DTexture9 *tex;
706 D3DLOCKED_RECT lock_rect;
709 DWORD value, expected, size, pitch;
712 hr = IDirect3DDevice9_CreateTexture(device, size, size, 0, 0, D3DFMT_A8R8G8B8,
713 D3DPOOL_MANAGED, &tex, NULL);
717 hr = D3DXFillTexture(tex, fillfunc, NULL);
718 ok(hr == D3D_OK, "D3DXFillTexture returned %#x, expected %#x\n", hr, D3D_OK);
720 for (m = 0; m < 3; m++)
722 hr = IDirect3DTexture9_LockRect(tex, m, &lock_rect, NULL, D3DLOCK_READONLY);
723 ok(hr == D3D_OK, "Couldn't lock the texture, error %#x\n", hr);
726 pitch = lock_rect.Pitch / sizeof(DWORD);
727 for (y = 0; y < size; y++)
729 for (x = 0; x < size; x++)
731 value = ((DWORD *)lock_rect.pBits)[y * pitch + x];
732 v[0] = (value >> 24) & 0xff;
733 v[1] = (value >> 16) & 0xff;
734 v[2] = (value >> 8) & 0xff;
738 e[1] = (x + 0.5f) / size * 255.0f + 0.5f;
739 e[2] = (y + 0.5f) / size * 255.0f + 0.5f;
740 e[3] = 255.0f / size + 0.5f;
741 expected = e[0] << 24 | e[1] << 16 | e[2] << 8 | e[3];
743 ok(color_match(v, e),
744 "Texel at (%u, %u) doesn't match: %#x, expected %#x\n",
745 x, y, value, expected);
748 IDirect3DTexture9_UnlockRect(tex, m);
754 skip("Failed to create texture\n");
756 IDirect3DTexture9_Release(tex);
758 hr = IDirect3DDevice9_CreateTexture(device, 4, 4, 1, 0, D3DFMT_A1R5G5B5,
759 D3DPOOL_MANAGED, &tex, NULL);
763 hr = D3DXFillTexture(tex, fillfunc, NULL);
764 ok(hr == D3D_OK, "D3DXFillTexture returned %#x, expected %#x\n", hr, D3D_OK);
766 hr = IDirect3DTexture9_LockRect(tex, 0, &lock_rect, NULL, D3DLOCK_READONLY);
767 ok(hr == D3D_OK, "Couldn't lock the texture, error %#x\n", hr);
770 pitch = lock_rect.Pitch / sizeof(WORD);
771 for (y = 0; y < 4; y++)
773 for (x = 0; x < 4; x++)
775 value = ((WORD *)lock_rect.pBits)[y * pitch + x];
777 v[1] = value >> 10 & 0x1f;
778 v[2] = value >> 5 & 0x1f;
782 e[1] = (x + 0.5f) / 4.0f * 31.0f + 0.5f;
783 e[2] = (y + 0.5f) / 4.0f * 31.0f + 0.5f;
785 expected = e[0] << 15 | e[1] << 10 | e[2] << 5 | e[3];
787 ok(color_match(v, e),
788 "Texel at (%u, %u) doesn't match: %#x, expected %#x\n",
789 x, y, value, expected);
792 IDirect3DTexture9_UnlockRect(tex, 0);
796 skip("Failed to create texture\n");
798 IDirect3DTexture9_Release(tex);
801 static void WINAPI fillfunc_cube(D3DXVECTOR4 *value, const D3DXVECTOR3 *texcoord,
802 const D3DXVECTOR3 *texelsize, void *data)
804 value->x = (texcoord->x + 1.0f) / 2.0f;
805 value->y = (texcoord->y + 1.0f) / 2.0f;
806 value->z = (texcoord->z + 1.0f) / 2.0f;
807 value->w = texelsize->x;
820 static float get_cube_coord(enum cube_coord coord, unsigned int x, unsigned int y, unsigned int size)
827 return size - x - 0.5f;
831 return size - y - 0.5f;
837 trace("Unexpected coordinate value\n");
842 static void test_D3DXFillCubeTexture(IDirect3DDevice9 *device)
844 IDirect3DCubeTexture9 *tex;
846 D3DLOCKED_RECT lock_rect;
849 DWORD value, expected, size, pitch;
850 enum cube_coord coordmap[6][3] =
852 {ONE, YCOORDINV, XCOORDINV},
853 {ZERO, YCOORDINV, XCOORD},
854 {XCOORD, ONE, YCOORD},
855 {XCOORD, ZERO, YCOORDINV},
856 {XCOORD, YCOORDINV, ONE},
857 {XCOORDINV, YCOORDINV, ZERO}
861 hr = IDirect3DDevice9_CreateCubeTexture(device, size, 0, 0, D3DFMT_A8R8G8B8,
862 D3DPOOL_MANAGED, &tex, NULL);
866 hr = D3DXFillCubeTexture(tex, fillfunc_cube, NULL);
867 ok(hr == D3D_OK, "D3DXFillCubeTexture returned %#x, expected %#x\n", hr, D3D_OK);
869 for (m = 0; m < 3; m++)
871 for (f = 0; f < 6; f++)
873 hr = IDirect3DCubeTexture9_LockRect(tex, f, m, &lock_rect, NULL, D3DLOCK_READONLY);
874 ok(hr == D3D_OK, "Couldn't lock the texture, error %#x\n", hr);
877 pitch = lock_rect.Pitch / sizeof(DWORD);
878 for (y = 0; y < size; y++)
880 for (x = 0; x < size; x++)
882 value = ((DWORD *)lock_rect.pBits)[y * pitch + x];
883 v[0] = (value >> 24) & 0xff;
884 v[1] = (value >> 16) & 0xff;
885 v[2] = (value >> 8) & 0xff;
888 e[0] = (f == 0) || (f == 1) ?
889 0 : (BYTE)(255.0f / size * 2.0f + 0.5f);
890 e[1] = get_cube_coord(coordmap[f][0], x, y, size) / size * 255.0f + 0.5f;
891 e[2] = get_cube_coord(coordmap[f][1], x, y, size) / size * 255.0f + 0.5f;
892 e[3] = get_cube_coord(coordmap[f][2], x, y, size) / size * 255.0f + 0.5f;
893 expected = e[0] << 24 | e[1] << 16 | e[2] << 8 | e[3];
895 ok(color_match(v, e),
896 "Texel at face %u (%u, %u) doesn't match: %#x, expected %#x\n",
897 f, x, y, value, expected);
900 IDirect3DCubeTexture9_UnlockRect(tex, f, m);
907 skip("Failed to create texture\n");
909 IDirect3DCubeTexture9_Release(tex);
911 hr = IDirect3DDevice9_CreateCubeTexture(device, 4, 1, 0, D3DFMT_A1R5G5B5,
912 D3DPOOL_MANAGED, &tex, NULL);
916 hr = D3DXFillCubeTexture(tex, fillfunc_cube, NULL);
917 ok(hr == D3D_OK, "D3DXFillTexture returned %#x, expected %#x\n", hr, D3D_OK);
918 for (f = 0; f < 6; f++)
920 hr = IDirect3DCubeTexture9_LockRect(tex, f, 0, &lock_rect, NULL, D3DLOCK_READONLY);
921 ok(hr == D3D_OK, "Couldn't lock the texture, error %#x\n", hr);
924 pitch = lock_rect.Pitch / sizeof(WORD);
925 for (y = 0; y < 4; y++)
927 for (x = 0; x < 4; x++)
929 value = ((WORD *)lock_rect.pBits)[y * pitch + x];
931 v[1] = value >> 10 & 0x1f;
932 v[2] = value >> 5 & 0x1f;
935 e[0] = (f == 0) || (f == 1) ?
936 0 : (BYTE)(1.0f / size * 2.0f + 0.5f);
937 e[1] = get_cube_coord(coordmap[f][0], x, y, 4) / 4 * 31.0f + 0.5f;
938 e[2] = get_cube_coord(coordmap[f][1], x, y, 4) / 4 * 31.0f + 0.5f;
939 e[3] = get_cube_coord(coordmap[f][2], x, y, 4) / 4 * 31.0f + 0.5f;
940 expected = e[0] << 15 | e[1] << 10 | e[2] << 5 | e[3];
942 ok(color_match(v, e),
943 "Texel at face %u (%u, %u) doesn't match: %#x, expected %#x\n",
944 f, x, y, value, expected);
947 IDirect3DCubeTexture9_UnlockRect(tex, f, 0);
952 skip("Failed to create texture\n");
954 IDirect3DCubeTexture9_Release(tex);
957 static void WINAPI fillfunc_volume(D3DXVECTOR4 *value, const D3DXVECTOR3 *texcoord,
958 const D3DXVECTOR3 *texelsize, void *data)
960 value->x = texcoord->x;
961 value->y = texcoord->y;
962 value->z = texcoord->z;
963 value->w = texelsize->x;
966 static void test_D3DXFillVolumeTexture(IDirect3DDevice9 *device)
968 IDirect3DVolumeTexture9 *tex;
970 D3DLOCKED_BOX lock_box;
973 DWORD value, expected, size, row_pitch, slice_pitch;
976 hr = IDirect3DDevice9_CreateVolumeTexture(device, size, size, size, 0, 0, D3DFMT_A8R8G8B8,
977 D3DPOOL_MANAGED, &tex, NULL);
981 hr = D3DXFillVolumeTexture(tex, fillfunc_volume, NULL);
982 ok(hr == D3D_OK, "D3DXFillVolumeTexture returned %#x, expected %#x\n", hr, D3D_OK);
984 for (m = 0; m < 3; m++)
986 hr = IDirect3DVolumeTexture9_LockBox(tex, m, &lock_box, NULL, D3DLOCK_READONLY);
987 ok(hr == D3D_OK, "Couldn't lock the texture, error %#x\n", hr);
990 row_pitch = lock_box.RowPitch / sizeof(DWORD);
991 slice_pitch = lock_box.SlicePitch / sizeof(DWORD);
992 for (z = 0; z < size; z++)
994 for (y = 0; y < size; y++)
996 for (x = 0; x < size; x++)
998 value = ((DWORD *)lock_box.pBits)[z * slice_pitch + y * row_pitch + x];
999 v[0] = (value >> 24) & 0xff;
1000 v[1] = (value >> 16) & 0xff;
1001 v[2] = (value >> 8) & 0xff;
1002 v[3] = value & 0xff;
1004 e[0] = 255.0f / size + 0.5f;
1005 e[1] = (x + 0.5f) / size * 255.0f + 0.5f;
1006 e[2] = (y + 0.5f) / size * 255.0f + 0.5f;
1007 e[3] = (z + 0.5f) / size * 255.0f + 0.5f;
1008 expected = e[0] << 24 | e[1] << 16 | e[2] << 8 | e[3];
1010 ok(color_match(v, e),
1011 "Texel at (%u, %u, %u) doesn't match: %#x, expected %#x\n",
1012 x, y, z, value, expected);
1016 IDirect3DVolumeTexture9_UnlockBox(tex, m);
1022 skip("Failed to create texture\n");
1024 IDirect3DVolumeTexture9_Release(tex);
1026 hr = IDirect3DDevice9_CreateVolumeTexture(device, 4, 4, 4, 1, 0, D3DFMT_A1R5G5B5,
1027 D3DPOOL_MANAGED, &tex, NULL);
1031 hr = D3DXFillVolumeTexture(tex, fillfunc_volume, NULL);
1032 ok(hr == D3D_OK, "D3DXFillTexture returned %#x, expected %#x\n", hr, D3D_OK);
1033 hr = IDirect3DVolumeTexture9_LockBox(tex, 0, &lock_box, NULL, D3DLOCK_READONLY);
1034 ok(hr == D3D_OK, "Couldn't lock the texture, error %#x\n", hr);
1037 row_pitch = lock_box.RowPitch / sizeof(WORD);
1038 slice_pitch = lock_box.SlicePitch / sizeof(WORD);
1039 for (z = 0; z < 4; z++)
1041 for (y = 0; y < 4; y++)
1043 for (x = 0; x < 4; x++)
1045 value = ((WORD *)lock_box.pBits)[z * slice_pitch + y * row_pitch + x];
1047 v[1] = value >> 10 & 0x1f;
1048 v[2] = value >> 5 & 0x1f;
1049 v[3] = value & 0x1f;
1052 e[1] = (x + 0.5f) / 4 * 31.0f + 0.5f;
1053 e[2] = (y + 0.5f) / 4 * 31.0f + 0.5f;
1054 e[3] = (z + 0.5f) / 4 * 31.0f + 0.5f;
1055 expected = e[0] << 15 | e[1] << 10 | e[2] << 5 | e[3];
1057 ok(color_match(v, e),
1058 "Texel at (%u, %u, %u) doesn't match: %#x, expected %#x\n",
1059 x, y, z, value, expected);
1063 IDirect3DVolumeTexture9_UnlockBox(tex, 0);
1067 skip("Failed to create texture\n");
1069 IDirect3DVolumeTexture9_Release(tex);
1076 IDirect3DDevice9 *device;
1077 D3DPRESENT_PARAMETERS d3dpp;
1080 wnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
1082 skip("Couldn't create application window\n");
1085 d3d = Direct3DCreate9(D3D_SDK_VERSION);
1087 skip("Couldn't create IDirect3D9 object\n");
1092 ZeroMemory(&d3dpp, sizeof(d3dpp));
1093 d3dpp.Windowed = TRUE;
1094 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
1095 hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &device);
1097 skip("Failed to create IDirect3DDevice9 object %#x\n", hr);
1098 IDirect3D9_Release(d3d);
1103 test_D3DXCheckTextureRequirements(device);
1104 test_D3DXCheckCubeTextureRequirements(device);
1105 test_D3DXCheckVolumeTextureRequirements(device);
1106 test_D3DXCreateTexture(device);
1107 test_D3DXFilterTexture(device);
1108 test_D3DXFillTexture(device);
1109 test_D3DXFillCubeTexture(device);
1110 test_D3DXFillVolumeTexture(device);
1112 IDirect3DDevice9_Release(device);
1113 IDirect3D9_Release(d3d);