1 /* 2 * Copyright 2010 Christian Costa 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 17 */ 18 19 #define COBJMACROS 20 #include "initguid.h" 21 #include <limits.h> 22 #include "wine/test.h" 23 #include "d3dx9.h" 24 25 #ifndef INFINITY 26 static inline float __port_infinity(void) 27 { 28 static const unsigned __inf_bytes = 0x7f800000; 29 return *(const float *)&__inf_bytes; 30 } 31 #define INFINITY __port_infinity() 32 #endif /* INFINITY */ 33 34 #ifndef NAN 35 static float get_nan(void) 36 { 37 DWORD nan = 0x7fc00000; 38 39 return *(float *)&nan; 40 } 41 #define NAN get_nan() 42 #endif 43 44 /* helper functions */ 45 static BOOL compare_float(FLOAT f, FLOAT g, UINT ulps) 46 { 47 INT x = *(INT *)&f; 48 INT y = *(INT *)&g; 49 50 if (x < 0) 51 x = INT_MIN - x; 52 if (y < 0) 53 y = INT_MIN - y; 54 55 if (abs(x - y) > ulps) 56 return FALSE; 57 58 return TRUE; 59 } 60 61 static inline INT get_int(D3DXPARAMETER_TYPE type, const void *data) 62 { 63 INT i; 64 65 switch (type) 66 { 67 case D3DXPT_FLOAT: 68 i = *(FLOAT *)data; 69 break; 70 71 case D3DXPT_INT: 72 i = *(INT *)data; 73 break; 74 75 case D3DXPT_BOOL: 76 i = *(BOOL *)data; 77 break; 78 79 default: 80 i = 0; 81 ok(0, "Unhandled type %x.\n", type); 82 break; 83 } 84 85 return i; 86 } 87 88 static inline float get_float(D3DXPARAMETER_TYPE type, const void *data) 89 { 90 float f; 91 92 switch (type) 93 { 94 case D3DXPT_FLOAT: 95 f = *(FLOAT *)data; 96 break; 97 98 case D3DXPT_INT: 99 f = *(INT *)data; 100 break; 101 102 case D3DXPT_BOOL: 103 f = *(BOOL *)data; 104 break; 105 106 default: 107 f = 0.0f; 108 ok(0, "Unhandled type %x.\n", type); 109 break; 110 } 111 112 return f; 113 } 114 115 static inline BOOL get_bool(const void *data) 116 { 117 return !!*(BOOL *)data; 118 } 119 120 static void set_number(void *outdata, D3DXPARAMETER_TYPE outtype, const void *indata, D3DXPARAMETER_TYPE intype) 121 { 122 switch (outtype) 123 { 124 case D3DXPT_FLOAT: 125 *(FLOAT *)outdata = get_float(intype, indata); 126 break; 127 128 case D3DXPT_BOOL: 129 *(BOOL *)outdata = get_bool(indata); 130 break; 131 132 case D3DXPT_INT: 133 *(INT *)outdata = get_int(intype, indata); 134 break; 135 136 case D3DXPT_PIXELSHADER: 137 case D3DXPT_VERTEXSHADER: 138 case D3DXPT_TEXTURE2D: 139 case D3DXPT_STRING: 140 *(INT *)outdata = 0x12345678; 141 break; 142 143 default: 144 ok(0, "Unhandled type %x.\n", outtype); 145 *(INT *)outdata = 0; 146 break; 147 } 148 } 149 150 static IDirect3DDevice9 *create_device(HWND *window) 151 { 152 D3DPRESENT_PARAMETERS present_parameters = { 0 }; 153 IDirect3DDevice9 *device; 154 IDirect3D9 *d3d; 155 HRESULT hr; 156 HWND wnd; 157 158 *window = NULL; 159 160 if (!(wnd = CreateWindowA("static", "d3dx9_test", WS_OVERLAPPEDWINDOW, 0, 0, 161 640, 480, NULL, NULL, NULL, NULL))) 162 { 163 skip("Couldn't create application window.\n"); 164 return NULL; 165 } 166 167 if (!(d3d = Direct3DCreate9(D3D_SDK_VERSION))) 168 { 169 skip("Couldn't create IDirect3D9 object.\n"); 170 DestroyWindow(wnd); 171 return NULL; 172 } 173 174 present_parameters.Windowed = TRUE; 175 present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD; 176 hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, 177 &present_parameters, &device); 178 IDirect3D9_Release(d3d); 179 if (FAILED(hr)) 180 { 181 skip("Failed to create IDirect3DDevice9 object %#x.\n", hr); 182 DestroyWindow(wnd); 183 return NULL; 184 } 185 186 *window = wnd; 187 return device; 188 } 189 190 static char temp_path[MAX_PATH]; 191 192 static BOOL create_file(const char *filename, const char *data, const unsigned int size, char *out_path) 193 { 194 DWORD written; 195 HANDLE hfile; 196 char path[MAX_PATH]; 197 198 if (!*temp_path) 199 GetTempPathA(sizeof(temp_path), temp_path); 200 201 strcpy(path, temp_path); 202 strcat(path, filename); 203 hfile = CreateFileA(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 204 if (hfile == INVALID_HANDLE_VALUE) 205 return FALSE; 206 207 if (WriteFile(hfile, data, size, &written, NULL)) 208 { 209 CloseHandle(hfile); 210 211 if (out_path) 212 strcpy(out_path, path); 213 return TRUE; 214 } 215 216 CloseHandle(hfile); 217 return FALSE; 218 } 219 220 static void delete_file(const char *filename) 221 { 222 char path[MAX_PATH]; 223 224 strcpy(path, temp_path); 225 strcat(path, filename); 226 DeleteFileA(path); 227 } 228 229 static BOOL create_directory(const char *name) 230 { 231 char path[MAX_PATH]; 232 233 strcpy(path, temp_path); 234 strcat(path, name); 235 return CreateDirectoryA(path, NULL); 236 } 237 238 static void delete_directory(const char *name) 239 { 240 char path[MAX_PATH]; 241 242 strcpy(path, temp_path); 243 strcat(path, name); 244 RemoveDirectoryA(path); 245 } 246 247 static const char effect_desc[] = 248 "Technique\n" 249 "{\n" 250 "}\n"; 251 252 static void test_create_effect_and_pool(IDirect3DDevice9 *device) 253 { 254 HRESULT hr; 255 ID3DXEffect *effect; 256 ID3DXBaseEffect *base; 257 ULONG count; 258 IDirect3DDevice9 *device2; 259 ID3DXEffectStateManager *manager = (ID3DXEffectStateManager *)0xdeadbeef; 260 ID3DXEffectPool *pool = (ID3DXEffectPool *)0xdeadbeef, *pool2; 261 262 hr = D3DXCreateEffect(NULL, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL, NULL); 263 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 264 265 hr = D3DXCreateEffect(device, NULL, 0, NULL, NULL, 0, NULL, NULL, NULL); 266 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 267 268 hr = D3DXCreateEffect(device, effect_desc, 0, NULL, NULL, 0, NULL, NULL, NULL); 269 ok(hr == E_FAIL, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, E_FAIL); 270 271 hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL, NULL); 272 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr); 273 274 hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, &effect, NULL); 275 todo_wine ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr); 276 if (FAILED(hr)) 277 { 278 skip("Failed to compile effect, skipping test.\n"); 279 return; 280 } 281 282 hr = effect->lpVtbl->QueryInterface(effect, &IID_ID3DXBaseEffect, (void **)&base); 283 ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE); 284 285 hr = effect->lpVtbl->GetStateManager(effect, NULL); 286 ok(hr == D3DERR_INVALIDCALL, "GetStateManager failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 287 288 hr = effect->lpVtbl->GetStateManager(effect, &manager); 289 ok(hr == D3D_OK, "GetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr); 290 ok(!manager, "GetStateManager failed, got %p\n", manager); 291 292 /* this works, but it is not recommended! */ 293 hr = effect->lpVtbl->SetStateManager(effect, (ID3DXEffectStateManager *)device); 294 ok(hr == D3D_OK, "SetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr); 295 296 hr = effect->lpVtbl->GetStateManager(effect, &manager); 297 ok(hr == D3D_OK, "GetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr); 298 ok(manager != NULL, "GetStateManager failed\n"); 299 300 IDirect3DDevice9_AddRef(device); 301 count = IDirect3DDevice9_Release(device); 302 ok(count == 4, "Release failed, got %u, expected 4\n", count); 303 304 count = IUnknown_Release(manager); 305 ok(count == 3, "Release failed, got %u, expected 3\n", count); 306 307 hr = effect->lpVtbl->SetStateManager(effect, NULL); 308 ok(hr == D3D_OK, "SetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr); 309 310 hr = effect->lpVtbl->GetPool(effect, &pool); 311 ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr); 312 ok(!pool, "GetPool failed, got %p\n", pool); 313 314 hr = effect->lpVtbl->GetPool(effect, NULL); 315 ok(hr == D3DERR_INVALIDCALL, "GetPool failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 316 317 hr = effect->lpVtbl->GetDevice(effect, &device2); 318 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr); 319 320 hr = effect->lpVtbl->GetDevice(effect, NULL); 321 ok(hr == D3DERR_INVALIDCALL, "GetDevice failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 322 323 count = IDirect3DDevice9_Release(device2); 324 ok(count == 2, "Release failed, got %u, expected 2\n", count); 325 326 count = effect->lpVtbl->Release(effect); 327 ok(count == 0, "Release failed %u\n", count); 328 329 hr = D3DXCreateEffectPool(NULL); 330 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 331 332 hr = D3DXCreateEffectPool(&pool); 333 ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr); 334 335 count = pool->lpVtbl->Release(pool); 336 ok(count == 0, "Release failed %u\n", count); 337 338 hr = D3DXCreateEffectPool(&pool); 339 ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr); 340 341 hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, NULL, NULL); 342 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr); 343 344 hr = pool->lpVtbl->QueryInterface(pool, &IID_ID3DXEffectPool, (void **)&pool2); 345 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr); 346 ok(pool == pool2, "Got effect pool %p, expected %p.\n", pool2, pool); 347 348 count = pool2->lpVtbl->Release(pool2); 349 ok(count == 1, "Release failed, got %u, expected 1\n", count); 350 351 hr = IDirect3DDevice9_QueryInterface(device, &IID_IDirect3DDevice9, (void **)&device2); 352 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr); 353 354 count = IDirect3DDevice9_Release(device2); 355 ok(count == 1, "Release failed, got %u, expected 1\n", count); 356 357 hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, &effect, NULL); 358 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr); 359 360 hr = effect->lpVtbl->GetPool(effect, &pool); 361 ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr); 362 ok(pool == pool2, "Got effect pool %p, expected %p.\n", pool2, pool); 363 364 count = pool2->lpVtbl->Release(pool2); 365 ok(count == 2, "Release failed, got %u, expected 2\n", count); 366 367 count = effect->lpVtbl->Release(effect); 368 ok(count == 0, "Release failed %u\n", count); 369 370 count = pool->lpVtbl->Release(pool); 371 ok(count == 0, "Release failed %u\n", count); 372 } 373 374 static void test_create_effect_compiler(void) 375 { 376 HRESULT hr; 377 ID3DXEffectCompiler *compiler, *compiler2; 378 ID3DXBaseEffect *base; 379 IUnknown *unknown; 380 ULONG count; 381 382 hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, &compiler, NULL); 383 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 384 385 hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, NULL, NULL); 386 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 387 388 hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, &compiler, NULL); 389 ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK); 390 if (FAILED(hr)) 391 { 392 skip("D3DXCreateEffectCompiler failed, skipping test.\n"); 393 return; 394 } 395 396 count = compiler->lpVtbl->Release(compiler); 397 ok(count == 0, "Release failed %u\n", count); 398 399 hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, NULL, NULL); 400 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 401 402 hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL); 403 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 404 405 hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL); 406 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 407 408 hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL); 409 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); 410 411 hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL); 412 ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK); 413 414 hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXBaseEffect, (void **)&base); 415 ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE); 416 417 hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXEffectCompiler, (void **)&compiler2); 418 ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK); 419 420 hr = compiler->lpVtbl->QueryInterface(compiler, &IID_IUnknown, (void **)&unknown); 421 ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK); 422 423 count = unknown->lpVtbl->Release(unknown); 424 ok(count == 2, "Release failed, got %u, expected %u\n", count, 2); 425 426 count = compiler2->lpVtbl->Release(compiler2); 427 ok(count == 1, "Release failed, got %u, expected %u\n", count, 1); 428 429 count = compiler->lpVtbl->Release(compiler); 430 ok(count == 0, "Release failed %u\n", count); 431 } 432 433 /* 434 * Parameter value test 435 */ 436 struct test_effect_parameter_value_result 437 { 438 const char *full_name; 439 D3DXPARAMETER_DESC desc; 440 UINT value_offset; /* start position for the value in the blob */ 441 }; 442 443 /* 444 * fxc.exe /Tfx_2_0 445 */ 446 #if 0 447 float f = 0.1; 448 float1 f1 = {1.1}; 449 float2 f2 = {2.1, 2.2}; 450 float3 f3 = {3.1, 3.2, 3.3}; 451 float4 f4 = {4.1, 4.2, 4.3, 4.4}; 452 float1x1 f11 = {11.1}; 453 float1x2 f12 = {12.1, 12.2}; 454 float1x3 f13 = {13.1, 13.2, 13.3}; 455 float1x4 f14 = {14.1, 14.2, 14.3, 14.4}; 456 float2x1 f21 = {{21.11, 21.21}}; 457 float2x2 f22 = {{22.11, 22.21}, {22.12, 22.22}}; 458 float2x3 f23 = {{23.11, 23.21}, {23.12, 23.22}, {23.13, 23.23}}; 459 float2x4 f24 = {{24.11, 24.21}, {24.12, 24.22}, {24.13, 24.23}, {24.14, 24.24}}; 460 float3x1 f31 = {{31.11, 31.21, 31.31}}; 461 float3x2 f32 = {{32.11, 32.21, 32.31}, {32.12, 32.22, 32.32}}; 462 float3x3 f33 = {{33.11, 33.21, 33.31}, {33.12, 33.22, 33.32}, 463 {33.13, 33.23, 33.33}}; 464 float3x4 f34 = {{34.11, 34.21, 34.31}, {34.12, 34.22, 34.32}, 465 {34.13, 34.23, 34.33}, {34.14, 34.24, 34.34}}; 466 float4x1 f41 = {{41.11, 41.21, 41.31, 41.41}}; 467 float4x2 f42 = {{42.11, 42.21, 42.31, 42.41}, {42.12, 42.22, 42.32, 42.42}}; 468 float4x3 f43 = {{43.11, 43.21, 43.31, 43.41}, {43.12, 43.22, 43.32, 43.42}, 469 {43.13, 43.23, 43.33, 43.43}}; 470 float4x4 f44 = {{44.11, 44.21, 44.31, 44.41}, {44.12, 44.22, 44.32, 44.42}, 471 {44.13, 44.23, 44.33, 44.43}, {44.14, 44.24, 44.34, 44.44}}; 472 float f_2[2] = {0.101, 0.102}; 473 float1 f1_2[2] = {{1.101}, {1.102}}; 474 float2 f2_2[2] = {{2.101, 2.201}, {2.102, 2.202}}; 475 float3 f3_2[2] = {{3.101, 3.201, 3.301}, {3.102, 3.202, 3.302}}; 476 float4 f4_2[2] = {{4.101, 4.201, 4.301, 4.401}, {4.102, 4.202, 4.302, 4.402}}; 477 float1x1 f11_2[2] = {{11.101}, {11.102}}; 478 float1x2 f12_2[2] = {{12.101, 12.201}, {12.102, 12.202}}; 479 float1x3 f13_2[2] = {{13.101, 13.201, 13.301}, {13.102, 13.202, 13.302}}; 480 float1x4 f14_2[2] = {{14.101, 14.201, 14.301, 14.401}, {14.102, 14.202, 14.302, 14.402}}; 481 float2x1 f21_2[2] = {{{21.1101, 21.2101}}, {{21.1102, 21.2102}}}; 482 float2x2 f22_2[2] = {{{22.1101, 22.2101}, {22.1201, 22.2201}}, {{22.1102, 22.2102}, {22.1202, 22.2202}}}; 483 float2x3 f23_2[2] = {{{23.1101, 23.2101}, {23.1201, 23.2201}, {23.1301, 23.2301}}, {{23.1102, 23.2102}, 484 {23.1202, 23.2202}, {23.1302, 23.2302}}}; 485 float2x4 f24_2[2] = {{{24.1101, 24.2101}, {24.1201, 24.2201}, {24.1301, 24.2301}, {24.1401, 24.2401}}, 486 {{24.1102, 24.2102}, {24.1202, 24.2202}, {24.1302, 24.2302}, {24.1402, 24.2402}}}; 487 float3x1 f31_2[2] = {{{31.1101, 31.2101, 31.3101}}, {{31.1102, 31.2102, 31.3102}}}; 488 float3x2 f32_2[2] = {{{32.1101, 32.2101, 32.3101}, {32.1201, 32.2201, 32.3201}}, 489 {{32.1102, 32.2102, 32.3102}, {32.1202, 32.2202, 32.3202}}}; 490 float3x3 f33_2[2] = {{{33.1101, 33.2101, 33.3101}, {33.1201, 33.2201, 33.3201}, 491 {33.1301, 33.2301, 33.3301}}, {{33.1102, 33.2102, 33.3102}, {33.1202, 33.2202, 33.3202}, 492 {33.1302, 33.2302, 33.3302}}}; 493 float3x4 f34_2[2] = {{{34.1101, 34.2101, 34.3101}, {34.1201, 34.2201, 34.3201}, 494 {34.1301, 34.2301, 34.3301}, {34.1401, 34.2401, 34.3401}}, {{34.1102, 34.2102, 34.3102}, 495 {34.1202, 34.2202, 34.3202}, {34.1302, 34.2302, 34.3302}, {34.1402, 34.2402, 34.3402}}}; 496 float4x1 f41_2[2] = {{{41.1101, 41.2101, 41.3101, 41.4101}}, {{41.1102, 41.2102, 41.3102, 41.4102}}}; 497 float4x2 f42_2[2] = {{{42.1101, 42.2101, 42.3101, 42.4101}, {42.1201, 42.2201, 42.3201, 42.4201}}, 498 {{42.1102, 42.2102, 42.3102, 42.4102}, {42.1202, 42.2202, 42.3202, 42.4202}}}; 499 float4x3 f43_2[2] = {{{43.1101, 43.2101, 43.3101, 43.4101}, {43.1201, 43.2201, 43.3201, 43.4201}, 500 {43.1301, 43.2301, 43.3301, 43.4301}}, {{43.1102, 43.2102, 43.3102, 43.4102}, 501 {43.1202, 43.2202, 43.3202, 43.4202}, {43.1302, 43.2302, 43.3302, 43.4302}}}; 502 float4x4 f44_2[2] = {{{44.1101, 44.2101, 44.3101, 44.4101}, {44.1201, 44.2201, 44.3201, 44.4201}, 503 {44.1301, 44.2301, 44.3301, 44.4301}, {44.1401, 44.2401, 44.3401, 44.4401}}, 504 {{44.1102, 44.2102, 44.3102, 44.4102}, {44.1202, 44.2202, 44.3202, 44.4202}, 505 {44.1302, 44.2302, 44.3302, 44.4302}, {44.1402, 44.2402, 44.3402, 44.4402}}}; 506 technique t { pass p { } } 507 #endif 508 static const DWORD test_effect_parameter_value_blob_float[] = 509 { 510 0xfeff0901, 0x00000b80, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000000, 511 0x00000001, 0x00000001, 0x3dcccccd, 0x00000002, 0x00000066, 0x00000003, 0x00000001, 0x0000004c, 512 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x3f8ccccd, 0x00000003, 0x00003166, 0x00000003, 513 0x00000001, 0x00000078, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x40066666, 0x400ccccd, 514 0x00000003, 0x00003266, 0x00000003, 0x00000001, 0x000000a8, 0x00000000, 0x00000000, 0x00000003, 515 0x00000001, 0x40466666, 0x404ccccd, 0x40533333, 0x00000003, 0x00003366, 0x00000003, 0x00000001, 516 0x000000dc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x40833333, 0x40866666, 0x4089999a, 517 0x408ccccd, 0x00000003, 0x00003466, 0x00000003, 0x00000002, 0x00000104, 0x00000000, 0x00000000, 518 0x00000001, 0x00000001, 0x4131999a, 0x00000004, 0x00313166, 0x00000003, 0x00000002, 0x00000130, 519 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x4141999a, 0x41433333, 0x00000004, 0x00323166, 520 0x00000003, 0x00000002, 0x00000160, 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x4151999a, 521 0x41533333, 0x4154cccd, 0x00000004, 0x00333166, 0x00000003, 0x00000002, 0x00000194, 0x00000000, 522 0x00000000, 0x00000001, 0x00000004, 0x4161999a, 0x41633333, 0x4164cccd, 0x41666666, 0x00000004, 523 0x00343166, 0x00000003, 0x00000002, 0x000001c0, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 524 0x41a8e148, 0x41a9ae14, 0x00000004, 0x00313266, 0x00000003, 0x00000002, 0x000001f4, 0x00000000, 525 0x00000000, 0x00000002, 0x00000002, 0x41b0e148, 0x41b1ae14, 0x41b0f5c3, 0x41b1c28f, 0x00000004, 526 0x00323266, 0x00000003, 0x00000002, 0x00000230, 0x00000000, 0x00000000, 0x00000002, 0x00000003, 527 0x41b8e148, 0x41b9ae14, 0x41b8f5c3, 0x41b9c28f, 0x41b90a3d, 0x41b9d70a, 0x00000004, 0x00333266, 528 0x00000003, 0x00000002, 0x00000274, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x41c0e148, 529 0x41c1ae14, 0x41c0f5c3, 0x41c1c28f, 0x41c10a3d, 0x41c1d70a, 0x41c11eb8, 0x41c1eb85, 0x00000004, 530 0x00343266, 0x00000003, 0x00000002, 0x000002a4, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 531 0x41f8e148, 0x41f9ae14, 0x41fa7ae1, 0x00000004, 0x00313366, 0x00000003, 0x00000002, 0x000002e0, 532 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x420070a4, 0x4200d70a, 0x42013d71, 0x42007ae1, 533 0x4200e148, 0x420147ae, 0x00000004, 0x00323366, 0x00000003, 0x00000002, 0x00000328, 0x00000000, 534 0x00000000, 0x00000003, 0x00000003, 0x420470a4, 0x4204d70a, 0x42053d71, 0x42047ae1, 0x4204e148, 535 0x420547ae, 0x4204851f, 0x4204eb85, 0x420551ec, 0x00000004, 0x00333366, 0x00000003, 0x00000002, 536 0x0000037c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x420870a4, 0x4208d70a, 0x42093d71, 537 0x42087ae1, 0x4208e148, 0x420947ae, 0x4208851f, 0x4208eb85, 0x420951ec, 0x42088f5c, 0x4208f5c3, 538 0x42095c29, 0x00000004, 0x00343366, 0x00000003, 0x00000002, 0x000003b0, 0x00000000, 0x00000000, 539 0x00000004, 0x00000001, 0x422470a4, 0x4224d70a, 0x42253d71, 0x4225a3d7, 0x00000004, 0x00313466, 540 0x00000003, 0x00000002, 0x000003f4, 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x422870a4, 541 0x4228d70a, 0x42293d71, 0x4229a3d7, 0x42287ae1, 0x4228e148, 0x422947ae, 0x4229ae14, 0x00000004, 542 0x00323466, 0x00000003, 0x00000002, 0x00000448, 0x00000000, 0x00000000, 0x00000004, 0x00000003, 543 0x422c70a4, 0x422cd70a, 0x422d3d71, 0x422da3d7, 0x422c7ae1, 0x422ce148, 0x422d47ae, 0x422dae14, 544 0x422c851f, 0x422ceb85, 0x422d51ec, 0x422db852, 0x00000004, 0x00333466, 0x00000003, 0x00000002, 545 0x000004ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x423070a4, 0x4230d70a, 0x42313d71, 546 0x4231a3d7, 0x42307ae1, 0x4230e148, 0x423147ae, 0x4231ae14, 0x4230851f, 0x4230eb85, 0x423151ec, 547 0x4231b852, 0x42308f5c, 0x4230f5c3, 0x42315c29, 0x4231c28f, 0x00000004, 0x00343466, 0x00000003, 548 0x00000000, 0x000004d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x3dced917, 0x3dd0e560, 549 0x00000004, 0x00325f66, 0x00000003, 0x00000001, 0x00000504, 0x00000000, 0x00000002, 0x00000001, 550 0x00000001, 0x3f8ced91, 0x3f8d0e56, 0x00000005, 0x325f3166, 0x00000000, 0x00000003, 0x00000001, 551 0x0000053c, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x400676c9, 0x400cdd2f, 0x4006872b, 552 0x400ced91, 0x00000005, 0x325f3266, 0x00000000, 0x00000003, 0x00000001, 0x0000057c, 0x00000000, 553 0x00000002, 0x00000003, 0x00000001, 0x404676c9, 0x404cdd2f, 0x40534396, 0x4046872b, 0x404ced91, 554 0x405353f8, 0x00000005, 0x325f3366, 0x00000000, 0x00000003, 0x00000001, 0x000005c4, 0x00000000, 555 0x00000002, 0x00000004, 0x00000001, 0x40833b64, 0x40866e98, 0x4089a1cb, 0x408cd4fe, 0x40834396, 556 0x408676c9, 0x4089a9fc, 0x408cdd2f, 0x00000005, 0x325f3466, 0x00000000, 0x00000003, 0x00000002, 557 0x000005f4, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x41319db2, 0x4131a1cb, 0x00000006, 558 0x5f313166, 0x00000032, 0x00000003, 0x00000002, 0x0000062c, 0x00000000, 0x00000002, 0x00000001, 559 0x00000002, 0x41419db2, 0x4143374c, 0x4141a1cb, 0x41433b64, 0x00000006, 0x5f323166, 0x00000032, 560 0x00000003, 0x00000002, 0x0000066c, 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x41519db2, 561 0x4153374c, 0x4154d0e5, 0x4151a1cb, 0x41533b64, 0x4154d4fe, 0x00000006, 0x5f333166, 0x00000032, 562 0x00000003, 0x00000002, 0x000006b4, 0x00000000, 0x00000002, 0x00000001, 0x00000004, 0x41619db2, 563 0x4163374c, 0x4164d0e5, 0x41666a7f, 0x4161a1cb, 0x41633b64, 0x4164d4fe, 0x41666e98, 0x00000006, 564 0x5f343166, 0x00000032, 0x00000003, 0x00000002, 0x000006ec, 0x00000000, 0x00000002, 0x00000002, 565 0x00000001, 0x41a8e17c, 0x41a9ae49, 0x41a8e1b1, 0x41a9ae7d, 0x00000006, 0x5f313266, 0x00000032, 566 0x00000003, 0x00000002, 0x00000734, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x41b0e17c, 567 0x41b1ae49, 0x41b0f5f7, 0x41b1c2c4, 0x41b0e1b1, 0x41b1ae7d, 0x41b0f62b, 0x41b1c2f8, 0x00000006, 568 0x5f323266, 0x00000032, 0x00000003, 0x00000002, 0x0000078c, 0x00000000, 0x00000002, 0x00000002, 569 0x00000003, 0x41b8e17c, 0x41b9ae49, 0x41b8f5f7, 0x41b9c2c4, 0x41b90a72, 0x41b9d73f, 0x41b8e1b1, 570 0x41b9ae7d, 0x41b8f62b, 0x41b9c2f8, 0x41b90aa6, 0x41b9d773, 0x00000006, 0x5f333266, 0x00000032, 571 0x00000003, 0x00000002, 0x000007f4, 0x00000000, 0x00000002, 0x00000002, 0x00000004, 0x41c0e17c, 572 0x41c1ae49, 0x41c0f5f7, 0x41c1c2c4, 0x41c10a72, 0x41c1d73f, 0x41c11eed, 0x41c1ebba, 0x41c0e1b1, 573 0x41c1ae7d, 0x41c0f62b, 0x41c1c2f8, 0x41c10aa6, 0x41c1d773, 0x41c11f21, 0x41c1ebee, 0x00000006, 574 0x5f343266, 0x00000032, 0x00000003, 0x00000002, 0x00000834, 0x00000000, 0x00000002, 0x00000003, 575 0x00000001, 0x41f8e17c, 0x41f9ae49, 0x41fa7b16, 0x41f8e1b1, 0x41f9ae7d, 0x41fa7b4a, 0x00000006, 576 0x5f313366, 0x00000032, 0x00000003, 0x00000002, 0x0000088c, 0x00000000, 0x00000002, 0x00000003, 577 0x00000002, 0x420070be, 0x4200d724, 0x42013d8b, 0x42007afb, 0x4200e162, 0x420147c8, 0x420070d8, 578 0x4200d73f, 0x42013da5, 0x42007b16, 0x4200e17c, 0x420147e3, 0x00000006, 0x5f323366, 0x00000032, 579 0x00000003, 0x00000002, 0x000008fc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x420470be, 580 0x4204d724, 0x42053d8b, 0x42047afb, 0x4204e162, 0x420547c8, 0x42048539, 0x4204eb9f, 0x42055206, 581 0x420470d8, 0x4204d73f, 0x42053da5, 0x42047b16, 0x4204e17c, 0x420547e3, 0x42048553, 0x4204ebba, 582 0x42055220, 0x00000006, 0x5f333366, 0x00000032, 0x00000003, 0x00000002, 0x00000984, 0x00000000, 583 0x00000002, 0x00000003, 0x00000004, 0x420870be, 0x4208d724, 0x42093d8b, 0x42087afb, 0x4208e162, 584 0x420947c8, 0x42088539, 0x4208eb9f, 0x42095206, 0x42088f76, 0x4208f5dd, 0x42095c43, 0x420870d8, 585 0x4208d73f, 0x42093da5, 0x42087b16, 0x4208e17c, 0x420947e3, 0x42088553, 0x4208ebba, 0x42095220, 586 0x42088f91, 0x4208f5f7, 0x42095c5d, 0x00000006, 0x5f343366, 0x00000032, 0x00000003, 0x00000002, 587 0x000009cc, 0x00000000, 0x00000002, 0x00000004, 0x00000001, 0x422470be, 0x4224d724, 0x42253d8b, 588 0x4225a3f1, 0x422470d8, 0x4224d73f, 0x42253da5, 0x4225a40b, 0x00000006, 0x5f313466, 0x00000032, 589 0x00000003, 0x00000002, 0x00000a34, 0x00000000, 0x00000002, 0x00000004, 0x00000002, 0x422870be, 590 0x4228d724, 0x42293d8b, 0x4229a3f1, 0x42287afb, 0x4228e162, 0x422947c8, 0x4229ae2f, 0x422870d8, 591 0x4228d73f, 0x42293da5, 0x4229a40b, 0x42287b16, 0x4228e17c, 0x422947e3, 0x4229ae49, 0x00000006, 592 0x5f323466, 0x00000032, 0x00000003, 0x00000002, 0x00000abc, 0x00000000, 0x00000002, 0x00000004, 593 0x00000003, 0x422c70be, 0x422cd724, 0x422d3d8b, 0x422da3f1, 0x422c7afb, 0x422ce162, 0x422d47c8, 594 0x422dae2f, 0x422c8539, 0x422ceb9f, 0x422d5206, 0x422db86c, 0x422c70d8, 0x422cd73f, 0x422d3da5, 595 0x422da40b, 0x422c7b16, 0x422ce17c, 0x422d47e3, 0x422dae49, 0x422c8553, 0x422cebba, 0x422d5220, 596 0x422db886, 0x00000006, 0x5f333466, 0x00000032, 0x00000003, 0x00000002, 0x00000b64, 0x00000000, 597 0x00000002, 0x00000004, 0x00000004, 0x423070be, 0x4230d724, 0x42313d8b, 0x4231a3f1, 0x42307afb, 598 0x4230e162, 0x423147c8, 0x4231ae2f, 0x42308539, 0x4230eb9f, 0x42315206, 0x4231b86c, 0x42308f76, 599 0x4230f5dd, 0x42315c43, 0x4231c2aa, 0x423070d8, 0x4230d73f, 0x42313da5, 0x4231a40b, 0x42307b16, 600 0x4230e17c, 0x423147e3, 0x4231ae49, 0x42308553, 0x4230ebba, 0x42315220, 0x4231b886, 0x42308f91, 601 0x4230f5f7, 0x42315c5d, 0x4231c2c4, 0x00000006, 0x5f343466, 0x00000032, 0x00000002, 0x00000070, 602 0x00000002, 0x00000074, 0x0000002a, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000020, 603 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 0x00000070, 604 0x00000000, 0x00000000, 0x00000080, 0x0000009c, 0x00000000, 0x00000000, 0x000000b0, 0x000000cc, 605 0x00000000, 0x00000000, 0x000000e4, 0x00000100, 0x00000000, 0x00000000, 0x0000010c, 0x00000128, 606 0x00000000, 0x00000000, 0x00000138, 0x00000154, 0x00000000, 0x00000000, 0x00000168, 0x00000184, 607 0x00000000, 0x00000000, 0x0000019c, 0x000001b8, 0x00000000, 0x00000000, 0x000001c8, 0x000001e4, 608 0x00000000, 0x00000000, 0x000001fc, 0x00000218, 0x00000000, 0x00000000, 0x00000238, 0x00000254, 609 0x00000000, 0x00000000, 0x0000027c, 0x00000298, 0x00000000, 0x00000000, 0x000002ac, 0x000002c8, 610 0x00000000, 0x00000000, 0x000002e8, 0x00000304, 0x00000000, 0x00000000, 0x00000330, 0x0000034c, 611 0x00000000, 0x00000000, 0x00000384, 0x000003a0, 0x00000000, 0x00000000, 0x000003b8, 0x000003d4, 612 0x00000000, 0x00000000, 0x000003fc, 0x00000418, 0x00000000, 0x00000000, 0x00000450, 0x0000046c, 613 0x00000000, 0x00000000, 0x000004b4, 0x000004d0, 0x00000000, 0x00000000, 0x000004e0, 0x000004fc, 614 0x00000000, 0x00000000, 0x00000510, 0x0000052c, 0x00000000, 0x00000000, 0x00000548, 0x00000564, 615 0x00000000, 0x00000000, 0x00000588, 0x000005a4, 0x00000000, 0x00000000, 0x000005d0, 0x000005ec, 616 0x00000000, 0x00000000, 0x00000600, 0x0000061c, 0x00000000, 0x00000000, 0x00000638, 0x00000654, 617 0x00000000, 0x00000000, 0x00000678, 0x00000694, 0x00000000, 0x00000000, 0x000006c0, 0x000006dc, 618 0x00000000, 0x00000000, 0x000006f8, 0x00000714, 0x00000000, 0x00000000, 0x00000740, 0x0000075c, 619 0x00000000, 0x00000000, 0x00000798, 0x000007b4, 0x00000000, 0x00000000, 0x00000800, 0x0000081c, 620 0x00000000, 0x00000000, 0x00000840, 0x0000085c, 0x00000000, 0x00000000, 0x00000898, 0x000008b4, 621 0x00000000, 0x00000000, 0x00000908, 0x00000924, 0x00000000, 0x00000000, 0x00000990, 0x000009ac, 622 0x00000000, 0x00000000, 0x000009d8, 0x000009f4, 0x00000000, 0x00000000, 0x00000a40, 0x00000a5c, 623 0x00000000, 0x00000000, 0x00000ac8, 0x00000ae4, 0x00000000, 0x00000000, 0x00000b78, 0x00000000, 624 0x00000001, 0x00000b70, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 625 }; 626 627 struct test_effect_parameter_value_result test_effect_parameter_value_result_float[] = 628 { 629 {"f", {"f", NULL, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0, 4}, 10}, 630 {"f1", {"f1", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0, 4}, 20}, 631 {"f2", {"f2", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 2, 0, 0, 0, 0, 8}, 30}, 632 {"f3", {"f3", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0, 12}, 41}, 633 {"f4", {"f4", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0, 16}, 53}, 634 {"f11", {"f11", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0, 4}, 66}, 635 {"f12", {"f12", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 2, 0, 0, 0, 0, 8}, 76}, 636 {"f13", {"f13", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0, 12}, 87}, 637 {"f14", {"f14", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0, 16}, 99}, 638 {"f21", {"f21", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 1, 0, 0, 0, 0, 8}, 112}, 639 {"f22", {"f22", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 2, 0, 0, 0, 0, 16}, 123}, 640 {"f23", {"f23", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 0, 0, 0, 0, 24}, 136}, 641 {"f24", {"f24", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 4, 0, 0, 0, 0, 32}, 151}, 642 {"f31", {"f31", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 0, 0, 0, 0, 12}, 168}, 643 {"f32", {"f32", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 0, 0, 0, 0, 24}, 180}, 644 {"f33", {"f33", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 0, 0, 0, 0, 36}, 195}, 645 {"f34", {"f34", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 4, 0, 0, 0, 0, 48}, 213}, 646 {"f41", {"f41", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 1, 0, 0, 0, 0, 16}, 234}, 647 {"f42", {"f42", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 2, 0, 0, 0, 0, 32}, 247}, 648 {"f43", {"f43", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 3, 0, 0, 0, 0, 48}, 264}, 649 {"f44", {"f44", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 0, 0, 0, 0, 64}, 285}, 650 {"f_2", {"f_2", NULL, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0, 8}, 310}, 651 {"f1_2", {"f1_2", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0, 8}, 321}, 652 {"f2_2", {"f2_2", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 2, 2, 0, 0, 0, 16}, 333}, 653 {"f3_2", {"f3_2", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 2, 0, 0, 0, 24}, 347}, 654 {"f4_2", {"f4_2", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 2, 0, 0, 0, 32}, 363}, 655 {"f11_2", {"f11_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0, 8}, 381}, 656 {"f12_2", {"f12_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 2, 2, 0, 0, 0, 16}, 393}, 657 {"f13_2", {"f13_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 2, 0, 0, 0, 24}, 407}, 658 {"f14_2", {"f14_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 4, 2, 0, 0, 0, 32}, 423}, 659 {"f21_2", {"f21_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 1, 2, 0, 0, 0, 16}, 441}, 660 {"f22_2", {"f22_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 2, 2, 0, 0, 0, 32}, 455}, 661 {"f23_2", {"f23_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 2, 0, 0, 0, 48}, 473}, 662 {"f24_2", {"f24_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 4, 2, 0, 0, 0, 64}, 495}, 663 {"f31_2", {"f31_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 0, 0, 24}, 521}, 664 {"f32_2", {"f32_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 2, 0, 0, 0, 48}, 537}, 665 {"f33_2", {"f33_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 2, 0, 0, 0, 72}, 559}, 666 {"f34_2", {"f34_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 4, 2, 0, 0, 0, 96}, 587}, 667 {"f41_2", {"f41_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 1, 2, 0, 0, 0, 32}, 621}, 668 {"f42_2", {"f42_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 2, 2, 0, 0, 0, 64}, 639}, 669 {"f43_2", {"f43_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 3, 2, 0, 0, 0, 96}, 665}, 670 {"f44_2", {"f44_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 2, 0, 0, 0, 128}, 699}, 671 }; 672 673 /* 674 * fxc.exe /Tfx_2_0 675 */ 676 #if 0 677 int i = 1; 678 int1 i1 = {11}; 679 int2 i2 = {21, 22}; 680 int3 i3 = {31, 32, 33}; 681 int4 i4 = {41, 42, 43, 44}; 682 int1x1 i11 = {111}; 683 int1x2 i12 = {121, 122}; 684 int1x3 i13 = {131, 132, 133}; 685 int1x4 i14 = {141, 142, 143, 144}; 686 int2x1 i21 = {{2111, 2121}}; 687 int2x2 i22 = {{2211, 2221}, {2212, 2222}}; 688 int2x3 i23 = {{2311, 2321}, {2312, 2322}, {2313, 2323}}; 689 int2x4 i24 = {{2411, 2421}, {2412, 2422}, {2413, 2423}, {2414, 2424}}; 690 int3x1 i31 = {{3111, 3121, 3131}}; 691 int3x2 i32 = {{3211, 3221, 3231}, {3212, 3222, 3232}}; 692 int3x3 i33 = {{3311, 3321, 3331}, {3312, 3322, 3332}, 693 {3313, 3323, 3333}}; 694 int3x4 i34 = {{3411, 3421, 3431}, {3412, 3422, 3432}, 695 {3413, 3423, 3433}, {3414, 3424, 3434}}; 696 int4x1 i41 = {{4111, 4121, 4131, 4141}}; 697 int4x2 i42 = {{4211, 4221, 4231, 4241}, {4212, 4222, 4232, 4242}}; 698 int4x3 i43 = {{4311, 4321, 4331, 4341}, {4312, 4322, 4332, 4342}, 699 {4313, 4323, 4333, 4343}}; 700 int4x4 i44 = {{4411, 4421, 4431, 4441}, {4412, 4422, 4432, 4442}, 701 {4413, 4423, 4433, 4443}, {4414, 4424, 4434, 4444}}; 702 int i_2[2] = {0101, 0102}; 703 int1 i1_2[2] = {{1101}, {1102}}; 704 int2 i2_2[2] = {{2101, 2201}, {2102, 2202}}; 705 int3 i3_2[2] = {{3101, 3201, 3301}, {3102, 3202, 3302}}; 706 int4 i4_2[2] = {{4101, 4201, 4301, 4401}, {4102, 4202, 4302, 4402}}; 707 int1x1 i11_2[2] = {{11101}, {11102}}; 708 int1x2 i12_2[2] = {{12101, 12201}, {12102, 12202}}; 709 int1x3 i13_2[2] = {{13101, 13201, 13301}, {13102, 13202, 13302}}; 710 int1x4 i14_2[2] = {{14101, 14201, 14301, 14401}, {14102, 14202, 14302, 14402}}; 711 int2x1 i21_2[2] = {{{211101, 212101}}, {{211102, 212102}}}; 712 int2x2 i22_2[2] = {{{221101, 222101}, {221201, 222201}}, {{221102, 222102}, {221202, 222202}}}; 713 int2x3 i23_2[2] = {{{231101, 232101}, {231201, 232201}, {231301, 232301}}, {{231102, 232102}, 714 {231202, 232202}, {231302, 232302}}}; 715 int2x4 i24_2[2] = {{{241101, 242101}, {241201, 242201}, {241301, 242301}, {241401, 242401}}, 716 {{241102, 242102}, {241202, 242202}, {241302, 242302}, {241402, 242402}}}; 717 int3x1 i31_2[2] = {{{311101, 312101, 313101}}, {{311102, 312102, 313102}}}; 718 int3x2 i32_2[2] = {{{321101, 322101, 323101}, {321201, 322201, 323201}}, 719 {{321102, 322102, 323102}, {321202, 322202, 323202}}}; 720 int3x3 i33_2[2] = {{{331101, 332101, 333101}, {331201, 332201, 333201}, 721 {331301, 332301, 333301}}, {{331102, 332102, 333102}, {331202, 332202, 333202}, 722 {331302, 332302, 333302}}}; 723 int3x4 i34_2[2] = {{{341101, 342101, 343101}, {341201, 342201, 343201}, 724 {341301, 342301, 343301}, {341401, 342401, 343401}}, {{341102, 342102, 343102}, 725 {341202, 342202, 343202}, {341302, 342302, 343302}, {341402, 342402, 343402}}}; 726 int4x1 i41_2[2] = {{{411101, 412101, 413101, 414101}}, {{411102, 412102, 413102, 414102}}}; 727 int4x2 i42_2[2] = {{{421101, 422101, 423101, 424101}, {421201, 422201, 423201, 424201}}, 728 {{421102, 422102, 423102, 424102}, {421202, 422202, 423202, 424202}}}; 729 int4x3 i43_2[2] = {{{431101, 432101, 433101, 434101}, {431201, 432201, 433201, 434201}, 730 {431301, 432301, 433301, 434301}}, {{431102, 432102, 433102, 434102}, 731 {431202, 432202, 433202, 434202}, {431302, 432302, 433302, 434302}}}; 732 int4x4 i44_2[2] = {{{441101, 442101, 443101, 444101}, {441201, 442201, 443201, 444201}, 733 {441301, 442301, 443301, 444301}, {441401, 442401, 443401, 444401}}, 734 {{441102, 442102, 443102, 444102}, {441202, 442202, 443202, 444202}, 735 {441302, 442302, 443302, 444302}, {441402, 442402, 443402, 444402}}}; 736 technique t { pass p { } } 737 #endif 738 static const DWORD test_effect_parameter_value_blob_int[] = 739 { 740 0xfeff0901, 0x00000b80, 0x00000000, 0x00000002, 0x00000000, 0x00000024, 0x00000000, 0x00000000, 741 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000069, 0x00000002, 0x00000001, 0x0000004c, 742 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x0000000b, 0x00000003, 0x00003169, 0x00000002, 743 0x00000001, 0x00000078, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x00000015, 0x00000016, 744 0x00000003, 0x00003269, 0x00000002, 0x00000001, 0x000000a8, 0x00000000, 0x00000000, 0x00000003, 745 0x00000001, 0x0000001f, 0x00000020, 0x00000021, 0x00000003, 0x00003369, 0x00000002, 0x00000001, 746 0x000000dc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000029, 0x0000002a, 0x0000002b, 747 0x0000002c, 0x00000003, 0x00003469, 0x00000002, 0x00000002, 0x00000104, 0x00000000, 0x00000000, 748 0x00000001, 0x00000001, 0x0000006f, 0x00000004, 0x00313169, 0x00000002, 0x00000002, 0x00000130, 749 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000079, 0x0000007a, 0x00000004, 0x00323169, 750 0x00000002, 0x00000002, 0x00000160, 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x00000083, 751 0x00000084, 0x00000085, 0x00000004, 0x00333169, 0x00000002, 0x00000002, 0x00000194, 0x00000000, 752 0x00000000, 0x00000001, 0x00000004, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000004, 753 0x00343169, 0x00000002, 0x00000002, 0x000001c0, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 754 0x0000083f, 0x00000849, 0x00000004, 0x00313269, 0x00000002, 0x00000002, 0x000001f4, 0x00000000, 755 0x00000000, 0x00000002, 0x00000002, 0x000008a3, 0x000008ad, 0x000008a4, 0x000008ae, 0x00000004, 756 0x00323269, 0x00000002, 0x00000002, 0x00000230, 0x00000000, 0x00000000, 0x00000002, 0x00000003, 757 0x00000907, 0x00000911, 0x00000908, 0x00000912, 0x00000909, 0x00000913, 0x00000004, 0x00333269, 758 0x00000002, 0x00000002, 0x00000274, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x0000096b, 759 0x00000975, 0x0000096c, 0x00000976, 0x0000096d, 0x00000977, 0x0000096e, 0x00000978, 0x00000004, 760 0x00343269, 0x00000002, 0x00000002, 0x000002a4, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 761 0x00000c27, 0x00000c31, 0x00000c3b, 0x00000004, 0x00313369, 0x00000002, 0x00000002, 0x000002e0, 762 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000c8b, 0x00000c95, 0x00000c9f, 0x00000c8c, 763 0x00000c96, 0x00000ca0, 0x00000004, 0x00323369, 0x00000002, 0x00000002, 0x00000328, 0x00000000, 764 0x00000000, 0x00000003, 0x00000003, 0x00000cef, 0x00000cf9, 0x00000d03, 0x00000cf0, 0x00000cfa, 765 0x00000d04, 0x00000cf1, 0x00000cfb, 0x00000d05, 0x00000004, 0x00333369, 0x00000002, 0x00000002, 766 0x0000037c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x00000d53, 0x00000d5d, 0x00000d67, 767 0x00000d54, 0x00000d5e, 0x00000d68, 0x00000d55, 0x00000d5f, 0x00000d69, 0x00000d56, 0x00000d60, 768 0x00000d6a, 0x00000004, 0x00343369, 0x00000002, 0x00000002, 0x000003b0, 0x00000000, 0x00000000, 769 0x00000004, 0x00000001, 0x0000100f, 0x00001019, 0x00001023, 0x0000102d, 0x00000004, 0x00313469, 770 0x00000002, 0x00000002, 0x000003f4, 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x00001073, 771 0x0000107d, 0x00001087, 0x00001091, 0x00001074, 0x0000107e, 0x00001088, 0x00001092, 0x00000004, 772 0x00323469, 0x00000002, 0x00000002, 0x00000448, 0x00000000, 0x00000000, 0x00000004, 0x00000003, 773 0x000010d7, 0x000010e1, 0x000010eb, 0x000010f5, 0x000010d8, 0x000010e2, 0x000010ec, 0x000010f6, 774 0x000010d9, 0x000010e3, 0x000010ed, 0x000010f7, 0x00000004, 0x00333469, 0x00000002, 0x00000002, 775 0x000004ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x0000113b, 0x00001145, 0x0000114f, 776 0x00001159, 0x0000113c, 0x00001146, 0x00001150, 0x0000115a, 0x0000113d, 0x00001147, 0x00001151, 777 0x0000115b, 0x0000113e, 0x00001148, 0x00001152, 0x0000115c, 0x00000004, 0x00343469, 0x00000002, 778 0x00000000, 0x000004d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x00000041, 0x00000042, 779 0x00000004, 0x00325f69, 0x00000002, 0x00000001, 0x00000504, 0x00000000, 0x00000002, 0x00000001, 780 0x00000001, 0x0000044d, 0x0000044e, 0x00000005, 0x325f3169, 0x00000000, 0x00000002, 0x00000001, 781 0x0000053c, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x00000835, 0x00000899, 0x00000836, 782 0x0000089a, 0x00000005, 0x325f3269, 0x00000000, 0x00000002, 0x00000001, 0x0000057c, 0x00000000, 783 0x00000002, 0x00000003, 0x00000001, 0x00000c1d, 0x00000c81, 0x00000ce5, 0x00000c1e, 0x00000c82, 784 0x00000ce6, 0x00000005, 0x325f3369, 0x00000000, 0x00000002, 0x00000001, 0x000005c4, 0x00000000, 785 0x00000002, 0x00000004, 0x00000001, 0x00001005, 0x00001069, 0x000010cd, 0x00001131, 0x00001006, 786 0x0000106a, 0x000010ce, 0x00001132, 0x00000005, 0x325f3469, 0x00000000, 0x00000002, 0x00000002, 787 0x000005f4, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x00002b5d, 0x00002b5e, 0x00000006, 788 0x5f313169, 0x00000032, 0x00000002, 0x00000002, 0x0000062c, 0x00000000, 0x00000002, 0x00000001, 789 0x00000002, 0x00002f45, 0x00002fa9, 0x00002f46, 0x00002faa, 0x00000006, 0x5f323169, 0x00000032, 790 0x00000002, 0x00000002, 0x0000066c, 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x0000332d, 791 0x00003391, 0x000033f5, 0x0000332e, 0x00003392, 0x000033f6, 0x00000006, 0x5f333169, 0x00000032, 792 0x00000002, 0x00000002, 0x000006b4, 0x00000000, 0x00000002, 0x00000001, 0x00000004, 0x00003715, 793 0x00003779, 0x000037dd, 0x00003841, 0x00003716, 0x0000377a, 0x000037de, 0x00003842, 0x00000006, 794 0x5f343169, 0x00000032, 0x00000002, 0x00000002, 0x000006ec, 0x00000000, 0x00000002, 0x00000002, 795 0x00000001, 0x0003389d, 0x00033c85, 0x0003389e, 0x00033c86, 0x00000006, 0x5f313269, 0x00000032, 796 0x00000002, 0x00000002, 0x00000734, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x00035fad, 797 0x00036395, 0x00036011, 0x000363f9, 0x00035fae, 0x00036396, 0x00036012, 0x000363fa, 0x00000006, 798 0x5f323269, 0x00000032, 0x00000002, 0x00000002, 0x0000078c, 0x00000000, 0x00000002, 0x00000002, 799 0x00000003, 0x000386bd, 0x00038aa5, 0x00038721, 0x00038b09, 0x00038785, 0x00038b6d, 0x000386be, 800 0x00038aa6, 0x00038722, 0x00038b0a, 0x00038786, 0x00038b6e, 0x00000006, 0x5f333269, 0x00000032, 801 0x00000002, 0x00000002, 0x000007f4, 0x00000000, 0x00000002, 0x00000002, 0x00000004, 0x0003adcd, 802 0x0003b1b5, 0x0003ae31, 0x0003b219, 0x0003ae95, 0x0003b27d, 0x0003aef9, 0x0003b2e1, 0x0003adce, 803 0x0003b1b6, 0x0003ae32, 0x0003b21a, 0x0003ae96, 0x0003b27e, 0x0003aefa, 0x0003b2e2, 0x00000006, 804 0x5f343269, 0x00000032, 0x00000002, 0x00000002, 0x00000834, 0x00000000, 0x00000002, 0x00000003, 805 0x00000001, 0x0004bf3d, 0x0004c325, 0x0004c70d, 0x0004bf3e, 0x0004c326, 0x0004c70e, 0x00000006, 806 0x5f313369, 0x00000032, 0x00000002, 0x00000002, 0x0000088c, 0x00000000, 0x00000002, 0x00000003, 807 0x00000002, 0x0004e64d, 0x0004ea35, 0x0004ee1d, 0x0004e6b1, 0x0004ea99, 0x0004ee81, 0x0004e64e, 808 0x0004ea36, 0x0004ee1e, 0x0004e6b2, 0x0004ea9a, 0x0004ee82, 0x00000006, 0x5f323369, 0x00000032, 809 0x00000002, 0x00000002, 0x000008fc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00050d5d, 810 0x00051145, 0x0005152d, 0x00050dc1, 0x000511a9, 0x00051591, 0x00050e25, 0x0005120d, 0x000515f5, 811 0x00050d5e, 0x00051146, 0x0005152e, 0x00050dc2, 0x000511aa, 0x00051592, 0x00050e26, 0x0005120e, 812 0x000515f6, 0x00000006, 0x5f333369, 0x00000032, 0x00000002, 0x00000002, 0x00000984, 0x00000000, 813 0x00000002, 0x00000003, 0x00000004, 0x0005346d, 0x00053855, 0x00053c3d, 0x000534d1, 0x000538b9, 814 0x00053ca1, 0x00053535, 0x0005391d, 0x00053d05, 0x00053599, 0x00053981, 0x00053d69, 0x0005346e, 815 0x00053856, 0x00053c3e, 0x000534d2, 0x000538ba, 0x00053ca2, 0x00053536, 0x0005391e, 0x00053d06, 816 0x0005359a, 0x00053982, 0x00053d6a, 0x00000006, 0x5f343369, 0x00000032, 0x00000002, 0x00000002, 817 0x000009cc, 0x00000000, 0x00000002, 0x00000004, 0x00000001, 0x000645dd, 0x000649c5, 0x00064dad, 818 0x00065195, 0x000645de, 0x000649c6, 0x00064dae, 0x00065196, 0x00000006, 0x5f313469, 0x00000032, 819 0x00000002, 0x00000002, 0x00000a34, 0x00000000, 0x00000002, 0x00000004, 0x00000002, 0x00066ced, 820 0x000670d5, 0x000674bd, 0x000678a5, 0x00066d51, 0x00067139, 0x00067521, 0x00067909, 0x00066cee, 821 0x000670d6, 0x000674be, 0x000678a6, 0x00066d52, 0x0006713a, 0x00067522, 0x0006790a, 0x00000006, 822 0x5f323469, 0x00000032, 0x00000002, 0x00000002, 0x00000abc, 0x00000000, 0x00000002, 0x00000004, 823 0x00000003, 0x000693fd, 0x000697e5, 0x00069bcd, 0x00069fb5, 0x00069461, 0x00069849, 0x00069c31, 824 0x0006a019, 0x000694c5, 0x000698ad, 0x00069c95, 0x0006a07d, 0x000693fe, 0x000697e6, 0x00069bce, 825 0x00069fb6, 0x00069462, 0x0006984a, 0x00069c32, 0x0006a01a, 0x000694c6, 0x000698ae, 0x00069c96, 826 0x0006a07e, 0x00000006, 0x5f333469, 0x00000032, 0x00000002, 0x00000002, 0x00000b64, 0x00000000, 827 0x00000002, 0x00000004, 0x00000004, 0x0006bb0d, 0x0006bef5, 0x0006c2dd, 0x0006c6c5, 0x0006bb71, 828 0x0006bf59, 0x0006c341, 0x0006c729, 0x0006bbd5, 0x0006bfbd, 0x0006c3a5, 0x0006c78d, 0x0006bc39, 829 0x0006c021, 0x0006c409, 0x0006c7f1, 0x0006bb0e, 0x0006bef6, 0x0006c2de, 0x0006c6c6, 0x0006bb72, 830 0x0006bf5a, 0x0006c342, 0x0006c72a, 0x0006bbd6, 0x0006bfbe, 0x0006c3a6, 0x0006c78e, 0x0006bc3a, 831 0x0006c022, 0x0006c40a, 0x0006c7f2, 0x00000006, 0x5f343469, 0x00000032, 0x00000002, 0x00000070, 832 0x00000002, 0x00000074, 0x0000002a, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000020, 833 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 0x00000070, 834 0x00000000, 0x00000000, 0x00000080, 0x0000009c, 0x00000000, 0x00000000, 0x000000b0, 0x000000cc, 835 0x00000000, 0x00000000, 0x000000e4, 0x00000100, 0x00000000, 0x00000000, 0x0000010c, 0x00000128, 836 0x00000000, 0x00000000, 0x00000138, 0x00000154, 0x00000000, 0x00000000, 0x00000168, 0x00000184, 837 0x00000000, 0x00000000, 0x0000019c, 0x000001b8, 0x00000000, 0x00000000, 0x000001c8, 0x000001e4, 838 0x00000000, 0x00000000, 0x000001fc, 0x00000218, 0x00000000, 0x00000000, 0x00000238, 0x00000254, 839 0x00000000, 0x00000000, 0x0000027c, 0x00000298, 0x00000000, 0x00000000, 0x000002ac, 0x000002c8, 840 0x00000000, 0x00000000, 0x000002e8, 0x00000304, 0x00000000, 0x00000000, 0x00000330, 0x0000034c, 841 0x00000000, 0x00000000, 0x00000384, 0x000003a0, 0x00000000, 0x00000000, 0x000003b8, 0x000003d4, 842 0x00000000, 0x00000000, 0x000003fc, 0x00000418, 0x00000000, 0x00000000, 0x00000450, 0x0000046c, 843 0x00000000, 0x00000000, 0x000004b4, 0x000004d0, 0x00000000, 0x00000000, 0x000004e0, 0x000004fc, 844 0x00000000, 0x00000000, 0x00000510, 0x0000052c, 0x00000000, 0x00000000, 0x00000548, 0x00000564, 845 0x00000000, 0x00000000, 0x00000588, 0x000005a4, 0x00000000, 0x00000000, 0x000005d0, 0x000005ec, 846 0x00000000, 0x00000000, 0x00000600, 0x0000061c, 0x00000000, 0x00000000, 0x00000638, 0x00000654, 847 0x00000000, 0x00000000, 0x00000678, 0x00000694, 0x00000000, 0x00000000, 0x000006c0, 0x000006dc, 848 0x00000000, 0x00000000, 0x000006f8, 0x00000714, 0x00000000, 0x00000000, 0x00000740, 0x0000075c, 849 0x00000000, 0x00000000, 0x00000798, 0x000007b4, 0x00000000, 0x00000000, 0x00000800, 0x0000081c, 850 0x00000000, 0x00000000, 0x00000840, 0x0000085c, 0x00000000, 0x00000000, 0x00000898, 0x000008b4, 851 0x00000000, 0x00000000, 0x00000908, 0x00000924, 0x00000000, 0x00000000, 0x00000990, 0x000009ac, 852 0x00000000, 0x00000000, 0x000009d8, 0x000009f4, 0x00000000, 0x00000000, 0x00000a40, 0x00000a5c, 853 0x00000000, 0x00000000, 0x00000ac8, 0x00000ae4, 0x00000000, 0x00000000, 0x00000b78, 0x00000000, 854 0x00000001, 0x00000b70, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 855 }; 856 857 struct test_effect_parameter_value_result test_effect_parameter_value_result_int[] = 858 { 859 {"i", {"i", NULL, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 0, 0, 0, 0, 4}, 10}, 860 {"i1", {"i1", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 1, 0, 0, 0, 0, 4}, 20}, 861 {"i2", {"i2", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 2, 0, 0, 0, 0, 8}, 30}, 862 {"i3", {"i3", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 3, 0, 0, 0, 0, 12}, 41}, 863 {"i4", {"i4", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 4, 0, 0, 0, 0, 16}, 53}, 864 {"i11", {"i11", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 1, 0, 0, 0, 0, 4}, 66}, 865 {"i12", {"i12", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 2, 0, 0, 0, 0, 8}, 76}, 866 {"i13", {"i13", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 3, 0, 0, 0, 0, 12}, 87}, 867 {"i14", {"i14", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 4, 0, 0, 0, 0, 16}, 99}, 868 {"i21", {"i21", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 1, 0, 0, 0, 0, 8}, 112}, 869 {"i22", {"i22", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 2, 0, 0, 0, 0, 16}, 123}, 870 {"i23", {"i23", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 0, 0, 0, 0, 24}, 136}, 871 {"i24", {"i24", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 4, 0, 0, 0, 0, 32}, 151}, 872 {"i31", {"i31", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 1, 0, 0, 0, 0, 12}, 168}, 873 {"i32", {"i32", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 2, 0, 0, 0, 0, 24}, 180}, 874 {"i33", {"i33", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 3, 0, 0, 0, 0, 36}, 195}, 875 {"i34", {"i34", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 4, 0, 0, 0, 0, 48}, 213}, 876 {"i41", {"i41", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 1, 0, 0, 0, 0, 16}, 234}, 877 {"i42", {"i42", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 2, 0, 0, 0, 0, 32}, 247}, 878 {"i43", {"i43", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 3, 0, 0, 0, 0, 48}, 264}, 879 {"i44", {"i44", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 4, 0, 0, 0, 0, 64}, 285}, 880 {"i_2", {"i_2", NULL, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 2, 0, 0, 0, 8}, 310}, 881 {"i1_2", {"i1_2", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 1, 2, 0, 0, 0, 8}, 321}, 882 {"i2_2", {"i2_2", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 2, 2, 0, 0, 0, 16}, 333}, 883 {"i3_2", {"i3_2", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 3, 2, 0, 0, 0, 24}, 347}, 884 {"i4_2", {"i4_2", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 4, 2, 0, 0, 0, 32}, 363}, 885 {"i11_2", {"i11_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 1, 2, 0, 0, 0, 8}, 381}, 886 {"i12_2", {"i12_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 2, 2, 0, 0, 0, 16}, 393}, 887 {"i13_2", {"i13_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 3, 2, 0, 0, 0, 24}, 407}, 888 {"i14_2", {"i14_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 4, 2, 0, 0, 0, 32}, 423}, 889 {"i21_2", {"i21_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 1, 2, 0, 0, 0, 16}, 441}, 890 {"i22_2", {"i22_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 2, 2, 0, 0, 0, 32}, 455}, 891 {"i23_2", {"i23_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 2, 0, 0, 0, 48}, 473}, 892 {"i24_2", {"i24_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 4, 2, 0, 0, 0, 64}, 495}, 893 {"i31_2", {"i31_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 1, 2, 0, 0, 0, 24}, 521}, 894 {"i32_2", {"i32_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 2, 2, 0, 0, 0, 48}, 537}, 895 {"i33_2", {"i33_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 3, 2, 0, 0, 0, 72}, 559}, 896 {"i34_2", {"i34_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 4, 2, 0, 0, 0, 96}, 587}, 897 {"i41_2", {"i41_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 1, 2, 0, 0, 0, 32}, 621}, 898 {"i42_2", {"i42_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 2, 2, 0, 0, 0, 64}, 639}, 899 {"i43_2", {"i43_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 3, 2, 0, 0, 0, 96}, 665}, 900 {"i44_2", {"i44_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 4, 2, 0, 0, 0, 128}, 699}, 901 }; 902 903 /* 904 * fxc.exe /Tfx_2_0 905 */ 906 #if 0 907 string s = "test"; 908 string s_2[2] = {"test1", "test2"}; 909 texture2D tex; 910 Vertexshader v; 911 Vertexshader v_2[2]; 912 Pixelshader p; 913 Pixelshader p_2[2]; 914 technique t { pass p { } } 915 #endif 916 static const DWORD test_effect_parameter_value_blob_object[] = 917 { 918 0xfeff0901, 0x00000100, 0x00000000, 0x00000004, 0x00000004, 0x0000001c, 0x00000000, 0x00000000, 919 0x00000001, 0x00000002, 0x00000073, 0x00000004, 0x00000004, 0x00000040, 0x00000000, 0x00000002, 920 0x00000002, 0x00000003, 0x00000004, 0x00325f73, 0x00000007, 0x00000004, 0x00000060, 0x00000000, 921 0x00000000, 0x00000004, 0x00000004, 0x00786574, 0x00000010, 0x00000004, 0x00000080, 0x00000000, 922 0x00000000, 0x00000005, 0x00000002, 0x00000076, 0x00000010, 0x00000004, 0x000000a4, 0x00000000, 923 0x00000002, 0x00000006, 0x00000007, 0x00000004, 0x00325f76, 0x0000000f, 0x00000004, 0x000000c4, 924 0x00000000, 0x00000000, 0x00000008, 0x00000002, 0x00000070, 0x0000000f, 0x00000004, 0x000000e8, 925 0x00000000, 0x00000002, 0x00000009, 0x0000000a, 0x00000004, 0x00325f70, 0x00000002, 0x00000070, 926 0x00000002, 0x00000074, 0x00000007, 0x00000001, 0x00000007, 0x0000000b, 0x00000004, 0x00000018, 927 0x00000000, 0x00000000, 0x00000024, 0x00000038, 0x00000000, 0x00000000, 0x00000048, 0x0000005c, 928 0x00000000, 0x00000000, 0x00000068, 0x0000007c, 0x00000000, 0x00000000, 0x00000088, 0x0000009c, 929 0x00000000, 0x00000000, 0x000000ac, 0x000000c0, 0x00000000, 0x00000000, 0x000000cc, 0x000000e0, 930 0x00000000, 0x00000000, 0x000000f8, 0x00000000, 0x00000001, 0x000000f0, 0x00000000, 0x00000000, 931 0x0000000a, 0x00000000, 0x00000009, 0x00000000, 0x0000000a, 0x00000000, 0x00000008, 0x00000000, 932 0x00000006, 0x00000000, 0x00000007, 0x00000000, 0x00000005, 0x00000000, 0x00000004, 0x00000000, 933 0x00000002, 0x00000006, 0x74736574, 0x00000031, 0x00000003, 0x00000006, 0x74736574, 0x00000032, 934 0x00000001, 0x00000005, 0x74736574, 0x00000000, 935 }; 936 937 struct test_effect_parameter_value_result test_effect_parameter_value_result_object[] = 938 { 939 {"s", {"s", NULL, D3DXPC_OBJECT, D3DXPT_STRING, 0, 0, 0, 0, 0, 0, sizeof(void *)}, 0}, 940 {"s_2", {"s_2", NULL, D3DXPC_OBJECT, D3DXPT_STRING, 0, 0, 2, 0, 0, 0, 2 * sizeof(void *)}, 0}, 941 {"tex", {"tex", NULL, D3DXPC_OBJECT, D3DXPT_TEXTURE2D, 0, 0, 0, 0, 0, 0, sizeof(void *)}, 0}, 942 {"v", {"v", NULL, D3DXPC_OBJECT, D3DXPT_VERTEXSHADER, 0, 0, 0, 0, 0, 0, sizeof(void *)}, 0}, 943 {"v_2", {"v_2", NULL, D3DXPC_OBJECT, D3DXPT_VERTEXSHADER, 0, 0, 2, 0, 0, 0, 2 * sizeof(void *)}, 0}, 944 {"p", {"p", NULL, D3DXPC_OBJECT, D3DXPT_PIXELSHADER, 0, 0, 0, 0, 0, 0, sizeof(void *)}, 0}, 945 {"p_2", {"p_2", NULL, D3DXPC_OBJECT, D3DXPT_PIXELSHADER, 0, 0, 2, 0, 0, 0, 2 * sizeof(void *)}, 0}, 946 }; 947 948 /* 949 * fxc.exe /Tfx_2_0 950 */ 951 #if 0 952 float3 f3 = {-3.1, 153.2, 283.3}; 953 float3 f3min = {-31.1, -31.2, -31.3}; 954 float3 f3max = {320.1, 320.2, 320.3}; 955 float4 f4 = {-4.1, 154.2, 284.3, 34.4}; 956 float4 f4min = {-41.1, -41.2, -41.3, -41.4}; 957 float4 f4max = {420.1, 42.20, 420.3, 420.4}; 958 technique t { pass p { } } 959 #endif 960 static const DWORD test_effect_parameter_value_blob_special[] = 961 { 962 0xfeff0901, 0x00000150, 0x00000000, 0x00000003, 0x00000001, 0x0000002c, 0x00000000, 0x00000000, 963 0x00000003, 0x00000001, 0xc0466666, 0x43193333, 0x438da666, 0x00000003, 0x00003366, 0x00000003, 964 0x00000001, 0x0000005c, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0xc1f8cccd, 0xc1f9999a, 965 0xc1fa6666, 0x00000006, 0x696d3366, 0x0000006e, 0x00000003, 0x00000001, 0x00000090, 0x00000000, 966 0x00000000, 0x00000003, 0x00000001, 0x43a00ccd, 0x43a0199a, 0x43a02666, 0x00000006, 0x616d3366, 967 0x00000078, 0x00000003, 0x00000001, 0x000000c8, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 968 0xc0833333, 0x431a3333, 0x438e2666, 0x4209999a, 0x00000003, 0x00003466, 0x00000003, 0x00000001, 969 0x000000fc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0xc2246666, 0xc224cccd, 0xc2253333, 970 0xc225999a, 0x00000006, 0x696d3466, 0x0000006e, 0x00000003, 0x00000001, 0x00000134, 0x00000000, 971 0x00000000, 0x00000004, 0x00000001, 0x43d20ccd, 0x4228cccd, 0x43d22666, 0x43d23333, 0x00000006, 972 0x616d3466, 0x00000078, 0x00000002, 0x00000070, 0x00000002, 0x00000074, 0x00000006, 0x00000001, 973 0x00000001, 0x00000001, 0x00000004, 0x00000020, 0x00000000, 0x00000000, 0x00000034, 0x00000050, 974 0x00000000, 0x00000000, 0x00000068, 0x00000084, 0x00000000, 0x00000000, 0x0000009c, 0x000000b8, 975 0x00000000, 0x00000000, 0x000000d0, 0x000000ec, 0x00000000, 0x00000000, 0x00000108, 0x00000124, 976 0x00000000, 0x00000000, 0x00000148, 0x00000000, 0x00000001, 0x00000140, 0x00000000, 0x00000000, 977 0x00000000, 0x00000000, 978 }; 979 980 struct test_effect_parameter_value_result test_effect_parameter_value_result_special[] = 981 { 982 {"f3", {"f3", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0, 12}, 10}, 983 {"f3min", {"f3min", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0, 12}, 22}, 984 {"f3max", {"f3max", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0, 12}, 35}, 985 {"f4", {"f4", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0, 16}, 48}, 986 {"f4min", {"f4min", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0, 16}, 61}, 987 {"f4max", {"f4max", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0, 16}, 75}, 988 }; 989 990 #define ADD_PARAMETER_VALUE(x) {\ 991 test_effect_parameter_value_blob_ ## x,\ 992 sizeof(test_effect_parameter_value_blob_ ## x),\ 993 test_effect_parameter_value_result_ ## x,\ 994 ARRAY_SIZE(test_effect_parameter_value_result_ ## x),\ 995 } 996 997 static const struct 998 { 999 const DWORD *blob; 1000 UINT blob_size; 1001 const struct test_effect_parameter_value_result *res; 1002 UINT res_count; 1003 } 1004 test_effect_parameter_value_data[] = 1005 { 1006 ADD_PARAMETER_VALUE(float), 1007 ADD_PARAMETER_VALUE(int), 1008 ADD_PARAMETER_VALUE(object), 1009 ADD_PARAMETER_VALUE(special), 1010 }; 1011 1012 #undef ADD_PARAMETER_VALUE 1013 1014 /* Multiple of 16 to cover complete matrices */ 1015 #define EFFECT_PARAMETER_VALUE_ARRAY_SIZE 48 1016 /* Constants for special INT/FLOAT conversation */ 1017 #define INT_FLOAT_MULTI 255.0f 1018 #define INT_FLOAT_MULTI_INVERSE (1/INT_FLOAT_MULTI) 1019 1020 static void test_effect_parameter_value_GetValue(const struct test_effect_parameter_value_result *res, 1021 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1022 { 1023 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1024 const char *res_full_name = res->full_name; 1025 DWORD value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1026 HRESULT hr; 1027 UINT l; 1028 1029 memset(value, 0xab, sizeof(value)); 1030 hr = effect->lpVtbl->GetValue(effect, parameter, value, res_desc->Bytes); 1031 if (res_desc->Class == D3DXPC_SCALAR 1032 || res_desc->Class == D3DXPC_VECTOR 1033 || res_desc->Class == D3DXPC_MATRIX_ROWS) 1034 { 1035 ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1036 1037 for (l = 0; l < res_desc->Bytes / sizeof(*value); ++l) 1038 { 1039 ok(value[l] == res_value[l], "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n", 1040 i, res_full_name, l, value[l], res_value[l]); 1041 } 1042 1043 for (l = res_desc->Bytes / sizeof(*value); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) 1044 { 1045 ok(value[l] == 0xabababab, "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n", 1046 i, res_full_name, l, value[l], 0xabababab); 1047 } 1048 } 1049 else if (res_desc->Class == D3DXPC_OBJECT) 1050 { 1051 switch (res_desc->Type) 1052 { 1053 case D3DXPT_PIXELSHADER: 1054 case D3DXPT_VERTEXSHADER: 1055 case D3DXPT_TEXTURE2D: 1056 ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1057 1058 for (l = 0; l < (res_desc->Elements ? res_desc->Elements : 1); ++l) 1059 { 1060 IUnknown *unk = *((IUnknown **)value + l); 1061 if (unk) IUnknown_Release(unk); 1062 } 1063 break; 1064 1065 case D3DXPT_STRING: 1066 ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1067 break; 1068 1069 default: 1070 ok(0, "Type is %u, this should not happen!\n", res_desc->Type); 1071 break; 1072 } 1073 } 1074 else 1075 { 1076 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n", 1077 i, res_full_name, hr, D3DERR_INVALIDCALL); 1078 1079 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) 1080 { 1081 ok(value[l] == 0xabababab, "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n", 1082 i, res_full_name, l, value[l], 0xabababab); 1083 } 1084 } 1085 } 1086 1087 static void test_effect_parameter_value_GetBool(const struct test_effect_parameter_value_result *res, 1088 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1089 { 1090 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1091 const char *res_full_name = res->full_name; 1092 BOOL bvalue = 0xabababab; 1093 HRESULT hr; 1094 1095 hr = effect->lpVtbl->GetBool(effect, parameter, &bvalue); 1096 if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1) 1097 { 1098 ok(hr == D3D_OK, "%u - %s: GetBool failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1099 ok(bvalue == get_bool(res_value), "%u - %s: GetBool bvalue failed, got %#x, expected %#x\n", 1100 i, res_full_name, bvalue, get_bool(res_value)); 1101 } 1102 else 1103 { 1104 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n", 1105 i, res_full_name, hr, D3DERR_INVALIDCALL); 1106 ok(bvalue == 0xabababab, "%u - %s: GetBool bvalue failed, got %#x, expected %#x\n", 1107 i, res_full_name, bvalue, 0xabababab); 1108 } 1109 } 1110 1111 static void test_effect_parameter_value_GetBoolArray(const struct test_effect_parameter_value_result *res, 1112 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1113 { 1114 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1115 const char *res_full_name = res->full_name; 1116 BOOL bavalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1117 HRESULT hr; 1118 UINT l, err = 0; 1119 1120 memset(bavalue, 0xab, sizeof(bavalue)); 1121 hr = effect->lpVtbl->GetBoolArray(effect, parameter, bavalue, res_desc->Bytes / sizeof(*bavalue)); 1122 if (res_desc->Class == D3DXPC_SCALAR 1123 || res_desc->Class == D3DXPC_VECTOR 1124 || res_desc->Class == D3DXPC_MATRIX_ROWS) 1125 { 1126 ok(hr == D3D_OK, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1127 1128 for (l = 0; l < res_desc->Bytes / sizeof(*bavalue); ++l) 1129 { 1130 if (bavalue[l] != get_bool(&res_value[l])) ++err; 1131 } 1132 1133 for (l = res_desc->Bytes / sizeof(*bavalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) 1134 { 1135 if (bavalue[l] != 0xabababab) ++err; 1136 } 1137 } 1138 else 1139 { 1140 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n", 1141 i, res_full_name, hr, D3DERR_INVALIDCALL); 1142 1143 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (bavalue[l] != 0xabababab) ++err; 1144 } 1145 ok(!err, "%u - %s: GetBoolArray failed with %u errors\n", i, res_full_name, err); 1146 } 1147 1148 static void test_effect_parameter_value_GetInt(const struct test_effect_parameter_value_result *res, 1149 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1150 { 1151 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1152 const char *res_full_name = res->full_name; 1153 INT ivalue = 0xabababab; 1154 HRESULT hr; 1155 1156 hr = effect->lpVtbl->GetInt(effect, parameter, &ivalue); 1157 if (!res_desc->Elements && res_desc->Columns == 1 && res_desc->Rows == 1) 1158 { 1159 ok(hr == D3D_OK, "%u - %s: GetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1160 ok(ivalue == get_int(res_desc->Type, res_value), "%u - %s: GetInt ivalue failed, got %i, expected %i\n", 1161 i, res_full_name, ivalue, get_int(res_desc->Type, res_value)); 1162 } 1163 else if(!res_desc->Elements && res_desc->Type == D3DXPT_FLOAT && 1164 ((res_desc->Class == D3DXPC_VECTOR && res_desc->Columns != 2) || 1165 (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Rows != 2 && res_desc->Columns == 1))) 1166 { 1167 INT tmp; 1168 1169 ok(hr == D3D_OK, "%u - %s: GetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1170 1171 tmp = (INT)(min(max(0.0f, *((FLOAT *)res_value + 2)), 1.0f) * INT_FLOAT_MULTI); 1172 tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 1)), 1.0f) * INT_FLOAT_MULTI)) << 8; 1173 tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 0)), 1.0f) * INT_FLOAT_MULTI)) << 16; 1174 if (res_desc->Columns * res_desc->Rows > 3) 1175 { 1176 tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 3)), 1.0f) * INT_FLOAT_MULTI)) << 24; 1177 } 1178 1179 ok(ivalue == tmp, "%u - %s: GetInt ivalue failed, got %x, expected %x\n", 1180 i, res_full_name, ivalue, tmp); 1181 } 1182 else 1183 { 1184 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n", 1185 i, res_full_name, hr, D3DERR_INVALIDCALL); 1186 ok(ivalue == 0xabababab, "%u - %s: GetInt ivalue failed, got %i, expected %i\n", 1187 i, res_full_name, ivalue, 0xabababab); 1188 } 1189 } 1190 1191 static void test_effect_parameter_value_GetIntArray(const struct test_effect_parameter_value_result *res, 1192 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1193 { 1194 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1195 const char *res_full_name = res->full_name; 1196 INT iavalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1197 HRESULT hr; 1198 UINT l, err = 0; 1199 1200 memset(iavalue, 0xab, sizeof(iavalue)); 1201 hr = effect->lpVtbl->GetIntArray(effect, parameter, iavalue, res_desc->Bytes / sizeof(*iavalue)); 1202 if (res_desc->Class == D3DXPC_SCALAR 1203 || res_desc->Class == D3DXPC_VECTOR 1204 || res_desc->Class == D3DXPC_MATRIX_ROWS) 1205 { 1206 ok(hr == D3D_OK, "%u - %s: GetIntArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1207 1208 for (l = 0; l < res_desc->Bytes / sizeof(*iavalue); ++l) 1209 { 1210 if (iavalue[l] != get_int(res_desc->Type, &res_value[l])) ++err; 1211 } 1212 1213 for (l = res_desc->Bytes / sizeof(*iavalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) 1214 { 1215 if (iavalue[l] != 0xabababab) ++err; 1216 } 1217 } 1218 else 1219 { 1220 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n", 1221 i, res_full_name, hr, D3DERR_INVALIDCALL); 1222 1223 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (iavalue[l] != 0xabababab) ++err; 1224 } 1225 ok(!err, "%u - %s: GetIntArray failed with %u errors\n", i, res_full_name, err); 1226 } 1227 1228 static void test_effect_parameter_value_GetFloat(const struct test_effect_parameter_value_result *res, 1229 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1230 { 1231 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1232 const char *res_full_name = res->full_name; 1233 HRESULT hr; 1234 DWORD cmp = 0xabababab; 1235 FLOAT fvalue = *(FLOAT *)&cmp; 1236 1237 hr = effect->lpVtbl->GetFloat(effect, parameter, &fvalue); 1238 if (!res_desc->Elements && res_desc->Columns == 1 && res_desc->Rows == 1) 1239 { 1240 ok(hr == D3D_OK, "%u - %s: GetFloat failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1241 ok(compare_float(fvalue, get_float(res_desc->Type, res_value), 512), "%u - %s: GetFloat fvalue failed, got %f, expected %f\n", 1242 i, res_full_name, fvalue, get_float(res_desc->Type, res_value)); 1243 } 1244 else 1245 { 1246 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n", 1247 i, res_full_name, hr, D3DERR_INVALIDCALL); 1248 ok(fvalue == *(FLOAT *)&cmp, "%u - %s: GetFloat fvalue failed, got %f, expected %f\n", 1249 i, res_full_name, fvalue, *(FLOAT *)&cmp); 1250 } 1251 } 1252 1253 static void test_effect_parameter_value_GetFloatArray(const struct test_effect_parameter_value_result *res, 1254 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1255 { 1256 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1257 const char *res_full_name = res->full_name; 1258 FLOAT favalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1259 HRESULT hr; 1260 UINT l, err = 0; 1261 DWORD cmp = 0xabababab; 1262 1263 memset(favalue, 0xab, sizeof(favalue)); 1264 hr = effect->lpVtbl->GetFloatArray(effect, parameter, favalue, res_desc->Bytes / sizeof(*favalue)); 1265 if (res_desc->Class == D3DXPC_SCALAR 1266 || res_desc->Class == D3DXPC_VECTOR 1267 || res_desc->Class == D3DXPC_MATRIX_ROWS) 1268 { 1269 ok(hr == D3D_OK, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1270 1271 for (l = 0; l < res_desc->Bytes / sizeof(*favalue); ++l) 1272 { 1273 if (!compare_float(favalue[l], get_float(res_desc->Type, &res_value[l]), 512)) ++err; 1274 } 1275 1276 for (l = res_desc->Bytes / sizeof(*favalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) 1277 { 1278 if (favalue[l] != *(FLOAT *)&cmp) ++err; 1279 } 1280 } 1281 else 1282 { 1283 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n", 1284 i, res_full_name, hr, D3DERR_INVALIDCALL); 1285 1286 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (favalue[l] != *(FLOAT *)&cmp) ++err; 1287 } 1288 ok(!err, "%u - %s: GetFloatArray failed with %u errors\n", i, res_full_name, err); 1289 } 1290 1291 static void test_effect_parameter_value_GetVector(const struct test_effect_parameter_value_result *res, 1292 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1293 { 1294 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1295 const char *res_full_name = res->full_name; 1296 HRESULT hr; 1297 DWORD cmp = 0xabababab; 1298 FLOAT fvalue[4]; 1299 UINT l, err = 0; 1300 1301 memset(fvalue, 0xab, sizeof(fvalue)); 1302 hr = effect->lpVtbl->GetVector(effect, parameter, (D3DXVECTOR4 *)&fvalue); 1303 if (!res_desc->Elements && 1304 (res_desc->Class == D3DXPC_SCALAR || res_desc->Class == D3DXPC_VECTOR) && 1305 res_desc->Type == D3DXPT_INT && res_desc->Bytes == 4) 1306 { 1307 DWORD tmp; 1308 1309 ok(hr == D3D_OK, "%u - %s: GetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1310 1311 tmp = (DWORD)(*(fvalue + 2) * INT_FLOAT_MULTI); 1312 tmp += ((DWORD)(*(fvalue + 1) * INT_FLOAT_MULTI)) << 8; 1313 tmp += ((DWORD)(*fvalue * INT_FLOAT_MULTI)) << 16; 1314 tmp += ((DWORD)(*(fvalue + 3) * INT_FLOAT_MULTI)) << 24; 1315 1316 if (*res_value != tmp) ++err; 1317 } 1318 else if (!res_desc->Elements && (res_desc->Class == D3DXPC_SCALAR || res_desc->Class == D3DXPC_VECTOR)) 1319 { 1320 ok(hr == D3D_OK, "%u - %s: GetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1321 1322 for (l = 0; l < res_desc->Columns; ++l) 1323 { 1324 if (!compare_float(fvalue[l], get_float(res_desc->Type, &res_value[l]), 512)) ++err; 1325 } 1326 1327 for (l = res_desc->Columns; l < 4; ++l) if (fvalue[l] != 0.0f) ++err; 1328 } 1329 else 1330 { 1331 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n", 1332 i, res_full_name, hr, D3DERR_INVALIDCALL); 1333 1334 for (l = 0; l < 4; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1335 } 1336 ok(!err, "%u - %s: GetVector failed with %u errors\n", i, res_full_name, err); 1337 } 1338 1339 static void test_effect_parameter_value_GetVectorArray(const struct test_effect_parameter_value_result *res, 1340 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1341 { 1342 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1343 const char *res_full_name = res->full_name; 1344 HRESULT hr; 1345 DWORD cmp = 0xabababab; 1346 FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1347 UINT l, k, element, err = 0; 1348 1349 for (element = 0; element <= res_desc->Elements + 1; ++element) 1350 { 1351 memset(fvalue, 0xab, sizeof(fvalue)); 1352 hr = effect->lpVtbl->GetVectorArray(effect, parameter, (D3DXVECTOR4 *)&fvalue, element); 1353 if (!element) 1354 { 1355 ok(hr == D3D_OK, "%u - %s[%u]: GetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK); 1356 1357 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1358 } 1359 else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_VECTOR) 1360 { 1361 ok(hr == D3D_OK, "%u - %s[%u]: GetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK); 1362 1363 for (k = 0; k < element; ++k) 1364 { 1365 for (l = 0; l < res_desc->Columns; ++l) 1366 { 1367 if (!compare_float(fvalue[l + k * 4], get_float(res_desc->Type, 1368 &res_value[l + k * res_desc->Columns]), 512)) 1369 ++err; 1370 } 1371 1372 for (l = res_desc->Columns; l < 4; ++l) if (fvalue[l + k * 4] != 0.0f) ++err; 1373 } 1374 1375 for (l = element * 4; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1376 } 1377 else 1378 { 1379 ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetVectorArray failed, got %#x, expected %#x\n", 1380 i, res_full_name, element, hr, D3DERR_INVALIDCALL); 1381 1382 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1383 } 1384 ok(!err, "%u - %s[%u]: GetVectorArray failed with %u errors\n", i, res_full_name, element, err); 1385 } 1386 } 1387 1388 static void test_effect_parameter_value_GetMatrix(const struct test_effect_parameter_value_result *res, 1389 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1390 { 1391 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1392 const char *res_full_name = res->full_name; 1393 HRESULT hr; 1394 union 1395 { 1396 DWORD d; 1397 float f; 1398 } cmp; 1399 float fvalue[16]; 1400 UINT l, k, err = 0; 1401 1402 cmp.d = 0xabababab; 1403 memset(fvalue, 0xab, sizeof(fvalue)); 1404 hr = effect->lpVtbl->GetMatrix(effect, parameter, (D3DXMATRIX *)&fvalue); 1405 if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS) 1406 { 1407 ok(hr == D3D_OK, "%u - %s: GetMatrix failed, got %#x, expected %#x.\n", i, res_full_name, hr, D3D_OK); 1408 1409 for (k = 0; k < 4; ++k) 1410 { 1411 for (l = 0; l < 4; ++l) 1412 { 1413 if (k < res_desc->Columns && l < res_desc->Rows) 1414 { 1415 if (!compare_float(fvalue[l * 4 + k], get_float(res_desc->Type, 1416 &res_value[l * res_desc->Columns + k]), 512)) 1417 ++err; 1418 } 1419 else if (fvalue[l * 4 + k] != 0.0f) ++err; 1420 } 1421 } 1422 } 1423 else 1424 { 1425 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrix failed, got %#x, expected %#x.\n", 1426 i, res_full_name, hr, D3DERR_INVALIDCALL); 1427 1428 for (l = 0; l < ARRAY_SIZE(fvalue); ++l) 1429 if (fvalue[l] != cmp.f) 1430 ++err; 1431 } 1432 ok(!err, "%u - %s: GetMatrix failed with %u errors.\n", i, res_full_name, err); 1433 } 1434 1435 static void test_effect_parameter_value_GetMatrixArray(const struct test_effect_parameter_value_result *res, 1436 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1437 { 1438 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1439 const char *res_full_name = res->full_name; 1440 HRESULT hr; 1441 DWORD cmp = 0xabababab; 1442 FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1443 UINT l, k, m, element, err = 0; 1444 1445 for (element = 0; element <= res_desc->Elements + 1; ++element) 1446 { 1447 memset(fvalue, 0xab, sizeof(fvalue)); 1448 hr = effect->lpVtbl->GetMatrixArray(effect, parameter, (D3DXMATRIX *)&fvalue, element); 1449 if (!element) 1450 { 1451 ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK); 1452 1453 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1454 } 1455 else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS) 1456 { 1457 ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK); 1458 1459 for (m = 0; m < element; ++m) 1460 { 1461 for (k = 0; k < 4; ++k) 1462 { 1463 for (l = 0; l < 4; ++l) 1464 { 1465 if (k < res_desc->Columns && l < res_desc->Rows) 1466 { 1467 if (!compare_float(fvalue[m * 16 + l * 4 + k], get_float(res_desc->Type, 1468 &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512)) 1469 ++err; 1470 } 1471 else if (fvalue[m * 16 + l * 4 + k] != 0.0f) ++err; 1472 } 1473 } 1474 } 1475 1476 for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1477 } 1478 else 1479 { 1480 ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixArray failed, got %#x, expected %#x\n", 1481 i, res_full_name, element, hr, D3DERR_INVALIDCALL); 1482 1483 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1484 } 1485 ok(!err, "%u - %s[%u]: GetMatrixArray failed with %u errors\n", i, res_full_name, element, err); 1486 } 1487 } 1488 1489 static void test_effect_parameter_value_GetMatrixPointerArray(const struct test_effect_parameter_value_result *res, 1490 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1491 { 1492 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1493 const char *res_full_name = res->full_name; 1494 HRESULT hr; 1495 DWORD cmp = 0xabababab; 1496 FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1497 D3DXMATRIX *matrix_pointer_array[sizeof(fvalue)/sizeof(D3DXMATRIX)]; 1498 UINT l, k, m, element, err = 0; 1499 1500 for (element = 0; element <= res_desc->Elements + 1; ++element) 1501 { 1502 memset(fvalue, 0xab, sizeof(fvalue)); 1503 for (l = 0; l < element; ++l) 1504 { 1505 matrix_pointer_array[l] = (D3DXMATRIX *)&fvalue[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)]; 1506 } 1507 hr = effect->lpVtbl->GetMatrixPointerArray(effect, parameter, matrix_pointer_array, element); 1508 if (!element) 1509 { 1510 ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixPointerArray failed, got %#x, expected %#x\n", 1511 i, res_full_name, element, hr, D3D_OK); 1512 1513 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1514 } 1515 else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS) 1516 { 1517 ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixPointerArray failed, got %#x, expected %#x\n", 1518 i, res_full_name, element, hr, D3D_OK); 1519 1520 for (m = 0; m < element; ++m) 1521 { 1522 for (k = 0; k < 4; ++k) 1523 { 1524 for (l = 0; l < 4; ++l) 1525 { 1526 if (k < res_desc->Columns && l < res_desc->Rows) 1527 { 1528 if (!compare_float(fvalue[m * 16 + l * 4 + k], get_float(res_desc->Type, 1529 &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512)) 1530 ++err; 1531 } 1532 else if (fvalue[m * 16 + l * 4 + k] != 0.0f) ++err; 1533 } 1534 } 1535 } 1536 1537 for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1538 } 1539 else 1540 { 1541 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1542 1543 ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixPointerArray failed, got %#x, expected %#x\n", 1544 i, res_full_name, element, hr, D3DERR_INVALIDCALL); 1545 } 1546 ok(!err, "%u - %s[%u]: GetMatrixPointerArray failed with %u errors\n", i, res_full_name, element, err); 1547 } 1548 } 1549 1550 static void test_effect_parameter_value_GetMatrixTranspose(const struct test_effect_parameter_value_result *res, 1551 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1552 { 1553 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1554 const char *res_full_name = res->full_name; 1555 HRESULT hr; 1556 union 1557 { 1558 DWORD d; 1559 float f; 1560 } cmp; 1561 float fvalue[16]; 1562 UINT l, k, err = 0; 1563 1564 cmp.d = 0xabababab; 1565 memset(fvalue, 0xab, sizeof(fvalue)); 1566 hr = effect->lpVtbl->GetMatrixTranspose(effect, parameter, (D3DXMATRIX *)&fvalue); 1567 if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS) 1568 { 1569 ok(hr == D3D_OK, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x.\n", i, res_full_name, hr, D3D_OK); 1570 1571 for (k = 0; k < 4; ++k) 1572 { 1573 for (l = 0; l < 4; ++l) 1574 { 1575 if (k < res_desc->Columns && l < res_desc->Rows) 1576 { 1577 if (!compare_float(fvalue[l + k * 4], get_float(res_desc->Type, 1578 &res_value[l * res_desc->Columns + k]), 512)) 1579 ++err; 1580 } 1581 else if (fvalue[l + k * 4] != 0.0f) ++err; 1582 } 1583 } 1584 } 1585 else if (!res_desc->Elements && (res_desc->Class == D3DXPC_VECTOR || res_desc->Class == D3DXPC_SCALAR)) 1586 { 1587 ok(hr == D3D_OK, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x.\n", i, res_full_name, hr, D3D_OK); 1588 1589 for (k = 0; k < 4; ++k) 1590 { 1591 for (l = 0; l < 4; ++l) 1592 { 1593 if (k < res_desc->Columns && l < res_desc->Rows) 1594 { 1595 if (!compare_float(fvalue[l * 4 + k], get_float(res_desc->Type, 1596 &res_value[l * res_desc->Columns + k]), 512)) 1597 ++err; 1598 } 1599 else if (fvalue[l * 4 + k] != 0.0f) ++err; 1600 } 1601 } 1602 } 1603 else 1604 { 1605 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x.\n", 1606 i, res_full_name, hr, D3DERR_INVALIDCALL); 1607 1608 for (l = 0; l < ARRAY_SIZE(fvalue); ++l) 1609 if (fvalue[l] != cmp.f) 1610 ++err; 1611 } 1612 ok(!err, "%u - %s: GetMatrixTranspose failed with %u errors.\n", i, res_full_name, err); 1613 } 1614 1615 static void test_effect_parameter_value_GetMatrixTransposeArray(const struct test_effect_parameter_value_result *res, 1616 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1617 { 1618 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1619 const char *res_full_name = res->full_name; 1620 HRESULT hr; 1621 DWORD cmp = 0xabababab; 1622 FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1623 UINT l, k, m, element, err = 0; 1624 1625 for (element = 0; element <= res_desc->Elements + 1; ++element) 1626 { 1627 memset(fvalue, 0xab, sizeof(fvalue)); 1628 hr = effect->lpVtbl->GetMatrixTransposeArray(effect, parameter, (D3DXMATRIX *)&fvalue, element); 1629 if (!element) 1630 { 1631 ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposeArray failed, got %#x, expected %#x\n", 1632 i, res_full_name, element, hr, D3D_OK); 1633 1634 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1635 } 1636 else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS) 1637 { 1638 ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposeArray failed, got %#x, expected %#x\n", 1639 i, res_full_name, element, hr, D3D_OK); 1640 1641 for (m = 0; m < element; ++m) 1642 { 1643 for (k = 0; k < 4; ++k) 1644 { 1645 for (l = 0; l < 4; ++l) 1646 { 1647 if (k < res_desc->Columns && l < res_desc->Rows) 1648 { 1649 if (!compare_float(fvalue[m * 16 + l + k * 4], get_float(res_desc->Type, 1650 &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512)) 1651 ++err; 1652 } 1653 else if (fvalue[m * 16 + l + k * 4] != 0.0f) ++err; 1654 } 1655 } 1656 } 1657 1658 for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1659 } 1660 else 1661 { 1662 ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixTransposeArray failed, got %#x, expected %#x\n", 1663 i, res_full_name, element, hr, D3DERR_INVALIDCALL); 1664 1665 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1666 } 1667 ok(!err, "%u - %s[%u]: GetMatrixTransposeArray failed with %u errors\n", i, res_full_name, element, err); 1668 } 1669 } 1670 1671 static void test_effect_parameter_value_GetMatrixTransposePointerArray(const struct test_effect_parameter_value_result *res, 1672 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1673 { 1674 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1675 const char *res_full_name = res->full_name; 1676 HRESULT hr; 1677 DWORD cmp = 0xabababab; 1678 FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1679 D3DXMATRIX *matrix_pointer_array[sizeof(fvalue)/sizeof(D3DXMATRIX)]; 1680 UINT l, k, m, element, err = 0; 1681 1682 for (element = 0; element <= res_desc->Elements + 1; ++element) 1683 { 1684 memset(fvalue, 0xab, sizeof(fvalue)); 1685 for (l = 0; l < element; ++l) 1686 { 1687 matrix_pointer_array[l] = (D3DXMATRIX *)&fvalue[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)]; 1688 } 1689 hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, parameter, matrix_pointer_array, element); 1690 if (!element) 1691 { 1692 ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n", 1693 i, res_full_name, element, hr, D3D_OK); 1694 1695 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1696 } 1697 else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS) 1698 { 1699 ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n", 1700 i, res_full_name, element, hr, D3D_OK); 1701 1702 for (m = 0; m < element; ++m) 1703 { 1704 for (k = 0; k < 4; ++k) 1705 { 1706 for (l = 0; l < 4; ++l) 1707 { 1708 if (k < res_desc->Columns && l < res_desc->Rows) 1709 { 1710 if (!compare_float(fvalue[m * 16 + l + k * 4], get_float(res_desc->Type, 1711 &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512)) 1712 ++err; 1713 } 1714 else if (fvalue[m * 16 + l + k * 4] != 0.0f) ++err; 1715 } 1716 } 1717 } 1718 1719 for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1720 } 1721 else 1722 { 1723 ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n", 1724 i, res_full_name, element, hr, D3DERR_INVALIDCALL); 1725 1726 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err; 1727 } 1728 ok(!err, "%u - %s[%u]: GetMatrixTransposePointerArray failed with %u errors\n", i, res_full_name, element, err); 1729 } 1730 } 1731 1732 static void test_effect_parameter_value_GetTestGroup(const struct test_effect_parameter_value_result *res, 1733 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1734 { 1735 test_effect_parameter_value_GetValue(res, effect, res_value, parameter, i); 1736 test_effect_parameter_value_GetBool(res, effect, res_value, parameter, i); 1737 test_effect_parameter_value_GetBoolArray(res, effect, res_value, parameter, i); 1738 test_effect_parameter_value_GetInt(res, effect, res_value, parameter, i); 1739 test_effect_parameter_value_GetIntArray(res, effect, res_value, parameter, i); 1740 test_effect_parameter_value_GetFloat(res, effect, res_value, parameter, i); 1741 test_effect_parameter_value_GetFloatArray(res, effect, res_value, parameter, i); 1742 test_effect_parameter_value_GetVector(res, effect, res_value, parameter, i); 1743 test_effect_parameter_value_GetVectorArray(res, effect, res_value, parameter, i); 1744 test_effect_parameter_value_GetMatrix(res, effect, res_value, parameter, i); 1745 test_effect_parameter_value_GetMatrixArray(res, effect, res_value, parameter, i); 1746 test_effect_parameter_value_GetMatrixPointerArray(res, effect, res_value, parameter, i); 1747 test_effect_parameter_value_GetMatrixTranspose(res, effect, res_value, parameter, i); 1748 test_effect_parameter_value_GetMatrixTransposeArray(res, effect, res_value, parameter, i); 1749 test_effect_parameter_value_GetMatrixTransposePointerArray(res, effect, res_value, parameter, i); 1750 } 1751 1752 static void test_effect_parameter_value_ResetValue(const struct test_effect_parameter_value_result *res, 1753 ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i) 1754 { 1755 const D3DXPARAMETER_DESC *res_desc = &res->desc; 1756 const char *res_full_name = res->full_name; 1757 HRESULT hr; 1758 1759 if (res_desc->Class == D3DXPC_SCALAR 1760 || res_desc->Class == D3DXPC_VECTOR 1761 || res_desc->Class == D3DXPC_MATRIX_ROWS) 1762 { 1763 hr = effect->lpVtbl->SetValue(effect, parameter, res_value, res_desc->Bytes); 1764 ok(hr == D3D_OK, "%u - %s: SetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1765 } 1766 else 1767 { 1768 /* nothing to do */ 1769 switch (res_desc->Type) 1770 { 1771 case D3DXPT_PIXELSHADER: 1772 case D3DXPT_VERTEXSHADER: 1773 case D3DXPT_TEXTURE2D: 1774 case D3DXPT_STRING: 1775 break; 1776 1777 default: 1778 ok(0, "Type is %u, this should not happen!\n", res_desc->Type); 1779 break; 1780 } 1781 } 1782 } 1783 1784 static void test_effect_parameter_value(IDirect3DDevice9 *device) 1785 { 1786 unsigned int effect_count = ARRAY_SIZE(test_effect_parameter_value_data), i; 1787 1788 for (i = 0; i < effect_count; ++i) 1789 { 1790 const struct test_effect_parameter_value_result *res = test_effect_parameter_value_data[i].res; 1791 UINT res_count = test_effect_parameter_value_data[i].res_count; 1792 const DWORD *blob = test_effect_parameter_value_data[i].blob; 1793 UINT blob_size = test_effect_parameter_value_data[i].blob_size; 1794 HRESULT hr; 1795 ID3DXEffect *effect; 1796 D3DXEFFECT_DESC edesc; 1797 ULONG count; 1798 UINT k; 1799 1800 hr = D3DXCreateEffect(device, blob, blob_size, NULL, NULL, 0, NULL, &effect, NULL); 1801 ok(hr == D3D_OK, "%u: D3DXCreateEffect failed, got %#x, expected %#x\n", i, hr, D3D_OK); 1802 1803 hr = effect->lpVtbl->GetDesc(effect, &edesc); 1804 ok(hr == D3D_OK, "%u: GetDesc failed, got %#x, expected %#x\n", i, hr, D3D_OK); 1805 ok(edesc.Parameters == res_count, "%u: Parameters failed, got %u, expected %u\n", 1806 i, edesc.Parameters, res_count); 1807 1808 for (k = 0; k < res_count; ++k) 1809 { 1810 const D3DXPARAMETER_DESC *res_desc = &res[k].desc; 1811 const char *res_full_name = res[k].full_name; 1812 UINT res_value_offset = res[k].value_offset; 1813 D3DXHANDLE parameter; 1814 D3DXPARAMETER_DESC pdesc; 1815 BOOL bvalue = TRUE; 1816 INT ivalue = 42; 1817 FLOAT fvalue = 2.71828f; 1818 DWORD input_value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1819 DWORD expected_value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE]; 1820 UINT l, n, m, element; 1821 const D3DXMATRIX *matrix_pointer_array[sizeof(input_value)/sizeof(D3DXMATRIX)]; 1822 1823 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, res_full_name); 1824 ok(parameter != NULL, "%u - %s: GetParameterByName failed\n", i, res_full_name); 1825 1826 hr = effect->lpVtbl->GetParameterDesc(effect, parameter, &pdesc); 1827 ok(hr == D3D_OK, "%u - %s: GetParameterDesc failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 1828 1829 ok(res_desc->Name ? !strcmp(pdesc.Name, res_desc->Name) : !pdesc.Name, 1830 "%u - %s: GetParameterDesc Name failed, got \"%s\", expected \"%s\"\n", 1831 i, res_full_name, pdesc.Name, res_desc->Name); 1832 ok(res_desc->Semantic ? !strcmp(pdesc.Semantic, res_desc->Semantic) : !pdesc.Semantic, 1833 "%u - %s: GetParameterDesc Semantic failed, got \"%s\", expected \"%s\"\n", 1834 i, res_full_name, pdesc.Semantic, res_desc->Semantic); 1835 ok(res_desc->Class == pdesc.Class, "%u - %s: GetParameterDesc Class failed, got %#x, expected %#x\n", 1836 i, res_full_name, pdesc.Class, res_desc->Class); 1837 ok(res_desc->Type == pdesc.Type, "%u - %s: GetParameterDesc Type failed, got %#x, expected %#x\n", 1838 i, res_full_name, pdesc.Type, res_desc->Type); 1839 ok(res_desc->Rows == pdesc.Rows, "%u - %s: GetParameterDesc Rows failed, got %u, expected %u\n", 1840 i, res_full_name, pdesc.Rows, res_desc->Rows); 1841 ok(res_desc->Columns == pdesc.Columns, "%u - %s: GetParameterDesc Columns failed, got %u, expected %u\n", 1842 i, res_full_name, pdesc.Columns, res_desc->Columns); 1843 ok(res_desc->Elements == pdesc.Elements, "%u - %s: GetParameterDesc Elements failed, got %u, expected %u\n", 1844 i, res_full_name, pdesc.Elements, res_desc->Elements); 1845 ok(res_desc->Annotations == pdesc.Annotations, "%u - %s: GetParameterDesc Annotations failed, got %u, expected %u\n", 1846 i, res_full_name, pdesc.Annotations, res_desc->Annotations); 1847 ok(res_desc->StructMembers == pdesc.StructMembers, "%u - %s: GetParameterDesc StructMembers failed, got %u, expected %u\n", 1848 i, res_full_name, pdesc.StructMembers, res_desc->StructMembers); 1849 ok(res_desc->Flags == pdesc.Flags, "%u - %s: GetParameterDesc Flags failed, got %u, expected %u\n", 1850 i, res_full_name, pdesc.Flags, res_desc->Flags); 1851 ok(res_desc->Bytes == pdesc.Bytes, "%u - %s: GetParameterDesc Bytes, got %u, expected %u\n", 1852 i, res_full_name, pdesc.Bytes, res_desc->Bytes); 1853 1854 /* check size */ 1855 ok(EFFECT_PARAMETER_VALUE_ARRAY_SIZE >= res_desc->Bytes / 4 + 1856 (res_desc->Elements ? res_desc->Bytes / 4 / res_desc->Elements : 0), 1857 "%u - %s: Warning: Array size too small\n", i, res_full_name); 1858 1859 test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i); 1860 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 1861 test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i); 1862 1863 /* 1864 * check invalid calls 1865 * These will crash: 1866 * effect->lpVtbl->SetBoolArray(effect, parameter, NULL, res_desc->Bytes / sizeof(BOOL)); 1867 * effect->lpVtbl->SetIntArray(effect, parameter, NULL, res_desc->Bytes / sizeof(INT)); 1868 * effect->lpVtbl->SetFloatArray(effect, parameter, NULL, res_desc->Bytes / sizeof(FLOAT)); 1869 * effect->lpVtbl->SetVector(effect, parameter, NULL); 1870 * effect->lpVtbl->SetVectorArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1); 1871 * effect->lpVtbl->SetMatrix(effect, parameter, NULL); 1872 * effect->lpVtbl->GetMatrix(effect, parameter, NULL); 1873 * effect->lpVtbl->SetMatrixArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1); 1874 * effect->lpVtbl->SetMatrixPointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1); 1875 * effect->lpVtbl->SetMatrixTranspose(effect, parameter, NULL); 1876 * effect->lpVtbl->SetMatrixTransposeArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1); 1877 * effect->lpVtbl->SetMatrixTransposePointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1); 1878 * effect->lpVtbl->GetValue(effect, parameter, NULL, res_desc->Bytes); 1879 * effect->lpVtbl->SetValue(effect, parameter, NULL, res_desc->Bytes); 1880 */ 1881 hr = effect->lpVtbl->SetBool(effect, NULL, bvalue); 1882 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBool failed, got %#x, expected %#x\n", 1883 i, res_full_name, hr, D3DERR_INVALIDCALL); 1884 1885 hr = effect->lpVtbl->GetBool(effect, NULL, &bvalue); 1886 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n", 1887 i, res_full_name, hr, D3DERR_INVALIDCALL); 1888 1889 hr = effect->lpVtbl->GetBool(effect, parameter, NULL); 1890 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n", 1891 i, res_full_name, hr, D3DERR_INVALIDCALL); 1892 1893 hr = effect->lpVtbl->SetBoolArray(effect, NULL, (BOOL *)input_value, res_desc->Bytes / sizeof(BOOL)); 1894 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n", 1895 i, res_full_name, hr, D3DERR_INVALIDCALL); 1896 1897 hr = effect->lpVtbl->GetBoolArray(effect, NULL, (BOOL *)input_value, res_desc->Bytes / sizeof(BOOL)); 1898 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n", 1899 i, res_full_name, hr, D3DERR_INVALIDCALL); 1900 1901 hr = effect->lpVtbl->GetBoolArray(effect, parameter, NULL, res_desc->Bytes / sizeof(BOOL)); 1902 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n", 1903 i, res_full_name, hr, D3DERR_INVALIDCALL); 1904 1905 hr = effect->lpVtbl->SetInt(effect, NULL, ivalue); 1906 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetInt failed, got %#x, expected %#x\n", 1907 i, res_full_name, hr, D3DERR_INVALIDCALL); 1908 1909 hr = effect->lpVtbl->GetInt(effect, NULL, &ivalue); 1910 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n", 1911 i, res_full_name, hr, D3DERR_INVALIDCALL); 1912 1913 hr = effect->lpVtbl->GetInt(effect, parameter, NULL); 1914 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n", 1915 i, res_full_name, hr, D3DERR_INVALIDCALL); 1916 1917 hr = effect->lpVtbl->SetIntArray(effect, NULL, (INT *)input_value, res_desc->Bytes / sizeof(INT)); 1918 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetIntArray failed, got %#x, expected %#x\n", 1919 i, res_full_name, hr, D3DERR_INVALIDCALL); 1920 1921 hr = effect->lpVtbl->GetIntArray(effect, NULL, (INT *)input_value, res_desc->Bytes / sizeof(INT)); 1922 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n", 1923 i, res_full_name, hr, D3DERR_INVALIDCALL); 1924 1925 hr = effect->lpVtbl->GetIntArray(effect, parameter, NULL, res_desc->Bytes / sizeof(INT)); 1926 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n", 1927 i, res_full_name, hr, D3DERR_INVALIDCALL); 1928 1929 hr = effect->lpVtbl->SetFloat(effect, NULL, fvalue); 1930 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloat failed, got %#x, expected %#x\n", 1931 i, res_full_name, hr, D3DERR_INVALIDCALL); 1932 1933 hr = effect->lpVtbl->GetFloat(effect, NULL, &fvalue); 1934 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n", 1935 i, res_full_name, hr, D3DERR_INVALIDCALL); 1936 1937 hr = effect->lpVtbl->GetFloat(effect, parameter, NULL); 1938 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n", 1939 i, res_full_name, hr, D3DERR_INVALIDCALL); 1940 1941 hr = effect->lpVtbl->SetFloatArray(effect, NULL, (FLOAT *)input_value, res_desc->Bytes / sizeof(FLOAT)); 1942 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n", 1943 i, res_full_name, hr, D3DERR_INVALIDCALL); 1944 1945 hr = effect->lpVtbl->GetFloatArray(effect, NULL, (FLOAT *)input_value, res_desc->Bytes / sizeof(FLOAT)); 1946 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n", 1947 i, res_full_name, hr, D3DERR_INVALIDCALL); 1948 1949 hr = effect->lpVtbl->GetFloatArray(effect, parameter, NULL, res_desc->Bytes / sizeof(FLOAT)); 1950 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n", 1951 i, res_full_name, hr, D3DERR_INVALIDCALL); 1952 1953 hr = effect->lpVtbl->SetVector(effect, NULL, (D3DXVECTOR4 *)input_value); 1954 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVector failed, got %#x, expected %#x\n", 1955 i, res_full_name, hr, D3DERR_INVALIDCALL); 1956 1957 hr = effect->lpVtbl->GetVector(effect, NULL, (D3DXVECTOR4 *)input_value); 1958 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n", 1959 i, res_full_name, hr, D3DERR_INVALIDCALL); 1960 1961 hr = effect->lpVtbl->GetVector(effect, parameter, NULL); 1962 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n", 1963 i, res_full_name, hr, D3DERR_INVALIDCALL); 1964 1965 hr = effect->lpVtbl->SetVectorArray(effect, NULL, (D3DXVECTOR4 *)input_value, res_desc->Elements ? res_desc->Elements : 1); 1966 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n", 1967 i, res_full_name, hr, D3DERR_INVALIDCALL); 1968 1969 hr = effect->lpVtbl->GetVectorArray(effect, NULL, (D3DXVECTOR4 *)input_value, res_desc->Elements ? res_desc->Elements : 1); 1970 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n", 1971 i, res_full_name, hr, D3DERR_INVALIDCALL); 1972 1973 hr = effect->lpVtbl->GetVectorArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1); 1974 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n", 1975 i, res_full_name, hr, D3DERR_INVALIDCALL); 1976 1977 hr = effect->lpVtbl->SetMatrix(effect, NULL, (D3DXMATRIX *)input_value); 1978 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrix failed, got %#x, expected %#x\n", 1979 i, res_full_name, hr, D3DERR_INVALIDCALL); 1980 1981 hr = effect->lpVtbl->GetMatrix(effect, NULL, (D3DXMATRIX *)input_value); 1982 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrix failed, got %#x, expected %#x\n", 1983 i, res_full_name, hr, D3DERR_INVALIDCALL); 1984 1985 hr = effect->lpVtbl->SetMatrixArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1); 1986 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n", 1987 i, res_full_name, hr, D3DERR_INVALIDCALL); 1988 1989 hr = effect->lpVtbl->GetMatrixArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1); 1990 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n", 1991 i, res_full_name, hr, D3DERR_INVALIDCALL); 1992 1993 hr = effect->lpVtbl->GetMatrixArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1); 1994 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n", 1995 i, res_full_name, hr, D3DERR_INVALIDCALL); 1996 1997 hr = effect->lpVtbl->SetMatrixPointerArray(effect, NULL, matrix_pointer_array, res_desc->Elements ? res_desc->Elements : 1); 1998 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n", 1999 i, res_full_name, hr, D3DERR_INVALIDCALL); 2000 2001 hr = effect->lpVtbl->SetMatrixPointerArray(effect, NULL, matrix_pointer_array, 0); 2002 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n", 2003 i, res_full_name, hr, D3DERR_INVALIDCALL); 2004 2005 hr = effect->lpVtbl->GetMatrixPointerArray(effect, NULL, NULL, 0); 2006 ok(hr == D3D_OK, "%u - %s: GetMatrixPointerArray failed, got %#x, expected %#x\n", 2007 i, res_full_name, hr, D3D_OK); 2008 2009 hr = effect->lpVtbl->GetMatrixPointerArray(effect, NULL, NULL, res_desc->Elements ? res_desc->Elements : 1); 2010 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixPointerArray failed, got %#x, expected %#x\n", 2011 i, res_full_name, hr, D3DERR_INVALIDCALL); 2012 2013 hr = effect->lpVtbl->GetMatrixPointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1); 2014 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixPointerArray failed, got %#x, expected %#x\n", 2015 i, res_full_name, hr, D3DERR_INVALIDCALL); 2016 2017 hr = effect->lpVtbl->SetMatrixTranspose(effect, NULL, (D3DXMATRIX *)input_value); 2018 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n", 2019 i, res_full_name, hr, D3DERR_INVALIDCALL); 2020 2021 hr = effect->lpVtbl->GetMatrixTranspose(effect, NULL, (D3DXMATRIX *)input_value); 2022 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n", 2023 i, res_full_name, hr, D3DERR_INVALIDCALL); 2024 2025 hr = effect->lpVtbl->GetMatrixTranspose(effect, parameter, NULL); 2026 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n", 2027 i, res_full_name, hr, D3DERR_INVALIDCALL); 2028 2029 hr = effect->lpVtbl->SetMatrixTransposeArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1); 2030 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n", 2031 i, res_full_name, hr, D3DERR_INVALIDCALL); 2032 2033 hr = effect->lpVtbl->GetMatrixTransposeArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1); 2034 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n", 2035 i, res_full_name, hr, D3DERR_INVALIDCALL); 2036 2037 hr = effect->lpVtbl->GetMatrixTransposeArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1); 2038 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n", 2039 i, res_full_name, hr, D3DERR_INVALIDCALL); 2040 2041 hr = effect->lpVtbl->SetMatrixTransposePointerArray(effect, NULL, matrix_pointer_array, res_desc->Elements ? res_desc->Elements : 1); 2042 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n", 2043 i, res_full_name, hr, D3DERR_INVALIDCALL); 2044 2045 hr = effect->lpVtbl->SetMatrixTransposePointerArray(effect, NULL, matrix_pointer_array, 0); 2046 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n", 2047 i, res_full_name, hr, D3DERR_INVALIDCALL); 2048 2049 hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, NULL, NULL, 0); 2050 ok(hr == D3D_OK, "%u - %s: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n", 2051 i, res_full_name, hr, D3D_OK); 2052 2053 hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, NULL, NULL, res_desc->Elements ? res_desc->Elements : 1); 2054 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n", 2055 i, res_full_name, hr, D3DERR_INVALIDCALL); 2056 2057 hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1); 2058 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n", 2059 i, res_full_name, hr, D3DERR_INVALIDCALL); 2060 2061 hr = effect->lpVtbl->SetValue(effect, NULL, input_value, res_desc->Bytes); 2062 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetValue failed, got %#x, expected %#x\n", 2063 i, res_full_name, hr, D3DERR_INVALIDCALL); 2064 2065 hr = effect->lpVtbl->SetValue(effect, parameter, input_value, res_desc->Bytes - 1); 2066 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetValue failed, got %#x, expected %#x\n", 2067 i, res_full_name, hr, D3DERR_INVALIDCALL); 2068 2069 hr = effect->lpVtbl->GetValue(effect, NULL, input_value, res_desc->Bytes); 2070 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n", 2071 i, res_full_name, hr, D3DERR_INVALIDCALL); 2072 2073 hr = effect->lpVtbl->GetValue(effect, parameter, input_value, res_desc->Bytes - 1); 2074 ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n", 2075 i, res_full_name, hr, D3DERR_INVALIDCALL); 2076 2077 test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i); 2078 2079 /* SetBool */ 2080 bvalue = 5; 2081 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2082 hr = effect->lpVtbl->SetBool(effect, parameter, bvalue); 2083 if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1) 2084 { 2085 bvalue = TRUE; 2086 set_number(expected_value, res_desc->Type, &bvalue, D3DXPT_BOOL); 2087 ok(hr == D3D_OK, "%u - %s: SetBool failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2088 } 2089 else 2090 { 2091 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBool failed, got %#x, expected %#x\n", 2092 i, res_full_name, hr, D3DERR_INVALIDCALL); 2093 } 2094 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2095 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2096 2097 /* SetBoolArray */ 2098 *input_value = 1; 2099 for (l = 1; l < res_desc->Bytes / sizeof(*input_value); ++l) 2100 { 2101 *(input_value + l) = *(input_value + l - 1) + 1; 2102 } 2103 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2104 hr = effect->lpVtbl->SetBoolArray(effect, parameter, (BOOL *)input_value, res_desc->Bytes / sizeof(*input_value)); 2105 if (res_desc->Class == D3DXPC_SCALAR 2106 || res_desc->Class == D3DXPC_VECTOR 2107 || res_desc->Class == D3DXPC_MATRIX_ROWS) 2108 { 2109 for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l) 2110 { 2111 set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_BOOL); 2112 } 2113 ok(hr == D3D_OK, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2114 } 2115 else 2116 { 2117 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n", 2118 i, res_full_name, hr, D3DERR_INVALIDCALL); 2119 } 2120 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2121 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2122 2123 /* SetInt */ 2124 ivalue = 0x1fbf02ff; 2125 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2126 hr = effect->lpVtbl->SetInt(effect, parameter, ivalue); 2127 if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1) 2128 { 2129 set_number(expected_value, res_desc->Type, &ivalue, D3DXPT_INT); 2130 ok(hr == D3D_OK, "%u - %s: SetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2131 } 2132 else if(!res_desc->Elements && res_desc->Type == D3DXPT_FLOAT && 2133 ((res_desc->Class == D3DXPC_VECTOR && res_desc->Columns != 2) || 2134 (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Rows != 2 && res_desc->Columns == 1))) 2135 { 2136 FLOAT tmp = ((ivalue & 0xff0000) >> 16) * INT_FLOAT_MULTI_INVERSE; 2137 set_number(expected_value, res_desc->Type, &tmp, D3DXPT_FLOAT); 2138 tmp = ((ivalue & 0xff00) >> 8) * INT_FLOAT_MULTI_INVERSE; 2139 set_number(expected_value + 1, res_desc->Type, &tmp, D3DXPT_FLOAT); 2140 tmp = (ivalue & 0xff) * INT_FLOAT_MULTI_INVERSE; 2141 set_number(expected_value + 2, res_desc->Type, &tmp, D3DXPT_FLOAT); 2142 tmp = ((ivalue & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE; 2143 set_number(expected_value + 3, res_desc->Type, &tmp, D3DXPT_FLOAT); 2144 2145 ok(hr == D3D_OK, "%u - %s: SetInt failed, got %#x, expected %#x\n", 2146 i, res_full_name, hr, D3D_OK); 2147 } 2148 else 2149 { 2150 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetInt failed, got %#x, expected %#x\n", 2151 i, res_full_name, hr, D3DERR_INVALIDCALL); 2152 } 2153 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2154 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2155 2156 /* SetIntArray */ 2157 *input_value = 123456; 2158 for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l) 2159 { 2160 *(input_value + l) = *(input_value + l - 1) + 23; 2161 } 2162 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2163 hr = effect->lpVtbl->SetIntArray(effect, parameter, (INT *)input_value, res_desc->Bytes / sizeof(*input_value)); 2164 if (res_desc->Class == D3DXPC_SCALAR 2165 || res_desc->Class == D3DXPC_VECTOR 2166 || res_desc->Class == D3DXPC_MATRIX_ROWS) 2167 { 2168 for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l) 2169 { 2170 set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_INT); 2171 } 2172 ok(hr == D3D_OK, "%u - %s: SetIntArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2173 } 2174 else 2175 { 2176 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetIntArray failed, got %#x, expected %#x\n", 2177 i, res_full_name, hr, D3DERR_INVALIDCALL); 2178 } 2179 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2180 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2181 2182 /* SetFloat */ 2183 fvalue = 1.33; 2184 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2185 hr = effect->lpVtbl->SetFloat(effect, parameter, fvalue); 2186 if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1) 2187 { 2188 set_number(expected_value, res_desc->Type, &fvalue, D3DXPT_FLOAT); 2189 ok(hr == D3D_OK, "%u - %s: SetFloat failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2190 } 2191 else 2192 { 2193 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloat failed, got %#x, expected %#x\n", 2194 i, res_full_name, hr, D3DERR_INVALIDCALL); 2195 } 2196 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2197 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2198 2199 /* SetFloatArray */ 2200 fvalue = 1.33; 2201 for (l = 0; l < res_desc->Bytes / sizeof(fvalue); ++l) 2202 { 2203 *(input_value + l) = *(DWORD *)&fvalue; 2204 fvalue += 1.12; 2205 } 2206 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2207 hr = effect->lpVtbl->SetFloatArray(effect, parameter, (FLOAT *)input_value, res_desc->Bytes / sizeof(*input_value)); 2208 if (res_desc->Class == D3DXPC_SCALAR 2209 || res_desc->Class == D3DXPC_VECTOR 2210 || res_desc->Class == D3DXPC_MATRIX_ROWS) 2211 { 2212 for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l) 2213 { 2214 set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_FLOAT); 2215 } 2216 ok(hr == D3D_OK, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2217 } 2218 else 2219 { 2220 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n", 2221 i, res_full_name, hr, D3DERR_INVALIDCALL); 2222 } 2223 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2224 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2225 2226 /* SetVector */ 2227 fvalue = -1.33; 2228 for (l = 0; l < 4; ++l) 2229 { 2230 *(input_value + l) = *(DWORD *)&fvalue; 2231 fvalue += 1.12; 2232 } 2233 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2234 hr = effect->lpVtbl->SetVector(effect, parameter, (D3DXVECTOR4 *)input_value); 2235 if (!res_desc->Elements && 2236 (res_desc->Class == D3DXPC_SCALAR 2237 || res_desc->Class == D3DXPC_VECTOR)) 2238 { 2239 /* only values between 0 and INT_FLOAT_MULTI are valid */ 2240 if (res_desc->Type == D3DXPT_INT && res_desc->Bytes == 4) 2241 { 2242 *expected_value = (DWORD)(max(min(*(FLOAT *)(input_value + 2), 1.0f), 0.0f) * INT_FLOAT_MULTI); 2243 *expected_value += ((DWORD)(max(min(*(FLOAT *)(input_value + 1), 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 8; 2244 *expected_value += ((DWORD)(max(min(*(FLOAT *)input_value, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 16; 2245 *expected_value += ((DWORD)(max(min(*(FLOAT *)(input_value + 3), 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 24; 2246 } 2247 else 2248 { 2249 for (l = 0; l < 4; ++l) 2250 { 2251 set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_FLOAT); 2252 } 2253 } 2254 ok(hr == D3D_OK, "%u - %s: SetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2255 } 2256 else 2257 { 2258 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVector failed, got %#x, expected %#x\n", 2259 i, res_full_name, hr, D3DERR_INVALIDCALL); 2260 } 2261 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2262 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2263 2264 /* SetVectorArray */ 2265 for (element = 0; element < res_desc->Elements + 1; ++element) 2266 { 2267 fvalue = 1.33; 2268 for (l = 0; l < element * 4; ++l) 2269 { 2270 *(input_value + l) = *(DWORD *)&fvalue; 2271 fvalue += 1.12; 2272 } 2273 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2274 hr = effect->lpVtbl->SetVectorArray(effect, parameter, (D3DXVECTOR4 *)input_value, element); 2275 if (res_desc->Elements && res_desc->Class == D3DXPC_VECTOR && element <= res_desc->Elements) 2276 { 2277 for (m = 0; m < element; ++m) 2278 { 2279 for (l = 0; l < res_desc->Columns; ++l) 2280 { 2281 set_number(expected_value + m * res_desc->Columns + l, res_desc->Type, input_value + m * 4 + l, D3DXPT_FLOAT); 2282 } 2283 } 2284 ok(hr == D3D_OK, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2285 } 2286 else 2287 { 2288 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n", 2289 i, res_full_name, hr, D3DERR_INVALIDCALL); 2290 } 2291 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2292 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2293 } 2294 2295 /* SetMatrix */ 2296 fvalue = 1.33; 2297 for (l = 0; l < 16; ++l) 2298 { 2299 *(input_value + l) = *(DWORD *)&fvalue; 2300 fvalue += 1.12; 2301 } 2302 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2303 hr = effect->lpVtbl->SetMatrix(effect, parameter, (D3DXMATRIX *)input_value); 2304 if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS) 2305 { 2306 for (l = 0; l < 4; ++l) 2307 { 2308 for (m = 0; m < 4; ++m) 2309 { 2310 if (m < res_desc->Rows && l < res_desc->Columns) 2311 set_number(expected_value + l + m * res_desc->Columns, res_desc->Type, 2312 input_value + l + m * 4, D3DXPT_FLOAT); 2313 } 2314 2315 } 2316 ok(hr == D3D_OK, "%u - %s: SetMatrix failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2317 } 2318 else 2319 { 2320 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrix failed, got %#x, expected %#x\n", 2321 i, res_full_name, hr, D3DERR_INVALIDCALL); 2322 } 2323 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2324 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2325 2326 /* SetMatrixArray */ 2327 for (element = 0; element < res_desc->Elements + 1; ++element) 2328 { 2329 fvalue = 1.33; 2330 for (l = 0; l < element * 16; ++l) 2331 { 2332 *(input_value + l) = *(DWORD *)&fvalue; 2333 fvalue += 1.12; 2334 } 2335 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2336 hr = effect->lpVtbl->SetMatrixArray(effect, parameter, (D3DXMATRIX *)input_value, element); 2337 if (res_desc->Class == D3DXPC_MATRIX_ROWS && element <= res_desc->Elements) 2338 { 2339 for (n = 0; n < element; ++n) 2340 { 2341 for (l = 0; l < 4; ++l) 2342 { 2343 for (m = 0; m < 4; ++m) 2344 { 2345 if (m < res_desc->Rows && l < res_desc->Columns) 2346 set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows, 2347 res_desc->Type, input_value + l + m * 4 + n * 16, D3DXPT_FLOAT); 2348 } 2349 2350 } 2351 } 2352 ok(hr == D3D_OK, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2353 } 2354 else 2355 { 2356 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n", 2357 i, res_full_name, hr, D3DERR_INVALIDCALL); 2358 } 2359 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2360 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2361 } 2362 2363 /* SetMatrixPointerArray */ 2364 for (element = 0; element < res_desc->Elements + 1; ++element) 2365 { 2366 fvalue = 1.33; 2367 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) 2368 { 2369 *(input_value + l) = *(DWORD *)&fvalue; 2370 fvalue += 1.12; 2371 } 2372 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2373 for (l = 0; l < element; ++l) 2374 { 2375 matrix_pointer_array[l] = (D3DXMATRIX *)&input_value[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)]; 2376 } 2377 hr = effect->lpVtbl->SetMatrixPointerArray(effect, parameter, matrix_pointer_array, element); 2378 if (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Elements >= element) 2379 { 2380 for (n = 0; n < element; ++n) 2381 { 2382 for (l = 0; l < 4; ++l) 2383 { 2384 for (m = 0; m < 4; ++m) 2385 { 2386 if (m < res_desc->Rows && l < res_desc->Columns) 2387 set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows, 2388 res_desc->Type, input_value + l + m * 4 + n * 16, D3DXPT_FLOAT); 2389 } 2390 2391 } 2392 } 2393 ok(hr == D3D_OK, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n", 2394 i, res_full_name, hr, D3D_OK); 2395 } 2396 else 2397 { 2398 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n", 2399 i, res_full_name, hr, D3DERR_INVALIDCALL); 2400 } 2401 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2402 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2403 } 2404 2405 /* SetMatrixTranspose */ 2406 fvalue = 1.33; 2407 for (l = 0; l < 16; ++l) 2408 { 2409 *(input_value + l) = *(DWORD *)&fvalue; 2410 fvalue += 1.12; 2411 } 2412 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2413 hr = effect->lpVtbl->SetMatrixTranspose(effect, parameter, (D3DXMATRIX *)input_value); 2414 if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS) 2415 { 2416 for (l = 0; l < 4; ++l) 2417 { 2418 for (m = 0; m < 4; ++m) 2419 { 2420 if (m < res_desc->Rows && l < res_desc->Columns) 2421 set_number(expected_value + l + m * res_desc->Columns, res_desc->Type, 2422 input_value + l * 4 + m, D3DXPT_FLOAT); 2423 } 2424 2425 } 2426 ok(hr == D3D_OK, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2427 } 2428 else 2429 { 2430 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n", 2431 i, res_full_name, hr, D3DERR_INVALIDCALL); 2432 } 2433 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2434 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2435 2436 /* SetMatrixTransposeArray */ 2437 for (element = 0; element < res_desc->Elements + 1; ++element) 2438 { 2439 fvalue = 1.33; 2440 for (l = 0; l < element * 16; ++l) 2441 { 2442 *(input_value + l) = *(DWORD *)&fvalue; 2443 fvalue += 1.12; 2444 } 2445 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2446 hr = effect->lpVtbl->SetMatrixTransposeArray(effect, parameter, (D3DXMATRIX *)input_value, element); 2447 if (res_desc->Class == D3DXPC_MATRIX_ROWS && element <= res_desc->Elements) 2448 { 2449 for (n = 0; n < element; ++n) 2450 { 2451 for (l = 0; l < 4; ++l) 2452 { 2453 for (m = 0; m < 4; ++m) 2454 { 2455 if (m < res_desc->Rows && l < res_desc->Columns) 2456 set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows, 2457 res_desc->Type, input_value + l * 4 + m + n * 16, D3DXPT_FLOAT); 2458 } 2459 2460 } 2461 } 2462 ok(hr == D3D_OK, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK); 2463 } 2464 else 2465 { 2466 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n", 2467 i, res_full_name, hr, D3DERR_INVALIDCALL); 2468 } 2469 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2470 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2471 } 2472 2473 /* SetMatrixTransposePointerArray */ 2474 for (element = 0; element < res_desc->Elements + 1; ++element) 2475 { 2476 fvalue = 1.33; 2477 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) 2478 { 2479 *(input_value + l) = *(DWORD *)&fvalue; 2480 fvalue += 1.12; 2481 } 2482 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes); 2483 for (l = 0; l < element; ++l) 2484 { 2485 matrix_pointer_array[l] = (D3DXMATRIX *)&input_value[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)]; 2486 } 2487 hr = effect->lpVtbl->SetMatrixTransposePointerArray(effect, parameter, matrix_pointer_array, element); 2488 if (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Elements >= element) 2489 { 2490 for (n = 0; n < element; ++n) 2491 { 2492 for (l = 0; l < 4; ++l) 2493 { 2494 for (m = 0; m < 4; ++m) 2495 { 2496 if (m < res_desc->Rows && l < res_desc->Columns) 2497 set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows, 2498 res_desc->Type, input_value + l * 4 + m + n * 16, D3DXPT_FLOAT); 2499 } 2500 2501 } 2502 } 2503 ok(hr == D3D_OK, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n", 2504 i, res_full_name, hr, D3D_OK); 2505 } 2506 else 2507 { 2508 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n", 2509 i, res_full_name, hr, D3DERR_INVALIDCALL); 2510 } 2511 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i); 2512 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i); 2513 } 2514 } 2515 2516 count = effect->lpVtbl->Release(effect); 2517 ok(!count, "Release failed %u\n", count); 2518 } 2519 } 2520 2521 static void test_effect_setvalue_object(IDirect3DDevice9 *device) 2522 { 2523 static const char expected_string[] = "test_string_1"; 2524 static const char expected_string2[] = "test_longer_string_2"; 2525 static const char *expected_string_array[] = {expected_string, expected_string2}; 2526 const char *string_array[ARRAY_SIZE(expected_string_array)]; 2527 const char *string, *string2; 2528 IDirect3DTexture9 *texture_set; 2529 IDirect3DTexture9 *texture; 2530 D3DXHANDLE parameter; 2531 ID3DXEffect *effect; 2532 unsigned int i; 2533 ULONG count; 2534 HRESULT hr; 2535 2536 hr = D3DXCreateEffect(device, test_effect_parameter_value_blob_object, 2537 sizeof(test_effect_parameter_value_blob_object), NULL, NULL, 0, NULL, &effect, NULL); 2538 ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr); 2539 2540 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "tex"); 2541 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2542 2543 texture = NULL; 2544 hr = D3DXCreateTexture(device, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, 0, D3DPOOL_DEFAULT, &texture); 2545 ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr); 2546 hr = effect->lpVtbl->SetValue(effect, parameter, &texture, sizeof(texture)); 2547 ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr); 2548 texture_set = NULL; 2549 hr = effect->lpVtbl->GetValue(effect, parameter, &texture_set, sizeof(texture_set)); 2550 ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr); 2551 ok(texture == texture_set, "Texture does not match.\n"); 2552 2553 count = IDirect3DTexture9_Release(texture_set); 2554 ok(count == 2, "Got reference count %u, expected 2.\n", count); 2555 texture_set = NULL; 2556 hr = effect->lpVtbl->SetValue(effect, parameter, &texture_set, sizeof(texture_set)); 2557 ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr); 2558 count = IDirect3DTexture9_Release(texture); 2559 ok(!count, "Got reference count %u, expected 0.\n", count); 2560 2561 hr = effect->lpVtbl->SetString(effect, "s", expected_string); 2562 ok(hr == D3D_OK, "Got result %#x.\n", hr); 2563 string = NULL; 2564 hr = effect->lpVtbl->GetString(effect, "s", &string); 2565 ok(hr == D3D_OK, "Got result %#x.\n", hr); 2566 hr = effect->lpVtbl->GetString(effect, "s", &string2); 2567 ok(hr == D3D_OK, "Got result %#x.\n", hr); 2568 2569 ok(string != expected_string, "String pointers are the same.\n"); 2570 ok(string == string2, "String pointers differ.\n"); 2571 ok(!strcmp(string, expected_string), "Unexpected string '%s'.\n", string); 2572 2573 string = expected_string2; 2574 hr = effect->lpVtbl->SetValue(effect, "s", &string, sizeof(string) - 1); 2575 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 2576 hr = effect->lpVtbl->SetValue(effect, "s", &string, sizeof(string)); 2577 ok(hr == D3D_OK, "Got result %#x.\n", hr); 2578 hr = effect->lpVtbl->SetValue(effect, "s", &string, sizeof(string) * 2); 2579 ok(hr == D3D_OK, "Got result %#x.\n", hr); 2580 string = NULL; 2581 hr = effect->lpVtbl->GetValue(effect, "s", &string, sizeof(string)); 2582 ok(hr == D3D_OK, "Got result %#x.\n", hr); 2583 2584 ok(string != expected_string2, "String pointers are the same.\n"); 2585 ok(!strcmp(string, expected_string2), "Unexpected string '%s'.\n", string); 2586 2587 hr = effect->lpVtbl->SetValue(effect, "s_2", expected_string_array, 2588 sizeof(expected_string_array)); 2589 ok(hr == D3D_OK, "Got result %#x.\n", hr); 2590 hr = effect->lpVtbl->GetValue(effect, "s_2", string_array, 2591 sizeof(string_array)); 2592 ok(hr == D3D_OK, "Got result %#x.\n", hr); 2593 for (i = 0; i < ARRAY_SIZE(expected_string_array); ++i) 2594 { 2595 ok(!strcmp(string_array[i], expected_string_array[i]), "Unexpected string '%s', i %u.\n", 2596 string_array[i], i); 2597 } 2598 effect->lpVtbl->Release(effect); 2599 } 2600 2601 /* 2602 * fxc.exe /Tfx_2_0 2603 */ 2604 #if 0 2605 float a = 2.1; 2606 float b[1]; 2607 float c <float d = 3;>; 2608 struct {float e;} f; 2609 float g <float h[1] = {3};>; 2610 struct s {float j;}; 2611 float i <s k[1] = {4};>; 2612 technique t <s l[1] = {5};> { pass p <s m[1] = {6};> { } } 2613 #endif 2614 static const DWORD test_effect_variable_names_blob[] = 2615 { 2616 0xfeff0901, 0x0000024c, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000000, 2617 0x00000001, 0x00000001, 0x40066666, 0x00000002, 0x00000061, 0x00000003, 0x00000000, 0x0000004c, 2618 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000062, 0x00000003, 2619 0x00000000, 0x0000009c, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x40400000, 2620 0x00000003, 0x00000000, 0x00000094, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 2621 0x00000064, 0x00000002, 0x00000063, 0x00000000, 0x00000005, 0x000000dc, 0x00000000, 0x00000000, 2622 0x00000001, 0x00000003, 0x00000000, 0x000000e4, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 2623 0x00000000, 0x00000002, 0x00000066, 0x00000002, 0x00000065, 0x00000003, 0x00000000, 0x00000134, 2624 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x40400000, 0x00000003, 0x00000000, 2625 0x0000012c, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000068, 0x00000002, 2626 0x00000067, 0x00000003, 0x00000000, 0x000001a4, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 2627 0x00000000, 0x40800000, 0x00000000, 0x00000005, 0x00000194, 0x00000000, 0x00000001, 0x00000001, 2628 0x00000003, 0x00000000, 0x0000019c, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 2629 0x0000006b, 0x00000002, 0x0000006a, 0x00000002, 0x00000069, 0x40a00000, 0x00000000, 0x00000005, 2630 0x000001e4, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00000000, 0x000001ec, 0x00000000, 2631 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x0000006c, 0x00000002, 0x0000006a, 0x40c00000, 2632 0x00000000, 0x00000005, 0x0000022c, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00000000, 2633 0x00000234, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x0000006d, 0x00000002, 2634 0x0000006a, 0x00000002, 0x00000070, 0x00000002, 0x00000074, 0x00000006, 0x00000001, 0x00000001, 2635 0x00000001, 0x00000004, 0x00000020, 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 2636 0x00000000, 0x00000054, 0x00000070, 0x00000000, 0x00000001, 0x00000078, 0x00000074, 0x000000a4, 2637 0x000000d8, 0x00000000, 0x00000000, 0x000000ec, 0x00000108, 0x00000000, 0x00000001, 0x00000110, 2638 0x0000010c, 0x0000013c, 0x00000158, 0x00000000, 0x00000001, 0x00000160, 0x0000015c, 0x00000244, 2639 0x00000001, 0x00000001, 0x000001b0, 0x000001ac, 0x0000023c, 0x00000001, 0x00000000, 0x000001f8, 2640 0x000001f4, 0x00000000, 0x00000000, 2641 }; 2642 2643 static void test_effect_variable_names(IDirect3DDevice9 *device) 2644 { 2645 ID3DXEffect *effect; 2646 ULONG count; 2647 HRESULT hr; 2648 D3DXHANDLE parameter, p; 2649 2650 hr = D3DXCreateEffect(device, test_effect_variable_names_blob, 2651 sizeof(test_effect_variable_names_blob), NULL, NULL, 0, NULL, &effect, NULL); 2652 ok(hr == D3D_OK, "D3DXCreateEffect failed, got %#x, expected %#x\n", hr, D3D_OK); 2653 2654 /* 2655 * check invalid calls 2656 * This will crash: 2657 * effect->lpVtbl->GetAnnotationByName(effect, "invalid1", "invalid2"); 2658 */ 2659 p = effect->lpVtbl->GetParameterByName(effect, NULL, NULL); 2660 ok(p == NULL, "GetParameterByName failed, got %p, expected %p\n", p, NULL); 2661 2662 p = effect->lpVtbl->GetParameterByName(effect, NULL, "invalid1"); 2663 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2664 2665 p = effect->lpVtbl->GetParameterByName(effect, "invalid1", NULL); 2666 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2667 2668 p = effect->lpVtbl->GetParameterByName(effect, "invalid1", "invalid2"); 2669 ok(p == NULL, "GetParameterByName failed, got %p, expected %p\n", p, NULL); 2670 2671 /* float a; */ 2672 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "a"); 2673 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2674 2675 p = effect->lpVtbl->GetParameterByName(effect, "a", NULL); 2676 ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter); 2677 2678 /* members */ 2679 p = effect->lpVtbl->GetParameterByName(effect, NULL, "a."); 2680 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2681 2682 p = effect->lpVtbl->GetParameterByName(effect, "a.", NULL); 2683 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2684 2685 p = effect->lpVtbl->GetParameterByName(effect, "a", "."); 2686 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2687 2688 p = effect->lpVtbl->GetParameterByName(effect, NULL, "a.invalid"); 2689 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2690 2691 p = effect->lpVtbl->GetParameterByName(effect, "a.invalid", NULL); 2692 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2693 2694 p = effect->lpVtbl->GetParameterByName(effect, "a", ".invalid"); 2695 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2696 2697 p = effect->lpVtbl->GetParameterByName(effect, "a.", "invalid"); 2698 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2699 2700 p = effect->lpVtbl->GetParameterByName(effect, "a", "invalid"); 2701 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2702 2703 /* elements */ 2704 p = effect->lpVtbl->GetParameterByName(effect, NULL, "a[]"); 2705 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2706 2707 p = effect->lpVtbl->GetParameterByName(effect, "a[]", NULL); 2708 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2709 2710 p = effect->lpVtbl->GetParameterByName(effect, NULL, "a[0]"); 2711 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2712 2713 p = effect->lpVtbl->GetParameterByName(effect, "a[0]", NULL); 2714 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2715 2716 p = effect->lpVtbl->GetParameterByName(effect, "a", "[0]"); 2717 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2718 2719 p = effect->lpVtbl->GetParameterElement(effect, "a", 0); 2720 ok(p == NULL, "GetParameterElement failed, got %p\n", p); 2721 2722 /* annotations */ 2723 p = effect->lpVtbl->GetParameterByName(effect, NULL, "a@"); 2724 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2725 2726 p = effect->lpVtbl->GetParameterByName(effect, "a@", NULL); 2727 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2728 2729 p = effect->lpVtbl->GetParameterByName(effect, "a", "@invalid"); 2730 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2731 2732 p = effect->lpVtbl->GetParameterByName(effect, "a@", "invalid"); 2733 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2734 2735 p = effect->lpVtbl->GetParameterByName(effect, NULL, "a@invalid"); 2736 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2737 2738 p = effect->lpVtbl->GetParameterByName(effect, "a@invalid", NULL); 2739 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2740 2741 p = effect->lpVtbl->GetAnnotationByName(effect, "a", NULL); 2742 ok(p == NULL, "GetAnnotationByName failed, got %p\n", p); 2743 2744 p = effect->lpVtbl->GetAnnotationByName(effect, "a", "invalid"); 2745 ok(p == NULL, "GetAnnotationByName failed, got %p\n", p); 2746 2747 p = effect->lpVtbl->GetAnnotation(effect, "a", 0); 2748 ok(p == NULL, "GetAnnotation failed, got %p\n", p); 2749 2750 /* float b[1]; */ 2751 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "b"); 2752 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2753 2754 p = effect->lpVtbl->GetParameterByName(effect, "b", NULL); 2755 ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter); 2756 2757 /* elements */ 2758 p = effect->lpVtbl->GetParameterByName(effect, NULL, "b[]"); 2759 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2760 2761 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "b[0]"); 2762 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2763 2764 p = effect->lpVtbl->GetParameterByName(effect, "b[0]", NULL); 2765 ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter); 2766 2767 p = effect->lpVtbl->GetParameterElement(effect, "b", 0); 2768 ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter); 2769 2770 p = effect->lpVtbl->GetParameterByName(effect, "b", "[0]"); 2771 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2772 2773 p = effect->lpVtbl->GetParameterByName(effect, NULL, "b[1]"); 2774 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2775 2776 p = effect->lpVtbl->GetParameterElement(effect, "b", 1); 2777 ok(p == NULL, "GetParameterElement failed, got %p\n", p); 2778 2779 /* float c <float d = 3;>; */ 2780 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "c"); 2781 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2782 2783 p = effect->lpVtbl->GetParameterByName(effect, "c", NULL); 2784 ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter); 2785 2786 /* annotations */ 2787 p = effect->lpVtbl->GetParameterByName(effect, "c", "@d"); 2788 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2789 2790 p = effect->lpVtbl->GetParameterByName(effect, "c@", "d"); 2791 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2792 2793 p = effect->lpVtbl->GetParameterByName(effect, NULL, "c@invalid"); 2794 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2795 2796 p = effect->lpVtbl->GetParameterByName(effect, "c@invalid", NULL); 2797 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2798 2799 p = effect->lpVtbl->GetAnnotationByName(effect, "c", NULL); 2800 ok(p == NULL, "GetAnnotationByName failed, got %p\n", p); 2801 2802 p = effect->lpVtbl->GetAnnotationByName(effect, "c", "invalid"); 2803 ok(p == NULL, "GetAnnotationByName failed, got %p\n", p); 2804 2805 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "c@d"); 2806 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2807 2808 p = effect->lpVtbl->GetParameterByName(effect, "c@d", NULL); 2809 ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter); 2810 2811 p = effect->lpVtbl->GetAnnotationByName(effect, "c", "d"); 2812 ok(parameter == p, "GetAnnotationByName failed, got %p, expected %p\n", p, parameter); 2813 2814 p = effect->lpVtbl->GetAnnotation(effect, "c", 0); 2815 ok(parameter == p, "GetAnnotation failed, got %p, expected %p\n", p, parameter); 2816 2817 p = effect->lpVtbl->GetAnnotation(effect, "c", 1); 2818 ok(p == NULL, "GetAnnotation failed, got %p\n", p); 2819 2820 /* struct {float e;} f; */ 2821 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "f"); 2822 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2823 2824 p = effect->lpVtbl->GetParameterByName(effect, "f", NULL); 2825 ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter); 2826 2827 /* members */ 2828 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "f.e"); 2829 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2830 2831 p = effect->lpVtbl->GetParameterByName(effect, "f.e", NULL); 2832 ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter); 2833 2834 p = effect->lpVtbl->GetParameterByName(effect, "f", "e"); 2835 ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter); 2836 2837 p = effect->lpVtbl->GetParameterByName(effect, "f", ".e"); 2838 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2839 2840 p = effect->lpVtbl->GetParameterByName(effect, "f.", "e"); 2841 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2842 2843 p = effect->lpVtbl->GetParameterByName(effect, "f.invalid", NULL); 2844 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2845 2846 p = effect->lpVtbl->GetParameterByName(effect, NULL, "f.invalid"); 2847 ok(p == NULL, "GetParameterByName failed, got %p\n", p); 2848 2849 /* float g <float h[1] = {3};>; */ 2850 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "g@h[0]"); 2851 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2852 2853 p = effect->lpVtbl->GetAnnotationByName(effect, "g", "h[0]"); 2854 ok(parameter == p, "GetAnnotationByName failed, got %p, expected %p\n", p, parameter); 2855 2856 p = effect->lpVtbl->GetParameterElement(effect, "g@h", 0); 2857 ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter); 2858 2859 p = effect->lpVtbl->GetParameterElement(effect, effect->lpVtbl->GetAnnotation(effect, "g", 0), 0); 2860 ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter); 2861 2862 /* struct s {float j;}; float i <s k[1] = {4};>; */ 2863 parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "i@k[0].j"); 2864 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2865 2866 p = effect->lpVtbl->GetAnnotationByName(effect, "i", "k[0].j"); 2867 ok(parameter == p, "GetAnnotationByName failed, got %p, expected %p\n", p, parameter); 2868 2869 p = effect->lpVtbl->GetParameterByName(effect, effect->lpVtbl->GetParameterElement(effect, "i@k", 0), "j"); 2870 ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter); 2871 2872 /* technique t <s l[1] = {5};> */ 2873 parameter = effect->lpVtbl->GetAnnotationByName(effect, "t", "l[0].j"); 2874 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2875 2876 /* pass p <s m[1] = {6};> */ 2877 parameter = effect->lpVtbl->GetAnnotationByName(effect, effect->lpVtbl->GetPassByName(effect, "t", "p"), "m[0].j"); 2878 ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter); 2879 2880 count = effect->lpVtbl->Release(effect); 2881 ok(!count, "Release failed %u\n", count); 2882 } 2883 2884 static void test_effect_compilation_errors(IDirect3DDevice9 *device) 2885 { 2886 ID3DXEffect *effect; 2887 ID3DXBuffer *compilation_errors; 2888 HRESULT hr; 2889 2890 /* Test binary effect */ 2891 compilation_errors = (ID3DXBuffer*)0xdeadbeef; 2892 hr = D3DXCreateEffect(NULL, NULL, 0, NULL, NULL, 0, NULL, NULL, &compilation_errors); 2893 ok(hr == D3DERR_INVALIDCALL, "D3DXCreateEffect failed, got %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); 2894 ok(!compilation_errors, "Returned %p\n", compilation_errors); 2895 2896 compilation_errors = (ID3DXBuffer*)0xdeadbeef; 2897 hr = D3DXCreateEffect(device, test_effect_variable_names_blob, 2898 sizeof(test_effect_variable_names_blob), NULL, NULL, 0, NULL, &effect, &compilation_errors); 2899 ok(hr == D3D_OK, "D3DXCreateEffect failed, got %#x, expected %#x\n", hr, D3D_OK); 2900 ok(!compilation_errors, "Returned %p\n", compilation_errors); 2901 effect->lpVtbl->Release(effect); 2902 } 2903 2904 /* 2905 * fxc.exe /Tfx_2_0 2906 */ 2907 #if 0 2908 vertexshader vs_arr1[2] = 2909 { 2910 asm 2911 { 2912 vs_1_1 2913 def c0, 1, 1, 1, 1 2914 mov oPos, c0 2915 }, 2916 asm 2917 { 2918 vs_2_0 2919 def c0, 2, 2, 2, 2 2920 mov oPos, c0 2921 } 2922 }; 2923 2924 sampler sampler1 = 2925 sampler_state 2926 { 2927 MipFilter = LINEAR; 2928 }; 2929 2930 float4x4 camera : VIEW = {4.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0, 0.0,0.0,0.0,6.0}; 2931 technique tech0 2932 { 2933 pass p0 2934 { 2935 vertexshader = vs_arr1[1]; 2936 VertexShaderConstant1[1] = 3.0f; 2937 VertexShaderConstant4[2] = 1; 2938 VertexShaderConstant1[3] = {2, 2, 2, 2}; 2939 VertexShaderConstant4[4] = {4, 4, 4, 4, 5, 5, 5, 5, 6}; 2940 BlendOp = 2; 2941 AlphaOp[3] = 4; 2942 ZEnable = true; 2943 WorldTransform[1]={2.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0, 0.0,0.0,0.0,4.0}; 2944 ViewTransform=(camera); 2945 LightEnable[2] = TRUE; 2946 LightType[2] = POINT; 2947 LightPosition[2] = {4.0f, 5.0f, 6.0f}; 2948 Sampler[1] = sampler1; 2949 } 2950 } 2951 #endif 2952 static const DWORD test_effect_states_effect_blob[] = 2953 { 2954 0xfeff0901, 0x00000368, 0x00000000, 0x00000010, 0x00000004, 0x00000020, 0x00000000, 0x00000002, 2955 0x00000001, 0x00000002, 0x00000008, 0x615f7376, 0x00317272, 0x0000000a, 0x00000004, 0x00000074, 2956 0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 2957 0x00000001, 0x00000001, 0x00000001, 0x000000ab, 0x00000100, 0x00000044, 0x00000040, 0x00000009, 2958 0x706d6173, 0x3172656c, 0x00000000, 0x00000003, 0x00000002, 0x000000e0, 0x000000ec, 0x00000000, 2959 0x00000004, 0x00000004, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2960 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2961 0x00000000, 0x40c00000, 0x00000007, 0x656d6163, 0x00006172, 0x00000005, 0x57454956, 0x00000000, 2962 0x00000003, 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x40400000, 0x00000003, 2963 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x3f800000, 0x00000003, 2964 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x40000000, 0x40000000, 2965 0x40000000, 0x40000000, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 2966 0x00000001, 0x40800000, 0x40800000, 0x40800000, 0x40800000, 0x40a00000, 0x40a00000, 0x40a00000, 2967 0x40a00000, 0x40c00000, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000009, 2968 0x00000001, 0x00000002, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 2969 0x00000001, 0x00000004, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 2970 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 2971 0x00000001, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2972 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2973 0x40800000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0x00000001, 2974 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2975 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2976 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000001, 2977 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 2978 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x40800000, 2979 0x40a00000, 0x40c00000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 2980 0x00000001, 0x00000000, 0x0000000a, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 2981 0x00003070, 0x00000006, 0x68636574, 0x00000030, 0x00000003, 0x00000001, 0x00000005, 0x00000004, 2982 0x00000004, 0x00000018, 0x00000000, 0x00000000, 0x0000002c, 0x00000060, 0x00000000, 0x00000000, 2983 0x00000084, 0x000000a0, 0x00000000, 0x00000000, 0x0000035c, 0x00000000, 0x00000001, 0x00000354, 2984 0x00000000, 0x0000000e, 0x00000092, 0x00000000, 0x000000fc, 0x000000f8, 0x00000098, 0x00000001, 2985 0x00000114, 0x00000110, 0x0000009b, 0x00000002, 0x00000134, 0x00000130, 0x00000098, 0x00000003, 2986 0x00000160, 0x00000150, 0x0000009b, 0x00000004, 0x000001a0, 0x0000017c, 0x0000004b, 0x00000000, 2987 0x000001c0, 0x000001bc, 0x0000006b, 0x00000003, 0x000001e0, 0x000001dc, 0x00000000, 0x00000000, 2988 0x00000200, 0x000001fc, 0x0000007d, 0x00000001, 0x0000025c, 0x0000021c, 0x0000007c, 0x00000000, 2989 0x000002b8, 0x00000278, 0x00000091, 0x00000002, 0x000002d8, 0x000002d4, 0x00000084, 0x00000002, 2990 0x000002f8, 0x000002f4, 0x00000088, 0x00000002, 0x00000320, 0x00000314, 0x000000b2, 0x00000001, 2991 0x00000340, 0x0000033c, 0x00000002, 0x00000003, 0x00000001, 0x0000002c, 0xfffe0101, 0x00000051, 2992 0xa00f0000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000001, 0xc00f0000, 0xa0e40000, 2993 0x0000ffff, 0x00000002, 0x0000002c, 0xfffe0200, 0x05000051, 0xa00f0000, 0x40000000, 0x40000000, 2994 0x40000000, 0x40000000, 0x02000001, 0xc00f0000, 0xa0e40000, 0x0000ffff, 0x00000000, 0x00000000, 2995 0xffffffff, 0x0000000d, 0x00000001, 0x00000009, 0x706d6173, 0x3172656c, 0x00000000, 0x00000000, 2996 0x00000000, 0xffffffff, 0x00000009, 0x00000000, 0x0000016c, 0x46580200, 0x0030fffe, 0x42415443, 2997 0x0000001c, 0x0000008b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000088, 0x00000030, 2998 0x00000002, 0x00000004, 0x00000038, 0x00000048, 0x656d6163, 0xab006172, 0x00030003, 0x00040004, 2999 0x00000001, 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3000 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3001 0x00000000, 0x40c00000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 3002 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 3003 0x54494c43, 0x00000000, 0x0024fffe, 0x434c5846, 0x00000004, 0x10000004, 0x00000001, 0x00000000, 3004 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x10000004, 0x00000001, 0x00000000, 3005 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000004, 0x10000004, 0x00000001, 0x00000000, 3006 0x00000002, 0x00000008, 0x00000000, 0x00000004, 0x00000008, 0x10000004, 0x00000001, 0x00000000, 3007 0x00000002, 0x0000000c, 0x00000000, 0x00000004, 0x0000000c, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 3008 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000001, 0x0000000b, 0x615f7376, 0x5b317272, 3009 0x00005d31, 3010 }; 3011 #define TEST_EFFECT_STATES_VSHADER_POS 315 3012 3013 static const D3DXVECTOR4 fvect_filler = {-9999.0f, -9999.0f, -9999.0f, -9999.0f}; 3014 3015 static void test_effect_clear_vconsts(IDirect3DDevice9 *device) 3016 { 3017 unsigned int i; 3018 HRESULT hr; 3019 3020 for (i = 0; i < 256; ++i) 3021 { 3022 hr = IDirect3DDevice9_SetVertexShaderConstantF(device, i, &fvect_filler.x, 1); 3023 ok(hr == D3D_OK, "Got result %#x.\n", hr); 3024 } 3025 } 3026 3027 static void test_effect_states(IDirect3DDevice9 *device) 3028 { 3029 static const D3DMATRIX test_mat = 3030 {{{ 3031 -1.0f, 0.0f, 0.0f, 0.0f, 3032 0.0f, 0.0f, 0.0f, 0.0f, 3033 0.0f, 0.0f, 0.0f, 0.0f, 3034 0.0f, 0.0f, 0.0f, 0.0f 3035 }}}; 3036 static const D3DMATRIX test_mat_camera = 3037 {{{ 3038 4.0f, 0.0f, 0.0f, 0.0f, 3039 0.0f, 0.0f, 0.0f, 0.0f, 3040 0.0f, 0.0f, 0.0f, 0.0f, 3041 0.0f, 0.0f, 0.0f, 6.0f 3042 }}}; 3043 static const D3DMATRIX test_mat_world1 = 3044 {{{ 3045 2.0f, 0.0f, 0.0f, 0.0f, 3046 0.0f, 0.0f, 0.0f, 0.0f, 3047 0.0f, 0.0f, 0.0f, 0.0f, 3048 0.0f, 0.0f, 0.0f, 4.0f 3049 }}}; 3050 3051 IDirect3DVertexShader9 *vshader; 3052 ID3DXEffect *effect; 3053 UINT byte_code_size; 3054 D3DXVECTOR4 fvect; 3055 void *byte_code; 3056 D3DLIGHT9 light; 3057 D3DMATRIX mat; 3058 UINT npasses; 3059 DWORD value; 3060 HRESULT hr; 3061 BOOL bval; 3062 3063 hr = D3DXCreateEffect(device, test_effect_states_effect_blob, sizeof(test_effect_states_effect_blob), 3064 NULL, NULL, 0, NULL, &effect, NULL); 3065 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3066 3067 /* State affected in passes saved/restored even if no pass 3068 was performed. States not present in passes are not saved & 3069 restored */ 3070 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_BLENDOP, 1); 3071 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3072 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ALPHAFUNC, 1); 3073 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3074 3075 hr = effect->lpVtbl->Begin(effect, &npasses, 0); 3076 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3077 ok(npasses == 1, "Expected 1 pass, got %u\n", npasses); 3078 3079 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_BLENDOP, 3); 3080 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3081 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ALPHAFUNC, 2); 3082 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3083 3084 hr = effect->lpVtbl->End(effect); 3085 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3086 3087 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_BLENDOP, &value); 3088 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3089 ok(value == 1, "Got result %u, expected %u.\n", value, 1); 3090 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_ALPHAFUNC, &value); 3091 ok(value == 2, "Got result %u, expected %u.\n", value, 2); 3092 3093 /* Test states application in BeginPass. No states are restored 3094 on EndPass. */ 3095 hr = IDirect3DDevice9_SetSamplerState(device, 1, D3DSAMP_MIPFILTER, 0); 3096 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3097 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ZENABLE, 0); 3098 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3099 3100 hr = IDirect3DDevice9_GetLightEnable(device, 2, &bval); 3101 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3102 if (hr == D3D_OK) 3103 ok(!bval, "Got result %u, expected 0.\n", bval); 3104 3105 hr = IDirect3DDevice9_SetTransform(device, D3DTS_WORLDMATRIX(1), &test_mat); 3106 hr = effect->lpVtbl->Begin(effect, NULL, 0); 3107 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3108 3109 hr = IDirect3DDevice9_GetTransform(device, D3DTS_WORLDMATRIX(1), &mat); 3110 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3111 ok(!memcmp(mat.m, test_mat.m, sizeof(mat)), "World matrix does not match.\n"); 3112 3113 test_effect_clear_vconsts(device); 3114 3115 hr = effect->lpVtbl->BeginPass(effect, 0); 3116 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3117 3118 hr = IDirect3DDevice9_GetTransform(device, D3DTS_WORLDMATRIX(1), &mat); 3119 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3120 ok(!memcmp(mat.m, test_mat_world1.m, sizeof(mat)), "World matrix does not match.\n"); 3121 3122 hr = IDirect3DDevice9_GetTransform(device, D3DTS_VIEW, &mat); 3123 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3124 ok(!memcmp(mat.m, test_mat_camera.m, sizeof(mat)), "View matrix does not match.\n"); 3125 3126 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_BLENDOP, &value); 3127 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3128 ok(value == 2, "Got result %u, expected %u\n", value, 2); 3129 3130 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 3131 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3132 ok(vshader != NULL, "Got NULL vshader.\n"); 3133 if (vshader) 3134 { 3135 hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size); 3136 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3137 byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size); 3138 hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size); 3139 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3140 ok(byte_code_size > 1, "Got unexpected byte code size %u.\n", byte_code_size); 3141 ok(!memcmp(byte_code, &test_effect_states_effect_blob[TEST_EFFECT_STATES_VSHADER_POS], byte_code_size), 3142 "Incorrect shader selected.\n"); 3143 HeapFree(GetProcessHeap(), 0, byte_code); 3144 IDirect3DVertexShader9_Release(vshader); 3145 } 3146 3147 hr = IDirect3DDevice9_GetLightEnable(device, 2, &bval); 3148 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3149 if (hr == D3D_OK) 3150 ok(bval, "Got result %u, expected TRUE.\n", bval); 3151 hr = IDirect3DDevice9_GetLight(device, 2, &light); 3152 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3153 if (hr == D3D_OK) 3154 ok(light.Position.x == 4.0f && light.Position.y == 5.0f && light.Position.z == 6.0f, 3155 "Got unexpected light position (%f, %f, %f).\n", light.Position.x, light.Position.y, light.Position.z); 3156 3157 /* Testing first value only for constants 1, 2 as the rest of the vector seem to 3158 * contain garbage data on native. */ 3159 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 1, &fvect.x, 1); 3160 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3161 ok(fvect.x == 3.0f, "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n", 3162 fvect.x, fvect.y, fvect.z, fvect.w); 3163 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 2, &fvect.x, 1); 3164 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3165 ok(fvect.x == 1.0f, "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n", 3166 fvect.x, fvect.y, fvect.z, fvect.w); 3167 3168 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 3, &fvect.x, 1); 3169 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3170 ok(fvect.x == 2.0f && fvect.y == 2.0f && fvect.z == 2.0f && fvect.w == 2.0f, 3171 "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n", 3172 fvect.x, fvect.y, fvect.z, fvect.w); 3173 3174 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 4, &fvect.x, 1); 3175 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3176 ok(fvect.x == 4.0f && fvect.y == 4.0f && fvect.z == 4.0f && fvect.w == 4.0f, 3177 "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n", 3178 fvect.x, fvect.y, fvect.z, fvect.w); 3179 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 5, &fvect.x, 1); 3180 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3181 ok(fvect.x == 0.0f && fvect.y == 0.0f && fvect.z == 0.0f && fvect.w == 0.0f, 3182 "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n", 3183 fvect.x, fvect.y, fvect.z, fvect.w); 3184 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 6, &fvect.x, 1); 3185 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3186 ok(fvect.x == 0.0f && fvect.y == 0.0f && fvect.z == 0.0f && fvect.w == 0.0f, 3187 "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n", 3188 fvect.x, fvect.y, fvect.z, fvect.w); 3189 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 7, &fvect.x, 1); 3190 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3191 ok(!memcmp(&fvect, &fvect_filler, sizeof(fvect_filler)), 3192 "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n", 3193 fvect.x, fvect.y, fvect.z, fvect.w); 3194 3195 hr = effect->lpVtbl->EndPass(effect); 3196 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3197 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_BLENDOP, &value); 3198 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3199 ok(value == 2, "Got result %u, expected %u\n", value, 2); 3200 3201 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_ZENABLE, &value); 3202 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3203 ok(value, "Got result %u, expected TRUE.\n", value); 3204 3205 hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MIPFILTER, &value); 3206 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3207 ok(value == D3DTEXF_LINEAR, "Unexpected sampler 1 mipfilter %u.\n", value); 3208 3209 hr = IDirect3DDevice9_GetTextureStageState(device, 3, D3DTSS_ALPHAOP, &value); 3210 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3211 ok(value == 4, "Unexpected texture stage 3 AlphaOp %u.\n", value); 3212 3213 hr = effect->lpVtbl->End(effect); 3214 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3215 3216 hr = IDirect3DDevice9_GetTransform(device, D3DTS_WORLDMATRIX(1), &mat); 3217 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3218 ok(!memcmp(mat.m, test_mat.m, sizeof(mat)), "World matrix not restored.\n"); 3219 3220 hr = IDirect3DDevice9_GetLightEnable(device, 2, &bval); 3221 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3222 if (hr == D3D_OK) 3223 ok(!bval, "Got result %u, expected 0.\n", bval); 3224 3225 /* State is not restored if effect is released without End call */ 3226 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_BLENDOP, 1); 3227 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3228 3229 hr = effect->lpVtbl->Begin(effect, &npasses, 0); 3230 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3231 3232 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_BLENDOP, 3); 3233 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3234 3235 effect->lpVtbl->Release(effect); 3236 3237 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_BLENDOP, &value); 3238 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 3239 ok(value == 3, "Got result %u, expected %u.\n", value, 1); 3240 } 3241 3242 /* 3243 * fxc.exe /Tfx_2_0 3244 */ 3245 #if 0 3246 float4 g_Pos1; 3247 float4 g_Pos2; 3248 float4 g_Selector[3] = {{0, 0, 0, 0}, {10, 10, 10, 10}, {5001, 5002, 5003, 5004}}; 3249 3250 float4 opvect1 = {0.0, -0.0, -2.2, 3.402823466e+38F}; 3251 float4 opvect2 = {1.0, 2.0, -3.0, 4.0}; 3252 float4 opvect3 = {0.0, -0.0, -2.2, 3.402823466e+38F}; 3253 3254 float4 vect_sampler = {1, 2, 3, 4}; 3255 3256 float3 vec3 = {1001, 1002, 1003}; 3257 3258 int4 g_iVect = {4, 3, 2, 1}; 3259 3260 vertexshader vs_arr[3] = 3261 { 3262 asm 3263 { 3264 vs_1_0 3265 def c0, 1, 1, 1, 1 3266 mov oPos, c0 3267 }, 3268 asm 3269 { 3270 vs_1_1 3271 def c0, 2, 2, 2, 2 3272 mov oPos, c0 3273 }, 3274 asm 3275 { 3276 vs_2_0 3277 def c0, 3, 3, 3, 3 3278 mov oPos, c0 3279 } 3280 }; 3281 3282 float4x4 m4x4 = {{11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}, {41, 42, 43, 44}}; 3283 3284 row_major float4x3 m4x3row = {{11, 12, 13}, {21, 22, 23}, {31, 32, 33}, {41, 42, 43}}; 3285 row_major float3x4 m3x4row = {{11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}}; 3286 column_major float4x3 m4x3column = {{11, 12, 13},{21, 22, 23},{31, 32, 33},{41, 42, 43}}; 3287 column_major float3x4 m3x4column = {{11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}}; 3288 row_major float2x2 m2x2row = {{11, 12}, {21, 22}}; 3289 column_major float2x2 m2x2column = {{11, 12}, {21, 22}}; 3290 row_major float2x3 m2x3row = {{11, 12, 13}, {21, 22, 23}}; 3291 column_major float2x3 m2x3column = {{11, 12, 13}, {21, 22, 23}}; 3292 row_major float3x2 m3x2row = {{11, 12}, {21, 22}, {31, 32}}; 3293 column_major float3x2 m3x2column = {{11, 12}, {21, 22}, {31, 32}}; 3294 3295 row_major bool2x3 mb2x3row = {{true, false, true}, {false, true, true}}; 3296 column_major bool2x3 mb2x3column = {{true, false, true}, {false, true, true}}; 3297 3298 struct test_struct 3299 { 3300 float3 v1; 3301 float fv; 3302 float4 v2; 3303 }; 3304 3305 struct struct_array 3306 { 3307 test_struct ts[2]; 3308 }; 3309 3310 test_struct ts1[1] = {{{9, 10, 11}, 12, {13, 14, 15, 16}}}; 3311 shared test_struct ts2[2] = {{{0, 0, 0}, 0, {0, 0, 0, 0}}, {{1, 2, 3}, 4, {5, 6, 7, 8}}}; 3312 struct_array ts3 = {{{1, 2, 3}, 4, {5, 6, 7, 8}}, {{9, 10, 11}, 12, {13, 14, 15, 16}}}; 3313 3314 float arr1[1] = {91}; 3315 shared float arr2[2] = {92, 93}; 3316 3317 Texture2D tex1; 3318 Texture2D tex2; 3319 sampler sampler1 = 3320 sampler_state 3321 { 3322 Texture = tex1; 3323 MinFilter = g_iVect.y; 3324 MagFilter = vect_sampler.x + vect_sampler.y; 3325 }; 3326 3327 sampler samplers_array[2] = 3328 { 3329 sampler_state 3330 { 3331 MinFilter = 1; 3332 MagFilter = vect_sampler.x; 3333 }, 3334 sampler_state 3335 { 3336 MinFilter = 2; 3337 MagFilter = vect_sampler.y; 3338 } 3339 }; 3340 3341 struct VS_OUTPUT 3342 { 3343 float4 Position : POSITION; 3344 float2 TextureUV : TEXCOORD0; 3345 float4 Diffuse : COLOR0; 3346 }; 3347 VS_OUTPUT RenderSceneVS(float4 vPos : POSITION, 3348 float3 vNormal : NORMAL, 3349 float2 vTexCoord0 : TEXCOORD0, 3350 uniform int nNumLights, 3351 uniform bool bTexture) 3352 { 3353 VS_OUTPUT Output; 3354 3355 if (g_Selector[1].y > float4(0.5, 0.5, 0.5, 0.5).y) 3356 Output.Position = -g_Pos1 * 2 - float4(-4, -5, -6, -7); 3357 else 3358 Output.Position = -g_Pos2 * 3 - float4(-4, -5, -6, -7); 3359 Output.TextureUV = float2(0, 0); 3360 Output.Diffuse = 0; 3361 Output.Diffuse.xyz = mul(vPos, m4x3column); 3362 Output.Diffuse += mul(vPos, m3x4column); 3363 Output.Diffuse += mul(vPos, m3x4row); 3364 Output.Diffuse.xyz += mul(vPos, m4x3row); 3365 Output.Diffuse += mul(vPos, ts1[0].fv); 3366 Output.Diffuse += mul(vPos, ts1[0].v2); 3367 Output.Diffuse += mul(vPos, ts2[1].fv); 3368 Output.Diffuse += mul(vPos, ts2[1].v2); 3369 Output.Diffuse += mul(vPos, arr1[0]); 3370 Output.Diffuse += mul(vPos, arr2[1]); 3371 Output.Diffuse += mul(vPos, ts3.ts[1].fv); 3372 Output.Diffuse += mul(vPos, ts3.ts[1].v2); 3373 Output.Diffuse += tex2Dlod(sampler1, g_Pos1); 3374 Output.Diffuse += tex2Dlod(samplers_array[1], g_Pos1); 3375 return Output; 3376 } 3377 3378 VS_OUTPUT RenderSceneVS2(float4 vPos : POSITION) 3379 { 3380 VS_OUTPUT Output; 3381 3382 Output.Position = g_Pos1; 3383 Output.TextureUV = float2(0, 0); 3384 Output.Diffuse = 0; 3385 return Output; 3386 } 3387 3388 struct PS_OUTPUT 3389 { 3390 float4 RGBColor : COLOR0; /* Pixel color */ 3391 }; 3392 PS_OUTPUT RenderScenePS( VS_OUTPUT In, uniform bool2x3 mb) 3393 { 3394 PS_OUTPUT Output; 3395 int i; 3396 3397 Output.RGBColor = In.Diffuse; 3398 Output.RGBColor.xy += mul(In.Diffuse, m2x2row); 3399 Output.RGBColor.xy += mul(In.Diffuse, m2x2column); 3400 Output.RGBColor.xy += mul(In.Diffuse, m3x2row); 3401 Output.RGBColor.xy += mul(In.Diffuse, m3x2column); 3402 Output.RGBColor.xyz += mul(In.Diffuse, m2x3row); 3403 Output.RGBColor.xyz += mul(In.Diffuse, m2x3column); 3404 for (i = 0; i < g_iVect.x; ++i) 3405 Output.RGBColor.xyz += mul(In.Diffuse, m2x3column); 3406 if (mb[1][1]) 3407 { 3408 Output.RGBColor += sin(Output.RGBColor); 3409 Output.RGBColor += cos(Output.RGBColor); 3410 Output.RGBColor.xyz += mul(Output.RGBColor, m2x3column); 3411 Output.RGBColor.xyz += mul(Output.RGBColor, m2x3row); 3412 Output.RGBColor.xy += mul(Output.RGBColor, m3x2column); 3413 Output.RGBColor.xy += mul(Output.RGBColor, m3x2row); 3414 } 3415 if (mb2x3column[0][0]) 3416 { 3417 Output.RGBColor += sin(Output.RGBColor); 3418 Output.RGBColor += cos(Output.RGBColor); 3419 Output.RGBColor.xyz += mul(Output.RGBColor, m2x3column); 3420 Output.RGBColor.xyz += mul(Output.RGBColor, m2x3row); 3421 Output.RGBColor.xy += mul(Output.RGBColor, m3x2column); 3422 Output.RGBColor.xy += mul(Output.RGBColor, m3x2row); 3423 } 3424 Output.RGBColor += tex2D(sampler1, In.TextureUV); 3425 Output.RGBColor += tex2D(samplers_array[0], In.TextureUV); 3426 return Output; 3427 } 3428 3429 shared vertexshader vs_arr2[2] = {compile vs_3_0 RenderSceneVS(1, true), compile vs_3_0 RenderSceneVS2()}; 3430 pixelshader ps_arr[1] = {compile ps_3_0 RenderScenePS(mb2x3row)}; 3431 3432 technique tech0 3433 { 3434 pass p0 3435 { 3436 VertexShader = vs_arr2[g_iVect.w - 1]; 3437 PixelShader = ps_arr[g_iVect.w - 1]; 3438 3439 LightEnable[0] = TRUE; 3440 LightEnable[1] = TRUE; 3441 LightEnable[2] = TRUE; 3442 LightEnable[3] = TRUE; 3443 LightEnable[4] = TRUE; 3444 LightEnable[5] = TRUE; 3445 LightEnable[6] = TRUE; 3446 LightEnable[7] = TRUE; 3447 LightType[0] = POINT; 3448 LightType[1] = POINT; 3449 LightType[2] = POINT; 3450 LightType[3] = POINT; 3451 LightType[4] = POINT; 3452 LightType[5] = POINT; 3453 LightType[6] = POINT; 3454 LightType[7] = POINT; 3455 LightDiffuse[0] = 1 / opvect1; 3456 LightDiffuse[1] = rsqrt(opvect1); 3457 LightDiffuse[2] = opvect1 * opvect2; 3458 LightDiffuse[3] = opvect1 + opvect2; 3459 LightDiffuse[4] = float4(opvect1 < opvect2); 3460 LightDiffuse[5] = float4(opvect1 >= opvect2); 3461 LightDiffuse[6] = -opvect1; 3462 LightDiffuse[7] = rcp(opvect1); 3463 3464 LightAmbient[0] = frac(opvect1); 3465 LightAmbient[1] = min(opvect1, opvect2); 3466 LightAmbient[2] = max(opvect1, opvect2); 3467 LightAmbient[3] = sin(opvect1); 3468 LightAmbient[4] = cos(opvect1); 3469 LightAmbient[5] = 1e-2 / opvect1; 3470 LightAmbient[6] = float4(0, dot(opvect1, opvect2), dot(opvect2, opvect2), 0); 3471 LightAmbient[7] = opvect1 + 1e-12 * opvect2 - opvect3; 3472 3473 LightSpecular[0] = float4(dot(opvect1.zx, opvect2.xy), dot(opvect1.zzx, opvect2.xyz), 3474 dot(opvect1.zzzx, opvect2.xxyy), 0); 3475 LightSpecular[1] = float4(opvect1[g_iVect.z], g_iVect[opvect2.y + 1], 3476 g_Selector[4 + g_iVect.w].x + g_Selector[7 + g_iVect.w].y, 3477 g_Selector[g_iVect.w].x + g_Selector[g_iVect.x].y); 3478 LightSpecular[2] = float4(dot(m4x4[3 + g_iVect.z], m4x4[g_iVect.w * 2]), ts3.ts[g_iVect.x].fv, 3479 vec3[g_iVect.z], float3(1, 2, 3)[g_iVect.w]); 3480 3481 FogEnable = TRUE; 3482 FogDensity = ts2[0].fv; 3483 FogStart = ts2[1].fv; 3484 PointScale_A = ts3.ts[0].fv; 3485 PointScale_B = ts3.ts[1].fv; 3486 } 3487 pass p1 3488 { 3489 VertexShader = vs_arr[g_iVect.z]; 3490 } 3491 } 3492 #endif 3493 static const DWORD test_effect_preshader_effect_blob[] = 3494 { 3495 0xfeff0901, 0x00001160, 0x00000000, 0x00000003, 0x00000001, 0x00000030, 0x00000000, 0x00000000, 3496 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x6f505f67, 3497 0x00003173, 0x00000003, 0x00000001, 0x00000068, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 3498 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x6f505f67, 0x00003273, 0x00000003, 3499 0x00000001, 0x000000c0, 0x00000000, 0x00000003, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 3500 0x00000000, 0x00000000, 0x41200000, 0x41200000, 0x41200000, 0x41200000, 0x459c4800, 0x459c5000, 3501 0x459c5800, 0x459c6000, 0x0000000b, 0x65535f67, 0x7463656c, 0x0000726f, 0x00000003, 0x00000001, 3502 0x000000fc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x80000000, 0xc00ccccd, 3503 0x7f7fffff, 0x00000008, 0x6576706f, 0x00317463, 0x00000003, 0x00000001, 0x00000134, 0x00000000, 3504 0x00000000, 0x00000004, 0x00000001, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x00000008, 3505 0x6576706f, 0x00327463, 0x00000003, 0x00000001, 0x0000016c, 0x00000000, 0x00000000, 0x00000004, 3506 0x00000001, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x00000008, 0x6576706f, 0x00337463, 3507 0x00000003, 0x00000001, 0x000001a4, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x3f800000, 3508 0x40000000, 0x40400000, 0x40800000, 0x0000000d, 0x74636576, 0x6d61735f, 0x72656c70, 0x00000000, 3509 0x00000003, 0x00000001, 0x000001e0, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x447a4000, 3510 0x447a8000, 0x447ac000, 0x00000005, 0x33636576, 0x00000000, 0x00000002, 0x00000001, 0x00000218, 3511 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000004, 0x00000003, 0x00000002, 0x00000001, 3512 0x00000008, 0x56695f67, 0x00746365, 0x00000010, 0x00000004, 0x00000244, 0x00000000, 0x00000003, 3513 0x00000001, 0x00000002, 0x00000003, 0x00000007, 0x615f7376, 0x00007272, 0x00000003, 0x00000002, 3514 0x000002ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x41300000, 0x41400000, 0x41500000, 3515 0x41600000, 0x41a80000, 0x41b00000, 0x41b80000, 0x41c00000, 0x41f80000, 0x42000000, 0x42040000, 3516 0x42080000, 0x42240000, 0x42280000, 0x422c0000, 0x42300000, 0x00000005, 0x3478346d, 0x00000000, 3517 0x00000003, 0x00000002, 0x00000304, 0x00000000, 0x00000000, 0x00000004, 0x00000003, 0x41300000, 3518 0x41400000, 0x41500000, 0x41a80000, 0x41b00000, 0x41b80000, 0x41f80000, 0x42000000, 0x42040000, 3519 0x42240000, 0x42280000, 0x422c0000, 0x00000008, 0x3378346d, 0x00776f72, 0x00000003, 0x00000002, 3520 0x0000035c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x41300000, 0x41400000, 0x41500000, 3521 0x41600000, 0x41a80000, 0x41b00000, 0x41b80000, 0x41c00000, 0x41f80000, 0x42000000, 0x42040000, 3522 0x42080000, 0x00000008, 0x3478336d, 0x00776f72, 0x00000003, 0x00000002, 0x000003b4, 0x00000000, 3523 0x00000000, 0x00000004, 0x00000003, 0x41300000, 0x41400000, 0x41500000, 0x41a80000, 0x41b00000, 3524 0x41b80000, 0x41f80000, 0x42000000, 0x42040000, 0x42240000, 0x42280000, 0x422c0000, 0x0000000b, 3525 0x3378346d, 0x756c6f63, 0x00006e6d, 0x00000003, 0x00000002, 0x00000410, 0x00000000, 0x00000000, 3526 0x00000003, 0x00000004, 0x41300000, 0x41400000, 0x41500000, 0x41600000, 0x41a80000, 0x41b00000, 3527 0x41b80000, 0x41c00000, 0x41f80000, 0x42000000, 0x42040000, 0x42080000, 0x0000000b, 0x3478336d, 3528 0x756c6f63, 0x00006e6d, 0x00000003, 0x00000002, 0x0000044c, 0x00000000, 0x00000000, 0x00000002, 3529 0x00000002, 0x41300000, 0x41400000, 0x41a80000, 0x41b00000, 0x00000008, 0x3278326d, 0x00776f72, 3530 0x00000003, 0x00000002, 0x00000484, 0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x41300000, 3531 0x41400000, 0x41a80000, 0x41b00000, 0x0000000b, 0x3278326d, 0x756c6f63, 0x00006e6d, 0x00000003, 3532 0x00000002, 0x000004c8, 0x00000000, 0x00000000, 0x00000002, 0x00000003, 0x41300000, 0x41400000, 3533 0x41500000, 0x41a80000, 0x41b00000, 0x41b80000, 0x00000008, 0x3378326d, 0x00776f72, 0x00000003, 3534 0x00000002, 0x00000508, 0x00000000, 0x00000000, 0x00000002, 0x00000003, 0x41300000, 0x41400000, 3535 0x41500000, 0x41a80000, 0x41b00000, 0x41b80000, 0x0000000b, 0x3378326d, 0x756c6f63, 0x00006e6d, 3536 0x00000003, 0x00000002, 0x0000054c, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x41300000, 3537 0x41400000, 0x41a80000, 0x41b00000, 0x41f80000, 0x42000000, 0x00000008, 0x3278336d, 0x00776f72, 3538 0x00000003, 0x00000002, 0x0000058c, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x41300000, 3539 0x41400000, 0x41a80000, 0x41b00000, 0x41f80000, 0x42000000, 0x0000000b, 0x3278336d, 0x756c6f63, 3540 0x00006e6d, 0x00000001, 0x00000002, 0x000005d0, 0x00000000, 0x00000000, 0x00000002, 0x00000003, 3541 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000009, 0x7832626d, 3542 0x776f7233, 0x00000000, 0x00000001, 0x00000002, 0x00000614, 0x00000000, 0x00000000, 0x00000002, 3543 0x00000003, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x0000000c, 3544 0x7832626d, 0x6c6f6333, 0x006e6d75, 0x00000000, 0x00000005, 0x000006b0, 0x00000000, 0x00000001, 3545 0x00000003, 0x00000003, 0x00000001, 0x000006b8, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 3546 0x00000003, 0x00000000, 0x000006c0, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 3547 0x00000001, 0x000006c8, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x41100000, 0x41200000, 3548 0x41300000, 0x41400000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x00000004, 0x00317374, 3549 0x00000003, 0x00003176, 0x00000003, 0x00007666, 0x00000003, 0x00003276, 0x00000000, 0x00000005, 3550 0x0000077c, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00000001, 0x00000784, 0x00000000, 3551 0x00000000, 0x00000003, 0x00000001, 0x00000003, 0x00000000, 0x0000078c, 0x00000000, 0x00000000, 3552 0x00000001, 0x00000001, 0x00000003, 0x00000001, 0x00000794, 0x00000000, 0x00000000, 0x00000004, 3553 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3554 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 0x40a00000, 0x40c00000, 0x40e00000, 3555 0x41000000, 0x00000004, 0x00327374, 0x00000003, 0x00003176, 0x00000003, 0x00007666, 0x00000003, 3556 0x00003276, 0x00000000, 0x00000005, 0x00000860, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 3557 0x00000005, 0x00000868, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00000001, 0x00000870, 3558 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x00000003, 0x00000000, 0x00000878, 0x00000000, 3559 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00000001, 0x00000880, 0x00000000, 0x00000000, 3560 0x00000004, 0x00000001, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 0x40a00000, 0x40c00000, 3561 0x40e00000, 0x41000000, 0x41100000, 0x41200000, 0x41300000, 0x41400000, 0x41500000, 0x41600000, 3562 0x41700000, 0x41800000, 0x00000004, 0x00337374, 0x00000003, 0x00007374, 0x00000003, 0x00003176, 3563 0x00000003, 0x00007666, 0x00000003, 0x00003276, 0x00000003, 0x00000000, 0x000008a8, 0x00000000, 3564 0x00000001, 0x00000001, 0x00000001, 0x42b60000, 0x00000005, 0x31727261, 0x00000000, 0x00000003, 3565 0x00000000, 0x000008d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x42b80000, 0x42ba0000, 3566 0x00000005, 0x32727261, 0x00000000, 0x00000007, 0x00000004, 0x000008fc, 0x00000000, 0x00000000, 3567 0x00000004, 0x00000005, 0x31786574, 0x00000000, 0x00000007, 0x00000004, 0x00000920, 0x00000000, 3568 0x00000000, 0x00000005, 0x00000005, 0x32786574, 0x00000000, 0x0000000a, 0x00000004, 0x000009cc, 3569 0x00000000, 0x00000000, 0x00000006, 0x00000007, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 3570 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 3571 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 3572 0x00000003, 0x000000a4, 0x00000100, 0x00000944, 0x00000940, 0x000000aa, 0x00000100, 0x0000095c, 3573 0x00000958, 0x000000a9, 0x00000100, 0x0000097c, 0x00000978, 0x00000009, 0x706d6173, 0x3172656c, 3574 0x00000000, 0x0000000a, 0x00000004, 0x00000ab8, 0x00000000, 0x00000002, 0x00000001, 0x00000002, 3575 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 3576 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 3577 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 3578 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x000000aa, 3579 0x00000100, 0x000009f4, 0x000009f0, 0x000000a9, 0x00000100, 0x00000a14, 0x00000a10, 0x00000002, 3580 0x000000aa, 0x00000100, 0x00000a34, 0x00000a30, 0x000000a9, 0x00000100, 0x00000a54, 0x00000a50, 3581 0x0000000f, 0x706d6173, 0x7372656c, 0x7272615f, 0x00007961, 0x00000010, 0x00000004, 0x00000ae8, 3582 0x00000000, 0x00000002, 0x00000007, 0x00000008, 0x00000008, 0x615f7376, 0x00327272, 0x0000000f, 3583 0x00000004, 0x00000b0c, 0x00000000, 0x00000001, 0x00000009, 0x00000007, 0x615f7370, 0x00007272, 3584 0x0000000a, 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x0000000b, 0x0000000f, 3585 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3586 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3587 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3588 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3589 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3590 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3591 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3592 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3593 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3594 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3595 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3596 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3597 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3598 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3599 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3600 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 3601 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3602 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 3603 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 3604 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 3605 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 3606 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 3607 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 3608 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 3609 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 3610 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 3611 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 3612 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3613 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 3614 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 3615 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 3616 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 3617 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 3618 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 3619 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 3620 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 3621 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 3622 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 3623 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3624 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 3625 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 3626 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 3627 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 3628 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00000002, 3629 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00000002, 3630 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00000002, 3631 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00000002, 3632 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00003070, 0x0000000c, 3633 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00003170, 0x00000006, 3634 0x68636574, 0x00000030, 0x00000022, 0x00000001, 0x0000000e, 0x0000000d, 0x00000004, 0x00000020, 3635 0x00000000, 0x00000000, 0x0000003c, 0x00000058, 0x00000000, 0x00000000, 0x00000074, 0x00000090, 3636 0x00000000, 0x00000000, 0x000000d0, 0x000000ec, 0x00000000, 0x00000000, 0x00000108, 0x00000124, 3637 0x00000000, 0x00000000, 0x00000140, 0x0000015c, 0x00000000, 0x00000000, 0x00000178, 0x00000194, 3638 0x00000000, 0x00000000, 0x000001b8, 0x000001d4, 0x00000000, 0x00000000, 0x000001ec, 0x00000208, 3639 0x00000000, 0x00000000, 0x00000224, 0x00000238, 0x00000000, 0x00000000, 0x00000250, 0x0000026c, 3640 0x00000000, 0x00000000, 0x000002b8, 0x000002d4, 0x00000000, 0x00000000, 0x00000310, 0x0000032c, 3641 0x00000000, 0x00000000, 0x00000368, 0x00000384, 0x00000000, 0x00000000, 0x000003c4, 0x000003e0, 3642 0x00000000, 0x00000000, 0x00000420, 0x0000043c, 0x00000000, 0x00000000, 0x00000458, 0x00000474, 3643 0x00000000, 0x00000000, 0x00000494, 0x000004b0, 0x00000000, 0x00000000, 0x000004d4, 0x000004f0, 3644 0x00000000, 0x00000000, 0x00000518, 0x00000534, 0x00000000, 0x00000000, 0x00000558, 0x00000574, 3645 0x00000000, 0x00000000, 0x0000059c, 0x000005b8, 0x00000000, 0x00000000, 0x000005e0, 0x000005fc, 3646 0x00000000, 0x00000000, 0x00000624, 0x00000690, 0x00000000, 0x00000000, 0x000006d0, 0x0000073c, 3647 0x00000001, 0x00000000, 0x0000079c, 0x00000820, 0x00000000, 0x00000000, 0x00000888, 0x000008a4, 3648 0x00000000, 0x00000000, 0x000008b4, 0x000008d0, 0x00000001, 0x00000000, 0x000008e4, 0x000008f8, 3649 0x00000000, 0x00000000, 0x00000908, 0x0000091c, 0x00000000, 0x00000000, 0x0000092c, 0x00000998, 3650 0x00000000, 0x00000000, 0x000009dc, 0x00000a70, 0x00000000, 0x00000000, 0x00000acc, 0x00000ae0, 3651 0x00000001, 0x00000000, 0x00000af4, 0x00000b08, 0x00000000, 0x00000000, 0x00001154, 0x00000000, 3652 0x00000002, 0x0000112c, 0x00000000, 0x0000002a, 0x00000092, 0x00000000, 0x00000b1c, 0x00000b18, 3653 0x00000093, 0x00000000, 0x00000b34, 0x00000b30, 0x00000091, 0x00000000, 0x00000b4c, 0x00000b48, 3654 0x00000091, 0x00000001, 0x00000b6c, 0x00000b68, 0x00000091, 0x00000002, 0x00000b8c, 0x00000b88, 3655 0x00000091, 0x00000003, 0x00000bac, 0x00000ba8, 0x00000091, 0x00000004, 0x00000bcc, 0x00000bc8, 3656 0x00000091, 0x00000005, 0x00000bec, 0x00000be8, 0x00000091, 0x00000006, 0x00000c0c, 0x00000c08, 3657 0x00000091, 0x00000007, 0x00000c2c, 0x00000c28, 0x00000084, 0x00000000, 0x00000c4c, 0x00000c48, 3658 0x00000084, 0x00000001, 0x00000c6c, 0x00000c68, 0x00000084, 0x00000002, 0x00000c8c, 0x00000c88, 3659 0x00000084, 0x00000003, 0x00000cac, 0x00000ca8, 0x00000084, 0x00000004, 0x00000ccc, 0x00000cc8, 3660 0x00000084, 0x00000005, 0x00000cec, 0x00000ce8, 0x00000084, 0x00000006, 0x00000d0c, 0x00000d08, 3661 0x00000084, 0x00000007, 0x00000d2c, 0x00000d28, 0x00000085, 0x00000000, 0x00000d58, 0x00000d48, 3662 0x00000085, 0x00000001, 0x00000d84, 0x00000d74, 0x00000085, 0x00000002, 0x00000db0, 0x00000da0, 3663 0x00000085, 0x00000003, 0x00000ddc, 0x00000dcc, 0x00000085, 0x00000004, 0x00000e08, 0x00000df8, 3664 0x00000085, 0x00000005, 0x00000e34, 0x00000e24, 0x00000085, 0x00000006, 0x00000e60, 0x00000e50, 3665 0x00000085, 0x00000007, 0x00000e8c, 0x00000e7c, 0x00000087, 0x00000000, 0x00000eb8, 0x00000ea8, 3666 0x00000087, 0x00000001, 0x00000ee4, 0x00000ed4, 0x00000087, 0x00000002, 0x00000f10, 0x00000f00, 3667 0x00000087, 0x00000003, 0x00000f3c, 0x00000f2c, 0x00000087, 0x00000004, 0x00000f68, 0x00000f58, 3668 0x00000087, 0x00000005, 0x00000f94, 0x00000f84, 0x00000087, 0x00000006, 0x00000fc0, 0x00000fb0, 3669 0x00000087, 0x00000007, 0x00000fec, 0x00000fdc, 0x00000086, 0x00000000, 0x00001018, 0x00001008, 3670 0x00000086, 0x00000001, 0x00001044, 0x00001034, 0x00000086, 0x00000002, 0x00001070, 0x00001060, 3671 0x0000000e, 0x00000000, 0x00001090, 0x0000108c, 0x00000014, 0x00000000, 0x000010b0, 0x000010ac, 3672 0x00000012, 0x00000000, 0x000010d0, 0x000010cc, 0x00000041, 0x00000000, 0x000010f0, 0x000010ec, 3673 0x00000042, 0x00000000, 0x00001110, 0x0000110c, 0x0000114c, 0x00000000, 0x00000001, 0x00000092, 3674 0x00000000, 0x00001138, 0x00001134, 0x00000008, 0x0000001f, 0x00000009, 0x00000ad0, 0xffff0300, 3675 0x00d9fffe, 0x42415443, 0x0000001c, 0x0000032f, 0xffff0300, 0x0000000b, 0x0000001c, 0x00000000, 3676 0x00000328, 0x000000f8, 0x00000001, 0x00000001, 0x00000100, 0x00000110, 0x00000120, 0x00080002, 3677 0x00000002, 0x0000012c, 0x0000013c, 0x0000015c, 0x00060002, 0x00000002, 0x00000164, 0x00000174, 3678 0x00000194, 0x00000002, 0x00000003, 0x000001a0, 0x000001b0, 0x000001e0, 0x000a0002, 0x00000002, 3679 0x000001e8, 0x000001f8, 0x00000218, 0x000c0002, 0x00000002, 0x00000224, 0x00000234, 0x00000254, 3680 0x00030002, 0x00000003, 0x0000025c, 0x0000026c, 0x0000029c, 0x00050000, 0x00000001, 0x000002a8, 3681 0x000002b8, 0x000002d0, 0x00000000, 0x00000005, 0x000002dc, 0x000002b8, 0x000002ec, 0x00000003, 3682 0x00000001, 0x000002f8, 0x00000000, 0x00000308, 0x00010003, 0x00000001, 0x00000318, 0x00000000, 3683 0x56695f67, 0x00746365, 0x00020001, 0x00040001, 0x00000001, 0x00000000, 0x00000004, 0x00000003, 3684 0x00000002, 0x00000001, 0x3278326d, 0x756c6f63, 0xab006e6d, 0x00030003, 0x00020002, 0x00000001, 3685 0x00000000, 0x41300000, 0x41a80000, 0x00000000, 0x00000000, 0x41400000, 0x41b00000, 0x00000000, 3686 0x00000000, 0x3278326d, 0x00776f72, 0x00030002, 0x00020002, 0x00000001, 0x00000000, 0x41300000, 3687 0x41400000, 0x00000000, 0x00000000, 0x41a80000, 0x41b00000, 0x00000000, 0x00000000, 0x3378326d, 3688 0x756c6f63, 0xab006e6d, 0x00030003, 0x00030002, 0x00000001, 0x00000000, 0x41300000, 0x41a80000, 3689 0x00000000, 0x00000000, 0x41400000, 0x41b00000, 0x00000000, 0x00000000, 0x41500000, 0x41b80000, 3690 0x00000000, 0x00000000, 0x3378326d, 0x00776f72, 0x00030002, 0x00030002, 0x00000001, 0x00000000, 3691 0x41300000, 0x41400000, 0x41500000, 0x00000000, 0x41a80000, 0x41b00000, 0x41b80000, 0x00000000, 3692 0x3278336d, 0x756c6f63, 0xab006e6d, 0x00030003, 0x00020003, 0x00000001, 0x00000000, 0x41300000, 3693 0x41a80000, 0x41f80000, 0x00000000, 0x41400000, 0x41b00000, 0x42000000, 0x00000000, 0x3278336d, 3694 0x00776f72, 0x00030002, 0x00020003, 0x00000001, 0x00000000, 0x41300000, 0x41400000, 0x00000000, 3695 0x00000000, 0x41a80000, 0x41b00000, 0x00000000, 0x00000000, 0x41f80000, 0x42000000, 0x00000000, 3696 0x00000000, 0x7832626d, 0x6c6f6333, 0x006e6d75, 0x00010003, 0x00030002, 0x00000001, 0x00000000, 3697 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x7832626d, 0x776f7233, 3698 0xababab00, 0x00010002, 0x00030002, 0x00000001, 0x00000000, 0x706d6173, 0x3172656c, 0xababab00, 3699 0x000c0004, 0x00010001, 0x00000001, 0x00000000, 0x706d6173, 0x7372656c, 0x7272615f, 0xab007961, 3700 0x000c0004, 0x00010001, 0x00000002, 0x00000000, 0x335f7370, 0x4d00305f, 0x6f726369, 0x74666f73, 3701 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 3702 0x332e3235, 0x00313131, 0x05000051, 0xa00f000e, 0x3d2aaaa4, 0xbf000000, 0x3f800000, 0xbe22f983, 3703 0x05000051, 0xa00f000f, 0x40c90fdb, 0xc0490fdb, 0xb4878163, 0x37cfb5a1, 0x05000051, 0xa00f0010, 3704 0x00000000, 0x3e22f983, 0x3e800000, 0xbab609ba, 0x0200001f, 0x80000005, 0x90030000, 0x0200001f, 3705 0x8000000a, 0x900f0001, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, 3706 0x03000005, 0x80030000, 0xa0e40007, 0x90550001, 0x04000004, 0x80030000, 0x90000001, 0xa0e40006, 3707 0x80e40000, 0x03000002, 0x80030000, 0x80e40000, 0x90e40001, 0x02000001, 0x80010001, 0xa0000010, 3708 0x0400005a, 0x80010002, 0x90e40001, 0xa0e40008, 0x80000001, 0x0400005a, 0x80020002, 0x90e40001, 3709 0xa0e40009, 0x80000001, 0x03000002, 0x80030000, 0x80e40000, 0x80e40002, 0x03000005, 0x800c0000, 3710 0xa0440004, 0x90550001, 0x04000004, 0x800c0000, 0x90000001, 0xa0440003, 0x80e40000, 0x04000004, 3711 0x800c0000, 0x90aa0001, 0xa0440005, 0x80e40000, 0x03000002, 0x80030000, 0x80ee0000, 0x80e40000, 3712 0x03000008, 0x80010002, 0x90e40001, 0xa0e4000c, 0x03000008, 0x80020002, 0x90e40001, 0xa0e4000d, 3713 0x03000002, 0x80030000, 0x80e40000, 0x80e40002, 0x03000005, 0x800e0001, 0xa090000b, 0x90550001, 3714 0x04000004, 0x800e0001, 0x90000001, 0xa090000a, 0x80e40001, 0x02000001, 0x80040000, 0x90aa0001, 3715 0x03000002, 0x80070000, 0x80e40000, 0x80f90001, 0x0400005a, 0x80010002, 0x90e40001, 0xa0e40000, 3716 0x80000001, 0x0400005a, 0x80020002, 0x90e40001, 0xa0e40001, 0x80000001, 0x0400005a, 0x80040002, 3717 0x90e40001, 0xa0e40002, 0x80000001, 0x03000002, 0x80070000, 0x80e40000, 0x80e40002, 0x02000001, 3718 0x80070003, 0x80e40000, 0x01000026, 0xf0e40000, 0x03000002, 0x80070003, 0x80e40002, 0x80e40003, 3719 0x00000027, 0x01000028, 0xe0e40804, 0x02000001, 0x80080003, 0x90ff0001, 0x04000004, 0x800f0000, 3720 0x80e40003, 0xa0550010, 0xa0aa0010, 0x02000013, 0x800f0000, 0x80e40000, 0x04000004, 0x800f0000, 3721 0x80e40000, 0xa000000f, 0xa055000f, 0x03000005, 0x800f0000, 0x80e40000, 0x80e40000, 0x04000004, 3722 0x800f0002, 0x80e40000, 0xa0aa000f, 0xa0ff000f, 0x04000004, 0x800f0002, 0x80e40000, 0x80e40002, 3723 0xa0ff0010, 0x04000004, 0x800f0002, 0x80e40000, 0x80e40002, 0xa000000e, 0x04000004, 0x800f0002, 3724 0x80e40000, 0x80e40002, 0xa055000e, 0x04000004, 0x800f0000, 0x80e40000, 0x80e40002, 0x80e40003, 3725 0x03000002, 0x800f0000, 0x80e40000, 0xa0aa000e, 0x04000004, 0x800f0002, 0x80e40000, 0xa1ff000e, 3726 0xa155000e, 0x02000013, 0x800f0002, 0x80e40002, 0x04000004, 0x800f0002, 0x80e40002, 0xa000000f, 3727 0xa055000f, 0x03000005, 0x800f0002, 0x80e40002, 0x80e40002, 0x04000004, 0x800f0004, 0x80e40002, 3728 0xa0aa000f, 0xa0ff000f, 0x04000004, 0x800f0004, 0x80e40002, 0x80e40004, 0xa0ff0010, 0x04000004, 3729 0x800f0004, 0x80e40002, 0x80e40004, 0xa000000e, 0x04000004, 0x800f0004, 0x80e40002, 0x80e40004, 3730 0xa055000e, 0x04000004, 0x800f0000, 0x80e40002, 0x80e40004, 0x80e40000, 0x03000002, 0x800f0003, 3731 0x80e40000, 0xa0aa000e, 0x0400005a, 0x80010000, 0x80e40003, 0xa0e40000, 0x80000001, 0x0400005a, 3732 0x80020000, 0x80e40003, 0xa0e40001, 0x80000001, 0x0400005a, 0x80040000, 0x80e40003, 0xa0e40002, 3733 0x80000001, 0x03000002, 0x80070000, 0x80e40000, 0x80e40003, 0x03000005, 0x800e0001, 0x80550000, 3734 0xa090000b, 0x04000004, 0x800e0001, 0x80000000, 0xa090000a, 0x80e40001, 0x03000002, 0x80070003, 3735 0x80e40000, 0x80f90001, 0x03000008, 0x80010000, 0x80e40003, 0xa0e4000c, 0x03000008, 0x80020000, 3736 0x80e40003, 0xa0e4000d, 0x03000002, 0x80030000, 0x80e40000, 0x80e40003, 0x03000005, 0x800c0000, 3737 0x80550000, 0xa0440004, 0x04000004, 0x800c0000, 0x80000000, 0xa0440003, 0x80e40000, 0x04000004, 3738 0x800c0000, 0x80aa0003, 0xa0440005, 0x80e40000, 0x03000002, 0x80030003, 0x80ee0000, 0x80e40000, 3739 0x0000002a, 0x02000001, 0x80080003, 0x90ff0001, 0x0000002b, 0x01000028, 0xe0e40805, 0x04000004, 3740 0x800f0000, 0x80e40003, 0xa0550010, 0xa0aa0010, 0x02000013, 0x800f0000, 0x80e40000, 0x04000004, 3741 0x800f0000, 0x80e40000, 0xa000000f, 0xa055000f, 0x03000005, 0x800f0000, 0x80e40000, 0x80e40000, 3742 0x04000004, 0x800f0002, 0x80e40000, 0xa0aa000f, 0xa0ff000f, 0x04000004, 0x800f0002, 0x80e40000, 3743 0x80e40002, 0xa0ff0010, 0x04000004, 0x800f0002, 0x80e40000, 0x80e40002, 0xa000000e, 0x04000004, 3744 0x800f0002, 0x80e40000, 0x80e40002, 0xa055000e, 0x04000004, 0x800f0000, 0x80e40000, 0x80e40002, 3745 0x80e40003, 0x03000002, 0x800f0000, 0x80e40000, 0xa0aa000e, 0x04000004, 0x800f0002, 0x80e40000, 3746 0xa1ff000e, 0xa155000e, 0x02000013, 0x800f0002, 0x80e40002, 0x04000004, 0x800f0002, 0x80e40002, 3747 0xa000000f, 0xa055000f, 0x03000005, 0x800f0002, 0x80e40002, 0x80e40002, 0x04000004, 0x800f0004, 3748 0x80e40002, 0xa0aa000f, 0xa0ff000f, 0x04000004, 0x800f0004, 0x80e40002, 0x80e40004, 0xa0ff0010, 3749 0x04000004, 0x800f0004, 0x80e40002, 0x80e40004, 0xa000000e, 0x04000004, 0x800f0004, 0x80e40002, 3750 0x80e40004, 0xa055000e, 0x04000004, 0x800f0000, 0x80e40002, 0x80e40004, 0x80e40000, 0x03000002, 3751 0x800f0003, 0x80e40000, 0xa0aa000e, 0x0400005a, 0x80010000, 0x80e40003, 0xa0e40000, 0x80000001, 3752 0x0400005a, 0x80020000, 0x80e40003, 0xa0e40001, 0x80000001, 0x0400005a, 0x80040000, 0x80e40003, 3753 0xa0e40002, 0x80000001, 0x03000002, 0x80070000, 0x80e40000, 0x80e40003, 0x03000005, 0x80070001, 3754 0x80550000, 0xa0e4000b, 0x04000004, 0x80070001, 0x80000000, 0xa0e4000a, 0x80e40001, 0x03000002, 3755 0x80070003, 0x80e40000, 0x80e40001, 0x03000008, 0x80010000, 0x80e40003, 0xa0e4000c, 0x03000008, 3756 0x80020000, 0x80e40003, 0xa0e4000d, 0x03000002, 0x80030000, 0x80e40000, 0x80e40003, 0x03000005, 3757 0x800c0000, 0x80550000, 0xa0440004, 0x04000004, 0x800c0000, 0x80000000, 0xa0440003, 0x80e40000, 3758 0x04000004, 0x800c0000, 0x80aa0003, 0xa0440005, 0x80e40000, 0x03000002, 0x80030003, 0x80ee0000, 3759 0x80e40000, 0x0000002b, 0x03000042, 0x800f0000, 0x90e40000, 0xa0e40800, 0x03000002, 0x800f0000, 3760 0x80e40000, 0x80e40003, 0x03000042, 0x800f0001, 0x90e40000, 0xa0e40801, 0x03000002, 0x800f0800, 3761 0x80e40000, 0x80e40001, 0x0000ffff, 0x00000007, 0x00000b6c, 0xfffe0300, 0x013cfffe, 0x42415443, 3762 0x0000001c, 0x000004bb, 0xfffe0300, 0x0000000c, 0x0000001c, 0x00000000, 0x000004b4, 0x0000010c, 3763 0x00200002, 0x00000001, 0x00000114, 0x00000124, 0x00000134, 0x001d0002, 0x00000002, 0x0000013c, 3764 0x0000014c, 0x0000016c, 0x001f0002, 0x00000001, 0x00000174, 0x00000184, 0x00000194, 0x00100002, 3765 0x00000004, 0x000001a0, 0x000001b0, 0x000001f0, 0x00140002, 0x00000003, 0x000001f8, 0x00000208, 3766 0x00000238, 0x00170002, 0x00000003, 0x00000244, 0x00000254, 0x00000284, 0x000c0002, 0x00000004, 3767 0x0000028c, 0x0000029c, 0x000002dc, 0x00020003, 0x00000001, 0x000002e8, 0x00000000, 0x000002f8, 3768 0x00000003, 0x00000002, 0x00000308, 0x00000000, 0x00000318, 0x001a0002, 0x00000003, 0x00000370, 3769 0x00000380, 0x000003b0, 0x00000002, 0x00000006, 0x000003b4, 0x000003c4, 0x00000424, 0x00060002, 3770 0x00000006, 0x00000444, 0x00000454, 0x31727261, 0xababab00, 0x00030000, 0x00010001, 0x00000001, 3771 0x00000000, 0x42b60000, 0x00000000, 0x00000000, 0x00000000, 0x32727261, 0xababab00, 0x00030000, 3772 0x00010001, 0x00000002, 0x00000000, 0x42b80000, 0x00000000, 0x00000000, 0x00000000, 0x42ba0000, 3773 0x00000000, 0x00000000, 0x00000000, 0x6f505f67, 0xab003173, 0x00030001, 0x00040001, 0x00000001, 3774 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3478336d, 0x756c6f63, 0xab006e6d, 3775 0x00030003, 0x00040003, 0x00000001, 0x00000000, 0x41300000, 0x41a80000, 0x41f80000, 0x00000000, 3776 0x41400000, 0x41b00000, 0x42000000, 0x00000000, 0x41500000, 0x41b80000, 0x42040000, 0x00000000, 3777 0x41600000, 0x41c00000, 0x42080000, 0x00000000, 0x3478336d, 0x00776f72, 0x00030002, 0x00040003, 3778 0x00000001, 0x00000000, 0x41300000, 0x41400000, 0x41500000, 0x41600000, 0x41a80000, 0x41b00000, 3779 0x41b80000, 0x41c00000, 0x41f80000, 0x42000000, 0x42040000, 0x42080000, 0x3378346d, 0x756c6f63, 3780 0xab006e6d, 0x00030003, 0x00030004, 0x00000001, 0x00000000, 0x41300000, 0x41a80000, 0x41f80000, 3781 0x42240000, 0x41400000, 0x41b00000, 0x42000000, 0x42280000, 0x41500000, 0x41b80000, 0x42040000, 3782 0x422c0000, 0x3378346d, 0x00776f72, 0x00030002, 0x00030004, 0x00000001, 0x00000000, 0x41300000, 3783 0x41400000, 0x41500000, 0x00000000, 0x41a80000, 0x41b00000, 0x41b80000, 0x00000000, 0x41f80000, 3784 0x42000000, 0x42040000, 0x00000000, 0x42240000, 0x42280000, 0x422c0000, 0x00000000, 0x706d6173, 3785 0x3172656c, 0xababab00, 0x000c0004, 0x00010001, 0x00000001, 0x00000000, 0x706d6173, 0x7372656c, 3786 0x7272615f, 0xab007961, 0x000c0004, 0x00010001, 0x00000002, 0x00000000, 0x00317374, 0xab003176, 3787 0x00030001, 0x00030001, 0x00000001, 0x00000000, 0xab007666, 0x00030000, 0x00010001, 0x00000001, 3788 0x00000000, 0xab003276, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x0000031c, 0x00000320, 3789 0x00000330, 0x00000334, 0x00000344, 0x00000348, 0x00000005, 0x00080001, 0x00030001, 0x00000358, 3790 0x41100000, 0x41200000, 0x41300000, 0x00000000, 0x41400000, 0x00000000, 0x00000000, 0x00000000, 3791 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x00327374, 0x00000005, 0x00080001, 0x00030002, 3792 0x00000358, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3793 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 3794 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 0x40e00000, 3795 0x41000000, 0x00337374, 0xab007374, 0x00000005, 0x00080001, 0x00030002, 0x00000358, 0x00000428, 3796 0x0000042c, 0x00000005, 0x00100001, 0x00010001, 0x0000043c, 0x3f800000, 0x40000000, 0x40400000, 3797 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 0x40e00000, 3798 0x41000000, 0x41100000, 0x41200000, 0x41300000, 0x00000000, 0x41400000, 0x00000000, 0x00000000, 3799 0x00000000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x335f7376, 0x4d00305f, 0x6f726369, 3800 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 3801 0x392e3932, 0x332e3235, 0x00313131, 0x00f0fffe, 0x53455250, 0x46580201, 0x0047fffe, 0x42415443, 3802 0x0000001c, 0x000000e7, 0x46580201, 0x00000003, 0x0000001c, 0x00000100, 0x000000e4, 0x00000058, 3803 0x00020002, 0x00000001, 0x00000060, 0x00000070, 0x00000080, 0x00030002, 0x00000001, 0x00000088, 3804 0x00000070, 0x00000098, 0x00000002, 0x00000002, 0x000000a4, 0x000000b4, 0x6f505f67, 0xab003173, 3805 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3806 0x6f505f67, 0xab003273, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x65535f67, 0x7463656c, 3807 0xab00726f, 0x00030001, 0x00040001, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3808 0x00000000, 0x41200000, 0x41200000, 0x41200000, 0x41200000, 0x459c4800, 0x459c5000, 0x459c5800, 3809 0x459c6000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 3810 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x000cfffe, 0x49535250, 3811 0x00000021, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000021, 3812 0x00000001, 0x00000000, 0x00000000, 0x0032fffe, 0x54494c43, 0x00000018, 0x00000000, 0x00000000, 3813 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3814 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3815 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3816 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3fe00000, 3817 0x00000000, 0xc0000000, 0x00000000, 0xc0080000, 0x00000000, 0x00000000, 0x00000000, 0x40100000, 3818 0x00000000, 0x40140000, 0x00000000, 0x40180000, 0x00000000, 0x401c0000, 0x0064fffe, 0x434c5846, 3819 0x00000009, 0xa0500004, 0x00000002, 0x00000000, 0x00000001, 0x00000011, 0x00000000, 0x00000002, 3820 0x00000008, 0x00000000, 0x00000007, 0x00000000, 0x20400004, 0x00000002, 0x00000000, 0x00000007, 3821 0x00000000, 0x00000000, 0x00000001, 0x00000014, 0x00000000, 0x00000007, 0x00000004, 0xa0500004, 3822 0x00000002, 0x00000000, 0x00000001, 0x00000012, 0x00000000, 0x00000002, 0x0000000c, 0x00000000, 3823 0x00000007, 0x00000000, 0x20400004, 0x00000002, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 3824 0x00000001, 0x00000014, 0x00000000, 0x00000007, 0x00000008, 0x10100004, 0x00000001, 0x00000000, 3825 0x00000007, 0x00000008, 0x00000000, 0x00000007, 0x00000000, 0x20400004, 0x00000002, 0x00000000, 3826 0x00000007, 0x00000000, 0x00000000, 0x00000007, 0x00000004, 0x00000000, 0x00000007, 0x0000000c, 3827 0xa0200001, 0x00000002, 0x00000000, 0x00000001, 0x00000010, 0x00000000, 0x00000002, 0x00000005, 3828 0x00000000, 0x00000007, 0x00000000, 0xa0500004, 0x00000002, 0x00000000, 0x00000007, 0x00000000, 3829 0x00000000, 0x00000007, 0x0000000c, 0x00000000, 0x00000007, 0x00000004, 0x20400004, 0x00000002, 3830 0x00000000, 0x00000007, 0x00000004, 0x00000000, 0x00000007, 0x00000008, 0x00000000, 0x00000004, 3831 0x00000084, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x05000051, 0xa00f0022, 0x00000000, 0x00000000, 3832 0x00000000, 0x00000000, 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f, 0x90000000, 0xa00f0801, 3833 0x0200001f, 0x90000000, 0xa00f0802, 0x0200001f, 0x80000000, 0xe00f0000, 0x0200001f, 0x80000005, 3834 0xe0030001, 0x0200001f, 0x8000000a, 0xe00f0002, 0x03000009, 0x80010000, 0x90e40000, 0xa0e40017, 3835 0x03000009, 0x80020000, 0x90e40000, 0xa0e40018, 0x03000009, 0x80040000, 0x90e40000, 0xa0e40019, 3836 0x03000008, 0x80010001, 0x90e40000, 0xa0e40010, 0x03000008, 0x80020001, 0x90e40000, 0xa0e40011, 3837 0x03000008, 0x80040001, 0x90e40000, 0xa0e40012, 0x03000008, 0x80080001, 0x90e40000, 0xa0e40013, 3838 0x02000001, 0x80080000, 0xa0000022, 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000005, 3839 0x800f0001, 0xa0e40015, 0x90550000, 0x04000004, 0x800f0001, 0x90000000, 0xa0e40014, 0x80e40001, 3840 0x04000004, 0x800f0001, 0x90aa0000, 0xa0e40016, 0x80e40001, 0x03000002, 0x800f0000, 0x80e40000, 3841 0x80e40001, 0x03000005, 0x80070001, 0xa0e4000d, 0x90550000, 0x04000004, 0x80070001, 0x90000000, 3842 0xa0e4000c, 0x80e40001, 0x04000004, 0x80070001, 0x90aa0000, 0xa0e4000e, 0x80e40001, 0x04000004, 3843 0x80070001, 0x90ff0000, 0xa0e4000f, 0x80e40001, 0x03000002, 0x80070000, 0x80e40000, 0x80e40001, 3844 0x04000004, 0x800f0000, 0x90e40000, 0xa000001b, 0x80e40000, 0x03000009, 0x80010001, 0x90e40000, 3845 0xa0e4001c, 0x03000002, 0x800f0000, 0x80e40000, 0x80000001, 0x04000004, 0x800f0000, 0x90e40000, 3846 0xa0000004, 0x80e40000, 0x03000009, 0x80010001, 0x90e40000, 0xa0e40005, 0x03000002, 0x800f0000, 3847 0x80e40000, 0x80000001, 0x04000004, 0x800f0000, 0x90e40000, 0xa0000020, 0x80e40000, 0x04000004, 3848 0x800f0000, 0x90e40000, 0xa000001e, 0x80e40000, 0x04000004, 0x800f0000, 0x90e40000, 0xa000000a, 3849 0x80e40000, 0x03000009, 0x80010001, 0x90e40000, 0xa0e4000b, 0x03000002, 0x800f0000, 0x80e40000, 3850 0x80000001, 0x0300005f, 0x800f0001, 0xa0e4001f, 0xa0e40802, 0x03000002, 0x800f0000, 0x80e40000, 3851 0x80e40001, 0x0300005f, 0x800f0001, 0xa0e4001f, 0xa0e40801, 0x03000002, 0xe00f0002, 0x80e40000, 3852 0x80e40001, 0x02000001, 0xe00f0000, 0xa0e40021, 0x02000001, 0xe0030001, 0xa0000022, 0x0000ffff, 3853 0x00000008, 0x000001dc, 0xfffe0300, 0x0016fffe, 0x42415443, 0x0000001c, 0x00000023, 0xfffe0300, 3854 0x00000000, 0x00000000, 0x00000000, 0x0000001c, 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 3855 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 3856 0x332e3235, 0x00313131, 0x0045fffe, 0x53455250, 0x46580201, 0x0024fffe, 0x42415443, 0x0000001c, 3857 0x0000005b, 0x46580201, 0x00000001, 0x0000001c, 0x00000100, 0x00000058, 0x00000030, 0x00000002, 3858 0x00000001, 0x00000038, 0x00000048, 0x6f505f67, 0xab003173, 0x00030001, 0x00040001, 0x00000001, 3859 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 3860 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 3861 0x332e3235, 0x00313131, 0x000cfffe, 0x49535250, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 3862 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x0002fffe, 3863 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10000004, 0x00000001, 0x00000000, 3864 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 3865 0x05000051, 0xa00f0001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, 0x80000000, 3866 0xe00f0000, 0x0200001f, 0x80000005, 0xe0030001, 0x0200001f, 0x8000000a, 0xe00f0002, 0x02000001, 3867 0xe00f0000, 0xa0e40000, 0x02000001, 0xe0030001, 0xa0000001, 0x02000001, 0xe00f0002, 0xa0000001, 3868 0x0000ffff, 0x00000005, 0x00000000, 0x00000004, 0x00000000, 0x00000001, 0x0000002c, 0xfffe0101, 3869 0x00000051, 0xa00f0000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000001, 0xc00f0000, 3870 0xa0e40000, 0x0000ffff, 0x00000002, 0x0000002c, 0xfffe0101, 0x00000051, 0xa00f0000, 0x40000000, 3871 0x40000000, 0x40000000, 0x40000000, 0x00000001, 0xc00f0000, 0xa0e40000, 0x0000ffff, 0x00000003, 3872 0x0000002c, 0xfffe0200, 0x05000051, 0xa00f0000, 0x40400000, 0x40400000, 0x40400000, 0x40400000, 3873 0x02000001, 0xc00f0000, 0xa0e40000, 0x0000ffff, 0x00000000, 0x00000001, 0xffffffff, 0x00000000, 3874 0x00000002, 0x000000e8, 0x00000008, 0x615f7376, 0x00007272, 0x46580200, 0x0024fffe, 0x42415443, 3875 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x00000100, 0x00000058, 0x00000030, 3876 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x56695f67, 0x00746365, 0x00020001, 0x00040001, 3877 0x00000001, 0x00000000, 0x40800000, 0x40400000, 0x40000000, 0x3f800000, 0x4d007874, 0x6f726369, 3878 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 3879 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 3880 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000004, 3881 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000029, 3882 0x00000000, 0x00000198, 0x46580200, 0x0053fffe, 0x42415443, 0x0000001c, 0x00000117, 0x46580200, 3883 0x00000001, 0x0000001c, 0x20000100, 0x00000114, 0x00000030, 0x00000002, 0x00000005, 0x000000a4, 3884 0x000000b4, 0x00337374, 0x76007374, 0xabab0031, 0x00030001, 0x00030001, 0x00000001, 0x00000000, 3885 0xab007666, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0xab003276, 0x00030001, 0x00040001, 3886 0x00000001, 0x00000000, 0x00000037, 0x0000003c, 0x0000004c, 0x00000050, 0x00000060, 0x00000064, 3887 0x00000005, 0x00080001, 0x00030002, 0x00000074, 0x00000034, 0x0000008c, 0x00000005, 0x00100001, 3888 0x00010001, 0x0000009c, 0x3f800000, 0x40000000, 0x40400000, 0x00000000, 0x40800000, 0x00000000, 3889 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 0x40e00000, 0x41000000, 0x41100000, 0x41200000, 3890 0x41300000, 0x00000000, 0x41400000, 0x00000000, 0x00000000, 0x00000000, 0x41500000, 0x41600000, 3891 0x41700000, 0x41800000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 3892 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 3893 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 3894 0x00000002, 0x00000010, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 3895 0x00000000, 0x00000000, 0xffffffff, 0x00000028, 0x00000000, 0x00000198, 0x46580200, 0x0053fffe, 3896 0x42415443, 0x0000001c, 0x00000117, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000114, 3897 0x00000030, 0x00000002, 0x00000002, 0x000000a4, 0x000000b4, 0x00337374, 0x76007374, 0xabab0031, 3898 0x00030001, 0x00030001, 0x00000001, 0x00000000, 0xab007666, 0x00030000, 0x00010001, 0x00000001, 3899 0x00000000, 0xab003276, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000037, 0x0000003c, 3900 0x0000004c, 0x00000050, 0x00000060, 0x00000064, 0x00000005, 0x00080001, 0x00030002, 0x00000074, 3901 0x00000034, 0x0000008c, 0x00000005, 0x00100001, 0x00010001, 0x0000009c, 0x3f800000, 0x40000000, 3902 0x40400000, 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 3903 0x40e00000, 0x41000000, 0x41100000, 0x41200000, 0x41300000, 0x00000000, 0x41400000, 0x00000000, 3904 0x00000000, 0x00000000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x4d007874, 0x6f726369, 3905 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 3906 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 3907 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 3908 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000027, 3909 0x00000000, 0x0000017c, 0x46580200, 0x004cfffe, 0x42415443, 0x0000001c, 0x000000fb, 0x46580200, 3910 0x00000001, 0x0000001c, 0x20000100, 0x000000f8, 0x00000030, 0x00000002, 0x00000005, 0x00000088, 3911 0x00000098, 0x00327374, 0xab003176, 0x00030001, 0x00030001, 0x00000001, 0x00000000, 0xab007666, 3912 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0xab003276, 0x00030001, 0x00040001, 0x00000001, 3913 0x00000000, 0x00000034, 0x00000038, 0x00000048, 0x0000004c, 0x0000005c, 0x00000060, 0x00000005, 3914 0x00080001, 0x00030002, 0x00000070, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3915 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 3916 0x40000000, 0x40400000, 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 3917 0x40c00000, 0x40e00000, 0x41000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 3918 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 3919 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 3920 0x00000000, 0x00000002, 0x00000010, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 3921 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000026, 0x00000000, 0x0000017c, 0x46580200, 3922 0x004cfffe, 0x42415443, 0x0000001c, 0x000000fb, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 3923 0x000000f8, 0x00000030, 0x00000002, 0x00000002, 0x00000088, 0x00000098, 0x00327374, 0xab003176, 3924 0x00030001, 0x00030001, 0x00000001, 0x00000000, 0xab007666, 0x00030000, 0x00010001, 0x00000001, 3925 0x00000000, 0xab003276, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000034, 0x00000038, 3926 0x00000048, 0x0000004c, 0x0000005c, 0x00000060, 0x00000005, 0x00080001, 0x00030002, 0x00000070, 3927 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3928 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x00000000, 3929 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 0x40e00000, 0x41000000, 3930 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 3931 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 3932 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000004, 3933 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 3934 0xffffffff, 0x00000024, 0x00000000, 0x00000770, 0x46580200, 0x008cfffe, 0x42415443, 0x0000001c, 3935 0x000001fb, 0x46580200, 0x00000004, 0x0000001c, 0x20000100, 0x000001f8, 0x0000006c, 0x000b0002, 3936 0x00000001, 0x00000074, 0x00000084, 0x00000094, 0x00060002, 0x00000004, 0x0000009c, 0x000000ac, 3937 0x000000ec, 0x00000002, 0x00000006, 0x00000160, 0x00000170, 0x000001d0, 0x000a0002, 0x00000001, 3938 0x000001d8, 0x000001e8, 0x56695f67, 0x00746365, 0x00020001, 0x00040001, 0x00000001, 0x00000000, 3939 0x40800000, 0x40400000, 0x40000000, 0x3f800000, 0x3478346d, 0xababab00, 0x00030003, 0x00040004, 3940 0x00000001, 0x00000000, 0x41300000, 0x41a80000, 0x41f80000, 0x42240000, 0x41400000, 0x41b00000, 3941 0x42000000, 0x42280000, 0x41500000, 0x41b80000, 0x42040000, 0x422c0000, 0x41600000, 0x41c00000, 3942 0x42080000, 0x42300000, 0x00337374, 0x76007374, 0xabab0031, 0x00030001, 0x00030001, 0x00000001, 3943 0x00000000, 0xab007666, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0xab003276, 0x00030001, 3944 0x00040001, 0x00000001, 0x00000000, 0x000000f3, 0x000000f8, 0x00000108, 0x0000010c, 0x0000011c, 3945 0x00000120, 0x00000005, 0x00080001, 0x00030002, 0x00000130, 0x000000f0, 0x00000148, 0x00000005, 3946 0x00100001, 0x00010001, 0x00000158, 0x3f800000, 0x40000000, 0x40400000, 0x00000000, 0x40800000, 3947 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 0x40e00000, 0x41000000, 0x41100000, 3948 0x41200000, 0x41300000, 0x00000000, 0x41400000, 0x00000000, 0x00000000, 0x00000000, 0x41500000, 3949 0x41600000, 0x41700000, 0x41800000, 0x33636576, 0xababab00, 0x00030001, 0x00030001, 0x00000001, 3950 0x00000000, 0x447a4000, 0x447a8000, 0x447ac000, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 3951 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 3952 0x332e3235, 0x00313131, 0x008afffe, 0x54494c43, 0x00000044, 0x00000000, 0x00000000, 0x00000000, 3953 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3954 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3955 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3956 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3957 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3958 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3959 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3960 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3961 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3962 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3963 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3964 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3ff00000, 0x00000000, 3965 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3966 0x3ff00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3967 0x00000000, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3968 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3ff00000, 0x00000000, 0x40080000, 0x00000000, 3969 0x3ff00000, 0x00000000, 0x40000000, 0x00000000, 0x00000000, 0x00c1fffe, 0x434c5846, 0x0000000e, 3970 0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000018, 0x00000001, 0x00000002, 0x0000002e, 3971 0x00000001, 0x0000003c, 0x00000000, 0x00000007, 0x00000000, 0x50000004, 0x00000002, 0x00000000, 3972 0x00000002, 0x0000001c, 0x00000001, 0x00000002, 0x0000002e, 0x00000001, 0x0000003c, 0x00000000, 3973 0x00000007, 0x00000001, 0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000020, 0x00000001, 3974 0x00000002, 0x0000002e, 0x00000001, 0x0000003c, 0x00000000, 0x00000007, 0x00000002, 0x50000004, 3975 0x00000002, 0x00000000, 0x00000002, 0x00000024, 0x00000001, 0x00000002, 0x0000002e, 0x00000001, 3976 0x0000003c, 0x00000000, 0x00000007, 0x00000003, 0xa0400001, 0x00000002, 0x00000000, 0x00000002, 3977 0x0000002f, 0x00000000, 0x00000002, 0x0000002f, 0x00000000, 0x00000007, 0x00000004, 0x50000004, 3978 0x00000002, 0x00000000, 0x00000002, 0x00000018, 0x00000001, 0x00000007, 0x00000004, 0x00000001, 3979 0x00000030, 0x00000000, 0x00000007, 0x00000008, 0x50000004, 0x00000002, 0x00000000, 0x00000002, 3980 0x0000001c, 0x00000001, 0x00000007, 0x00000004, 0x00000001, 0x00000030, 0x00000000, 0x00000007, 3981 0x00000009, 0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000020, 0x00000001, 0x00000007, 3982 0x00000004, 0x00000001, 0x00000030, 0x00000000, 0x00000007, 0x0000000a, 0x50000004, 0x00000002, 3983 0x00000000, 0x00000002, 0x00000024, 0x00000001, 0x00000007, 0x00000004, 0x00000001, 0x00000030, 3984 0x00000000, 0x00000007, 0x0000000b, 0x50000004, 0x00000002, 0x00000000, 0x00000007, 0x00000000, 3985 0x00000000, 0x00000007, 0x00000008, 0x00000000, 0x00000004, 0x00000000, 0x50000003, 0x00000002, 3986 0x00000000, 0x00000002, 0x00000028, 0x00000001, 0x00000002, 0x0000002e, 0x00000001, 0x00000030, 3987 0x00000000, 0x00000004, 0x00000002, 0x70e00001, 0x00000006, 0x00000000, 0x00000001, 0x00000041, 3988 0x00000000, 0x00000001, 0x00000042, 0x00000000, 0x00000001, 0x00000040, 0x00000001, 0x00000002, 3989 0x0000002f, 0x00000001, 0x00000030, 0x00000001, 0x00000002, 0x0000002f, 0x00000001, 0x00000031, 3990 0x00000001, 0x00000002, 0x0000002f, 0x00000001, 0x00000032, 0x00000000, 0x00000004, 0x00000003, 3991 0xa0500001, 0x00000002, 0x00000000, 0x00000002, 0x0000002c, 0x00000000, 0x00000001, 0x00000040, 3992 0x00000000, 0x00000007, 0x00000000, 0x10000001, 0x00000001, 0x00000001, 0x00000007, 0x00000000, 3993 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000001, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 3994 0x00000000, 0x00000000, 0xffffffff, 0x00000023, 0x00000000, 0x000004ec, 0x46580200, 0x005afffe, 3995 0x42415443, 0x0000001c, 0x00000133, 0x46580200, 0x00000004, 0x0000001c, 0x20000100, 0x00000130, 3996 0x0000006c, 0x00000002, 0x00000003, 0x00000078, 0x00000088, 0x000000b8, 0x000a0002, 0x00000001, 3997 0x000000c0, 0x000000d0, 0x000000e0, 0x00080002, 0x00000001, 0x000000e8, 0x000000f8, 0x00000108, 3998 0x00090002, 0x00000001, 0x00000110, 0x00000120, 0x65535f67, 0x7463656c, 0xab00726f, 0x00030001, 3999 0x00040001, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x41200000, 4000 0x41200000, 0x41200000, 0x41200000, 0x459c4800, 0x459c5000, 0x459c5800, 0x459c6000, 0x56695f67, 4001 0x00746365, 0x00020001, 0x00040001, 0x00000001, 0x00000000, 0x40800000, 0x40400000, 0x40000000, 4002 0x3f800000, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 4003 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001, 4004 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x4d007874, 0x6f726369, 0x74666f73, 4005 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 4006 0x332e3235, 0x00313131, 0x007afffe, 0x54494c43, 0x0000003c, 0x00000000, 0x00000000, 0x00000000, 4007 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4008 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4009 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4010 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4011 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4012 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4013 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4014 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4015 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4016 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4017 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3ff00000, 0x00000000, 4018 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4019 0x3ff00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4020 0x00000000, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4021 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3ff00000, 0x0062fffe, 0x434c5846, 0x00000008, 4022 0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000020, 0x00000001, 0x00000002, 0x0000002a, 4023 0x00000001, 0x0000002c, 0x00000000, 0x00000004, 0x00000000, 0x10400001, 0x00000001, 0x00000000, 4024 0x00000002, 0x00000025, 0x00000000, 0x00000007, 0x00000000, 0x10100001, 0x00000001, 0x00000000, 4025 0x00000007, 0x00000000, 0x00000000, 0x00000007, 0x00000004, 0xa0400001, 0x00000002, 0x00000000, 4026 0x00000002, 0x00000025, 0x00000000, 0x00000001, 0x0000002c, 0x00000000, 0x00000007, 0x00000000, 4027 0xa0400001, 0x00000002, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000007, 0x00000004, 4028 0x00000000, 0x00000007, 0x00000008, 0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000028, 4029 0x00000001, 0x00000007, 0x00000008, 0x00000001, 0x0000002c, 0x00000000, 0x00000004, 0x00000001, 4030 0xa0400001, 0x00000002, 0x00000001, 0x00000002, 0x0000002b, 0x00000002, 0x00000010, 0x00000001, 4031 0x00000002, 0x0000002b, 0x00000002, 0x0000001d, 0x00000000, 0x00000004, 0x00000002, 0xa0400001, 4032 0x00000002, 0x00000001, 0x00000002, 0x00000028, 0x00000002, 0x00000001, 0x00000001, 0x00000002, 4033 0x0000002b, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 4034 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000022, 0x00000000, 0x000002cc, 0x46580200, 4035 0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 0x0000001c, 0x20000100, 4036 0x00000094, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 4037 0x00000001, 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 4038 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 4039 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x4d007874, 4040 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 4041 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x001afffe, 0x54494c43, 0x0000000c, 0x00000000, 4042 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4043 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4044 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0061fffe, 4045 0x434c5846, 0x00000006, 0xa0500001, 0x00000002, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 4046 0x00000002, 0x00000004, 0x00000000, 0x00000007, 0x00000000, 0xa0500001, 0x00000002, 0x00000000, 4047 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000005, 0x00000000, 0x00000007, 0x00000001, 4048 0xa0400001, 0x00000002, 0x00000000, 0x00000007, 0x00000001, 0x00000000, 0x00000007, 0x00000000, 4049 0x00000000, 0x00000004, 0x00000000, 0x70e00001, 0x00000006, 0x00000000, 0x00000002, 0x00000002, 4050 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 4051 0x00000004, 0x00000000, 0x00000002, 0x00000005, 0x00000000, 0x00000002, 0x00000006, 0x00000000, 4052 0x00000004, 0x00000001, 0x70e00001, 0x00000008, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 4053 0x00000002, 0x00000002, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 4054 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000002, 4055 0x00000005, 0x00000000, 0x00000002, 0x00000005, 0x00000000, 0x00000004, 0x00000002, 0x10000001, 4056 0x00000001, 0x00000000, 0x00000001, 0x00000008, 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 4057 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000021, 0x00000000, 0x00000248, 4058 0x46580200, 0x003efffe, 0x42415443, 0x0000001c, 0x000000c3, 0x46580200, 0x00000003, 0x0000001c, 4059 0x20000100, 0x000000c0, 0x00000058, 0x00000002, 0x00000001, 0x00000060, 0x00000070, 0x00000080, 4060 0x00010002, 0x00000001, 0x00000088, 0x00000098, 0x000000a8, 0x00020002, 0x00000001, 0x000000b0, 4061 0x00000070, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 4062 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001, 4063 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x6576706f, 0x00337463, 0x00030001, 4064 0x00040001, 0x00000001, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 4065 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 4066 0x0022fffe, 0x54494c43, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4067 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4068 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4069 0x00000000, 0x00000000, 0x00000000, 0x812dea11, 0x3d719799, 0x00000000, 0x00000000, 0x00000000, 4070 0x00000000, 0x00000000, 0x00000000, 0x002dfffe, 0x434c5846, 0x00000004, 0xa0500004, 0x00000002, 4071 0x00000000, 0x00000001, 0x0000000c, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000007, 4072 0x00000000, 0x20400004, 0x00000002, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000002, 4073 0x00000000, 0x00000000, 0x00000007, 0x00000004, 0x10100004, 0x00000001, 0x00000000, 0x00000002, 4074 0x00000008, 0x00000000, 0x00000007, 0x00000000, 0x20400004, 0x00000002, 0x00000000, 0x00000007, 4075 0x00000000, 0x00000000, 0x00000007, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 4076 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000020, 0x00000000, 0x000001f0, 4077 0x46580200, 0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 0x0000001c, 4078 0x20000100, 0x00000094, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 4079 0x00010002, 0x00000001, 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 4080 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 4081 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 4082 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 4083 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x001afffe, 0x54494c43, 0x0000000c, 4084 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4085 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4086 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4087 0x002afffe, 0x434c5846, 0x00000004, 0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 4088 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000001, 0x50000004, 0x00000002, 4089 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 4090 0x00000002, 0x10000001, 0x00000001, 0x00000000, 0x00000001, 0x00000008, 0x00000000, 0x00000004, 4091 0x00000000, 0x10000001, 0x00000001, 0x00000000, 0x00000001, 0x00000008, 0x00000000, 0x00000004, 4092 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x0000001f, 4093 0x00000000, 0x000001a8, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 4094 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 4095 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 4096 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 4097 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 4098 0x0012fffe, 0x54494c43, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4099 0x00000000, 0x00000000, 0x00000000, 0x47ae147b, 0x3f847ae1, 0x00000000, 0x00000000, 0x00000000, 4100 0x00000000, 0x00000000, 0x00000000, 0x002ffffe, 0x434c5846, 0x00000005, 0x10300001, 0x00000001, 4101 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x10300001, 0x00000001, 4102 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000007, 0x00000001, 0x10300001, 0x00000001, 4103 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000007, 0x00000002, 0x10300001, 0x00000001, 4104 0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000007, 0x00000003, 0xa0500004, 0x00000002, 4105 0x00000000, 0x00000001, 0x00000004, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000004, 4106 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x0000001e, 4107 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 4108 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 4109 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 4110 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 4111 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 4112 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10900004, 0x00000001, 4113 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 4114 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x0000001d, 0x00000000, 0x000000dc, 0x46580200, 4115 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 4116 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 4117 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 4118 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 4119 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 4120 0x000cfffe, 0x434c5846, 0x00000001, 0x10800004, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 4121 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 4122 0xffffffff, 0x0000001c, 0x00000000, 0x00000124, 0x46580200, 0x0033fffe, 0x42415443, 0x0000001c, 4123 0x00000097, 0x46580200, 0x00000002, 0x0000001c, 0x20000100, 0x00000094, 0x00000044, 0x00000002, 4124 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 0x00000001, 0x00000074, 0x00000084, 4125 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x80000000, 4126 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 4127 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 4128 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 4129 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe, 0x434c5846, 0x00000001, 0x20100004, 4130 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 4131 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 4132 0x0000001b, 0x00000000, 0x00000124, 0x46580200, 0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 4133 0x46580200, 0x00000002, 0x0000001c, 0x20000100, 0x00000094, 0x00000044, 0x00000002, 0x00000001, 4134 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 0x00000001, 0x00000074, 0x00000084, 0x6576706f, 4135 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 4136 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 4137 0x40000000, 0xc0400000, 0x40800000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 4138 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 4139 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe, 0x434c5846, 0x00000001, 0x20000004, 0x00000002, 4140 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 4141 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x0000001a, 4142 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 4143 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 4144 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 4145 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 4146 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 4147 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10400004, 0x00000001, 4148 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 4149 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000019, 0x00000000, 0x0000013c, 0x46580200, 4150 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 4151 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 4152 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 4153 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 4154 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 4155 0x0024fffe, 0x434c5846, 0x00000004, 0x10300001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 4156 0x00000000, 0x00000004, 0x00000000, 0x10300001, 0x00000001, 0x00000000, 0x00000002, 0x00000001, 4157 0x00000000, 0x00000004, 0x00000001, 0x10300001, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 4158 0x00000000, 0x00000004, 0x00000002, 0x10300001, 0x00000001, 0x00000000, 0x00000002, 0x00000003, 4159 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 4160 0xffffffff, 0x00000018, 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 4161 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 4162 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 4163 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 0x74666f73, 4164 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 4165 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 4166 0x10100004, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 4167 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000017, 0x00000000, 4168 0x00000124, 0x46580200, 0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 4169 0x0000001c, 0x20000100, 0x00000094, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 4170 0x0000006c, 0x00010002, 0x00000001, 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 4171 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 4172 0x00327463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 4173 0x40800000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 4174 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 4175 0x00000000, 0x000ffffe, 0x434c5846, 0x00000001, 0x20300004, 0x00000002, 0x00000000, 0x00000002, 4176 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 4177 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000016, 0x00000000, 0x00000124, 4178 0x46580200, 0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 0x0000001c, 4179 0x20000100, 0x00000094, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 4180 0x00010002, 0x00000001, 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 4181 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 4182 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 4183 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 4184 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 4185 0x000ffffe, 0x434c5846, 0x00000001, 0x20200004, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 4186 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 4187 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000015, 0x00000000, 0x00000124, 0x46580200, 4188 0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 0x0000001c, 0x20000100, 4189 0x00000094, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 4190 0x00000001, 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 4191 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 4192 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x4d007874, 4193 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 4194 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe, 4195 0x434c5846, 0x00000001, 0x20400004, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 4196 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 4197 0x00000000, 0x00000000, 0xffffffff, 0x00000014, 0x00000000, 0x00000124, 0x46580200, 0x0033fffe, 4198 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 0x0000001c, 0x20000100, 0x00000094, 4199 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 0x00000001, 4200 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 4201 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 4202 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x4d007874, 0x6f726369, 4203 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 4204 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe, 0x434c5846, 4205 0x00000001, 0x20500004, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 4206 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 4207 0x00000000, 0xffffffff, 0x00000013, 0x00000000, 0x0000013c, 0x46580200, 0x0024fffe, 0x42415443, 4208 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 4209 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 4210 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 4211 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 4212 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x0024fffe, 0x434c5846, 4213 0x00000004, 0x10700001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 4214 0x00000000, 0x10700001, 0x00000001, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000004, 4215 0x00000001, 0x10700001, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000004, 4216 0x00000002, 0x10700001, 0x00000001, 0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000004, 4217 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000012, 4218 0x00000000, 0x0000013c, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 4219 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 4220 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 4221 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 4222 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 4223 0x0002fffe, 0x54494c43, 0x00000000, 0x0024fffe, 0x434c5846, 0x00000004, 0x10300001, 0x00000001, 4224 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x10300001, 0x00000001, 4225 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000004, 0x00000001, 0x10300001, 0x00000001, 4226 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000004, 0x00000002, 0x10300001, 0x00000001, 4227 0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 4228 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000001, 0x00000002, 0x00000134, 0x00000008, 4229 0x615f7370, 0x00007272, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 4230 0x00000001, 0x0000001c, 0x00000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 4231 0x00000048, 0x56695f67, 0x00746365, 0x00020001, 0x00040001, 0x00000001, 0x00000000, 0x40800000, 4232 0x40400000, 0x40000000, 0x3f800000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 4233 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 4234 0x0012fffe, 0x54494c43, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4235 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xbff00000, 0x00000000, 0x00000000, 0x00000000, 4236 0x00000000, 0x00000000, 0x00000000, 0x000ffffe, 0x434c5846, 0x00000001, 0xa0400001, 0x00000002, 4237 0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000001, 0x00000004, 0x00000000, 0x00000004, 4238 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 4239 0x00000002, 0x00000134, 0x00000008, 0x615f7376, 0x00327272, 0x46580200, 0x0024fffe, 0x42415443, 4240 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x00000100, 0x00000058, 0x00000030, 4241 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x56695f67, 0x00746365, 0x00020001, 0x00040001, 4242 0x00000001, 0x00000000, 0x40800000, 0x40400000, 0x40000000, 0x3f800000, 0x4d007874, 0x6f726369, 4243 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 4244 0x392e3932, 0x332e3235, 0x00313131, 0x0012fffe, 0x54494c43, 0x00000008, 0x00000000, 0x00000000, 4245 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xbff00000, 4246 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000ffffe, 0x434c5846, 4247 0x00000001, 0xa0400001, 0x00000002, 0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000001, 4248 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0xffffffff, 4249 0x0000001f, 0x00000001, 0x00000001, 0x00000000, 0x000000e4, 0x46580200, 0x0026fffe, 0x42415443, 4250 0x0000001c, 0x00000063, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000060, 0x00000030, 4251 0x00000002, 0x00000001, 0x00000040, 0x00000050, 0x74636576, 0x6d61735f, 0x72656c70, 0xababab00, 4252 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 4253 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 4254 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 4255 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000001, 4256 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0xffffffff, 0x0000001f, 4257 0x00000000, 0x00000001, 0x00000000, 0x000000e4, 0x46580200, 0x0026fffe, 0x42415443, 0x0000001c, 4258 0x00000063, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000060, 0x00000030, 0x00000002, 4259 0x00000001, 0x00000040, 0x00000050, 0x74636576, 0x6d61735f, 0x72656c70, 0xababab00, 0x00030001, 4260 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 0x4d007874, 4261 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 4262 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 4263 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 4264 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0xffffffff, 0x0000001e, 0x00000000, 4265 0x00000002, 0x00000000, 0x000000f0, 0x46580200, 0x0026fffe, 0x42415443, 0x0000001c, 0x00000063, 4266 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000060, 0x00000030, 0x00000002, 0x00000001, 4267 0x00000040, 0x00000050, 0x74636576, 0x6d61735f, 0x72656c70, 0xababab00, 0x00030001, 0x00040001, 4268 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 0x4d007874, 0x6f726369, 4269 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 4270 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe, 0x434c5846, 4271 0x00000001, 0xa0400001, 0x00000002, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000002, 4272 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0xffffffff, 4273 0x0000001e, 0x00000000, 0x00000001, 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 4274 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 4275 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x56695f67, 0x00746365, 0x00020001, 0x00040001, 4276 0x00000001, 0x00000000, 0x40800000, 0x40400000, 0x40000000, 0x3f800000, 0x4d007874, 0x6f726369, 4277 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 4278 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 4279 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000004, 4280 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0xffffffff, 0x0000001e, 0x00000000, 0x00000000, 4281 0x00000001, 0x00000005, 0x31786574, 0x00000000, 4282 }; 4283 #define TEST_EFFECT_PRESHADER_VSHADER_POS 2991 4284 #define TEST_EFFECT_PRESHADER_VSHADER_LEN 13 4285 4286 #define test_effect_preshader_compare_shader_bytecode(a, b, c, d) \ 4287 test_effect_preshader_compare_shader_bytecode_(__LINE__, a, b, c, d) 4288 static void test_effect_preshader_compare_shader_bytecode_(unsigned int line, 4289 const DWORD *bytecode, unsigned int bytecode_size, int expected_shader_index, BOOL todo) 4290 { 4291 unsigned int i = 0; 4292 4293 todo_wine_if(todo) 4294 ok_(__FILE__, line)(!!bytecode, "NULL shader bytecode.\n"); 4295 4296 if (!bytecode) 4297 return; 4298 4299 while (bytecode[i++] != 0x0000ffff) 4300 ; 4301 4302 if (!bytecode_size) 4303 bytecode_size = i * sizeof(*bytecode); 4304 else 4305 ok(i * sizeof(*bytecode) == bytecode_size, "Unexpected byte code size %u.\n", bytecode_size); 4306 4307 todo_wine_if(todo) 4308 ok_(__FILE__, line)(!memcmp(bytecode, &test_effect_preshader_effect_blob[TEST_EFFECT_PRESHADER_VSHADER_POS 4309 + expected_shader_index * TEST_EFFECT_PRESHADER_VSHADER_LEN], bytecode_size), 4310 "Incorrect shader selected.\n"); 4311 } 4312 4313 #define test_effect_preshader_compare_shader(a, b, c) \ 4314 test_effect_preshader_compare_shader_(__LINE__, a, b, c) 4315 static void test_effect_preshader_compare_shader_(unsigned int line, IDirect3DDevice9 *device, 4316 int expected_shader_index, BOOL todo) 4317 { 4318 IDirect3DVertexShader9 *vshader; 4319 void *byte_code; 4320 unsigned int byte_code_size; 4321 HRESULT hr; 4322 4323 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 4324 ok_(__FILE__, line)(hr == D3D_OK, "IDirect3DDevice9_GetVertexShader result %#x.\n", hr); 4325 4326 todo_wine_if(todo) 4327 ok_(__FILE__, line)(!!vshader, "Got NULL vshader.\n"); 4328 if (!vshader) 4329 return; 4330 4331 hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size); 4332 ok_(__FILE__, line)(hr == D3D_OK, "IDirect3DVertexShader9_GetFunction %#x.\n", hr); 4333 ok_(__FILE__, line)(byte_code_size > 1, "Got unexpected byte code size %u.\n", byte_code_size); 4334 4335 byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size); 4336 hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size); 4337 ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr); 4338 4339 test_effect_preshader_compare_shader_bytecode_(line, byte_code, 4340 byte_code_size, expected_shader_index, todo); 4341 4342 HeapFree(GetProcessHeap(), 0, byte_code); 4343 IDirect3DVertexShader9_Release(vshader); 4344 } 4345 4346 static const struct 4347 { 4348 const char *comment; 4349 BOOL todo[4]; 4350 unsigned int result[4]; 4351 unsigned int ulps; 4352 } 4353 test_effect_preshader_op_expected[] = 4354 { 4355 {"1 / op", {FALSE, FALSE, FALSE, FALSE}, {0x7f800000, 0xff800000, 0xbee8ba2e, 0x00200000}}, 4356 {"rsq", {FALSE, FALSE, FALSE, FALSE}, {0x7f800000, 0x7f800000, 0x3f2c985c, 0x1f800001}, 1}, 4357 {"mul", {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x80000000, 0x40d33334, 0x7f800000}}, 4358 {"add", {FALSE, FALSE, FALSE, FALSE}, {0x3f800000, 0x40000000, 0xc0a66666, 0x7f7fffff}}, 4359 {"lt", {FALSE, FALSE, FALSE, FALSE}, {0x3f800000, 0x3f800000, 0x00000000, 0x00000000}}, 4360 {"ge", {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x00000000, 0x3f800000, 0x3f800000}}, 4361 {"neg", {FALSE, FALSE, FALSE, FALSE}, {0x80000000, 0x00000000, 0x400ccccd, 0xff7fffff}}, 4362 {"rcp", {FALSE, FALSE, FALSE, FALSE}, {0x7f800000, 0xff800000, 0xbee8ba2e, 0x00200000}}, 4363 4364 {"frac", {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x00000000, 0x3f4ccccc, 0x00000000}}, 4365 {"min", {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x80000000, 0xc0400000, 0x40800000}}, 4366 {"max", {FALSE, FALSE, FALSE, FALSE}, {0x3f800000, 0x40000000, 0xc00ccccd, 0x7f7fffff}}, 4367 #if __x86_64__ 4368 {"sin", {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x80000000, 0xbf4ef99e, 0xbf0599b3}}, 4369 {"cos", {FALSE, FALSE, FALSE, FALSE}, {0x3f800000, 0x3f800000, 0xbf16a803, 0x3f5a5f96}}, 4370 #else 4371 {"sin", {FALSE, FALSE, FALSE, TRUE}, {0x00000000, 0x80000000, 0xbf4ef99e, 0x3f792dc4}}, 4372 {"cos", {FALSE, FALSE, FALSE, TRUE}, {0x3f800000, 0x3f800000, 0xbf16a803, 0xbe6acefc}}, 4373 #endif 4374 {"den mul",{FALSE, FALSE, FALSE, FALSE}, {0x7f800000, 0xff800000, 0xbb94f209, 0x000051ec}}, 4375 {"dot", {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x7f800000, 0x41f00000, 0x00000000}}, 4376 {"prec", {FALSE, FALSE, TRUE, FALSE}, {0x2b8cbccc, 0x2c0cbccc, 0xac531800, 0x00000000}}, 4377 4378 {"dotswiz", {FALSE, FALSE, FALSE, FALSE}, {0xc00ccccd, 0xc0d33334, 0xc10ccccd, 0}}, 4379 {"reladdr", {FALSE, FALSE, FALSE, FALSE}, {0xc00ccccd, 0x3f800000, 0, 0x41200000}}, 4380 {"reladdr2", {FALSE, FALSE, FALSE, FALSE}, {0, 0, 0x447ac000, 0x40000000}}, 4381 }; 4382 4383 enum expected_state_update 4384 { 4385 EXPECTED_STATE_ZERO, 4386 EXPECTED_STATE_UPDATED, 4387 EXPECTED_STATE_ANYTHING 4388 }; 4389 4390 #define test_effect_preshader_op_results(a, b, c) test_effect_preshader_op_results_(__LINE__, a, b, c) 4391 static void test_effect_preshader_op_results_(unsigned int line, IDirect3DDevice9 *device, 4392 const enum expected_state_update *expected_state, const char *updated_param) 4393 { 4394 static const D3DCOLORVALUE black = {0.0f}; 4395 unsigned int i, j; 4396 D3DLIGHT9 light; 4397 const float *v; 4398 HRESULT hr; 4399 4400 for (i = 0; i < ARRAY_SIZE(test_effect_preshader_op_expected); ++i) 4401 { 4402 hr = IDirect3DDevice9_GetLight(device, i % 8, &light); 4403 ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr); 4404 4405 v = i < 8 ? &light.Diffuse.r : (i < 16 ? &light.Ambient.r : &light.Specular.r); 4406 if (!expected_state || expected_state[i] == EXPECTED_STATE_UPDATED) 4407 { 4408 for (j = 0; j < 4; ++j) 4409 { 4410 todo_wine_if(test_effect_preshader_op_expected[i].todo[j]) 4411 ok_(__FILE__, line)(compare_float(v[j], 4412 ((const float *)test_effect_preshader_op_expected[i].result)[j], 4413 test_effect_preshader_op_expected[i].ulps), 4414 "Operation %s, component %u, expected %#x, got %#x (%g).\n", 4415 test_effect_preshader_op_expected[i].comment, j, 4416 test_effect_preshader_op_expected[i].result[j], 4417 ((const unsigned int *)v)[j], v[j]); 4418 } 4419 } 4420 else if (expected_state[i] == EXPECTED_STATE_ZERO) 4421 { 4422 ok_(__FILE__, line)(!memcmp(v, &black, sizeof(black)), 4423 "Parameter %s, test %d, operation %s, state updated unexpectedly.\n", 4424 updated_param, i, test_effect_preshader_op_expected[i].comment); 4425 } 4426 } 4427 } 4428 4429 static const D3DXVECTOR4 test_effect_preshader_fvect_v[] = 4430 { 4431 {0.0f, 0.0f, 0.0f, 0.0f}, 4432 {0.0f, 0.0f, 0.0f, 0.0f}, 4433 {0.0f, 0.0f, 0.0f, 0.0f}, 4434 {1.0f, 2.0f, 3.0f, 0.0f}, 4435 {4.0f, 0.0f, 0.0f, 0.0f}, 4436 {5.0f, 6.0f, 7.0f, 8.0f}, 4437 {1.0f, 2.0f, 3.0f, 0.0f}, 4438 {4.0f, 0.0f, 0.0f, 0.0f}, 4439 {5.0f, 6.0f, 7.0f, 8.0f}, 4440 {9.0f, 10.0f, 11.0f, 0.0f}, 4441 {12.0f, 0.0f, 0.0f, 0.0f}, 4442 {13.0f, 14.0f, 15.0f, 16.0f}, 4443 {11.0f, 12.0f, 13.0f, 0.0f}, 4444 {21.0f, 22.0f, 23.0f, 0.0f}, 4445 {31.0f, 32.0f, 33.0f, 0.0f}, 4446 {41.0f, 42.0f, 43.0f, 0.0f}, 4447 {11.0f, 21.0f, 31.0f, 0.0f}, 4448 {12.0f, 22.0f, 32.0f, 0.0f}, 4449 {13.0f, 23.0f, 33.0f, 0.0f}, 4450 {14.0f, 24.0f, 34.0f, 0.0f}, 4451 {11.0f, 12.0f, 13.0f, 14.0f}, 4452 {21.0f, 22.0f, 23.0f, 24.0f}, 4453 {31.0f, 32.0f, 33.0f, 34.0f}, 4454 {11.0f, 21.0f, 31.0f, 41.0f}, 4455 {12.0f, 22.0f, 32.0f, 42.0f}, 4456 {13.0f, 23.0f, 33.0f, 43.0f}, 4457 {9.0f, 10.0f, 11.0f, 0.0f}, 4458 {12.0f, 0.0f, 0.0f, 0.0f}, 4459 {13.0f, 14.0f, 15.0f, 16.0f}, 4460 {92.0f, 0.0f, 0.0f, 0.0f}, 4461 {93.0f, 0.0f, 0.0f, 0.0f}, 4462 {0.0f, 0.0f, 0.0f, 0.0f}, 4463 {91.0f, 0.0f, 0.0f, 0.0f}, 4464 {4.0f, 5.0f, 6.0f, 7.0f}, 4465 }; 4466 #define TEST_EFFECT_BITMASK_BLOCK_SIZE (sizeof(unsigned int) * 8) 4467 4468 #define test_effect_preshader_compare_vconsts(a, b, c) \ 4469 test_effect_preshader_compare_vconsts_(__LINE__, a, b, c) 4470 static void test_effect_preshader_compare_vconsts_(unsigned int line, IDirect3DDevice9 *device, 4471 const unsigned int *const_updated_mask, const char *updated_param) 4472 { 4473 HRESULT hr; 4474 unsigned int i; 4475 D3DXVECTOR4 fdata[ARRAY_SIZE(test_effect_preshader_fvect_v)]; 4476 4477 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 0, &fdata[0].x, 4478 ARRAY_SIZE(test_effect_preshader_fvect_v)); 4479 ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr); 4480 4481 if (!const_updated_mask) 4482 { 4483 ok_(__FILE__, line)(!memcmp(fdata, test_effect_preshader_fvect_v, sizeof(test_effect_preshader_fvect_v)), 4484 "Vertex shader float constants do not match.\n"); 4485 } 4486 else 4487 { 4488 for (i = 0; i < ARRAY_SIZE(test_effect_preshader_fvect_v); ++i) 4489 { 4490 if (const_updated_mask[i / TEST_EFFECT_BITMASK_BLOCK_SIZE] 4491 & (1u << (i % TEST_EFFECT_BITMASK_BLOCK_SIZE))) 4492 { 4493 ok_(__FILE__, line)(!memcmp(&fdata[i], &test_effect_preshader_fvect_v[i], sizeof(fdata[i])), 4494 "Vertex shader float constants do not match, expected (%g, %g, %g, %g), " 4495 "got (%g, %g, %g, %g), parameter %s.\n", 4496 test_effect_preshader_fvect_v[i].x, test_effect_preshader_fvect_v[i].y, 4497 test_effect_preshader_fvect_v[i].z, test_effect_preshader_fvect_v[i].w, 4498 fdata[i].x, fdata[i].y, fdata[i].z, fdata[i].w, updated_param); 4499 } 4500 else 4501 { 4502 ok_(__FILE__, line)(!memcmp(&fdata[i], &fvect_filler, sizeof(fdata[i])), 4503 "Vertex shader float constants updated unexpectedly, parameter %s.\n", updated_param); 4504 } 4505 } 4506 } 4507 4508 for (i = ARRAY_SIZE(test_effect_preshader_fvect_v); i < 256; ++i) 4509 { 4510 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, i, &fdata[0].x, 1); 4511 ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr); 4512 ok_(__FILE__, line)(!memcmp(fdata, &fvect_filler, sizeof(fvect_filler)), 4513 "Vertex shader float constants do not match.\n"); 4514 } 4515 } 4516 4517 static const BOOL test_effect_preshader_bconsts[] = 4518 { 4519 TRUE, FALSE, TRUE, FALSE, TRUE, TRUE 4520 }; 4521 4522 static void test_effect_preshader_clear_pbool_consts(IDirect3DDevice9 *device) 4523 { 4524 BOOL bval; 4525 unsigned int i; 4526 HRESULT hr; 4527 4528 for (i = 0; i < 16; ++i) 4529 { 4530 bval = i < ARRAY_SIZE(test_effect_preshader_bconsts) ? !test_effect_preshader_bconsts[i] : FALSE; 4531 hr = IDirect3DDevice9_SetPixelShaderConstantB(device, i, &bval, 1); 4532 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4533 } 4534 } 4535 4536 #define test_effect_preshader_compare_pbool_consts(a, b, c) \ 4537 test_effect_preshader_compare_pbool_consts_(__LINE__, a, b, c) 4538 static void test_effect_preshader_compare_pbool_consts_(unsigned int line, IDirect3DDevice9 *device, 4539 const unsigned int *const_updated_mask, const char *updated_param) 4540 { 4541 unsigned int i; 4542 BOOL bdata[16]; 4543 HRESULT hr; 4544 4545 hr = IDirect3DDevice9_GetPixelShaderConstantB(device, 0, bdata, ARRAY_SIZE(bdata)); 4546 ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr); 4547 4548 if (!const_updated_mask) 4549 { 4550 for (i = 0; i < ARRAY_SIZE(test_effect_preshader_bconsts); ++i) 4551 { 4552 /* The negation on both sides is actually needed, sometimes you 4553 * get 0xffffffff instead of 1 on native. */ 4554 ok_(__FILE__, line)(!bdata[i] == !test_effect_preshader_bconsts[i], 4555 "Pixel shader boolean constants do not match, expected %#x, got %#x, i %u.\n", 4556 test_effect_preshader_bconsts[i], bdata[i], i); 4557 } 4558 } 4559 else 4560 { 4561 for (i = 0; i < ARRAY_SIZE(test_effect_preshader_bconsts); ++i) 4562 { 4563 if (const_updated_mask[i / TEST_EFFECT_BITMASK_BLOCK_SIZE] 4564 & (1u << (i % TEST_EFFECT_BITMASK_BLOCK_SIZE))) 4565 { 4566 /* The negation on both sides is actually needed, sometimes 4567 * you get 0xffffffff instead of 1 on native. */ 4568 ok_(__FILE__, line)(!bdata[i] == !test_effect_preshader_bconsts[i], 4569 "Pixel shader boolean constants do not match, expected %#x, got %#x, i %u, parameter %s.\n", 4570 test_effect_preshader_bconsts[i], bdata[i], i, updated_param); 4571 } 4572 else 4573 { 4574 ok_(__FILE__, line)(bdata[i] == !test_effect_preshader_bconsts[i], 4575 "Pixel shader boolean constants updated unexpectedly, parameter %s.\n", updated_param); 4576 } 4577 } 4578 } 4579 4580 for (; i < 16; ++i) 4581 { 4582 ok_(__FILE__, line)(!bdata[i], "Got result %#x, boolean register value %u.\n", hr, bdata[i]); 4583 } 4584 } 4585 4586 static void test_effect_preshader(IDirect3DDevice9 *device) 4587 { 4588 static const D3DXVECTOR4 test_effect_preshader_fvect_p[] = 4589 { 4590 {11.0f, 21.0f, 0.0f, 0.0f}, 4591 {12.0f, 22.0f, 0.0f, 0.0f}, 4592 {13.0f, 23.0f, 0.0f, 0.0f}, 4593 {11.0f, 12.0f, 0.0f, 0.0f}, 4594 {21.0f, 22.0f, 0.0f, 0.0f}, 4595 {31.0f, 32.0f, 0.0f, 0.0f}, 4596 {11.0f, 12.0f, 0.0f, 0.0f}, 4597 {21.0f, 22.0f, 0.0f, 0.0f}, 4598 {11.0f, 21.0f, 0.0f, 0.0f}, 4599 {12.0f, 22.0f, 0.0f, 0.0f}, 4600 {11.0f, 12.0f, 13.0f, 0.0f}, 4601 {21.0f, 22.0f, 23.0f, 0.0f}, 4602 {11.0f, 21.0f, 31.0f, 0.0f}, 4603 {12.0f, 22.0f, 32.0f, 0.0f} 4604 }; 4605 static const int test_effect_preshader_iconsts[][4] = 4606 { 4607 {4, 3, 2, 1} 4608 }; 4609 static const D3DXVECTOR4 fvect1 = {28.0f, 29.0f, 30.0f, 31.0f}; 4610 static const D3DXVECTOR4 fvect2 = {0.0f, 0.0f, 1.0f, 0.0f}; 4611 static const int ivect_empty[4] = {-1, -1, -1, -1}; 4612 HRESULT hr; 4613 ID3DXEffect *effect; 4614 D3DXHANDLE par; 4615 unsigned int npasses; 4616 DWORD value; 4617 D3DXVECTOR4 fdata[ARRAY_SIZE(test_effect_preshader_fvect_p)]; 4618 int idata[ARRAY_SIZE(test_effect_preshader_iconsts)][4]; 4619 IDirect3DVertexShader9 *vshader; 4620 unsigned int i; 4621 D3DCAPS9 caps; 4622 4623 hr = IDirect3DDevice9_GetDeviceCaps(device, &caps); 4624 ok(SUCCEEDED(hr), "Failed to get device caps, hr %#x.\n", hr); 4625 if (caps.VertexShaderVersion < D3DVS_VERSION(3, 0) 4626 || caps.PixelShaderVersion < D3DPS_VERSION(3, 0)) 4627 { 4628 skip("Test requires VS >= 3 and PS >= 3, skipping.\n"); 4629 return; 4630 } 4631 4632 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 4633 NULL, NULL, 0, NULL, &effect, NULL); 4634 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4635 4636 test_effect_clear_vconsts(device); 4637 4638 for (i = 0; i < 224; ++i) 4639 { 4640 hr = IDirect3DDevice9_SetPixelShaderConstantF(device, i, &fvect_filler.x, 1); 4641 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4642 } 4643 4644 test_effect_preshader_clear_pbool_consts(device); 4645 4646 for (i = 0; i < 16; ++i) 4647 { 4648 hr = IDirect3DDevice9_SetPixelShaderConstantI(device, i, ivect_empty, 1); 4649 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4650 } 4651 4652 hr = effect->lpVtbl->Begin(effect, &npasses, 0); 4653 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4654 4655 par = effect->lpVtbl->GetParameterByName(effect, NULL, "g_Pos2"); 4656 ok(par != NULL, "GetParameterByName failed.\n"); 4657 4658 hr = effect->lpVtbl->SetVector(effect, par, &fvect1); 4659 ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr); 4660 4661 hr = effect->lpVtbl->BeginPass(effect, 0); 4662 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4663 4664 hr = effect->lpVtbl->BeginPass(effect, 0); 4665 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 4666 4667 hr = effect->lpVtbl->BeginPass(effect, 1); 4668 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 4669 4670 test_effect_preshader_compare_vconsts(device, NULL, NULL); 4671 4672 hr = IDirect3DDevice9_GetPixelShaderConstantF(device, 0, &fdata[0].x, 4673 ARRAY_SIZE(test_effect_preshader_fvect_p)); 4674 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4675 ok(!memcmp(fdata, test_effect_preshader_fvect_p, sizeof(test_effect_preshader_fvect_p)), 4676 "Pixel shader float constants do not match.\n"); 4677 for (i = ARRAY_SIZE(test_effect_preshader_fvect_p); i < 224; ++i) 4678 { 4679 hr = IDirect3DDevice9_GetPixelShaderConstantF(device, i, &fdata[0].x, 1); 4680 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4681 ok(!memcmp(fdata, &fvect_filler, sizeof(fvect_filler)), 4682 "Pixel shader float constants do not match.\n"); 4683 } 4684 hr = IDirect3DDevice9_GetPixelShaderConstantI(device, 0, idata[0], 4685 ARRAY_SIZE(test_effect_preshader_iconsts)); 4686 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4687 ok(!memcmp(idata, test_effect_preshader_iconsts, sizeof(test_effect_preshader_iconsts)), 4688 "Pixel shader integer constants do not match.\n"); 4689 for (i = ARRAY_SIZE(test_effect_preshader_iconsts); i < 16; ++i) 4690 { 4691 hr = IDirect3DDevice9_GetPixelShaderConstantI(device, i, idata[0], 1); 4692 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4693 ok(!memcmp(idata[0], ivect_empty, sizeof(ivect_empty)), 4694 "Pixel shader integer constants do not match.\n"); 4695 } 4696 4697 test_effect_preshader_compare_pbool_consts(device, NULL, NULL); 4698 4699 test_effect_preshader_op_results(device, NULL, NULL); 4700 4701 hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MINFILTER, &value); 4702 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4703 ok(value == 3, "Unexpected sampler 0 minfilter %u.\n", value); 4704 hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MAGFILTER, &value); 4705 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4706 todo_wine ok(value == 3, "Unexpected sampler 0 magfilter %u.\n", value); 4707 4708 hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MINFILTER, &value); 4709 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4710 ok(value == 1, "Unexpected sampler 1 minfilter %u.\n", value); 4711 hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MAGFILTER, &value); 4712 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4713 todo_wine 4714 ok(value == 1, "Unexpected sampler 1 magfilter %u.\n", value); 4715 4716 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MINFILTER, &value); 4717 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4718 ok(value == 1, "Unexpected vertex sampler 0 minfilter %u.\n", value); 4719 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MAGFILTER, &value); 4720 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4721 todo_wine 4722 ok(value == 1, "Unexpected vertex sampler 0 magfilter %u.\n", value); 4723 4724 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MINFILTER, &value); 4725 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4726 todo_wine 4727 ok(value == 0, "Unexpected vertex sampler 1 minfilter %u.\n", value); 4728 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MAGFILTER, &value); 4729 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4730 todo_wine 4731 ok(value == 0, "Unexpected vertex sampler 1 magfilter %u.\n", value); 4732 4733 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MINFILTER, &value); 4734 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4735 ok(value == 3, "Unexpected vertex sampler 2 minfilter %u.\n", value); 4736 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MAGFILTER, &value); 4737 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4738 todo_wine ok(value == 3, "Unexpected vertex sampler 2 magfilter %u.\n", value); 4739 4740 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGDENSITY, &value); 4741 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4742 ok(value == 0, "Unexpected fog density %g.\n", *(float *)&value); 4743 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGSTART, &value); 4744 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4745 ok(*(float *)&value == 4.0f, "Unexpected fog start %g.\n", *(float *)&value); 4746 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_A, &value); 4747 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4748 ok(*(float *)&value == 4.0f, "Unexpected point scale A %g.\n", *(float *)&value); 4749 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_B, &value); 4750 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4751 ok(*(float *)&value == 12.0f, "Unexpected point scale B %g.\n", *(float *)&value); 4752 4753 hr = effect->lpVtbl->EndPass(effect); 4754 4755 par = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect"); 4756 ok(par != NULL, "GetParameterByName failed.\n"); 4757 hr = effect->lpVtbl->SetVector(effect, par, &fvect2); 4758 ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr); 4759 hr = effect->lpVtbl->BeginPass(effect, 1); 4760 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4761 4762 test_effect_preshader_compare_shader(device, 1, FALSE); 4763 4764 hr = IDirect3DDevice9_SetVertexShader(device, NULL); 4765 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4766 4767 hr = effect->lpVtbl->SetVector(effect, par, &fvect1); 4768 ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr); 4769 hr = effect->lpVtbl->CommitChanges(effect); 4770 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4771 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 4772 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4773 ok(!vshader, "Incorrect shader selected.\n"); 4774 4775 hr = effect->lpVtbl->EndPass(effect); 4776 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4777 4778 hr = effect->lpVtbl->End(effect); 4779 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4780 4781 effect->lpVtbl->Release(effect); 4782 4783 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 4784 NULL, NULL, 0, NULL, &effect, NULL); 4785 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4786 4787 hr = effect->lpVtbl->Begin(effect, &npasses, D3DXFX_DONOTSAVESTATE); 4788 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4789 4790 hr = effect->lpVtbl->BeginPass(effect, 0); 4791 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4792 4793 hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MINFILTER, &value); 4794 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4795 ok(value == 3, "Unexpected sampler 0 minfilter %u.\n", value); 4796 hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MAGFILTER, &value); 4797 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4798 todo_wine ok(value == 3, "Unexpected sampler 0 magfilter %u.\n", value); 4799 4800 hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MINFILTER, &value); 4801 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4802 ok(value == 1, "Unexpected sampler 1 minfilter %u.\n", value); 4803 hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MAGFILTER, &value); 4804 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4805 todo_wine 4806 ok(value == 1, "Unexpected sampler 1 magfilter %u.\n", value); 4807 4808 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MINFILTER, &value); 4809 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4810 ok(value == 1, "Unexpected vertex sampler 0 minfilter %u.\n", value); 4811 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MAGFILTER, &value); 4812 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4813 todo_wine 4814 ok(value == 1, "Unexpected vertex sampler 0 magfilter %u.\n", value); 4815 4816 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MINFILTER, &value); 4817 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4818 ok(value == 2, "Unexpected vertex sampler 1 minfilter %u.\n", value); 4819 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MAGFILTER, &value); 4820 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4821 todo_wine 4822 ok(value == 2, "Unexpected vertex sampler 1 magfilter %u.\n", value); 4823 4824 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MINFILTER, &value); 4825 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4826 ok(value == 3, "Unexpected vertex sampler 2 minfilter %u.\n", value); 4827 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MAGFILTER, &value); 4828 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4829 todo_wine 4830 ok(value == 3, "Unexpected vertex sampler 2 magfilter %u.\n", value); 4831 4832 hr = effect->lpVtbl->EndPass(effect); 4833 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4834 hr = effect->lpVtbl->End(effect); 4835 ok(hr == D3D_OK, "Got result %#x.\n", hr); 4836 effect->lpVtbl->Release(effect); 4837 } 4838 4839 /* 4840 * fxc.exe /Tfx_2_0 4841 */ 4842 #if 0 4843 float4 opvect1; 4844 float4 opvect2; 4845 float4 opvect3; 4846 4847 technique tech0 4848 { 4849 pass p0 4850 { 4851 LightEnable[0] = TRUE; 4852 LightEnable[1] = TRUE; 4853 LightEnable[2] = TRUE; 4854 LightEnable[3] = TRUE; 4855 LightEnable[4] = TRUE; 4856 LightEnable[5] = TRUE; 4857 LightEnable[6] = TRUE; 4858 LightEnable[7] = TRUE; 4859 LightType[0] = POINT; 4860 LightType[1] = POINT; 4861 LightType[2] = POINT; 4862 LightType[3] = POINT; 4863 LightType[4] = POINT; 4864 LightType[5] = POINT; 4865 LightType[6] = POINT; 4866 LightType[7] = POINT; 4867 4868 LightDiffuse[0] = exp(opvect1); 4869 LightDiffuse[1] = log(opvect1); 4870 LightDiffuse[2] = asin(opvect1); 4871 LightDiffuse[3] = acos(opvect1); 4872 LightDiffuse[4] = atan(opvect1); 4873 LightDiffuse[5] = atan2(opvect1, opvect2); 4874 LightDiffuse[6] = opvect1 * opvect2; 4875 4876 /* Placeholder for 'div' instruction manually edited in binary blob. */ 4877 LightDiffuse[7] = opvect1 * opvect2; 4878 4879 /* Placeholder for 'cmp' instruction manually edited in binary blob. */ 4880 LightAmbient[0] = opvect1 + opvect2 + opvect3; 4881 } 4882 } 4883 #endif 4884 static const DWORD test_effect_preshader_ops_blob[] = 4885 { 4886 0xfeff0901, 0x0000044c, 0x00000000, 0x00000003, 0x00000001, 0x00000030, 0x00000000, 0x00000000, 4887 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008, 0x6576706f, 4888 0x00317463, 0x00000003, 0x00000001, 0x00000068, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 4889 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008, 0x6576706f, 0x00327463, 0x00000003, 4890 0x00000001, 0x000000a0, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 4891 0x00000000, 0x00000000, 0x00000008, 0x6576706f, 0x00337463, 0x00000001, 0x00000002, 0x00000002, 4892 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4893 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4894 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4895 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4896 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4897 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4898 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4899 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4900 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4901 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4902 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4903 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4904 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4905 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4906 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 4907 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 4908 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 4909 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 4910 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 4911 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 4912 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 4913 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 4914 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4915 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 4916 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 4917 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 4918 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 4919 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 4920 0x00000003, 0x00003070, 0x00000006, 0x68636574, 0x00000030, 0x00000003, 0x00000001, 0x00000001, 4921 0x00000001, 0x00000004, 0x00000020, 0x00000000, 0x00000000, 0x0000003c, 0x00000058, 0x00000000, 4922 0x00000000, 0x00000074, 0x00000090, 0x00000000, 0x00000000, 0x00000440, 0x00000000, 0x00000001, 4923 0x00000438, 0x00000000, 0x00000019, 0x00000091, 0x00000000, 0x000000b0, 0x000000ac, 0x00000091, 4924 0x00000001, 0x000000d0, 0x000000cc, 0x00000091, 0x00000002, 0x000000f0, 0x000000ec, 0x00000091, 4925 0x00000003, 0x00000110, 0x0000010c, 0x00000091, 0x00000004, 0x00000130, 0x0000012c, 0x00000091, 4926 0x00000005, 0x00000150, 0x0000014c, 0x00000091, 0x00000006, 0x00000170, 0x0000016c, 0x00000091, 4927 0x00000007, 0x00000190, 0x0000018c, 0x00000084, 0x00000000, 0x000001b0, 0x000001ac, 0x00000084, 4928 0x00000001, 0x000001d0, 0x000001cc, 0x00000084, 0x00000002, 0x000001f0, 0x000001ec, 0x00000084, 4929 0x00000003, 0x00000210, 0x0000020c, 0x00000084, 0x00000004, 0x00000230, 0x0000022c, 0x00000084, 4930 0x00000005, 0x00000250, 0x0000024c, 0x00000084, 0x00000006, 0x00000270, 0x0000026c, 0x00000084, 4931 0x00000007, 0x00000290, 0x0000028c, 0x00000085, 0x00000000, 0x000002bc, 0x000002ac, 0x00000085, 4932 0x00000001, 0x000002e8, 0x000002d8, 0x00000085, 0x00000002, 0x00000314, 0x00000304, 0x00000085, 4933 0x00000003, 0x00000340, 0x00000330, 0x00000085, 0x00000004, 0x0000036c, 0x0000035c, 0x00000085, 4934 0x00000005, 0x00000398, 0x00000388, 0x00000085, 0x00000006, 0x000003c4, 0x000003b4, 0x00000085, 4935 0x00000007, 0x000003f0, 0x000003e0, 0x00000087, 0x00000000, 0x0000041c, 0x0000040c, 0x00000000, 4936 0x00000009, 0x00000000, 0x00000000, 0xffffffff, 0x00000018, 0x00000000, 0x0000016c, 0x46580200, 4937 0x003afffe, 0x42415443, 0x0000001c, 0x000000b3, 0x46580200, 0x00000003, 0x0000001c, 0x20000100, 4938 0x000000b0, 0x00000058, 0x00000002, 0x00000001, 0x00000060, 0x00000070, 0x00000080, 0x00010002, 4939 0x00000001, 0x00000088, 0x00000070, 0x00000098, 0x00020002, 0x00000001, 0x000000a0, 0x00000070, 4940 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 4941 0x00000000, 0x00000000, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 4942 0x6576706f, 0x00337463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x4d007874, 0x6f726369, 4943 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 4944 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 4945 /* FXLC for LightAmbient[0] start. */ 4946 0x001afffe, 0x434c5846, 4947 0x00000001, /* Instruction count, set to 1. */ 4948 0x30000004, /* Operation code (bits 20-30) set to 'cmp' opcode 0x300. */ 4949 0x00000003, /* Input arguments count set to 3. */ 4950 /* Argument 1. */ 4951 0x00000000, /* Relative addressing flag. */ 4952 0x00000002, /* Register table ("c", float constants). */ 4953 0x00000000, /* Register offset. */ 4954 /* Argument 2. */ 4955 0x00000000, 0x00000002, 0x00000004, 4956 /* Argument 3. */ 4957 0x00000000, 0x00000002, 0x00000008, 4958 /* Output register. */ 4959 0x00000000, 0x00000004, 0x00000000, 4960 /* End mark. */ 4961 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 4962 /* Padding to match placeholder length. */ 4963 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4964 /* FXLC for LightAmbient[0] end. */ 4965 0x00000000, 0x00000000, 0xffffffff, 0x00000017, 0x00000000, 0x00000114, 4966 0x46580200, 0x002ffffe, 0x42415443, 0x0000001c, 0x00000087, 0x46580200, 0x00000002, 0x0000001c, 4967 0x20000100, 0x00000084, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 4968 0x00010002, 0x00000001, 0x00000074, 0x0000005c, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 4969 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6576706f, 0x00327463, 4970 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 4971 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 4972 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 4973 /* FXLC for LightDiffuse[7] start. */ 4974 0x000ffffe, 0x434c5846, 4975 0x00000001, /* Instruction count. */ 4976 0x20800004, /* Operation code (bits 20-30) set to 'div' opcode 0x208. */ 4977 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 4978 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 4979 /* FXLC for LightDiffuse[7] end. */ 4980 0x00000000, 0x00000000, 0xffffffff, 4981 0x00000016, 0x00000000, 0x00000114, 0x46580200, 0x002ffffe, 0x42415443, 0x0000001c, 0x00000087, 4982 0x46580200, 0x00000002, 0x0000001c, 0x20000100, 0x00000084, 0x00000044, 0x00000002, 0x00000001, 4983 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 0x00000001, 0x00000074, 0x0000005c, 0x6576706f, 4984 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4985 0x00000000, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x4d007874, 4986 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 4987 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe, 4988 0x434c5846, 0x00000001, 0x20500004, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 4989 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 4990 0x00000000, 0x00000000, 0xffffffff, 0x00000015, 0x00000000, 0x00000114, 0x46580200, 0x002ffffe, 4991 0x42415443, 0x0000001c, 0x00000087, 0x46580200, 0x00000002, 0x0000001c, 0x20000100, 0x00000084, 4992 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 0x00000001, 4993 0x00000074, 0x0000005c, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 4994 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 4995 0x00000001, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 4996 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 4997 0x54494c43, 0x00000000, 0x000ffffe, 0x434c5846, 0x00000001, 0x20600004, 0x00000002, 0x00000000, 4998 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 4999 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000014, 0x00000000, 5000 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 5001 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 5002 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 5003 0x00000000, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 5004 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 5005 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10c00004, 0x00000001, 0x00000000, 5006 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 5007 0x00000000, 0x00000000, 0xffffffff, 0x00000013, 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 5008 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 5009 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 5010 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874, 5011 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 5012 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 5013 0x434c5846, 0x00000001, 0x10b00004, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 5014 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 5015 0x00000012, 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 5016 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 5017 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 5018 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 5019 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 5020 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10a00004, 5021 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 5022 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000011, 0x00000000, 0x0000013c, 5023 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 5024 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 5025 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 5026 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 5027 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 5028 0x00000000, 0x0024fffe, 0x434c5846, 0x00000004, 0x10600001, 0x00000001, 0x00000000, 0x00000002, 5029 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x10600001, 0x00000001, 0x00000000, 0x00000002, 5030 0x00000001, 0x00000000, 0x00000004, 0x00000001, 0x10600001, 0x00000001, 0x00000000, 0x00000002, 5031 0x00000002, 0x00000000, 0x00000004, 0x00000002, 0x10600001, 0x00000001, 0x00000000, 0x00000002, 5032 0x00000003, 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 5033 0x00000000, 0xffffffff, 0x00000010, 0x00000000, 0x0000013c, 0x46580200, 0x0024fffe, 0x42415443, 5034 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 5035 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 5036 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874, 0x6f726369, 5037 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 5038 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x0024fffe, 0x434c5846, 5039 0x00000004, 0x10500001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 5040 0x00000000, 0x10500001, 0x00000001, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000004, 5041 0x00000001, 0x10500001, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000004, 5042 0x00000002, 0x10500001, 0x00000001, 0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000004, 5043 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 5044 }; 5045 5046 static void test_effect_preshader_ops(IDirect3DDevice9 *device) 5047 { 5048 static D3DLIGHT9 light; 5049 const struct 5050 { 5051 const char *mnem; 5052 unsigned int expected_result[4]; 5053 unsigned int result_index; 5054 float *result; 5055 D3DXVECTOR4 opvect1, opvect2, opvect3; 5056 unsigned int ulps; 5057 BOOL todo[4]; 5058 } 5059 op_tests[] = 5060 { 5061 {"exp", {0x3f800000, 0x3f800000, 0x3e5edc66, 0x7f800000}, 0, &light.Diffuse.r, 5062 {0.0f, -0.0f, -2.2f, 3.402823466e+38f}, {1.0f, 2.0f, -3.0f, 4.0f}}, 5063 {"log", {0, 0x40000000, 0x3f9199b7, 0x43000000}, 1, &light.Diffuse.r, 5064 {0.0f, 4.0f, -2.2f, 3.402823466e+38f}, {1.0f, 2.0f, -3.0f, 4.0f}}, 5065 {"asin", {0xbe9c00ad, 0xffc00000, 0xffc00000, 0xffc00000}, 2, &light.Diffuse.r, 5066 {-0.3f, 4.0f, -2.2f, 3.402823466e+38f}, {1.0f, 2.0f, -3.0f, 4.0f}}, 5067 {"acos", {0x3ff01006, 0xffc00000, 0xffc00000, 0xffc00000}, 3, &light.Diffuse.r, 5068 {-0.3f, 4.0f, -2.2f, 3.402823466e+38f}, {1.0f, 2.0f, -3.0f, 4.0f}}, 5069 {"atan", {0xbe9539d4, 0x3fa9b465, 0xbf927420, 0x3fc90fdb}, 4, &light.Diffuse.r, 5070 {-0.3f, 4.0f, -2.2f, 3.402823466e+38f}, {1.0f, 2.0f, -3.0f, 4.0f}}, 5071 {"atan2 test #1", {0xbfc90fdb, 0x40490fdb, 0x80000000, 0x7fc00000}, 5, &light.Diffuse.r, 5072 {-0.3f, 0.0f, -0.0f, NAN}, {0.0f, -0.0f, 0.0f, 1.0f}}, 5073 {"atan2 test #2", {0xbfc90fdb, 0, 0xc0490fdb, 0}, 5, &light.Diffuse.r, 5074 {-0.3f, 0.0f, -0.0f, -0.0f}, {-0.0f, 0.0f, -0.0f, 1.0f}}, 5075 {"div", {0, 0, 0, 0}, 7, &light.Diffuse.r, 5076 {-0.3f, 0.0f, -2.2f, NAN}, {0.0f, -0.0f, -3.0f, 1.0f}}, 5077 {"cmp", {0x40a00000, 0x40000000, 0x40400000, 0x41000000}, 0, &light.Ambient.r, 5078 {-0.3f, 0.0f, 2.2f, NAN}, {1.0f, 2.0f, 3.0f, 4.0f}, {5.0f, 6.0f, 7.0f, 8.0f}}, 5079 {"0 * INF", {0xffc00000, 0xffc00000, 0xc0d33334, 0x7f800000}, 6, &light.Diffuse.r, 5080 {0.0f, -0.0f, -2.2f, 3.402823466e+38f}, {INFINITY, INFINITY, 3.0f, 4.0f}}, 5081 }; 5082 unsigned int i, j, passes_count; 5083 ID3DXEffect *effect; 5084 HRESULT hr; 5085 5086 hr = D3DXCreateEffect(device, test_effect_preshader_ops_blob, sizeof(test_effect_preshader_ops_blob), 5087 NULL, NULL, 0, NULL, &effect, NULL); 5088 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5089 hr = effect->lpVtbl->Begin(effect, &passes_count, 0); 5090 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5091 hr = effect->lpVtbl->BeginPass(effect, 0); 5092 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5093 5094 for (i = 0; i < ARRAY_SIZE(op_tests); ++i) 5095 { 5096 const float *result = op_tests[i].result; 5097 const float *expected_float = (float *)op_tests[i].expected_result; 5098 5099 hr = effect->lpVtbl->SetVector(effect, "opvect1", &op_tests[i].opvect1); 5100 ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr); 5101 hr = effect->lpVtbl->SetVector(effect, "opvect2", &op_tests[i].opvect2); 5102 ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr); 5103 hr = effect->lpVtbl->SetVector(effect, "opvect3", &op_tests[i].opvect3); 5104 ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr); 5105 hr = effect->lpVtbl->CommitChanges(effect); 5106 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5107 5108 hr = IDirect3DDevice9_GetLight(device, op_tests[i].result_index, &light); 5109 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5110 for (j = 0; j < 4; ++j) 5111 { 5112 todo_wine_if(op_tests[i].todo[j]) 5113 ok(compare_float(result[j], expected_float[j], op_tests[i].ulps), 5114 "Operation %s, component %u, expected %#x (%.8e), got %#x (%.8e).\n", op_tests[i].mnem, 5115 j, op_tests[i].expected_result[j], expected_float[j], 5116 ((unsigned int *)result)[j], result[j]); 5117 } 5118 } 5119 5120 hr = effect->lpVtbl->End(effect); 5121 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5122 effect->lpVtbl->Release(effect); 5123 } 5124 5125 static void test_isparameterused_children(unsigned int line, ID3DXEffect *effect, 5126 D3DXHANDLE tech, D3DXHANDLE param) 5127 { 5128 D3DXPARAMETER_DESC desc; 5129 D3DXHANDLE param_child; 5130 unsigned int i, child_count; 5131 HRESULT hr; 5132 5133 hr = effect->lpVtbl->GetParameterDesc(effect, param, &desc); 5134 ok_(__FILE__, line)(hr == D3D_OK, "GetParameterDesc failed, result %#x.\n", hr); 5135 child_count = desc.Elements ? desc.Elements : desc.StructMembers; 5136 for (i = 0; i < child_count; ++i) 5137 { 5138 param_child = desc.Elements ? effect->lpVtbl->GetParameterElement(effect, param, i) 5139 : effect->lpVtbl->GetParameter(effect, param, i); 5140 ok_(__FILE__, line)(!!param_child, "Failed getting child parameter %s[%u].\n", desc.Name, i); 5141 ok_(__FILE__, line)(!effect->lpVtbl->IsParameterUsed(effect, param_child, tech), 5142 "Unexpected IsParameterUsed() result for %s[%u].\n", desc.Name, i); 5143 test_isparameterused_children(line, effect, tech, param_child); 5144 } 5145 } 5146 5147 #ifdef __REACTOS__ 5148 #define test_isparameterused_param_with_children(...) \ 5149 test_isparameterused_param_with_children_(__LINE__, __VA_ARGS__) 5150 #else 5151 #define test_isparameterused_param_with_children(args...) \ 5152 test_isparameterused_param_with_children_(__LINE__, args) 5153 #endif 5154 static void test_isparameterused_param_with_children_(unsigned int line, ID3DXEffect *effect, 5155 ID3DXEffect *effect2, D3DXHANDLE tech, const char *name, BOOL expected_result) 5156 { 5157 D3DXHANDLE param; 5158 5159 ok_(__FILE__, line)(effect->lpVtbl->IsParameterUsed(effect, (D3DXHANDLE)name, tech) 5160 == expected_result, "Unexpected IsParameterUsed() result for %s (referenced by name).\n", name); 5161 5162 if (effect2) 5163 param = effect2->lpVtbl->GetParameterByName(effect2, NULL, name); 5164 else 5165 param = effect->lpVtbl->GetParameterByName(effect, NULL, name); 5166 ok_(__FILE__, line)(!!param, "GetParameterByName failed for %s.\n", name); 5167 5168 ok_(__FILE__, line)(effect->lpVtbl->IsParameterUsed(effect, param, tech) == expected_result, 5169 "Unexpected IsParameterUsed() result for %s (referenced by handle).\n", name); 5170 5171 test_isparameterused_children(line, effect, tech, param); 5172 } 5173 5174 static void test_effect_isparameterused(IDirect3DDevice9 *device) 5175 { 5176 static const struct 5177 { 5178 const char *name; 5179 BOOL expected_result; 5180 } 5181 check_parameters[] = 5182 { 5183 {"g_Pos1", TRUE}, 5184 {"g_Pos2", TRUE}, 5185 {"g_Selector", TRUE}, 5186 {"opvect1", TRUE}, 5187 {"opvect2", TRUE}, 5188 {"opvect3", TRUE}, 5189 {"arr2", TRUE}, 5190 {"vs_arr", TRUE}, 5191 {"g_iVect", TRUE}, 5192 {"vect_sampler", TRUE}, 5193 {"tex1", TRUE}, 5194 {"tex2", FALSE}, 5195 {"sampler1", TRUE}, 5196 {"ts1", TRUE}, 5197 {"ts2", TRUE}, 5198 {"ts3", TRUE}, 5199 }; 5200 ID3DXEffect *effect, *effect2; 5201 HRESULT hr; 5202 D3DXHANDLE tech; 5203 unsigned int i; 5204 5205 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 5206 NULL, NULL, 0, NULL, &effect, NULL); 5207 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5208 5209 tech = effect->lpVtbl->GetTechniqueByName(effect, "tech0"); 5210 ok(!!tech, "GetTechniqueByName failed.\n"); 5211 5212 for (i = 0; i < ARRAY_SIZE(check_parameters); ++i) 5213 test_isparameterused_param_with_children(effect, NULL, tech, check_parameters[i].name, 5214 check_parameters[i].expected_result); 5215 5216 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 5217 NULL, NULL, 0, NULL, &effect2, NULL); 5218 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5219 5220 for (i = 0; i < ARRAY_SIZE(check_parameters); ++i) 5221 test_isparameterused_param_with_children(effect, effect2, tech, check_parameters[i].name, 5222 check_parameters[i].expected_result); 5223 5224 effect2->lpVtbl->Release(effect2); 5225 5226 hr = D3DXCreateEffect(device, test_effect_states_effect_blob, sizeof(test_effect_states_effect_blob), 5227 NULL, NULL, 0, NULL, &effect2, NULL); 5228 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5229 5230 test_isparameterused_param_with_children(effect, effect2, tech, "sampler1", TRUE); 5231 effect2->lpVtbl->Release(effect2); 5232 5233 effect->lpVtbl->Release(effect); 5234 } 5235 5236 static void test_effect_out_of_bounds_selector(IDirect3DDevice9 *device) 5237 { 5238 ID3DXEffect *effect; 5239 HRESULT hr; 5240 D3DXHANDLE param; 5241 int ivect[4]; 5242 unsigned int passes_count; 5243 IDirect3DVertexShader9 *vshader; 5244 5245 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 5246 NULL, NULL, 0, NULL, &effect, NULL); 5247 5248 hr = effect->lpVtbl->Begin(effect, &passes_count, 0); 5249 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5250 5251 ivect[0] = ivect[1] = ivect[3] = 1; 5252 5253 param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect"); 5254 ok(!!param, "GetParameterByName failed.\n"); 5255 ivect[2] = 3; 5256 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5257 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5258 5259 hr = effect->lpVtbl->BeginPass(effect, 0); 5260 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5261 hr = effect->lpVtbl->EndPass(effect); 5262 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5263 5264 hr = IDirect3DDevice9_SetVertexShader(device, NULL); 5265 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5266 5267 hr = effect->lpVtbl->BeginPass(effect, 1); 5268 ok(hr == E_FAIL, "Got result %#x.\n", hr); 5269 5270 /* Second try reports success and selects array element used previously. 5271 * Probably array index is not recomputed and previous index value is used. */ 5272 hr = effect->lpVtbl->BeginPass(effect, 1); 5273 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5274 test_effect_preshader_compare_shader(device, 2, FALSE); 5275 5276 /* Confirm that array element selected is the previous good one and does not depend 5277 * on computed (out of bound) index value. */ 5278 ivect[2] = 1; 5279 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5280 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5281 hr = IDirect3DDevice9_SetVertexShader(device, NULL); 5282 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5283 hr = effect->lpVtbl->CommitChanges(effect); 5284 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5285 test_effect_preshader_compare_shader(device, 1, FALSE); 5286 hr = effect->lpVtbl->EndPass(effect); 5287 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5288 ivect[2] = 3; 5289 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5290 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5291 hr = IDirect3DDevice9_SetVertexShader(device, NULL); 5292 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5293 hr = effect->lpVtbl->BeginPass(effect, 1); 5294 ok(hr == E_FAIL, "Got result %#x.\n", hr); 5295 hr = effect->lpVtbl->BeginPass(effect, 1); 5296 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5297 test_effect_preshader_compare_shader(device, 1, FALSE); 5298 5299 /* End and begin effect again to ensure it will not trigger array 5300 * index recompute and error return from BeginPass. */ 5301 hr = effect->lpVtbl->EndPass(effect); 5302 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5303 hr = effect->lpVtbl->End(effect); 5304 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5305 hr = effect->lpVtbl->Begin(effect, &passes_count, 0); 5306 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5307 hr = effect->lpVtbl->BeginPass(effect, 1); 5308 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5309 test_effect_preshader_compare_shader(device, 1, FALSE); 5310 hr = effect->lpVtbl->EndPass(effect); 5311 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5312 5313 5314 hr = IDirect3DDevice9_SetVertexShader(device, NULL); 5315 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5316 5317 ivect[2] = -2; 5318 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5319 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5320 5321 hr = effect->lpVtbl->BeginPass(effect, 1); 5322 ok(hr == E_FAIL, "Got result %#x.\n", hr); 5323 5324 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 5325 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5326 ok(!vshader, "Got non NULL vshader.\n"); 5327 5328 hr = effect->lpVtbl->BeginPass(effect, 1); 5329 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5330 5331 test_effect_preshader_compare_shader(device, 1, FALSE); 5332 5333 hr = effect->lpVtbl->EndPass(effect); 5334 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5335 5336 ivect[2] = -1; 5337 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5338 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5339 5340 hr = effect->lpVtbl->BeginPass(effect, 1); 5341 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5342 5343 test_effect_preshader_compare_shader(device, 0, FALSE); 5344 5345 hr = IDirect3DDevice9_SetVertexShader(device, NULL); 5346 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5347 5348 ivect[2] = 3; 5349 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5350 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5351 hr = effect->lpVtbl->CommitChanges(effect); 5352 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5353 5354 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 5355 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5356 ok(!vshader, "Got non NULL vshader.\n"); 5357 5358 ivect[2] = -1; 5359 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5360 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5361 hr = effect->lpVtbl->CommitChanges(effect); 5362 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5363 5364 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 5365 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5366 ok(!vshader, "Got non NULL vshader.\n"); 5367 5368 ivect[2] = 1; 5369 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5370 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5371 hr = effect->lpVtbl->CommitChanges(effect); 5372 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5373 5374 test_effect_preshader_compare_shader(device, 1, FALSE); 5375 5376 hr = effect->lpVtbl->EndPass(effect); 5377 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5378 5379 hr = effect->lpVtbl->End(effect); 5380 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5381 5382 effect->lpVtbl->Release(effect); 5383 } 5384 5385 static void test_effect_commitchanges(IDirect3DDevice9 *device) 5386 { 5387 static const struct 5388 { 5389 const char *param_name; 5390 enum expected_state_update state_updated[ARRAY_SIZE(test_effect_preshader_op_expected)]; 5391 } 5392 check_op_parameters[] = 5393 { 5394 {"opvect1", {EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, 5395 EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, 5396 EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, 5397 EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_ANYTHING, 5398 EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED}}, 5399 {"opvect2", {EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, 5400 EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, 5401 EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, 5402 EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_ANYTHING, 5403 EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED}}, 5404 {"opvect3", {EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, 5405 EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_UPDATED, 5406 EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, 5407 EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ANYTHING, 5408 EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO}}, 5409 }; 5410 static const struct 5411 { 5412 const char *param_name; 5413 const unsigned int const_updated_mask[(ARRAY_SIZE(test_effect_preshader_fvect_v) 5414 + TEST_EFFECT_BITMASK_BLOCK_SIZE - 1) / TEST_EFFECT_BITMASK_BLOCK_SIZE]; 5415 } 5416 check_vconsts_parameters[] = 5417 { 5418 {"g_Selector", {0x00000000, 0x00000002}}, 5419 {"g_Pos1", {0x80000000, 0x00000002}}, 5420 {"g_Pos2", {0x00000000, 0x00000002}}, 5421 {"m4x3column", {0x03800000, 0x00000000}}, 5422 {"m3x4column", {0x000f0000, 0x00000000}}, 5423 {"m4x3row", {0x0000f000, 0x00000000}}, 5424 {"m3x4row", {0x00700000, 0x00000000}}, 5425 {"ts1", {0x1c000000, 0x00000000}}, 5426 {"ts2", {0x0000003f, 0x00000000}}, 5427 {"arr1", {0x00000000, 0x00000001}}, 5428 {"arr2", {0x60000000, 0x00000000}}, 5429 {"ts3", {0x00000fc0, 0x00000000}}, 5430 }; 5431 static const struct 5432 { 5433 const char *param_name; 5434 const unsigned int const_updated_mask[(ARRAY_SIZE(test_effect_preshader_bconsts) 5435 + TEST_EFFECT_BITMASK_BLOCK_SIZE - 1) / TEST_EFFECT_BITMASK_BLOCK_SIZE]; 5436 } 5437 check_bconsts_parameters[] = 5438 { 5439 {"mb2x3row", {0x0000001f}}, 5440 {"mb2x3column", {0x00000060}}, 5441 }; 5442 static const unsigned int const_no_update_mask[(ARRAY_SIZE(test_effect_preshader_fvect_v) 5443 + TEST_EFFECT_BITMASK_BLOCK_SIZE - 1) / TEST_EFFECT_BITMASK_BLOCK_SIZE]; 5444 static const D3DLIGHT9 light_filler = {D3DLIGHT_POINT}; 5445 5446 ID3DXEffect *effect; 5447 HRESULT hr; 5448 D3DXHANDLE param; 5449 unsigned int i, passes_count, value; 5450 int ivect[4]; 5451 D3DXVECTOR4 fvect; 5452 IDirect3DVertexShader9 *vshader; 5453 unsigned char buffer[256]; 5454 5455 5456 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 5457 NULL, NULL, 0, NULL, &effect, NULL); 5458 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5459 5460 param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect"); 5461 ok(!!param, "GetParameterByName failed.\n"); 5462 5463 hr = effect->lpVtbl->Begin(effect, &passes_count, 0); 5464 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5465 5466 hr = IDirect3DDevice9_SetVertexShader(device, NULL); 5467 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5468 5469 hr = effect->lpVtbl->BeginPass(effect, 0); 5470 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5471 5472 for (i = 0; i < ARRAY_SIZE(check_op_parameters); ++i) 5473 { 5474 unsigned int j; 5475 5476 for (j = 0; j < 8; ++j) 5477 { 5478 hr = IDirect3DDevice9_SetLight(device, j, &light_filler); 5479 ok(hr == D3D_OK, "Got result %#x, i %u, j %u.\n", hr, i, j); 5480 } 5481 param = effect->lpVtbl->GetParameterByName(effect, NULL, check_op_parameters[i].param_name); 5482 ok(!!param, "Failed to get parameter (test %u).\n", i); 5483 hr = effect->lpVtbl->GetValue(effect, param, &fvect, sizeof(fvect)); 5484 ok(hr == D3D_OK, "Failed to get parameter value, hr %#x (test %u).\n", hr, i); 5485 hr = effect->lpVtbl->SetValue(effect, param, &fvect, sizeof(fvect)); 5486 ok(hr == D3D_OK, "Failed to set parameter value, hr %#x (test %u).\n", hr, i); 5487 hr = effect->lpVtbl->CommitChanges(effect); 5488 ok(hr == D3D_OK, "Failed to commit changes, hr %#x (test %u).\n", hr, i); 5489 5490 test_effect_preshader_op_results(device, check_op_parameters[i].state_updated, 5491 check_op_parameters[i].param_name); 5492 } 5493 5494 for (i = 0; i < ARRAY_SIZE(check_vconsts_parameters); ++i) 5495 { 5496 test_effect_clear_vconsts(device); 5497 param = effect->lpVtbl->GetParameterByName(effect, NULL, check_vconsts_parameters[i].param_name); 5498 ok(!!param, "GetParameterByName failed.\n"); 5499 hr = effect->lpVtbl->GetValue(effect, param, buffer, sizeof(buffer)); 5500 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5501 hr = effect->lpVtbl->SetValue(effect, param, buffer, sizeof(buffer)); 5502 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5503 hr = effect->lpVtbl->CommitChanges(effect); 5504 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5505 5506 test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[i].const_updated_mask, 5507 check_vconsts_parameters[i].param_name); 5508 } 5509 5510 for (i = 0; i < ARRAY_SIZE(check_bconsts_parameters); ++i) 5511 { 5512 test_effect_preshader_clear_pbool_consts(device); 5513 param = effect->lpVtbl->GetParameterByName(effect, NULL, check_bconsts_parameters[i].param_name); 5514 ok(!!param, "GetParameterByName failed.\n"); 5515 hr = effect->lpVtbl->GetValue(effect, param, buffer, sizeof(buffer)); 5516 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5517 hr = effect->lpVtbl->SetValue(effect, param, buffer, sizeof(buffer)); 5518 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5519 hr = effect->lpVtbl->CommitChanges(effect); 5520 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5521 5522 test_effect_preshader_compare_pbool_consts(device, check_bconsts_parameters[i].const_updated_mask, 5523 check_bconsts_parameters[i].param_name); 5524 } 5525 5526 test_effect_clear_vconsts(device); 5527 param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_Selector"); 5528 ok(!!param, "GetParameterByName failed.\n"); 5529 fvect.x = fvect.y = fvect.z = fvect.w = 0.0f; 5530 hr = effect->lpVtbl->SetVectorArray(effect, param, &fvect, 1); 5531 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5532 hr = effect->lpVtbl->CommitChanges(effect); 5533 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5534 test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[0].const_updated_mask, 5535 check_vconsts_parameters[0].param_name); 5536 5537 test_effect_clear_vconsts(device); 5538 param = effect->lpVtbl->GetParameterByName(effect, NULL, "arr2"); 5539 ok(!!param, "GetParameterByName failed.\n"); 5540 param = effect->lpVtbl->GetParameterElement(effect, param, 0); 5541 ok(!!param, "GetParameterElement failed.\n"); 5542 hr = effect->lpVtbl->SetFloat(effect, param, 92.0f); 5543 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5544 hr = effect->lpVtbl->CommitChanges(effect); 5545 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5546 test_effect_preshader_compare_vconsts(device, const_no_update_mask, 5547 check_vconsts_parameters[10].param_name); 5548 5549 test_effect_clear_vconsts(device); 5550 param = effect->lpVtbl->GetParameterByName(effect, NULL, "arr2"); 5551 ok(!!param, "GetParameterByName failed.\n"); 5552 param = effect->lpVtbl->GetParameterElement(effect, param, 1); 5553 ok(!!param, "GetParameterElement failed.\n"); 5554 fvect.x = 93.0f; 5555 hr = effect->lpVtbl->SetValue(effect, param, &fvect.x, sizeof(fvect.x)); 5556 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5557 hr = effect->lpVtbl->CommitChanges(effect); 5558 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5559 test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[10].const_updated_mask, 5560 check_vconsts_parameters[10].param_name); 5561 5562 test_effect_clear_vconsts(device); 5563 param = effect->lpVtbl->GetParameterByName(effect, NULL, "arr2"); 5564 ok(!!param, "GetParameterByName failed.\n"); 5565 fvect.x = 92.0f; 5566 hr = effect->lpVtbl->SetFloatArray(effect, param, &fvect.x, 1); 5567 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5568 hr = effect->lpVtbl->CommitChanges(effect); 5569 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5570 test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[10].const_updated_mask, 5571 check_vconsts_parameters[10].param_name); 5572 5573 test_effect_clear_vconsts(device); 5574 param = effect->lpVtbl->GetParameterByName(effect, NULL, "arr2"); 5575 ok(!!param, "GetParameterByName failed.\n"); 5576 param = effect->lpVtbl->GetParameterElement(effect, param, 1); 5577 ok(!!param, "GetParameterElement failed.\n"); 5578 hr = effect->lpVtbl->SetInt(effect, param, 93); 5579 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5580 hr = effect->lpVtbl->CommitChanges(effect); 5581 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5582 test_effect_preshader_compare_vconsts(device, const_no_update_mask, 5583 check_vconsts_parameters[10].param_name); 5584 5585 test_effect_clear_vconsts(device); 5586 param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_Pos1"); 5587 ok(!!param, "GetParameterByName failed.\n"); 5588 fvect.x = fvect.y = fvect.z = fvect.w = 0.0f; 5589 hr = effect->lpVtbl->SetVector(effect, param, &fvect); 5590 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5591 hr = effect->lpVtbl->CommitChanges(effect); 5592 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5593 test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[1].const_updated_mask, 5594 check_vconsts_parameters[1].param_name); 5595 5596 test_effect_clear_vconsts(device); 5597 param = effect->lpVtbl->GetParameterByName(effect, NULL, "ts1"); 5598 ok(!!param, "GetParameterByName failed.\n"); 5599 param = effect->lpVtbl->GetParameterElement(effect, param, 0); 5600 ok(!!param, "GetParameterByName failed.\n"); 5601 param = effect->lpVtbl->GetParameterByName(effect, param, "fv"); 5602 ok(!!param, "GetParameterByName failed.\n"); 5603 fvect.x = 12; 5604 hr = effect->lpVtbl->SetValue(effect, param, &fvect.x, sizeof(float)); 5605 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5606 hr = effect->lpVtbl->CommitChanges(effect); 5607 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5608 test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[7].const_updated_mask, 5609 check_vconsts_parameters[7].param_name); 5610 5611 *(float *)&value = 9999.0f; 5612 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGDENSITY, value); 5613 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5614 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGSTART, value); 5615 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5616 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_POINTSCALE_A, value); 5617 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5618 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_POINTSCALE_B, value); 5619 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5620 test_effect_clear_vconsts(device); 5621 param = effect->lpVtbl->GetParameterByName(effect, NULL, "ts2"); 5622 ok(!!param, "GetParameterByName failed.\n"); 5623 param = effect->lpVtbl->GetParameterElement(effect, param, 0); 5624 ok(!!param, "GetParameterByName failed.\n"); 5625 param = effect->lpVtbl->GetParameterByName(effect, param, "v1"); 5626 ok(!!param, "GetParameterByName failed.\n"); 5627 hr = effect->lpVtbl->GetValue(effect, param, &fvect, sizeof(float) * 3); 5628 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5629 hr = effect->lpVtbl->SetValue(effect, param, &fvect, sizeof(float) * 3); 5630 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5631 hr = effect->lpVtbl->CommitChanges(effect); 5632 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5633 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGDENSITY, &value); 5634 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5635 ok(value == 0, "Unexpected fog density %g.\n", *(float *)&value); 5636 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGSTART, &value); 5637 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5638 ok(*(float *)&value == 4.0f, "Unexpected fog start %g.\n", *(float *)&value); 5639 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_A, &value); 5640 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5641 ok(*(float *)&value == 9999.0f, "Unexpected point scale A %g.\n", *(float *)&value); 5642 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_B, &value); 5643 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5644 ok(*(float *)&value == 9999.0f, "Unexpected point scale B %g.\n", *(float *)&value); 5645 test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[8].const_updated_mask, 5646 check_vconsts_parameters[8].param_name); 5647 5648 *(float *)&value = 9999.0f; 5649 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGDENSITY, value); 5650 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5651 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGSTART, value); 5652 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5653 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_POINTSCALE_A, value); 5654 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5655 hr = IDirect3DDevice9_SetRenderState(device, D3DRS_POINTSCALE_B, value); 5656 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5657 test_effect_clear_vconsts(device); 5658 param = effect->lpVtbl->GetParameterByName(effect, NULL, "ts3"); 5659 ok(!!param, "GetParameterByName failed.\n"); 5660 param = effect->lpVtbl->GetParameterByName(effect, param, "ts"); 5661 ok(!!param, "GetParameterByName failed.\n"); 5662 param = effect->lpVtbl->GetParameterElement(effect, param, 1); 5663 ok(!!param, "GetParameterByName failed.\n"); 5664 param = effect->lpVtbl->GetParameterByName(effect, param, "fv"); 5665 ok(!!param, "GetParameterByName failed.\n"); 5666 hr = effect->lpVtbl->GetValue(effect, param, &fvect.x, sizeof(float)); 5667 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5668 hr = effect->lpVtbl->SetValue(effect, param, &fvect.x, sizeof(float)); 5669 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5670 hr = effect->lpVtbl->CommitChanges(effect); 5671 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5672 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGDENSITY, &value); 5673 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5674 ok(*(float *)&value == 9999.0f, "Unexpected fog density %g.\n", *(float *)&value); 5675 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGSTART, &value); 5676 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5677 ok(*(float *)&value == 9999.0f, "Unexpected fog start %g.\n", *(float *)&value); 5678 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_A, &value); 5679 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5680 ok(*(float *)&value == 4.0f, "Unexpected point scale A %g.\n", *(float *)&value); 5681 hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_B, &value); 5682 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5683 ok(*(float *)&value == 12.0f, "Unexpected point scale B %g.\n", *(float *)&value); 5684 test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[11].const_updated_mask, 5685 check_vconsts_parameters[11].param_name); 5686 5687 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MINFILTER, &value); 5688 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5689 ok(value == 1, "Unexpected sampler 0 minfilter %u.\n", value); 5690 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MINFILTER, &value); 5691 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5692 todo_wine 5693 ok(value == 0, "Unexpected sampler 1 minfilter %u.\n", value); 5694 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MINFILTER, &value); 5695 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5696 ok(value == 3, "Unexpected sampler 2 minfilter %u.\n", value); 5697 5698 param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect"); 5699 ok(!!param, "GetParameterByName failed.\n"); 5700 ivect[0] = ivect[1] = ivect[2] = ivect[3] = 1; 5701 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5702 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5703 5704 for (i = 0; i < 3; ++i) 5705 { 5706 hr = IDirect3DDevice9_SetSamplerState(device, D3DVERTEXTEXTURESAMPLER0 + i, D3DSAMP_MINFILTER, 0); 5707 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5708 hr = IDirect3DDevice9_SetSamplerState(device, D3DVERTEXTEXTURESAMPLER0 + i, D3DSAMP_MAGFILTER, 0); 5709 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5710 } 5711 5712 hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MINFILTER, 0); 5713 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5714 hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, 0); 5715 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5716 5717 hr = IDirect3DDevice9_SetVertexShader(device, NULL); 5718 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5719 test_effect_clear_vconsts(device); 5720 5721 hr = effect->lpVtbl->CommitChanges(effect); 5722 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5723 5724 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 5725 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5726 ok(!vshader, "Got non NULL vshader.\n"); 5727 test_effect_preshader_compare_vconsts(device, const_no_update_mask, 5728 "selector g_iVect"); 5729 5730 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MINFILTER, &value); 5731 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5732 ok(value == 0, "Unexpected sampler 0 minfilter %u.\n", value); 5733 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MINFILTER, &value); 5734 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5735 ok(value == 0, "Unexpected sampler 1 minfilter %u.\n", value); 5736 5737 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MINFILTER, &value); 5738 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5739 ok(value == 1, "Unexpected sampler 2 minfilter %u.\n", value); 5740 hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MAGFILTER, &value); 5741 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5742 ok(value == 0, "Unexpected sampler 2 minfilter %u.\n", value); 5743 hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MINFILTER, &value); 5744 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5745 ok(value == 1, "Unexpected sampler 0 minfilter %u.\n", value); 5746 hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MAGFILTER, &value); 5747 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5748 ok(value == 0, "Unexpected sampler 0 minfilter %u.\n", value); 5749 5750 ivect[3] = 2; 5751 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5752 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5753 ivect[3] = 1; 5754 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5755 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5756 hr = effect->lpVtbl->CommitChanges(effect); 5757 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5758 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 5759 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5760 ok(!vshader, "Got non NULL vshader.\n"); 5761 test_effect_preshader_compare_vconsts(device, const_no_update_mask, 5762 "selector g_iVect"); 5763 ivect[3] = 2; 5764 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5765 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5766 hr = effect->lpVtbl->CommitChanges(effect); 5767 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5768 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 5769 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5770 ok(!!vshader, "Got NULL vshader.\n"); 5771 IDirect3DVertexShader9_Release(vshader); 5772 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 0, &fvect.x, 1); 5773 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5774 ok(fvect.x == 0.0f && fvect.y == 0.0f && fvect.z == 0.0f && fvect.w == 0.0f, 5775 "Vertex shader float constants do not match.\n"); 5776 hr = IDirect3DDevice9_SetVertexShaderConstantF(device, 0, &fvect_filler.x, 1); 5777 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5778 test_effect_preshader_compare_vconsts(device, const_no_update_mask, 5779 "selector g_iVect"); 5780 ivect[3] = 1; 5781 hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect)); 5782 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5783 hr = effect->lpVtbl->CommitChanges(effect); 5784 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5785 test_effect_preshader_compare_vconsts(device, NULL, NULL); 5786 5787 hr = effect->lpVtbl->EndPass(effect); 5788 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5789 5790 hr = effect->lpVtbl->End(effect); 5791 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5792 5793 effect->lpVtbl->Release(effect); 5794 } 5795 5796 static void test_effect_preshader_relative_addressing(IDirect3DDevice9 *device) 5797 { 5798 static const struct 5799 { 5800 D3DXVECTOR4 opvect2; 5801 D3DXVECTOR4 g_ivect; 5802 unsigned int expected[4]; 5803 } 5804 test_out_of_bounds_index[] = 5805 { 5806 {{1.0f, 2.0f, 3.0f, 4.0f}, {101.0f, 101.0f, 101.0f, 101.0f}, {0, 0x42ca0000, 0x3f800000, 0}}, 5807 {{1.0f, 2.0f, 3.0f, 4.0f}, {3333.0f, 1094.0f, 2222.0f, 3333.0f}, 5808 {0x447ac000, 0x45505000, 0x3f800000, 0}}, 5809 {{1.0f, 2.0f, 3.0f, 4.0f}, {3333.0f, 1094.0f, 2222.0f, 1.0f}, 5810 {0x447ac000, 0x3f800000, 0x447a8000, 0x453b9000}}, 5811 {{1.0f, 2.0f, 3.0f, 4.0f}, {1.0f, 1094.0f, 2222.0f, 3333.0f}, 5812 {0x447ac000, 0x45505000, 0x3f800000, 0x453ba000}}, 5813 {{1.0f, 2.0f, 3.0f, 4.0f}, {1111.0f, 1094.0f, 2222.0f, 1111.0f}, 5814 {0x447ac000, 0x448ae000, 0, 0}}, 5815 {{1.0f, 2.0f, 3.0f, 4.0f}, {1111.0f, 1094.0f, 2222.0f, 3333.0f}, 5816 {0x447ac000, 0x45505000, 0x3f800000, 0}}, 5817 {{-1111.0f, 1094.0f, -2222.0f, -3333.0f}, {4.0f, 3.0f, 2.0f, 1.0f}, 5818 {0x447ac000, 0x40800000, 0x447a8000, 0x453b9000}}, 5819 {{1.0f, 2.0f, 3.0f, 4.0f}, {-1.0f, -1.0f, -1.0f, -1.0f}, {0, 0xbf800000, 0, 0}}, 5820 {{1.0f, 2.0f, 3.0f, 4.0f}, {-2.0f, -2.0f, -2.0f, -2.0f}, {0, 0xc0000000, 0x459c4800, 0}}, 5821 {{1.0f, 2.0f, 3.0f, 4.0f}, {-3.0f, -3.0f, -3.0f, -3.0f}, {0, 0xc0400000, 0x453b9000, 0}}, 5822 {{1.0f, 2.0f, 3.0f, 4.0f}, {-4.0f, -4.0f, -4.0f, -4.0f}, {0, 0xc0800000, 0x44fa2000, 0}}, 5823 {{1.0f, 2.0f, 3.0f, 4.0f}, {-5.0f, -5.0f, -5.0f, -5.0f}, {0, 0xc0a00000, 0x459c5000, 0}}, 5824 {{1.0f, 2.0f, 3.0f, 4.0f}, {-6.0f, -6.0f, -6.0f, -6.0f}, {0, 0xc0c00000, 0x453ba000, 0xc1400000}}, 5825 {{1.0f, 2.0f, 3.0f, 4.0f}, {-7.0f, -7.0f, -7.0f, -7.0f}, {0, 0xc0e00000, 0x44fa4000, 0x40400000}}, 5826 {{1.0f, 2.0f, 3.0f, 4.0f}, {-8.0f, -8.0f, -8.0f, -8.0f}, {0, 0xc1000000, 0, 0x44fa6000}}, 5827 {{1.0f, 2.0f, 3.0f, 4.0f}, {-9.0f, -9.0f, -9.0f, -9.0f}, {0, 0xc1100000, 0, 0}}, 5828 {{1.0f, 2.0f, 3.0f, 4.0f}, {-10.0f, -10.0f, -10.0f, -10.0f}, {0, 0xc1200000, 0xc1200000, 0}}, 5829 {{1.0f, 2.0f, 3.0f, 4.0f}, {-11.0f, -11.0f, -11.0f, -11.0f}, {0, 0xc1300000, 0x3f800000, 0}}, 5830 {{1.0f, 2.0f, 3.0f, 4.0f}, {-12.0f, -12.0f, -12.0f, -12.0f}, {0, 0xc1400000, 0x447a4000, 0}}, 5831 {{1.0f, 2.0f, 3.0f, 4.0f}, {5.0f, 5.0f, 5.0f, 5.0f}, {0, 0x40a00000, 0x3f800000, 0}}, 5832 {{1.0f, 2.0f, 3.0f, 4.0f}, {-1111.0f, 1094.0f, -2222.0f, -3333.0f}, 5833 {0x447ac000, 0xc5505000, 0x459c5000, 0x40000000}}, 5834 {{1.0f, 2.0f, 3.0f, 4.0f}, {-3333.0f, 1094.0f, -2222.0f, -1111.0f}, 5835 {0x447ac000, 0xc48ae000, 0x44fa4000, 0x3f800000}}, 5836 {{1.0f, 2.0f, 3.0f, 4.0f}, {-3333.0f, 1094.0f, -2222.0f, -3333.0f}, 5837 {0x447ac000, 0xc5505000, 0x459c5000, 0}}, 5838 {{1.0f, 2.0f, 3.0f, 4.0f}, {-1111.0f, 1094.0f, -2222.0f, -1111.0f}, 5839 {0x447ac000, 0xc48ae000, 0x44fa4000, 0x40400000}}, 5840 }; 5841 static const struct 5842 { 5843 unsigned int zw[2]; 5844 } 5845 expected_light_specular[] = 5846 { 5847 {{0, 0x44fa2000}}, 5848 {{0x447a8000, 0x453b9000}}, 5849 {{0x40000000, 0x459c4800}}, 5850 {{0xbf800000, 0}}, 5851 {{0x447a4000, 0}}, 5852 {{0x3f800000, 0}}, 5853 {{0xbf800000, 0}}, 5854 {{0, 0}}, 5855 {{0, 0x447a4000}}, 5856 {{0x44fa4000, 0x3f800000}}, 5857 {{0x453ba000, 0xbf800000}}, 5858 {{0x459c5000, 0}}, 5859 {{0x44fa2000, 0}}, 5860 {{0x453b9000, 0}}, 5861 {{0x459c4800, 0}}, 5862 {{0, 0}}, 5863 }; 5864 static const struct 5865 { 5866 int index_value; 5867 unsigned int expected[4]; 5868 } 5869 test_index_to_immediate_table[] = 5870 { 5871 {-1000000, {0, 0x40800000, 0x45bbd800, 0x41300000}}, 5872 {-1001, {0x448d4000, 0x41300000, 0, 0}}, 5873 {-32, {0x448d4000, 0x40800000, 0, 0}}, 5874 {-31, {0x45843000, 0x41400000, 0, 0}}, 5875 {-30, {0x46a64000, 0x41400000, 0x447a4000, 0x3f800000}}, 5876 {-29, {0, 0x447a4000, 0x447a8000, 0x40000000}}, 5877 {-28, {0, 0, 0x447ac000, 0x40400000}}, 5878 {-27, {0, 0x3f800000, 0, 0}}, 5879 {-26, {0, 0x41100000, 0x45bbd800, 0x41300000}}, 5880 {-25, {0, 0x41300000, 0, 0}}, 5881 {-24, {0, 0x41600000, 0, 0}}, 5882 {-23, {0, 0, 0, 0}}, 5883 {-22, {0, 0, 0, 0}}, 5884 {-21, {0, 0x40a00000, 0, 0}}, 5885 {-20, {0, 0x41500000, 0, 0}}, 5886 {-19, {0, 0x41500000, 0, 0}}, 5887 {-18, {0, 0xc1900000, 0, 0}}, 5888 {-17, {0, 0, 0, 0}}, 5889 {-16, {0, 0x40800000, 0, 0}}, 5890 {-15, {0, 0x41400000, 0, 0}}, 5891 {-14, {0, 0x41400000, 0, 0}}, 5892 {-13, {0, 0x447a4000, 0x447a4000, 0x3f800000}}, 5893 {-12, {0, 0, 0, 0}}, 5894 {-11, {0, 0x3f800000, 0, 0}}, 5895 {-10, {0, 0x41100000, 0, 0}}, 5896 {-9, {0, 0x41300000, 0, 0}}, 5897 {-8, {0, 0x41600000, 0, 0}}, 5898 {-7, {0, 0, 0, 0}}, 5899 {-6, {0, 0, 0, 0}}, 5900 {-5, {0, 0x40a00000, 0, 0}}, 5901 {-4, {0, 0x41500000, 0, 0}}, 5902 {-3, {0, 0x41500000, 0, 0}}, 5903 {-2, {0, 0xc0000000, 0, 0}}, 5904 {-1, {0, 0, 0, 0}}, 5905 {0, {0x45052000, 0x40800000, 0x447a4000, 0x3f800000}}, 5906 {1, {0x467e6000, 0x41400000, 0x447a8000, 0x40000000}}, 5907 {2, {0, 0x41400000, 0x447ac000, 0x40400000}}, 5908 {3, {0, 0x447a4000, 0, 0}}, 5909 {4, {0, 0, 0x45bbd800, 0x41300000}}, 5910 {5, {0, 0x3f800000, 0, 0}}, 5911 {6, {0, 0x41100000, 0, 0}}, 5912 {7, {0, 0x41300000, 0, 0}}, 5913 {8, {0, 0x41600000, 0, 0}}, 5914 {9, {0, 0, 0, 0}}, 5915 {10, {0, 0, 0, 0}}, 5916 {11, {0, 0x40a00000, 0, 0}}, 5917 {12, {0, 0x41500000, 0, 0}}, 5918 {13, {0, 0x41500000, 0, 0}}, 5919 {14, {0, 0x41600000, 0, 0}}, 5920 {15, {0, 0, 0, 0}}, 5921 {16, {0, 0x40800000, 0, 0}}, 5922 {17, {0x45052000, 0x41400000, 0x447a4000, 0x3f800000}}, 5923 {18, {0x467e6000, 0x41400000, 0x447a8000, 0x40000000}}, 5924 {19, {0, 0x447a4000, 0x447ac000, 0x40400000}}, 5925 {20, {0, 0, 0, 0}}, 5926 {21, {0, 0x3f800000, 0x45bbd800, 0x41300000}}, 5927 {22, {0, 0x41100000, 0, 0}}, 5928 {23, {0, 0x41300000, 0, 0}}, 5929 {24, {0, 0x41600000, 0, 0}}, 5930 {25, {0, 0, 0, 0}}, 5931 {26, {0, 0, 0, 0}}, 5932 {27, {0, 0x40a00000, 0, 0}}, 5933 {28, {0, 0x41500000, 0, 0}}, 5934 {29, {0, 0x41500000, 0, 0}}, 5935 {30, {0, 0x41f00000, 0, 0}}, 5936 {31, {0, 0, 0, 0}}, 5937 {1001, {0, 0, 0, 0}}, 5938 {1000000, {0, 0x40800000, 0, 0}}, 5939 }; 5940 static const D3DLIGHT9 light_filler = {D3DLIGHT_POINT, {1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f}, 5941 {1.0f, 1.0f, 1.0f, 1.0f}}; 5942 unsigned int j, passes_count; 5943 const unsigned int *expected; 5944 const float *expected_float; 5945 ID3DXEffect *effect; 5946 D3DXVECTOR4 fvect; 5947 D3DLIGHT9 light; 5948 const float *v; 5949 HRESULT hr; 5950 int i; 5951 5952 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 5953 NULL, NULL, 0, NULL, &effect, NULL); 5954 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5955 5956 hr = effect->lpVtbl->Begin(effect, &passes_count, 0); 5957 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5958 hr = effect->lpVtbl->BeginPass(effect, 0); 5959 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5960 5961 fvect.x = 1001.0f; fvect.y = 1002.0f; fvect.z = 1003.0f; fvect.w = 1004.0f; 5962 hr = effect->lpVtbl->SetVector(effect, "opvect1", &fvect); 5963 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5964 5965 fvect.x = 2001.0f; fvect.y = 2002.0f; fvect.z = 2003.0f; fvect.w = 2004.0f; 5966 hr = effect->lpVtbl->SetVector(effect, "g_Selector[0]", &fvect); 5967 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5968 5969 fvect.x = 3001.0f; fvect.y = 3002.0f; fvect.z = 3003.0f; fvect.w = 3004.0f; 5970 hr = effect->lpVtbl->SetVector(effect, "g_Selector[1]", &fvect); 5971 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5972 5973 v = &light.Specular.r; 5974 for (i = 0; i < ARRAY_SIZE(test_out_of_bounds_index); ++i) 5975 { 5976 hr = effect->lpVtbl->SetVector(effect, "opvect2", &test_out_of_bounds_index[i].opvect2); 5977 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5978 hr = effect->lpVtbl->SetVector(effect, "g_iVect", &test_out_of_bounds_index[i].g_ivect); 5979 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5980 5981 hr = IDirect3DDevice9_SetLight(device, 1, &light_filler); 5982 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5983 5984 hr = effect->lpVtbl->CommitChanges(effect); 5985 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5986 5987 hr = IDirect3DDevice9_GetLight(device, 1, &light); 5988 ok(hr == D3D_OK, "Got result %#x.\n", hr); 5989 5990 expected = test_out_of_bounds_index[i].expected; 5991 expected_float = (const float *)expected; 5992 5993 for (j = 0; j < 4; ++j) 5994 { 5995 ok(compare_float(v[j], expected_float[j], 0), 5996 "Test %d, component %u, expected %#x (%g), got %#x (%g).\n", 5997 i, j, expected[j], expected_float[j], ((const unsigned int *)v)[j], v[j]); 5998 } 5999 } 6000 6001 hr = effect->lpVtbl->SetVector(effect, "opvect2", &test_out_of_bounds_index[7].opvect2); 6002 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6003 hr = effect->lpVtbl->SetVector(effect, "g_iVect", &test_out_of_bounds_index[7].g_ivect); 6004 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6005 6006 hr = IDirect3DDevice9_SetLight(device, 1, &light_filler); 6007 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6008 6009 fvect = test_out_of_bounds_index[7].g_ivect; 6010 v = &light.Specular.b; 6011 for (i = -100; i < 100; ++i) 6012 { 6013 fvect.w = i; 6014 hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect); 6015 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6016 hr = effect->lpVtbl->CommitChanges(effect); 6017 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6018 6019 hr = IDirect3DDevice9_GetLight(device, 1, &light); 6020 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6021 6022 expected = expected_light_specular[(unsigned int)i % ARRAY_SIZE(expected_light_specular)].zw; 6023 expected_float = (const float *)expected; 6024 6025 for (j = 0; j < 2; ++j) 6026 { 6027 ok(compare_float(v[j], expected_float[j], 0), 6028 "i %d, component %u, expected %#x (%g), got %#x (%g).\n", 6029 i, j + 2, expected[j], expected_float[j], ((const unsigned int *)v)[j], v[j]); 6030 } 6031 } 6032 6033 v = &light.Specular.r; 6034 for (i = 0; i < ARRAY_SIZE(test_index_to_immediate_table); ++i) 6035 { 6036 fvect.x = fvect.y = fvect.z = fvect.w = test_index_to_immediate_table[i].index_value; 6037 hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect); 6038 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6039 hr = effect->lpVtbl->CommitChanges(effect); 6040 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6041 6042 hr = IDirect3DDevice9_GetLight(device, 2, &light); 6043 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6044 6045 expected = test_index_to_immediate_table[i].expected; 6046 expected_float = (const float *)expected; 6047 6048 for (j = 0; j < 4; ++j) 6049 { 6050 ok(compare_float(v[j], expected_float[j], 0), 6051 "Test %d, component %u, expected %#x (%g), got %#x (%g).\n", 6052 i, j, expected[j], expected_float[j], ((const unsigned int *)v)[j], v[j]); 6053 } 6054 } 6055 6056 hr = effect->lpVtbl->EndPass(effect); 6057 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6058 hr = effect->lpVtbl->End(effect); 6059 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6060 6061 effect->lpVtbl->Release(effect); 6062 } 6063 6064 struct test_state_manager_update 6065 { 6066 unsigned int state_op; 6067 DWORD param1; 6068 DWORD param2; 6069 }; 6070 6071 struct test_manager 6072 { 6073 ID3DXEffectStateManager ID3DXEffectStateManager_iface; 6074 LONG ref; 6075 6076 IDirect3DDevice9 *device; 6077 struct test_state_manager_update *update_record; 6078 unsigned int update_record_count; 6079 unsigned int update_record_size; 6080 }; 6081 6082 #define INITIAL_UPDATE_RECORD_SIZE 64 6083 6084 static struct test_manager *impl_from_ID3DXEffectStateManager(ID3DXEffectStateManager *iface) 6085 { 6086 return CONTAINING_RECORD(iface, struct test_manager, ID3DXEffectStateManager_iface); 6087 } 6088 6089 static void free_test_effect_state_manager(struct test_manager *state_manager) 6090 { 6091 HeapFree(GetProcessHeap(), 0, state_manager->update_record); 6092 state_manager->update_record = NULL; 6093 6094 IDirect3DDevice9_Release(state_manager->device); 6095 } 6096 6097 static ULONG WINAPI test_manager_AddRef(ID3DXEffectStateManager *iface) 6098 { 6099 struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface); 6100 6101 return InterlockedIncrement(&state_manager->ref); 6102 } 6103 6104 static ULONG WINAPI test_manager_Release(ID3DXEffectStateManager *iface) 6105 { 6106 struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface); 6107 ULONG ref = InterlockedDecrement(&state_manager->ref); 6108 6109 if (!ref) 6110 { 6111 free_test_effect_state_manager(state_manager); 6112 HeapFree(GetProcessHeap(), 0, state_manager); 6113 } 6114 return ref; 6115 } 6116 6117 static HRESULT test_process_set_state(ID3DXEffectStateManager *iface, 6118 unsigned int state_op, DWORD param1, DWORD param2) 6119 { 6120 struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface); 6121 6122 if (state_manager->update_record_count == state_manager->update_record_size) 6123 { 6124 if (!state_manager->update_record_size) 6125 { 6126 state_manager->update_record_size = INITIAL_UPDATE_RECORD_SIZE; 6127 state_manager->update_record = HeapAlloc(GetProcessHeap(), 0, 6128 sizeof(*state_manager->update_record) * state_manager->update_record_size); 6129 } 6130 else 6131 { 6132 state_manager->update_record_size *= 2; 6133 state_manager->update_record = HeapReAlloc(GetProcessHeap(), 0, state_manager->update_record, 6134 sizeof(*state_manager->update_record) * state_manager->update_record_size); 6135 } 6136 } 6137 state_manager->update_record[state_manager->update_record_count].state_op = state_op; 6138 state_manager->update_record[state_manager->update_record_count].param1 = param1; 6139 state_manager->update_record[state_manager->update_record_count].param2 = param2; 6140 ++state_manager->update_record_count; 6141 return D3D_OK; 6142 } 6143 6144 static HRESULT WINAPI test_manager_SetTransform(ID3DXEffectStateManager *iface, 6145 D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix) 6146 { 6147 return test_process_set_state(iface, 0, state, 0); 6148 } 6149 6150 static HRESULT WINAPI test_manager_SetMaterial(ID3DXEffectStateManager *iface, 6151 const D3DMATERIAL9 *material) 6152 { 6153 return test_process_set_state(iface, 1, 0, 0); 6154 } 6155 6156 static HRESULT WINAPI test_manager_SetLight(ID3DXEffectStateManager *iface, 6157 DWORD index, const D3DLIGHT9 *light) 6158 { 6159 struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface); 6160 6161 IDirect3DDevice9_SetLight(state_manager->device, index, light); 6162 return test_process_set_state(iface, 2, index, 0); 6163 } 6164 6165 static HRESULT WINAPI test_manager_LightEnable(ID3DXEffectStateManager *iface, 6166 DWORD index, BOOL enable) 6167 { 6168 struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface); 6169 6170 IDirect3DDevice9_LightEnable(state_manager->device, index, enable); 6171 return test_process_set_state(iface, 3, index, 0); 6172 } 6173 6174 static HRESULT WINAPI test_manager_SetRenderState(ID3DXEffectStateManager *iface, 6175 D3DRENDERSTATETYPE state, DWORD value) 6176 { 6177 return test_process_set_state(iface, 4, state, 0); 6178 } 6179 6180 static HRESULT WINAPI test_manager_SetTexture(ID3DXEffectStateManager *iface, 6181 DWORD stage, struct IDirect3DBaseTexture9 *texture) 6182 { 6183 return test_process_set_state(iface, 5, stage, 0); 6184 } 6185 6186 static HRESULT WINAPI test_manager_SetTextureStageState(ID3DXEffectStateManager *iface, 6187 DWORD stage, D3DTEXTURESTAGESTATETYPE type, DWORD value) 6188 { 6189 return test_process_set_state(iface, 6, stage, type); 6190 } 6191 6192 static HRESULT WINAPI test_manager_SetSamplerState(ID3DXEffectStateManager *iface, 6193 DWORD sampler, D3DSAMPLERSTATETYPE type, DWORD value) 6194 { 6195 return test_process_set_state(iface, 7, sampler, type); 6196 } 6197 6198 static HRESULT WINAPI test_manager_SetNPatchMode(ID3DXEffectStateManager *iface, 6199 FLOAT num_segments) 6200 { 6201 return test_process_set_state(iface, 8, 0, 0); 6202 } 6203 6204 static HRESULT WINAPI test_manager_SetFVF(ID3DXEffectStateManager *iface, 6205 DWORD format) 6206 { 6207 return test_process_set_state(iface, 9, 0, 0); 6208 } 6209 6210 static HRESULT WINAPI test_manager_SetVertexShader(ID3DXEffectStateManager *iface, 6211 struct IDirect3DVertexShader9 *shader) 6212 { 6213 return test_process_set_state(iface, 10, 0, 0); 6214 } 6215 6216 static HRESULT WINAPI test_manager_SetVertexShaderConstantF(ID3DXEffectStateManager *iface, 6217 UINT register_index, const FLOAT *constant_data, UINT register_count) 6218 { 6219 return test_process_set_state(iface, 11, register_index, register_count); 6220 } 6221 6222 static HRESULT WINAPI test_manager_SetVertexShaderConstantI(ID3DXEffectStateManager *iface, 6223 UINT register_index, const INT *constant_data, UINT register_count) 6224 { 6225 return test_process_set_state(iface, 12, register_index, register_count); 6226 } 6227 6228 static HRESULT WINAPI test_manager_SetVertexShaderConstantB(ID3DXEffectStateManager *iface, 6229 UINT register_index, const BOOL *constant_data, UINT register_count) 6230 { 6231 return test_process_set_state(iface, 13, register_index, register_count); 6232 } 6233 6234 static HRESULT WINAPI test_manager_SetPixelShader(ID3DXEffectStateManager *iface, 6235 struct IDirect3DPixelShader9 *shader) 6236 { 6237 return test_process_set_state(iface, 14, 0, 0); 6238 } 6239 6240 static HRESULT WINAPI test_manager_SetPixelShaderConstantF(ID3DXEffectStateManager *iface, 6241 UINT register_index, const FLOAT *constant_data, UINT register_count) 6242 { 6243 return test_process_set_state(iface, 15, register_index, register_count); 6244 } 6245 6246 static HRESULT WINAPI test_manager_SetPixelShaderConstantI(ID3DXEffectStateManager *iface, 6247 UINT register_index, const INT *constant_data, UINT register_count) 6248 { 6249 return test_process_set_state(iface, 16, register_index, register_count); 6250 } 6251 6252 static HRESULT WINAPI test_manager_SetPixelShaderConstantB(ID3DXEffectStateManager *iface, 6253 UINT register_index, const BOOL *constant_data, UINT register_count) 6254 { 6255 return test_process_set_state(iface, 17, register_index, register_count); 6256 } 6257 6258 static void test_effect_state_manager_init(struct test_manager *state_manager, 6259 IDirect3DDevice9 *device) 6260 { 6261 static const struct ID3DXEffectStateManagerVtbl test_ID3DXEffectStateManager_Vtbl = 6262 { 6263 /*** IUnknown methods ***/ 6264 NULL, 6265 test_manager_AddRef, 6266 test_manager_Release, 6267 /*** ID3DXEffectStateManager methods ***/ 6268 test_manager_SetTransform, 6269 test_manager_SetMaterial, 6270 test_manager_SetLight, 6271 test_manager_LightEnable, 6272 test_manager_SetRenderState, 6273 test_manager_SetTexture, 6274 test_manager_SetTextureStageState, 6275 test_manager_SetSamplerState, 6276 test_manager_SetNPatchMode, 6277 test_manager_SetFVF, 6278 test_manager_SetVertexShader, 6279 test_manager_SetVertexShaderConstantF, 6280 test_manager_SetVertexShaderConstantI, 6281 test_manager_SetVertexShaderConstantB, 6282 test_manager_SetPixelShader, 6283 test_manager_SetPixelShaderConstantF, 6284 test_manager_SetPixelShaderConstantI, 6285 test_manager_SetPixelShaderConstantB, 6286 }; 6287 6288 state_manager->ID3DXEffectStateManager_iface.lpVtbl = &test_ID3DXEffectStateManager_Vtbl; 6289 state_manager->ref = 1; 6290 6291 IDirect3DDevice9_AddRef(device); 6292 state_manager->device = device; 6293 } 6294 6295 static const char *test_effect_state_manager_state_names[] = 6296 { 6297 "SetTransform", 6298 "SetMaterial", 6299 "SetLight", 6300 "LightEnable", 6301 "SetRenderState", 6302 "SetTexture", 6303 "SetTextureStageState", 6304 "SetSamplerState", 6305 "SetNPatchMode", 6306 "SetFVF", 6307 "SetVertexShader", 6308 "SetVertexShaderConstantF", 6309 "SetVertexShaderConstantI", 6310 "SetVertexShaderConstantB", 6311 "SetPixelShader", 6312 "SetPixelShaderConstantF", 6313 "SetPixelShaderConstantI", 6314 "SetPixelShaderConstantB", 6315 }; 6316 6317 static int compare_update_record(const void *a, const void *b) 6318 { 6319 const struct test_state_manager_update *r1 = (const struct test_state_manager_update *)a; 6320 const struct test_state_manager_update *r2 = (const struct test_state_manager_update *)b; 6321 6322 if (r1->state_op != r2->state_op) 6323 return r1->state_op - r2->state_op; 6324 if (r1->param1 != r2->param1) 6325 return r1->param1 - r2->param1; 6326 return r1->param2 - r2->param2; 6327 } 6328 6329 static void test_effect_state_manager(IDirect3DDevice9 *device) 6330 { 6331 static const struct test_state_manager_update expected_updates[] = 6332 { 6333 {2, 0, 0}, 6334 {2, 1, 0}, 6335 {2, 2, 0}, 6336 {2, 3, 0}, 6337 {2, 4, 0}, 6338 {2, 5, 0}, 6339 {2, 6, 0}, 6340 {2, 7, 0}, 6341 {3, 0, 0}, 6342 {3, 1, 0}, 6343 {3, 2, 0}, 6344 {3, 3, 0}, 6345 {3, 4, 0}, 6346 {3, 5, 0}, 6347 {3, 6, 0}, 6348 {3, 7, 0}, 6349 {4, 28, 0}, 6350 {4, 36, 0}, 6351 {4, 38, 0}, 6352 {4, 158, 0}, 6353 {4, 159, 0}, 6354 {5, 0, 0}, 6355 {5, 259, 0}, 6356 {7, 0, 5}, 6357 {7, 0, 6}, 6358 {7, 1, 5}, 6359 {7, 1, 6}, 6360 {7, 257, 5}, 6361 {7, 257, 6}, 6362 {7, 258, 5}, 6363 {7, 258, 6}, 6364 {7, 259, 5}, 6365 {7, 259, 6}, 6366 {10, 0, 0}, 6367 {11, 0, 34}, 6368 {14, 0, 0}, 6369 {15, 0, 14}, 6370 {16, 0, 1}, 6371 {17, 0, 6}, 6372 }; 6373 static D3DLIGHT9 light_filler = 6374 {D3DLIGHT_DIRECTIONAL, {0.5f, 0.5f, 0.5f, 0.5f}, {0.5f, 0.5f, 0.5f, 0.5f}, {0.5f, 0.5f, 0.5f, 0.5f}}; 6375 struct test_manager *state_manager; 6376 unsigned int passes_count, i, n; 6377 ID3DXEffect *effect; 6378 ULONG refcount; 6379 HRESULT hr; 6380 6381 state_manager = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*state_manager)); 6382 test_effect_state_manager_init(state_manager, device); 6383 6384 for (i = 0; i < 8; ++i) 6385 { 6386 hr = IDirect3DDevice9_SetLight(device, i, &light_filler); 6387 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6388 } 6389 6390 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 6391 NULL, NULL, 0, NULL, &effect, NULL); 6392 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6393 6394 hr = effect->lpVtbl->SetStateManager(effect, &state_manager->ID3DXEffectStateManager_iface); 6395 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6396 6397 hr = effect->lpVtbl->Begin(effect, &passes_count, 0); 6398 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6399 6400 hr = effect->lpVtbl->BeginPass(effect, 0); 6401 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6402 6403 hr = effect->lpVtbl->EndPass(effect); 6404 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6405 6406 hr = effect->lpVtbl->End(effect); 6407 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6408 6409 effect->lpVtbl->Release(effect); 6410 6411 qsort(state_manager->update_record, state_manager->update_record_count, 6412 sizeof(*state_manager->update_record), compare_update_record); 6413 6414 ok(ARRAY_SIZE(expected_updates) == state_manager->update_record_count, 6415 "Got %u update records.\n", state_manager->update_record_count); 6416 n = min(ARRAY_SIZE(expected_updates), state_manager->update_record_count); 6417 for (i = 0; i < n; ++i) 6418 { 6419 ok(!memcmp(&expected_updates[i], &state_manager->update_record[i], 6420 sizeof(expected_updates[i])), 6421 "Update record mismatch, expected %s, %u, %u, got %s, %u, %u.\n", 6422 test_effect_state_manager_state_names[expected_updates[i].state_op], 6423 expected_updates[i].param1, expected_updates[i].param2, 6424 test_effect_state_manager_state_names[state_manager->update_record[i].state_op], 6425 state_manager->update_record[i].param1, state_manager->update_record[i].param2); 6426 } 6427 6428 for (i = 0; i < 8; ++i) 6429 { 6430 D3DLIGHT9 light; 6431 6432 hr = IDirect3DDevice9_GetLight(device, i, &light); 6433 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6434 ok(!memcmp(&light, &light_filler, sizeof(light)), "Light %u mismatch.\n", i); 6435 } 6436 6437 refcount = state_manager->ID3DXEffectStateManager_iface.lpVtbl->Release( 6438 &state_manager->ID3DXEffectStateManager_iface); 6439 ok(!refcount, "State manager was not properly freed, refcount %u.\n", refcount); 6440 } 6441 6442 static void test_cross_effect_handle(IDirect3DDevice9 *device) 6443 { 6444 ID3DXEffect *effect1, *effect2; 6445 D3DXHANDLE param1, param2; 6446 static int expected_ivect[4] = {28, 29, 30, 31}; 6447 int ivect[4]; 6448 HRESULT hr; 6449 6450 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 6451 NULL, NULL, 0, NULL, &effect1, NULL); 6452 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6453 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 6454 NULL, NULL, 0, NULL, &effect2, NULL); 6455 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6456 6457 ok(effect1 != effect2, "Got same effect unexpectedly.\n"); 6458 6459 param1 = effect1->lpVtbl->GetParameterByName(effect1, NULL, "g_iVect"); 6460 ok(!!param1, "GetParameterByName failed.\n"); 6461 6462 param2 = effect2->lpVtbl->GetParameterByName(effect2, NULL, "g_iVect"); 6463 ok(!!param2, "GetParameterByName failed.\n"); 6464 6465 ok(param1 != param2, "Got same parameter handle unexpectedly.\n"); 6466 6467 hr = effect2->lpVtbl->SetValue(effect2, param1, expected_ivect, sizeof(expected_ivect)); 6468 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6469 6470 hr = effect1->lpVtbl->GetValue(effect1, param1, ivect, sizeof(ivect)); 6471 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6472 6473 ok(!memcmp(ivect, expected_ivect, sizeof(expected_ivect)), "Vector value mismatch.\n"); 6474 6475 effect2->lpVtbl->Release(effect2); 6476 effect1->lpVtbl->Release(effect1); 6477 } 6478 6479 #if 0 6480 struct test_struct 6481 { 6482 float3 v1_2; 6483 float fv_2; 6484 float4 v2_2; 6485 }; 6486 6487 shared float arr2[1]; 6488 shared test_struct ts2[2] = {{{0, 0, 0}, 0, {0, 0, 0, 0}}, {{1, 2, 3}, 4, {5, 6, 7, 8}}}; 6489 6490 struct VS_OUTPUT 6491 { 6492 float4 Position : POSITION; 6493 }; 6494 6495 VS_OUTPUT RenderSceneVS(float4 vPos : POSITION) 6496 { 6497 VS_OUTPUT Output; 6498 6499 Output.Position = arr2[0] * vPos; 6500 return Output; 6501 } 6502 6503 shared vertexshader vs_arr2[2] = {compile vs_3_0 RenderSceneVS(), NULL}; 6504 6505 technique tech0 6506 { 6507 pass p0 6508 { 6509 FogEnable = TRUE; 6510 FogDensity = arr2[0]; 6511 PointScale_A = ts2[0].fv_2; 6512 VertexShader = vs_arr2[0]; 6513 } 6514 6515 pass p1 6516 { 6517 VertexShader = vs_arr2[1]; 6518 } 6519 } 6520 #endif 6521 static const DWORD test_effect_shared_parameters_blob[] = 6522 { 6523 0xfeff0901, 0x000001dc, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000001, 6524 0x00000001, 0x00000001, 0x00000000, 0x00000005, 0x32727261, 0x00000000, 0x00000000, 0x00000005, 6525 0x000000dc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00000001, 0x000000e4, 0x00000000, 6526 0x00000000, 0x00000003, 0x00000001, 0x00000003, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 6527 0x00000001, 0x00000001, 0x00000003, 0x00000001, 0x000000fc, 0x00000000, 0x00000000, 0x00000004, 6528 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 6529 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 0x40a00000, 0x40c00000, 0x40e00000, 6530 0x41000000, 0x00000004, 0x00327374, 0x00000005, 0x325f3176, 0x00000000, 0x00000005, 0x325f7666, 6531 0x00000000, 0x00000005, 0x325f3276, 0x00000000, 0x00000010, 0x00000004, 0x00000124, 0x00000000, 6532 0x00000002, 0x00000001, 0x00000002, 0x00000008, 0x615f7376, 0x00327272, 0x00000001, 0x00000002, 6533 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 6534 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 6535 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00000010, 6536 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00003070, 0x00000004, 0x00000010, 6537 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00003170, 0x00000006, 0x68636574, 6538 0x00000030, 0x00000003, 0x00000001, 0x00000006, 0x00000005, 0x00000004, 0x00000020, 0x00000001, 6539 0x00000000, 0x00000030, 0x0000009c, 0x00000001, 0x00000000, 0x00000108, 0x0000011c, 0x00000001, 6540 0x00000000, 0x000001d0, 0x00000000, 0x00000002, 0x000001a8, 0x00000000, 0x00000004, 0x0000000e, 6541 0x00000000, 0x00000134, 0x00000130, 0x00000014, 0x00000000, 0x00000154, 0x00000150, 0x00000041, 6542 0x00000000, 0x00000174, 0x00000170, 0x00000092, 0x00000000, 0x00000194, 0x00000190, 0x000001c8, 6543 0x00000000, 0x00000001, 0x00000092, 0x00000000, 0x000001b4, 0x000001b0, 0x00000002, 0x00000004, 6544 0x00000001, 0x000000c8, 0xfffe0300, 0x0025fffe, 0x42415443, 0x0000001c, 0x0000005f, 0xfffe0300, 6545 0x00000001, 0x0000001c, 0x00000000, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 6546 0x00000048, 0x32727261, 0xababab00, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0x00000000, 6547 0x00000000, 0x00000000, 0x00000000, 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 6548 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 6549 0x00313131, 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x03000005, 6550 0xe00f0000, 0xa0000000, 0x90e40000, 0x0000ffff, 0x00000002, 0x00000000, 0x00000000, 0x00000001, 6551 0xffffffff, 0x00000000, 0x00000001, 0x0000000b, 0x615f7376, 0x5b327272, 0x00005d31, 0x00000000, 6552 0x00000000, 0xffffffff, 0x00000003, 0x00000001, 0x0000000b, 0x615f7376, 0x5b327272, 0x00005d30, 6553 0x00000000, 0x00000000, 0xffffffff, 0x00000002, 0x00000000, 0x00000188, 0x46580200, 0x004ffffe, 6554 0x42415443, 0x0000001c, 0x00000107, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000104, 6555 0x00000030, 0x00000002, 0x00000002, 0x00000094, 0x000000a4, 0x00327374, 0x325f3176, 0xababab00, 6556 0x00030001, 0x00030001, 0x00000001, 0x00000000, 0x325f7666, 0xababab00, 0x00030000, 0x00010001, 6557 0x00000001, 0x00000000, 0x325f3276, 0xababab00, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 6558 0x00000034, 0x0000003c, 0x0000004c, 0x00000054, 0x00000064, 0x0000006c, 0x00000005, 0x00080001, 6559 0x00030002, 0x0000007c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 6560 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x40000000, 6561 0x40400000, 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 6562 0x40e00000, 0x41000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 6563 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 6564 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 6565 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 6566 0x00000000, 0x00000000, 0xffffffff, 0x00000001, 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 6567 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 6568 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x32727261, 0xababab00, 0x00030000, 6569 0x00010001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874, 6570 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 6571 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 6572 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 6573 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 6574 }; 6575 6576 #ifdef __REACTOS__ 6577 #define test_effect_shared_vs_arr_compare_helper(...) \ 6578 test_effect_shared_vs_arr_compare_helper_(__LINE__, __VA_ARGS__) 6579 #else 6580 #define test_effect_shared_vs_arr_compare_helper(args...) \ 6581 test_effect_shared_vs_arr_compare_helper_(__LINE__, args) 6582 #endif 6583 static void test_effect_shared_vs_arr_compare_helper_(unsigned int line, ID3DXEffect *effect, 6584 D3DXHANDLE param_child, struct IDirect3DVertexShader9 *vshader1, unsigned int element, 6585 BOOL todo) 6586 { 6587 struct IDirect3DVertexShader9 *vshader2; 6588 D3DXHANDLE param_child2; 6589 HRESULT hr; 6590 6591 param_child2 = effect->lpVtbl->GetParameterElement(effect, "vs_arr2", element); 6592 ok_(__FILE__, line)(!!param_child2, "GetParameterElement failed.\n"); 6593 ok_(__FILE__, line)(param_child != param_child2, "Got same parameter handle unexpectedly.\n"); 6594 hr = effect->lpVtbl->GetVertexShader(effect, param_child2, &vshader2); 6595 ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr); 6596 todo_wine_if(todo) 6597 ok_(__FILE__, line)(vshader1 == vshader2, "Shared shader interface pointers differ.\n"); 6598 if (vshader2) 6599 IDirect3DVertexShader9_Release(vshader2); 6600 } 6601 6602 #ifdef __REACTOS__ 6603 #define test_effect_shared_parameters_compare_vconst(...) \ 6604 test_effect_shared_parameters_compare_vconst_(__LINE__, __VA_ARGS__) 6605 #else 6606 #define test_effect_shared_parameters_compare_vconst(args...) \ 6607 test_effect_shared_parameters_compare_vconst_(__LINE__, args) 6608 #endif 6609 static void test_effect_shared_parameters_compare_vconst_(unsigned int line, IDirect3DDevice9 *device, 6610 unsigned int index, const D3DXVECTOR4 *expected_fvect, BOOL todo) 6611 { 6612 D3DXVECTOR4 fvect; 6613 HRESULT hr; 6614 6615 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, index, &fvect.x, 1); 6616 ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr); 6617 todo_wine_if(todo) 6618 ok_(__FILE__, line)(!memcmp(&fvect, expected_fvect, sizeof(fvect)), 6619 "Unexpected constant value %g, %g, %g, %g.\n", fvect.x, fvect.y, fvect.z, fvect.w); 6620 } 6621 6622 static void test_effect_shared_parameters(IDirect3DDevice9 *device) 6623 { 6624 ID3DXEffect *effect1, *effect2, *effect3, *effect4; 6625 ID3DXEffectPool *pool; 6626 HRESULT hr; 6627 D3DXHANDLE param, param_child, param2, param_child2; 6628 unsigned int i, passes_count; 6629 ULONG refcount; 6630 D3DXVECTOR4 fvect; 6631 float fval[2]; 6632 6633 hr = D3DXCreateEffectPool(&pool); 6634 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6635 6636 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 6637 NULL, NULL, 0, pool, &effect2, NULL); 6638 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6639 effect2->lpVtbl->SetFloat(effect2, "arr2[0]", 28.0f); 6640 effect2->lpVtbl->Release(effect2); 6641 6642 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 6643 NULL, NULL, 0, pool, &effect2, NULL); 6644 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6645 effect2->lpVtbl->GetFloat(effect2, "arr2[0]", &fvect.x); 6646 ok(fvect.x == 92.0f, "Unexpected parameter value %g.\n", fvect.x); 6647 effect2->lpVtbl->SetFloat(effect2, "arr2[0]", 28.0f); 6648 6649 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 6650 NULL, NULL, 0, pool, &effect1, NULL); 6651 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6652 6653 effect1->lpVtbl->GetFloat(effect1, "arr2[0]", &fvect.x); 6654 ok(fvect.x == 28.0f, "Unexpected parameter value %g.\n", fvect.x); 6655 6656 hr = D3DXCreateEffect(device, test_effect_shared_parameters_blob, sizeof(test_effect_shared_parameters_blob), 6657 NULL, NULL, 0, pool, &effect3, NULL); 6658 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6659 hr = D3DXCreateEffect(device, test_effect_shared_parameters_blob, sizeof(test_effect_shared_parameters_blob), 6660 NULL, NULL, 0, pool, &effect4, NULL); 6661 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6662 6663 effect2->lpVtbl->SetFloat(effect2, "arr2[0]", 3.0f); 6664 effect2->lpVtbl->SetFloat(effect2, "ts2[0].fv", 3.0f); 6665 6666 effect3->lpVtbl->GetFloat(effect3, "arr2[0]", &fvect.x); 6667 ok(fvect.x == 0.0f, "Unexpected parameter value %g.\n", fvect.x); 6668 effect4->lpVtbl->SetFloat(effect4, "arr2[0]", 28.0f); 6669 effect3->lpVtbl->GetFloat(effect3, "arr2[0]", &fvect.x); 6670 ok(fvect.x == 28.0f, "Unexpected parameter value %g.\n", fvect.x); 6671 effect1->lpVtbl->GetFloat(effect1, "arr2[0]", &fvect.x); 6672 ok(fvect.x == 3.0f, "Unexpected parameter value %g.\n", fvect.x); 6673 6674 param = effect3->lpVtbl->GetParameterByName(effect3, NULL, "ts2[0].fv_2"); 6675 ok(!!param, "GetParameterByName failed.\n"); 6676 effect3->lpVtbl->GetFloat(effect3, param, &fvect.x); 6677 ok(fvect.x == 0.0f, "Unexpected parameter value %g.\n", fvect.x); 6678 6679 param = effect1->lpVtbl->GetParameterByName(effect1, NULL, "arr2"); 6680 ok(!!param, "GetParameterByName failed.\n"); 6681 ok(!effect3->lpVtbl->IsParameterUsed(effect3, param, "tech0"), 6682 "Unexpected IsParameterUsed result.\n"); 6683 6684 param = effect3->lpVtbl->GetParameterByName(effect3, NULL, "arr2"); 6685 ok(!!param, "GetParameterByName failed.\n"); 6686 ok(effect3->lpVtbl->IsParameterUsed(effect3, param, "tech0"), 6687 "Unexpected IsParameterUsed result.\n"); 6688 6689 param = effect1->lpVtbl->GetParameterByName(effect1, NULL, "vs_arr2"); 6690 ok(!!param, "GetParameterByName failed.\n"); 6691 todo_wine 6692 ok(!effect3->lpVtbl->IsParameterUsed(effect3, param, "tech0"), 6693 "Unexpected IsParameterUsed result.\n"); 6694 6695 ok(effect3->lpVtbl->IsParameterUsed(effect3, "vs_arr2", "tech0"), 6696 "Unexpected IsParameterUsed result.\n"); 6697 ok(!effect3->lpVtbl->IsParameterUsed(effect3, "vs_arr2[0]", "tech0"), 6698 "Unexpected IsParameterUsed result.\n"); 6699 ok(!effect3->lpVtbl->IsParameterUsed(effect3, "vs_arr2[1]", "tech0"), 6700 "Unexpected IsParameterUsed result.\n"); 6701 6702 ok(effect1->lpVtbl->IsParameterUsed(effect1, param, "tech0"), 6703 "Unexpected IsParameterUsed result.\n"); 6704 6705 hr = effect3->lpVtbl->Begin(effect3, &passes_count, 0); 6706 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6707 6708 if (0) 6709 { 6710 /* Native d3dx crashes in BeginPass(). This is the case of shader array declared shared 6711 * but initialized with different shaders using different parameters. */ 6712 hr = effect3->lpVtbl->BeginPass(effect3, 0); 6713 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6714 6715 hr = effect3->lpVtbl->EndPass(effect3); 6716 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6717 } 6718 6719 test_effect_clear_vconsts(device); 6720 fvect.x = fvect.y = fvect.z = fvect.w = 28.0f; 6721 hr = effect2->lpVtbl->SetVector(effect2, "g_Pos1", &fvect); 6722 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6723 hr = effect1->lpVtbl->SetVector(effect1, "g_Pos1", &fvect); 6724 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6725 6726 hr = effect3->lpVtbl->BeginPass(effect3, 1); 6727 todo_wine 6728 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6729 6730 hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 0, &fvect.x, 1); 6731 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6732 todo_wine 6733 ok(fvect.x == 0.0f && fvect.y == 0.0f && fvect.z == 0.0f && fvect.w == 0.0f, 6734 "Unexpected vector %g, %g, %g, %g.\n", fvect.x, fvect.y, fvect.z, fvect.w); 6735 6736 hr = effect3->lpVtbl->EndPass(effect3); 6737 todo_wine 6738 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6739 6740 hr = effect3->lpVtbl->End(effect3); 6741 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6742 6743 for (i = 0; i < 2; ++i) 6744 { 6745 struct IDirect3DVertexShader9 *vshader1; 6746 6747 param_child = effect1->lpVtbl->GetParameterElement(effect1, "vs_arr2", i); 6748 ok(!!param_child, "GetParameterElement failed.\n"); 6749 hr = effect1->lpVtbl->GetVertexShader(effect1, param_child, &vshader1); 6750 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6751 6752 test_effect_shared_vs_arr_compare_helper(effect2, param_child, vshader1, i, FALSE); 6753 test_effect_shared_vs_arr_compare_helper(effect3, param_child, vshader1, i, FALSE); 6754 test_effect_shared_vs_arr_compare_helper(effect4, param_child, vshader1, i, FALSE); 6755 IDirect3DVertexShader9_Release(vshader1); 6756 } 6757 6758 effect3->lpVtbl->Release(effect3); 6759 effect4->lpVtbl->Release(effect4); 6760 6761 fval[0] = 1.0f; 6762 hr = effect1->lpVtbl->SetFloatArray(effect1, "arr1", fval, 1); 6763 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6764 fval[0] = 0.0f; 6765 hr = effect2->lpVtbl->GetFloatArray(effect2, "arr1", fval, 1); 6766 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6767 ok(fval[0] == 91.0f, "Unexpected value %g.\n", fval[0]); 6768 6769 param = effect1->lpVtbl->GetParameterByName(effect1, NULL, "arr2"); 6770 ok(!!param, "GetParameterByName failed.\n"); 6771 param2 = effect2->lpVtbl->GetParameterByName(effect2, NULL, "arr2"); 6772 ok(!!param, "GetParameterByName failed.\n"); 6773 ok(param != param2, "Got same parameter handle unexpectedly.\n"); 6774 param_child = effect1->lpVtbl->GetParameterElement(effect1, param, 0); 6775 ok(!!param_child, "GetParameterElement failed.\n"); 6776 param_child2 = effect1->lpVtbl->GetParameterElement(effect2, param2, 0); 6777 ok(!!param_child2, "GetParameterElement failed.\n"); 6778 ok(param_child != param_child2, "Got same parameter handle unexpectedly.\n"); 6779 6780 fval[0] = 33.0f; 6781 hr = effect1->lpVtbl->SetFloatArray(effect1, "arr2", fval, 1); 6782 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6783 fval[0] = 0.0f; 6784 hr = effect1->lpVtbl->GetFloatArray(effect1, "arr2", fval, 2); 6785 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6786 ok(fval[0] == 33.0f && fval[1] == 93.0f, "Unexpected values %g, %g.\n", fval[0], fval[1]); 6787 fval[0] = 0.0f; 6788 hr = effect2->lpVtbl->GetFloatArray(effect2, "arr2", fval, 2); 6789 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6790 ok(fval[0] == 33.0f && fval[1] == 93.0f, "Unexpected values %g, %g.\n", fval[0], fval[1]); 6791 6792 hr = effect1->lpVtbl->Begin(effect1, &passes_count, 0); 6793 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6794 6795 hr = effect2->lpVtbl->Begin(effect2, &passes_count, 0); 6796 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6797 6798 hr = effect1->lpVtbl->BeginPass(effect1, 0); 6799 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6800 6801 fvect.x = 1.0f; 6802 fvect.y = fvect.z = fvect.w = 0.0f; 6803 test_effect_shared_parameters_compare_vconst(device, 32, &fvect, FALSE); 6804 6805 hr = effect1->lpVtbl->BeginPass(effect2, 0); 6806 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6807 6808 fvect.x = 91.0f; 6809 test_effect_shared_parameters_compare_vconst(device, 32, &fvect, FALSE); 6810 fvect.x = 33.0f; 6811 test_effect_shared_parameters_compare_vconst(device, 29, &fvect, FALSE); 6812 6813 fval[0] = 28.0f; 6814 fval[1] = -1.0f; 6815 hr = effect1->lpVtbl->SetFloatArray(effect1, "arr2", fval, 2); 6816 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6817 6818 test_effect_clear_vconsts(device); 6819 6820 hr = effect1->lpVtbl->CommitChanges(effect1); 6821 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6822 6823 fvect.x = 28.0f; 6824 test_effect_shared_parameters_compare_vconst(device, 29, &fvect, FALSE); 6825 fvect.x = -1.0f; 6826 test_effect_shared_parameters_compare_vconst(device, 30, &fvect, FALSE); 6827 6828 test_effect_clear_vconsts(device); 6829 6830 hr = effect1->lpVtbl->CommitChanges(effect1); 6831 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6832 6833 test_effect_shared_parameters_compare_vconst(device, 29, &fvect_filler, FALSE); 6834 test_effect_shared_parameters_compare_vconst(device, 30, &fvect_filler, FALSE); 6835 6836 hr = effect2->lpVtbl->CommitChanges(effect2); 6837 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6838 6839 fvect.x = 28.0f; 6840 test_effect_shared_parameters_compare_vconst(device, 29, &fvect, FALSE); 6841 fvect.x = -1.0f; 6842 test_effect_shared_parameters_compare_vconst(device, 30, &fvect, FALSE); 6843 6844 fval[0] = -2.0f; 6845 hr = effect2->lpVtbl->SetFloat(effect2, "arr2[0]", fval[0]); 6846 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6847 hr = effect1->lpVtbl->CommitChanges(effect1); 6848 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6849 6850 fvect.x = -2.0f; 6851 test_effect_shared_parameters_compare_vconst(device, 29, &fvect, FALSE); 6852 fvect.x = -1.0f; 6853 test_effect_shared_parameters_compare_vconst(device, 30, &fvect, FALSE); 6854 6855 fvect.x = fvect.y = fvect.z = fvect.w = 1111.0f; 6856 hr = effect2->lpVtbl->SetVector(effect2, "g_Pos1", &fvect); 6857 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6858 6859 hr = effect1->lpVtbl->CommitChanges(effect1); 6860 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6861 test_effect_shared_parameters_compare_vconst(device, 31, &fvect_filler, FALSE); 6862 6863 hr = effect1->lpVtbl->CommitChanges(effect2); 6864 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6865 test_effect_shared_parameters_compare_vconst(device, 31, &fvect, FALSE); 6866 6867 hr = effect1->lpVtbl->End(effect1); 6868 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6869 6870 hr = effect2->lpVtbl->End(effect2); 6871 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6872 6873 if (0) 6874 { 6875 refcount = pool->lpVtbl->Release(pool); 6876 ok(refcount == 2, "Unexpected refcount %u.\n", refcount); 6877 6878 refcount = pool->lpVtbl->Release(pool); 6879 ok(refcount == 1, "Unexpected refcount %u.\n", refcount); 6880 6881 refcount = pool->lpVtbl->Release(pool); 6882 ok(!refcount, "Unexpected refcount %u.\n", refcount); 6883 6884 /* Native d3dx crashes in GetFloat(). */ 6885 effect2->lpVtbl->GetFloat(effect2, "arr2[0]", &fvect.x); 6886 } 6887 6888 effect1->lpVtbl->Release(effect1); 6889 effect2->lpVtbl->Release(effect2); 6890 6891 refcount = pool->lpVtbl->Release(pool); 6892 ok(!refcount, "Effect pool was not properly freed, refcount %u.\n", refcount); 6893 } 6894 6895 static void test_effect_large_address_aware_flag(IDirect3DDevice9 *device) 6896 { 6897 ID3DXEffect *effect; 6898 D3DXHANDLE param; 6899 static int expected_ivect[4] = {28, 29, 30, 31}; 6900 int ivect[4]; 6901 HRESULT hr; 6902 6903 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 6904 NULL, NULL, D3DXFX_LARGEADDRESSAWARE, NULL, &effect, NULL); 6905 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6906 6907 param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect"); 6908 ok(!!param, "GetParameterByName failed.\n"); 6909 6910 hr = effect->lpVtbl->SetValue(effect, param, expected_ivect, sizeof(expected_ivect)); 6911 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6912 6913 hr = effect->lpVtbl->GetValue(effect, param, ivect, sizeof(ivect)); 6914 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6915 6916 ok(!memcmp(ivect, expected_ivect, sizeof(expected_ivect)), "Vector value mismatch.\n"); 6917 6918 if (0) 6919 { 6920 /* Native d3dx crashes in GetValue(). */ 6921 hr = effect->lpVtbl->GetValue(effect, "g_iVect", ivect, sizeof(ivect)); 6922 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 6923 } 6924 6925 effect->lpVtbl->Release(effect); 6926 } 6927 6928 static void test_effect_get_pass_desc(IDirect3DDevice9 *device) 6929 { 6930 unsigned int passes_count; 6931 ID3DXEffect *effect; 6932 D3DXPASS_DESC desc; 6933 D3DXVECTOR4 fvect; 6934 D3DXHANDLE pass; 6935 HRESULT hr; 6936 6937 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 6938 NULL, NULL, 0, NULL, &effect, NULL); 6939 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6940 6941 pass = effect->lpVtbl->GetPass(effect, "tech0", 1); 6942 ok(!!pass, "GetPass() failed.\n"); 6943 6944 hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc); 6945 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6946 test_effect_preshader_compare_shader_bytecode(desc.pVertexShaderFunction, 0, 2, FALSE); 6947 6948 fvect.x = fvect.y = fvect.w = 0.0f; 6949 fvect.z = 0.0f; 6950 hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect); 6951 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6952 6953 hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc); 6954 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6955 ok(!desc.pPixelShaderFunction, "Unexpected non null desc.pPixelShaderFunction.\n"); 6956 6957 test_effect_preshader_compare_shader_bytecode(desc.pVertexShaderFunction, 0, 0, FALSE); 6958 6959 fvect.z = 3.0f; 6960 hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect); 6961 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6962 6963 hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc); 6964 ok(hr == E_FAIL, "Got result %#x.\n", hr); 6965 ok(!desc.pVertexShaderFunction, "Unexpected non null desc.pVertexShaderFunction.\n"); 6966 6967 /* Repeating call to confirm GetPassDesc() returns same error on the second call, 6968 * as it is not the case sometimes for BeginPass() with out of bound access. */ 6969 hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc); 6970 ok(hr == E_FAIL, "Got result %#x.\n", hr); 6971 ok(!desc.pVertexShaderFunction, "Unexpected non null desc.pVertexShaderFunction.\n"); 6972 6973 hr = effect->lpVtbl->Begin(effect, &passes_count, 0); 6974 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6975 6976 hr = effect->lpVtbl->BeginPass(effect, 1); 6977 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6978 6979 hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc); 6980 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6981 6982 test_effect_preshader_compare_shader_bytecode(desc.pVertexShaderFunction, 0, 0, FALSE); 6983 6984 fvect.z = 2.0f; 6985 hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect); 6986 hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc); 6987 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6988 test_effect_preshader_compare_shader_bytecode(desc.pVertexShaderFunction, 0, 2, FALSE); 6989 6990 effect->lpVtbl->Release(effect); 6991 6992 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 6993 NULL, NULL, D3DXFX_NOT_CLONEABLE, NULL, &effect, NULL); 6994 ok(hr == D3D_OK, "Got result %#x.\n", hr); 6995 6996 pass = effect->lpVtbl->GetPass(effect, "tech0", 1); 6997 ok(!!pass, "GetPass() failed.\n"); 6998 6999 hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc); 7000 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7001 7002 ok(!desc.pVertexShaderFunction, "Unexpected non null desc.pVertexShaderFunction.\n"); 7003 ok(!desc.pPixelShaderFunction, "Unexpected non null desc.pPixelShaderFunction.\n"); 7004 7005 effect->lpVtbl->Release(effect); 7006 } 7007 7008 #if 0 7009 float v1 : register(c2); 7010 float v2 : register(c3); 7011 float v3; 7012 float v4 : register(c4); 7013 float v5; 7014 float v6[2] : register(c5) = {11, 22}; 7015 7016 struct VS_OUTPUT 7017 { 7018 float4 Position : POSITION; 7019 }; 7020 7021 VS_OUTPUT RenderSceneVS(float4 vPos : POSITION) 7022 { 7023 VS_OUTPUT Output; 7024 7025 Output.Position = v1 * v2 * vPos + v2 + v3 + v4; 7026 Output.Position += v6[0] + v6[1]; 7027 return Output; 7028 } 7029 7030 technique tech0 7031 { 7032 pass p0 7033 { 7034 PointScale_A = v4; 7035 VertexShader = compile vs_3_0 RenderSceneVS(); 7036 } 7037 } 7038 #endif 7039 static const DWORD test_effect_skip_constants_blob[] = 7040 { 7041 0xfeff0901, 0x00000144, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000000, 7042 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00003176, 0x00000003, 0x00000000, 0x0000004c, 7043 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00003276, 0x00000003, 7044 0x00000000, 0x00000074, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 7045 0x00003376, 0x00000003, 0x00000000, 0x0000009c, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 7046 0x00000000, 0x00000003, 0x00003476, 0x00000003, 0x00000000, 0x000000c4, 0x00000000, 0x00000000, 7047 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00003576, 0x00000003, 0x00000000, 0x000000f0, 7048 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x41300000, 0x41b00000, 0x00000003, 0x00003676, 7049 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 7050 0x00000001, 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00003070, 7051 0x00000006, 0x68636574, 0x00000030, 0x00000006, 0x00000001, 0x00000002, 0x00000002, 0x00000004, 7052 0x00000020, 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 7053 0x00000070, 0x00000000, 0x00000000, 0x0000007c, 0x00000098, 0x00000000, 0x00000000, 0x000000a4, 7054 0x000000c0, 0x00000000, 0x00000000, 0x000000cc, 0x000000e8, 0x00000000, 0x00000000, 0x00000138, 7055 0x00000000, 0x00000001, 0x00000130, 0x00000000, 0x00000002, 0x00000041, 0x00000000, 0x000000fc, 7056 0x000000f8, 0x00000092, 0x00000000, 0x0000011c, 0x00000118, 0x00000000, 0x00000002, 0x00000000, 7057 0x00000000, 0xffffffff, 0x00000001, 0x00000000, 0x000001bc, 0xfffe0300, 0x0047fffe, 0x42415443, 7058 0x0000001c, 0x000000e7, 0xfffe0300, 0x00000005, 0x0000001c, 0x20000000, 0x000000e0, 0x00000080, 7059 0x00020002, 0x000a0001, 0x00000084, 0x00000094, 0x000000a4, 0x00030002, 0x000e0001, 0x00000084, 7060 0x00000094, 0x000000a7, 0x00000002, 0x00000001, 0x00000084, 0x00000094, 0x000000aa, 0x00040002, 7061 0x00120001, 0x00000084, 0x00000094, 0x000000ad, 0x00050002, 0x00160002, 0x000000b0, 0x000000c0, 7062 0xab003176, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 7063 0x00000000, 0x76003276, 0x34760033, 0x00367600, 0x00030000, 0x00010001, 0x00000002, 0x00000000, 7064 0x41300000, 0x00000000, 0x00000000, 0x00000000, 0x41b00000, 0x00000000, 0x00000000, 0x00000000, 7065 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 7066 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0200001f, 0x80000000, 7067 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x02000001, 0x80010000, 0xa0000003, 0x03000005, 7068 0x80010000, 0x80000000, 0xa0000002, 0x04000004, 0x800f0000, 0x80000000, 0x90e40000, 0xa0000003, 7069 0x03000002, 0x800f0000, 0x80e40000, 0xa0000000, 0x03000002, 0x800f0000, 0x80e40000, 0xa0000004, 7070 0x02000001, 0x80010001, 0xa0000005, 0x03000002, 0x80010001, 0x80000001, 0xa0000006, 0x03000002, 7071 0xe00f0000, 0x80e40000, 0x80000001, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 7072 0x00000000, 0x000000d8, 0x46580200, 0x0023fffe, 0x42415443, 0x0000001c, 0x00000057, 0x46580200, 7073 0x00000001, 0x0000001c, 0x20000100, 0x00000054, 0x00000030, 0x00040002, 0x00120001, 0x00000034, 7074 0x00000044, 0xab003476, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 7075 0x00000000, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 7076 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 7077 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 7078 0x00000002, 0x00000010, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 7079 }; 7080 7081 static void test_effect_skip_constants(IDirect3DDevice9 *device) 7082 { 7083 HRESULT hr; 7084 ID3DXEffect *effect; 7085 unsigned int passes_count; 7086 D3DXVECTOR4 fvect; 7087 unsigned int i; 7088 7089 hr = D3DXCreateEffectEx(device, test_effect_skip_constants_blob, sizeof(test_effect_skip_constants_blob), 7090 NULL, NULL, "v3", 0, NULL, &effect, NULL); 7091 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 7092 hr = D3DXCreateEffectEx(device, test_effect_skip_constants_blob, sizeof(test_effect_skip_constants_blob), 7093 NULL, NULL, "v4", 0, NULL, &effect, NULL); 7094 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 7095 hr = D3DXCreateEffectEx(device, test_effect_skip_constants_blob, sizeof(test_effect_skip_constants_blob), 7096 NULL, NULL, "v1;v5;v4", 0, NULL, &effect, NULL); 7097 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 7098 7099 hr = D3DXCreateEffectEx(device, test_effect_skip_constants_blob, sizeof(test_effect_skip_constants_blob), 7100 NULL, NULL, " v1#,.+-= &\t\nv2*/!\"'v5 v6[1]", 0, NULL, &effect, NULL); 7101 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7102 7103 ok(!effect->lpVtbl->IsParameterUsed(effect, "v1", "tech0"), 7104 "Unexpected IsParameterUsed result.\n"); 7105 ok(!effect->lpVtbl->IsParameterUsed(effect, "v2", "tech0"), 7106 "Unexpected IsParameterUsed result.\n"); 7107 ok(effect->lpVtbl->IsParameterUsed(effect, "v3", "tech0"), 7108 "Unexpected IsParameterUsed result.\n"); 7109 ok(effect->lpVtbl->IsParameterUsed(effect, "v4", "tech0"), 7110 "Unexpected IsParameterUsed result.\n"); 7111 ok(!effect->lpVtbl->IsParameterUsed(effect, "v5", "tech0"), 7112 "Unexpected IsParameterUsed result.\n"); 7113 ok(!effect->lpVtbl->IsParameterUsed(effect, "v6", "tech0"), 7114 "Unexpected IsParameterUsed result.\n"); 7115 7116 hr = effect->lpVtbl->SetFloat(effect, "v1", 28.0f); 7117 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7118 hr = effect->lpVtbl->SetFloat(effect, "v2", 29.0f); 7119 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7120 hr = effect->lpVtbl->SetFloat(effect, "v3", 30.0f); 7121 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7122 hr = effect->lpVtbl->SetFloat(effect, "v4", 31.0f); 7123 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7124 hr = effect->lpVtbl->SetFloat(effect, "v5", 32.0f); 7125 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7126 7127 test_effect_clear_vconsts(device); 7128 7129 hr = effect->lpVtbl->Begin(effect, &passes_count, 0); 7130 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7131 hr = effect->lpVtbl->BeginPass(effect, 0); 7132 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7133 7134 fvect.y = fvect.z = fvect.w = 0.0f; 7135 fvect.x = 30.0f; 7136 test_effect_shared_parameters_compare_vconst(device, 0, &fvect, FALSE); 7137 for (i = 1; i < 4; ++i) 7138 test_effect_shared_parameters_compare_vconst(device, i, &fvect_filler, FALSE); 7139 fvect.x = 31.0f; 7140 test_effect_shared_parameters_compare_vconst(device, 4, &fvect, FALSE); 7141 for (i = 5; i < 256; ++i) 7142 test_effect_shared_parameters_compare_vconst(device, i, &fvect_filler, FALSE); 7143 7144 hr = effect->lpVtbl->EndPass(effect); 7145 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7146 hr = effect->lpVtbl->End(effect); 7147 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7148 7149 effect->lpVtbl->Release(effect); 7150 } 7151 7152 #if 0 7153 vertexshader vs_arr[2] = 7154 { 7155 asm 7156 { 7157 vs_3_0 7158 def c0, 1, 1, 1, 1 7159 dcl_position o0 7160 mov o0, c0 7161 }, 7162 7163 asm 7164 { 7165 vs_3_sw 7166 def c256, 1, 1, 1, 1 7167 dcl_position o0 7168 mov o0, c256 7169 }, 7170 }; 7171 7172 int i; 7173 7174 technique tech0 7175 { 7176 pass p0 7177 { 7178 VertexShader = vs_arr[1]; 7179 } 7180 } 7181 technique tech1 7182 { 7183 pass p0 7184 { 7185 VertexShader = vs_arr[i]; 7186 } 7187 } 7188 #endif 7189 static const DWORD test_effect_unsupported_shader_blob[] = 7190 { 7191 0xfeff0901, 0x000000ac, 0x00000000, 0x00000010, 0x00000004, 0x00000020, 0x00000000, 0x00000002, 7192 0x00000001, 0x00000002, 0x00000007, 0x615f7376, 0x00007272, 0x00000002, 0x00000000, 0x0000004c, 7193 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000069, 0x00000003, 7194 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00003070, 0x00000006, 7195 0x68636574, 0x00000030, 0x00000004, 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 7196 0x00000003, 0x00003070, 0x00000006, 0x68636574, 0x00000031, 0x00000002, 0x00000002, 0x00000006, 7197 0x00000005, 0x00000004, 0x00000018, 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 7198 0x00000000, 0x00000074, 0x00000000, 0x00000001, 0x0000006c, 0x00000000, 0x00000001, 0x00000092, 7199 0x00000000, 0x00000058, 0x00000054, 0x000000a0, 0x00000000, 0x00000001, 0x00000098, 0x00000000, 7200 0x00000001, 0x00000092, 0x00000000, 0x00000084, 0x00000080, 0x00000002, 0x00000002, 0x00000001, 7201 0x00000038, 0xfffe0300, 0x05000051, 0xa00f0000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 7202 0x0200001f, 0x80000000, 0xe00f0000, 0x02000001, 0xe00f0000, 0xa0e40000, 0x0000ffff, 0x00000002, 7203 0x00000038, 0xfffe03ff, 0x05000051, 0xa00f0100, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 7204 0x0200001f, 0x80000000, 0xe00f0000, 0x02000001, 0xe00f0000, 0xa0e40100, 0x0000ffff, 0x00000001, 7205 0x00000000, 0xffffffff, 0x00000000, 0x00000002, 0x000000e4, 0x00000008, 0x615f7376, 0x00007272, 7206 0x46580200, 0x0023fffe, 0x42415443, 0x0000001c, 0x00000057, 0x46580200, 0x00000001, 0x0000001c, 7207 0x00000100, 0x00000054, 0x00000030, 0x00000002, 0x00000001, 0x00000034, 0x00000044, 0xabab0069, 7208 0x00020000, 0x00010001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 7209 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 7210 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 7211 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 7212 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 7213 0xffffffff, 0x00000000, 0x00000001, 0x0000000a, 0x615f7376, 0x315b7272, 0x0000005d, 7214 }; 7215 7216 #define TEST_EFFECT_UNSUPPORTED_SHADER_BYTECODE_VS_3_0_POS 81 7217 #define TEST_EFFECT_UNSUPPORTED_SHADER_BYTECODE_VS_3_0_LEN 14 7218 7219 static void test_effect_unsupported_shader(void) 7220 { 7221 IDirect3DVertexShader9 *vshader; 7222 unsigned int passes_count; 7223 IDirect3DDevice9 *device; 7224 UINT byte_code_size; 7225 ID3DXEffect *effect; 7226 void *byte_code; 7227 ULONG refcount; 7228 HWND window; 7229 HRESULT hr; 7230 7231 if (!(device = create_device(&window))) 7232 return; 7233 7234 hr = D3DXCreateEffectEx(device, test_effect_unsupported_shader_blob, sizeof(test_effect_unsupported_shader_blob), 7235 NULL, NULL, NULL, 0, NULL, &effect, NULL); 7236 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7237 7238 hr = effect->lpVtbl->ValidateTechnique(effect, "missing_technique"); 7239 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 7240 hr = effect->lpVtbl->ValidateTechnique(effect, "tech0"); 7241 ok(hr == E_FAIL, "Got result %#x.\n", hr); 7242 7243 hr = effect->lpVtbl->ValidateTechnique(effect, "tech1"); 7244 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7245 hr = effect->lpVtbl->SetInt(effect, "i", 1); 7246 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7247 hr = effect->lpVtbl->ValidateTechnique(effect, "tech1"); 7248 ok(hr == E_FAIL, "Got result %#x.\n", hr); 7249 hr = effect->lpVtbl->SetInt(effect, "i", 0); 7250 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7251 hr = effect->lpVtbl->ValidateTechnique(effect, "tech1"); 7252 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7253 7254 hr = effect->lpVtbl->SetTechnique(effect, "tech0"); 7255 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7256 hr = effect->lpVtbl->Begin(effect, &passes_count, 0); 7257 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7258 hr = effect->lpVtbl->BeginPass(effect, 0); 7259 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7260 7261 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 7262 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 7263 ok(!vshader, "Got non NULL vshader.\n"); 7264 7265 hr = effect->lpVtbl->EndPass(effect); 7266 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7267 hr = effect->lpVtbl->End(effect); 7268 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7269 7270 hr = effect->lpVtbl->SetTechnique(effect, "tech1"); 7271 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7272 hr = effect->lpVtbl->Begin(effect, &passes_count, 0); 7273 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7274 hr = effect->lpVtbl->BeginPass(effect, 0); 7275 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7276 7277 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 7278 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); 7279 ok(!!vshader, "Got NULL vshader.\n"); 7280 hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size); 7281 ok(hr == D3D_OK, "Got result %x.\n", hr); 7282 byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size); 7283 hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size); 7284 ok(hr == D3D_OK, "Got result %x.\n", hr); 7285 ok(byte_code_size == TEST_EFFECT_UNSUPPORTED_SHADER_BYTECODE_VS_3_0_LEN * sizeof(DWORD), 7286 "Got unexpected byte code size %u.\n", byte_code_size); 7287 ok(!memcmp(byte_code, 7288 &test_effect_unsupported_shader_blob[TEST_EFFECT_UNSUPPORTED_SHADER_BYTECODE_VS_3_0_POS], 7289 byte_code_size), "Incorrect shader selected.\n"); 7290 HeapFree(GetProcessHeap(), 0, byte_code); 7291 IDirect3DVertexShader9_Release(vshader); 7292 7293 hr = effect->lpVtbl->SetInt(effect, "i", 1); 7294 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7295 hr = effect->lpVtbl->CommitChanges(effect); 7296 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7297 hr = IDirect3DDevice9_GetVertexShader(device, &vshader); 7298 ok(hr == D3D_OK, "Got result %x.\n", hr); 7299 ok(!vshader, "Got non NULL vshader.\n"); 7300 7301 effect->lpVtbl->Release(effect); 7302 7303 refcount = IDirect3DDevice9_Release(device); 7304 ok(!refcount, "Device has %u references left.\n", refcount); 7305 DestroyWindow(window); 7306 } 7307 7308 #if 0 7309 vertexshader vs_arr[2]; 7310 7311 int i; 7312 7313 technique tech0 7314 { 7315 pass p0 7316 { 7317 VertexShader = null; 7318 } 7319 } 7320 technique tech1 7321 { 7322 pass p0 7323 { 7324 VertexShader = vs_arr[i]; 7325 } 7326 } 7327 #endif 7328 static const DWORD test_effect_null_shader_blob[] = 7329 { 7330 0xfeff0901, 0x000000b4, 0x00000000, 0x00000010, 0x00000004, 0x00000020, 0x00000000, 0x00000002, 7331 0x00000001, 0x00000002, 0x00000007, 0x615f7376, 0x00007272, 0x00000002, 0x00000000, 0x0000004c, 7332 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000069, 0x00000000, 7333 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 7334 0x00003070, 0x00000006, 0x68636574, 0x00000030, 0x00000003, 0x00000010, 0x00000004, 0x00000000, 7335 0x00000000, 0x00000000, 0x00000003, 0x00003070, 0x00000006, 0x68636574, 0x00000031, 0x00000002, 7336 0x00000002, 0x00000005, 0x00000004, 0x00000004, 0x00000018, 0x00000000, 0x00000000, 0x0000002c, 7337 0x00000048, 0x00000000, 0x00000000, 0x0000007c, 0x00000000, 0x00000001, 0x00000074, 0x00000000, 7338 0x00000001, 0x00000092, 0x00000000, 0x00000058, 0x00000054, 0x000000a8, 0x00000000, 0x00000001, 7339 0x000000a0, 0x00000000, 0x00000001, 0x00000092, 0x00000000, 0x0000008c, 0x00000088, 0x00000002, 7340 0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000001, 0x00000000, 0xffffffff, 7341 0x00000000, 0x00000002, 0x000000e4, 0x00000008, 0x615f7376, 0x00007272, 0x46580200, 0x0023fffe, 7342 0x42415443, 0x0000001c, 0x00000057, 0x46580200, 0x00000001, 0x0000001c, 0x00000100, 0x00000054, 7343 0x00000030, 0x00000002, 0x00000001, 0x00000034, 0x00000044, 0xabab0069, 0x00020000, 0x00010001, 7344 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874, 0x6f726369, 7345 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 7346 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 7347 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 7348 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 7349 }; 7350 7351 static void test_effect_null_shader(void) 7352 { 7353 IDirect3DDevice9 *device; 7354 ID3DXEffect *effect; 7355 D3DXPASS_DESC desc; 7356 D3DXHANDLE pass; 7357 ULONG refcount; 7358 HWND window; 7359 HRESULT hr; 7360 7361 /* Creating a fresh device because the existing device can have invalid 7362 * render states from previous tests. If IDirect3DDevice9_ValidateDevice() 7363 * returns certain error codes, native ValidateTechnique() fails. */ 7364 if (!(device = create_device(&window))) 7365 return; 7366 7367 hr = D3DXCreateEffectEx(device, test_effect_null_shader_blob, 7368 sizeof(test_effect_null_shader_blob), NULL, NULL, NULL, 0, NULL, &effect, NULL); 7369 ok(hr == D3D_OK, "Failed to create effect, hr %#x.\n", hr); 7370 7371 pass = effect->lpVtbl->GetPass(effect, "tech0", 0); 7372 ok(!!pass, "GetPass() failed.\n"); 7373 hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc); 7374 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7375 ok(!desc.pVertexShaderFunction, "Got non NULL vertex function.\n"); 7376 7377 pass = effect->lpVtbl->GetPass(effect, "tech1", 0); 7378 ok(!!pass, "GetPass() failed.\n"); 7379 hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc); 7380 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7381 ok(!desc.pVertexShaderFunction, "Got non NULL vertex function.\n"); 7382 7383 hr = effect->lpVtbl->ValidateTechnique(effect, "tech0"); 7384 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7385 hr = effect->lpVtbl->SetInt(effect, "i", 0); 7386 ok(hr == D3D_OK, "Failed to set parameter, hr %#x.\n", hr); 7387 hr = effect->lpVtbl->ValidateTechnique(effect, "tech1"); 7388 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7389 hr = effect->lpVtbl->SetInt(effect, "i", 1); 7390 ok(hr == D3D_OK, "Failed to set parameter, hr %#x.\n", hr); 7391 hr = effect->lpVtbl->ValidateTechnique(effect, "tech1"); 7392 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7393 7394 hr = effect->lpVtbl->SetInt(effect, "i", 2); 7395 ok(hr == D3D_OK, "Failed to set parameter, hr %#x.\n", hr); 7396 hr = effect->lpVtbl->ValidateTechnique(effect, "tech1"); 7397 ok(hr == E_FAIL, "Got result %#x.\n", hr); 7398 7399 effect->lpVtbl->Release(effect); 7400 7401 refcount = IDirect3DDevice9_Release(device); 7402 ok(!refcount, "Device has %u references left.\n", refcount); 7403 DestroyWindow(window); 7404 } 7405 7406 static void test_effect_clone(void) 7407 { 7408 IDirect3DDevice9 *device, *device2, *device3; 7409 ID3DXEffect *effect, *cloned; 7410 HWND window, window2; 7411 ULONG refcount; 7412 HRESULT hr; 7413 7414 if (!(device = create_device(&window))) 7415 return; 7416 7417 /* D3DXFX_NOT_CLONEABLE */ 7418 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 7419 NULL, NULL, D3DXFX_NOT_CLONEABLE, NULL, &effect, NULL); 7420 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7421 7422 hr = effect->lpVtbl->CloneEffect(effect, NULL, NULL); 7423 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 7424 7425 cloned = (void *)0xdeadbeef; 7426 hr = effect->lpVtbl->CloneEffect(effect, NULL, &cloned); 7427 ok(hr == E_FAIL, "Got result %#x.\n", hr); 7428 ok(cloned == (void *)0xdeadbeef, "Unexpected effect pointer.\n"); 7429 7430 hr = effect->lpVtbl->CloneEffect(effect, device, NULL); 7431 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 7432 7433 cloned = (void *)0xdeadbeef; 7434 hr = effect->lpVtbl->CloneEffect(effect, device, &cloned); 7435 ok(hr == E_FAIL, "Got result %#x.\n", hr); 7436 ok(cloned == (void *)0xdeadbeef, "Unexpected effect pointer.\n"); 7437 7438 effect->lpVtbl->Release(effect); 7439 7440 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob), 7441 NULL, NULL, 0, NULL, &effect, NULL); 7442 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7443 7444 hr = effect->lpVtbl->CloneEffect(effect, NULL, NULL); 7445 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 7446 7447 cloned = (void *)0xdeadbeef; 7448 hr = effect->lpVtbl->CloneEffect(effect, NULL, &cloned); 7449 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 7450 ok(cloned == (void *)0xdeadbeef, "Unexpected effect pointer.\n"); 7451 7452 hr = effect->lpVtbl->CloneEffect(effect, device, NULL); 7453 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 7454 7455 hr = effect->lpVtbl->CloneEffect(effect, device, &cloned); 7456 todo_wine 7457 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7458 if (hr == D3D_OK) 7459 { 7460 ok(cloned != effect, "Expected new effect instance.\n"); 7461 cloned->lpVtbl->Release(cloned); 7462 } 7463 /* Try with different device. */ 7464 device2 = create_device(&window2); 7465 hr = effect->lpVtbl->CloneEffect(effect, device2, &cloned); 7466 todo_wine 7467 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7468 if (hr == D3D_OK) 7469 { 7470 ok(cloned != effect, "Expected new effect instance.\n"); 7471 7472 hr = cloned->lpVtbl->GetDevice(cloned, &device3); 7473 ok(hr == S_OK, "Failed to get effect device.\n"); 7474 ok(device3 == device2, "Unexpected device instance.\n"); 7475 IDirect3DDevice9_Release(device3); 7476 7477 cloned->lpVtbl->Release(cloned); 7478 } 7479 IDirect3DDevice9_Release(device2); 7480 DestroyWindow(window2); 7481 effect->lpVtbl->Release(effect); 7482 refcount = IDirect3DDevice9_Release(device); 7483 ok(!refcount, "Device has %u references left.\n", refcount); 7484 DestroyWindow(window); 7485 } 7486 7487 static unsigned int get_texture_refcount(IDirect3DTexture9 *iface) 7488 { 7489 IDirect3DTexture9_AddRef(iface); 7490 return IDirect3DTexture9_Release(iface); 7491 } 7492 7493 static void test_refcount(void) 7494 { 7495 IDirect3DTexture9 *texture, *cur_texture, *managed_texture, *sysmem_texture; 7496 unsigned int passes_count; 7497 IDirect3DDevice9 *device; 7498 ID3DXEffect *effect; 7499 ULONG refcount; 7500 HWND window; 7501 HRESULT hr; 7502 7503 if (!(device = create_device(&window))) 7504 return; 7505 7506 hr = IDirect3DDevice9_CreateTexture(device, 16, 16, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &texture, NULL); 7507 ok(hr == D3D_OK, "Failed to create texture, hr %#x.\n", hr); 7508 7509 hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, 7510 sizeof(test_effect_preshader_effect_blob), NULL, NULL, 7511 D3DXFX_DONOTSAVESTATE, NULL, &effect, NULL); 7512 ok(hr == D3D_OK, "Failed to create effect, hr %#x.\n", hr); 7513 7514 hr = effect->lpVtbl->SetTexture(effect, "tex1", (IDirect3DBaseTexture9 *)texture); 7515 ok(hr == D3D_OK, "Failed to set texture parameter, hr %#x.\n", hr); 7516 7517 hr = effect->lpVtbl->Begin(effect, &passes_count, D3DXFX_DONOTSAVESTATE); 7518 ok(hr == D3D_OK, "Begin() failed, hr %#x.\n", hr); 7519 7520 hr = effect->lpVtbl->BeginPass(effect, 0); 7521 ok(hr == D3D_OK, "BeginPass() failed, hr %#x.\n", hr); 7522 7523 IDirect3DDevice9_GetTexture(device, 0, (IDirect3DBaseTexture9 **)&cur_texture); 7524 ok(cur_texture == texture, "Unexpected current texture %p.\n", cur_texture); 7525 IDirect3DTexture9_Release(cur_texture); 7526 7527 IDirect3DDevice9_SetTexture(device, 0, NULL); 7528 effect->lpVtbl->CommitChanges(effect); 7529 7530 IDirect3DDevice9_GetTexture(device, 0, (IDirect3DBaseTexture9 **)&cur_texture); 7531 ok(cur_texture == NULL, "Unexpected current texture %p.\n", cur_texture); 7532 7533 hr = effect->lpVtbl->EndPass(effect); 7534 ok(hr == D3D_OK, "EndPass() failed, hr %#x.\n", hr); 7535 7536 hr = effect->lpVtbl->BeginPass(effect, 0); 7537 ok(hr == D3D_OK, "BeginPass() failed, hr %#x.\n", hr); 7538 7539 IDirect3DDevice9_GetTexture(device, 0, (IDirect3DBaseTexture9 **)&cur_texture); 7540 ok(cur_texture == texture, "Unexpected current texture %p.\n", cur_texture); 7541 IDirect3DTexture9_Release(cur_texture); 7542 7543 hr = effect->lpVtbl->EndPass(effect); 7544 ok(hr == D3D_OK, "EndPass() failed, hr %#x.\n", hr); 7545 hr = effect->lpVtbl->End(effect); 7546 ok(hr == D3D_OK, "End() failed, hr %#x.\n", hr); 7547 7548 IDirect3DDevice9_GetTexture(device, 0, (IDirect3DBaseTexture9 **)&cur_texture); 7549 ok(cur_texture == texture, "Unexpected current texture %p.\n", cur_texture); 7550 IDirect3DTexture9_Release(cur_texture); 7551 refcount = get_texture_refcount(texture); 7552 ok(refcount == 2, "Unexpected texture refcount %u.\n", refcount); 7553 7554 hr = effect->lpVtbl->OnLostDevice(effect); 7555 ok(hr == D3D_OK, "OnLostDevice() failed, hr %#x.\n", hr); 7556 refcount = get_texture_refcount(texture); 7557 ok(refcount == 1, "Unexpected texture refcount %u.\n", refcount); 7558 7559 hr = IDirect3DDevice9_CreateTexture(device, 16, 16, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, 7560 &managed_texture, NULL); 7561 ok(hr == D3D_OK, "Failed to create texture, hr %#x.\n", hr); 7562 effect->lpVtbl->SetTexture(effect, "tex1", (IDirect3DBaseTexture9 *)managed_texture); 7563 7564 refcount = get_texture_refcount(managed_texture); 7565 ok(refcount == 2, "Unexpected texture refcount %u.\n", refcount); 7566 hr = effect->lpVtbl->OnLostDevice(effect); 7567 ok(hr == D3D_OK, "OnLostDevice() failed, hr %#x.\n", hr); 7568 refcount = get_texture_refcount(managed_texture); 7569 ok(refcount == 2, "Unexpected texture refcount %u.\n", refcount); 7570 7571 hr = IDirect3DDevice9_CreateTexture(device, 16, 16, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, 7572 &sysmem_texture, NULL); 7573 ok(hr == D3D_OK, "Failed to create texture, hr %#x.\n", hr); 7574 effect->lpVtbl->SetTexture(effect, "tex1", (IDirect3DBaseTexture9 *)sysmem_texture); 7575 7576 refcount = get_texture_refcount(managed_texture); 7577 ok(refcount == 1, "Unexpected texture refcount %u.\n", refcount); 7578 IDirect3DTexture9_Release(managed_texture); 7579 refcount = get_texture_refcount(sysmem_texture); 7580 ok(refcount == 2, "Unexpected texture refcount %u.\n", refcount); 7581 hr = effect->lpVtbl->OnLostDevice(effect); 7582 ok(hr == D3D_OK, "OnLostDevice() failed, hr %#x.\n", hr); 7583 refcount = get_texture_refcount(sysmem_texture); 7584 ok(refcount == 2, "Unexpected texture refcount %u.\n", refcount); 7585 7586 effect->lpVtbl->Release(effect); 7587 7588 refcount = get_texture_refcount(sysmem_texture); 7589 ok(refcount == 1, "Unexpected texture refcount %u.\n", refcount); 7590 IDirect3DTexture9_Release(sysmem_texture); 7591 7592 IDirect3DDevice9_GetTexture(device, 0, (IDirect3DBaseTexture9 **)&cur_texture); 7593 ok(cur_texture == texture, "Unexpected current texture %p.\n", cur_texture); 7594 IDirect3DTexture9_Release(cur_texture); 7595 refcount = get_texture_refcount(texture); 7596 ok(refcount == 1, "Unexpected texture refcount %u.\n", refcount); 7597 IDirect3DTexture9_Release(texture); 7598 7599 refcount = IDirect3DDevice9_Release(device); 7600 ok(!refcount, "Device has %u references left.\n", refcount); 7601 DestroyWindow(window); 7602 } 7603 7604 static HRESULT WINAPI d3dxinclude_open(ID3DXInclude *iface, D3DXINCLUDE_TYPE include_type, 7605 const char *filename, const void *parent_data, const void **data, UINT *bytes) 7606 { 7607 static const char include1[] = 7608 "float4 light;\n" 7609 "float4x4 mat;\n" 7610 "float4 color;\n" 7611 "\n" 7612 "struct vs_input\n" 7613 "{\n" 7614 " float4 position : POSITION;\n" 7615 " float3 normal : NORMAL;\n" 7616 "};\n" 7617 "\n" 7618 "struct vs_output\n" 7619 "{\n" 7620 " float4 position : POSITION;\n" 7621 " float4 diffuse : COLOR;\n" 7622 "};\n"; 7623 static const char include2[] = 7624 "#include \"include1.h\"\n" 7625 "\n" 7626 "vs_output vs_main(const vs_input v)\n" 7627 "{\n" 7628 " vs_output o;\n" 7629 " const float4 scaled_color = 0.5 * color;\n" 7630 "\n" 7631 " o.position = mul(v.position, mat);\n" 7632 " o.diffuse = dot((float3)light, v.normal) * scaled_color;\n" 7633 "\n" 7634 " return o;\n" 7635 "}\n"; 7636 static const char effect2[] = 7637 "#include \"include\\include2.h\"\n" 7638 "\n" 7639 "technique t\n" 7640 "{\n" 7641 " pass p\n" 7642 " {\n" 7643 " VertexShader = compile vs_2_0 vs_main();\n" 7644 " }\n" 7645 "}\n"; 7646 char *buffer; 7647 7648 trace("filename %s.\n", filename); 7649 trace("parent_data %p: %s.\n", parent_data, parent_data ? (char *)parent_data : "(null)"); 7650 7651 if (!strcmp(filename, "effect2.fx")) 7652 { 7653 buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(effect2)); 7654 memcpy(buffer, effect2, sizeof(effect2)); 7655 *bytes = sizeof(effect2); 7656 ok(!parent_data, "Unexpected parent_data value.\n"); 7657 } 7658 else if (!strcmp(filename, "include1.h")) 7659 { 7660 buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(include1)); 7661 memcpy(buffer, include1, sizeof(include1)); 7662 *bytes = sizeof(include1); 7663 ok(!strncmp(parent_data, include2, strlen(include2)), "Unexpected parent_data value.\n"); 7664 } 7665 else if (!strcmp(filename, "include\\include2.h")) 7666 { 7667 buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(include2)); 7668 memcpy(buffer, include2, sizeof(include2)); 7669 *bytes = sizeof(include2); 7670 todo_wine ok(parent_data && !strncmp(parent_data, effect2, strlen(effect2)), 7671 "unexpected parent_data value.\n"); 7672 } 7673 else 7674 { 7675 ok(0, "Unexpected #include for file %s.\n", filename); 7676 return D3DERR_INVALIDCALL; 7677 } 7678 *data = buffer; 7679 return S_OK; 7680 } 7681 7682 static HRESULT WINAPI d3dxinclude_close(ID3DXInclude *iface, const void *data) 7683 { 7684 HeapFree(GetProcessHeap(), 0, (void *)data); 7685 return S_OK; 7686 } 7687 7688 static const struct ID3DXIncludeVtbl d3dxinclude_vtbl = 7689 { 7690 d3dxinclude_open, 7691 d3dxinclude_close 7692 }; 7693 7694 struct d3dxinclude 7695 { 7696 ID3DXInclude ID3DXInclude_iface; 7697 }; 7698 7699 static void test_create_effect_from_file(void) 7700 { 7701 static const char effect1[] = 7702 "float4 light;\n" 7703 "float4x4 mat;\n" 7704 "float4 color;\n" 7705 "\n" 7706 "struct vs_input\n" 7707 "{\n" 7708 " float4 position : POSITION;\n" 7709 " float3 normal : NORMAL;\n" 7710 "};\n" 7711 "\n" 7712 "struct vs_output\n" 7713 "{\n" 7714 " float4 position : POSITION;\n" 7715 " float4 diffuse : COLOR;\n" 7716 "};\n" 7717 "\n" 7718 "vs_output vs_main(const vs_input v)\n" 7719 "{\n" 7720 " vs_output o;\n" 7721 " const float4 scaled_color = 0.5 * color;\n" 7722 "\n" 7723 " o.position = mul(v.position, mat);\n" 7724 " o.diffuse = dot((float3)light, v.normal) * scaled_color;\n" 7725 "\n" 7726 " return o;\n" 7727 "}\n" 7728 "\n" 7729 "technique t\n" 7730 "{\n" 7731 " pass p\n" 7732 " {\n" 7733 " VertexShader = compile vs_2_0 vs_main();\n" 7734 " }\n" 7735 "}\n"; 7736 static const char include1[] = 7737 "float4 light;\n" 7738 "float4x4 mat;\n" 7739 "float4 color;\n" 7740 "\n" 7741 "struct vs_input\n" 7742 "{\n" 7743 " float4 position : POSITION;\n" 7744 " float3 normal : NORMAL;\n" 7745 "};\n" 7746 "\n" 7747 "struct vs_output\n" 7748 "{\n" 7749 " float4 position : POSITION;\n" 7750 " float4 diffuse : COLOR;\n" 7751 "};\n"; 7752 static const char include1_wrong[] = 7753 "#error \"wrong include\"\n"; 7754 static const char include2[] = 7755 "#include \"include1.h\"\n" 7756 "\n" 7757 "vs_output vs_main(const vs_input v)\n" 7758 "{\n" 7759 " vs_output o;\n" 7760 " const float4 scaled_color = 0.5 * color;\n" 7761 "\n" 7762 " o.position = mul(v.position, mat);\n" 7763 " o.diffuse = dot((float3)light, v.normal) * scaled_color;\n" 7764 "\n" 7765 " return o;\n" 7766 "}\n"; 7767 static const char effect2[] = 7768 "#include \"include\\include2.h\"\n" 7769 "\n" 7770 "technique t\n" 7771 "{\n" 7772 " pass p\n" 7773 " {\n" 7774 " VertexShader = compile vs_2_0 vs_main();\n" 7775 " }\n" 7776 "}\n"; 7777 static const WCHAR effect1_filename_w[] = {'e','f','f','e','c','t','1','.','f','x',0}; 7778 static const WCHAR effect2_filename_w[] = {'e','f','f','e','c','t','2','.','f','x',0}; 7779 WCHAR effect_path_w[MAX_PATH], filename_w[MAX_PATH]; 7780 char effect_path[MAX_PATH], filename[MAX_PATH]; 7781 D3DPRESENT_PARAMETERS present_parameters = {0}; 7782 unsigned int filename_size; 7783 struct d3dxinclude include; 7784 IDirect3DDevice9 *device; 7785 ID3DXBuffer *messages; 7786 ID3DXEffect *effect; 7787 IDirect3D9 *d3d; 7788 ULONG refcount; 7789 HWND window; 7790 HRESULT hr; 7791 7792 if (!(window = CreateWindowA("static", "d3dx9_test", WS_OVERLAPPEDWINDOW, 0, 0, 7793 640, 480, NULL, NULL, NULL, NULL))) 7794 { 7795 skip("Failed to create window.\n"); 7796 return; 7797 } 7798 if (!(d3d = Direct3DCreate9(D3D_SDK_VERSION))) 7799 { 7800 skip("Failed to create IDirect3D9 object.\n"); 7801 DestroyWindow(window); 7802 return; 7803 } 7804 present_parameters.Windowed = TRUE; 7805 present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD; 7806 hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, window, 7807 D3DCREATE_HARDWARE_VERTEXPROCESSING, &present_parameters, &device); 7808 if (FAILED(hr)) 7809 { 7810 skip("Failed to create IDirect3DDevice9 object, hr %#x.\n", hr); 7811 IDirect3D9_Release(d3d); 7812 DestroyWindow(window); 7813 return; 7814 } 7815 7816 if (!create_file("effect1.fx", effect1, sizeof(effect1) - 1, filename)) 7817 { 7818 skip("Couldn't create temporary file, skipping test.\n"); 7819 return; 7820 } 7821 7822 filename_size = strlen(filename); 7823 filename_size -= sizeof("effect1.fx") - 1; 7824 memcpy(effect_path, filename, filename_size); 7825 effect_path[filename_size] = 0; 7826 MultiByteToWideChar(CP_ACP, 0, effect_path, -1, effect_path_w, ARRAY_SIZE(effect_path_w)); 7827 7828 create_directory("include"); 7829 create_file("effect2.fx", effect2, sizeof(effect2) - 1, NULL); 7830 create_file("include\\include1.h", include1, sizeof(include1) - 1, NULL); 7831 create_file("include\\include2.h", include2, sizeof(include2) - 1, NULL); 7832 create_file("include1.h", include1_wrong, sizeof(include1_wrong) - 1, NULL); 7833 7834 lstrcpyW(filename_w, effect_path_w); 7835 lstrcatW(filename_w, effect1_filename_w); 7836 effect = NULL; 7837 messages = NULL; 7838 hr = D3DXCreateEffectFromFileExW(device, filename_w, NULL, NULL, NULL, 7839 0, NULL, &effect, &messages); 7840 todo_wine ok(hr == D3D_OK, "Unexpected hr %#x.\n", hr); 7841 if (messages) 7842 { 7843 trace("D3DXCreateEffectFromFileExW messages:\n%s", (char *)ID3DXBuffer_GetBufferPointer(messages)); 7844 ID3DXBuffer_Release(messages); 7845 } 7846 if (effect) 7847 effect->lpVtbl->Release(effect); 7848 7849 lstrcpyW(filename_w, effect_path_w); 7850 lstrcatW(filename_w, effect2_filename_w); 7851 effect = NULL; 7852 messages = NULL; 7853 /* This is apparently broken on native, it ends up using the wrong include. */ 7854 hr = D3DXCreateEffectFromFileExW(device, filename_w, NULL, NULL, NULL, 7855 0, NULL, &effect, &messages); 7856 todo_wine ok(hr == E_FAIL, "Unexpected error, hr %#x.\n", hr); 7857 if (messages) 7858 { 7859 trace("D3DXCreateEffectFromFileExW messages:\n%s", (char *)ID3DXBuffer_GetBufferPointer(messages)); 7860 ID3DXBuffer_Release(messages); 7861 } 7862 if (effect) 7863 effect->lpVtbl->Release(effect); 7864 7865 delete_file("effect1.fx"); 7866 delete_file("effect2.fx"); 7867 delete_file("include\\include1.h"); 7868 delete_file("include\\include2.h"); 7869 delete_file("include2.h"); 7870 delete_directory("include"); 7871 7872 lstrcpyW(filename_w, effect2_filename_w); 7873 effect = NULL; 7874 messages = NULL; 7875 include.ID3DXInclude_iface.lpVtbl = &d3dxinclude_vtbl; 7876 /* This is actually broken in native d3dx9 (manually tried multiple 7877 * versions, all are affected). For reference, the message printed below 7878 * is "ID3DXEffectCompiler: There were no techniques" */ 7879 hr = D3DXCreateEffectFromFileExW(device, filename_w, NULL, &include.ID3DXInclude_iface, NULL, 7880 0, NULL, &effect, &messages); 7881 todo_wine ok(hr == E_FAIL, "D3DXInclude test failed with error %#x.\n", hr); 7882 if (messages) 7883 { 7884 trace("D3DXCreateEffectFromFileExW messages:\n%s", (char *)ID3DXBuffer_GetBufferPointer(messages)); 7885 ID3DXBuffer_Release(messages); 7886 } 7887 7888 refcount = IDirect3DDevice9_Release(device); 7889 ok(!refcount, "Device has %u references left.\n", refcount); 7890 IDirect3D9_Release(d3d); 7891 DestroyWindow(window); 7892 } 7893 7894 #if 0 7895 technique tech0 7896 { 7897 pass p0 7898 { 7899 LightEnable[0] = FALSE; 7900 FogEnable = FALSE; 7901 } 7902 } 7903 technique tech1 7904 { 7905 pass p0 7906 { 7907 LightEnable[0] = TRUE; 7908 FogEnable = TRUE; 7909 } 7910 } 7911 #endif 7912 static const DWORD test_two_techniques_blob[] = 7913 { 7914 0xfeff0901, 0x000000ac, 0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 7915 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 7916 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00003070, 0x00000006, 0x68636574, 0x00000030, 7917 0x00000001, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 7918 0x00000001, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 7919 0x00000003, 0x00003070, 0x00000006, 0x68636574, 0x00000031, 0x00000000, 0x00000002, 0x00000002, 7920 0x00000001, 0x0000004c, 0x00000000, 0x00000001, 0x00000044, 0x00000000, 0x00000002, 0x00000091, 7921 0x00000000, 0x00000008, 0x00000004, 0x0000000e, 0x00000000, 0x00000028, 0x00000024, 0x000000a0, 7922 0x00000000, 0x00000001, 0x00000098, 0x00000000, 0x00000002, 0x00000091, 0x00000000, 0x0000005c, 7923 0x00000058, 0x0000000e, 0x00000000, 0x0000007c, 0x00000078, 0x00000000, 0x00000000, 7924 }; 7925 7926 static void test_effect_find_next_valid_technique(void) 7927 { 7928 D3DPRESENT_PARAMETERS present_parameters = {0}; 7929 IDirect3DDevice9 *device; 7930 D3DXTECHNIQUE_DESC desc; 7931 ID3DXEffect *effect; 7932 IDirect3D9 *d3d; 7933 D3DXHANDLE tech; 7934 ULONG refcount; 7935 HWND window; 7936 HRESULT hr; 7937 7938 if (!(window = CreateWindowA("static", "d3dx9_test", WS_OVERLAPPEDWINDOW, 0, 0, 7939 640, 480, NULL, NULL, NULL, NULL))) 7940 { 7941 skip("Failed to create window.\n"); 7942 return; 7943 } 7944 if (!(d3d = Direct3DCreate9(D3D_SDK_VERSION))) 7945 { 7946 skip("Failed to create IDirect3D9 object.\n"); 7947 DestroyWindow(window); 7948 return; 7949 } 7950 present_parameters.Windowed = TRUE; 7951 present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD; 7952 hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, window, 7953 D3DCREATE_HARDWARE_VERTEXPROCESSING, &present_parameters, &device); 7954 if (FAILED(hr)) 7955 { 7956 skip("Failed to create IDirect3DDevice9 object, hr %#x.\n", hr); 7957 IDirect3D9_Release(d3d); 7958 DestroyWindow(window); 7959 return; 7960 } 7961 7962 hr = D3DXCreateEffectEx(device, test_two_techniques_blob, sizeof(test_two_techniques_blob), 7963 NULL, NULL, NULL, 0, NULL, &effect, NULL); 7964 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7965 7966 hr = effect->lpVtbl->FindNextValidTechnique(effect, NULL, &tech); 7967 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7968 hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc); 7969 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7970 ok(!strcmp(desc.Name, "tech0"), "Got unexpected technique %s.\n", desc.Name); 7971 7972 hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech); 7973 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7974 hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc); 7975 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7976 ok(!strcmp(desc.Name, "tech1"), "Got unexpected technique %s.\n", desc.Name); 7977 7978 hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech); 7979 ok(hr == S_FALSE, "Got result %#x.\n", hr); 7980 hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc); 7981 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7982 ok(!strcmp(desc.Name, "tech0"), "Got unexpected technique %s.\n", desc.Name); 7983 7984 effect->lpVtbl->Release(effect); 7985 7986 hr = D3DXCreateEffectEx(device, test_effect_unsupported_shader_blob, sizeof(test_effect_unsupported_shader_blob), 7987 NULL, NULL, NULL, 0, NULL, &effect, NULL); 7988 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7989 7990 hr = effect->lpVtbl->FindNextValidTechnique(effect, NULL, &tech); 7991 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7992 hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc); 7993 ok(hr == D3D_OK, "Got result %#x.\n", hr); 7994 ok(!strcmp(desc.Name, "tech1"), "Got unexpected technique %s.\n", desc.Name); 7995 7996 hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech); 7997 ok(hr == S_FALSE, "Got result %#x.\n", hr); 7998 hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc); 7999 ok(hr == D3D_OK, "Got result %#x.\n", hr); 8000 ok(!strcmp(desc.Name, "tech0"), "Got unexpected technique %s.\n", desc.Name); 8001 8002 hr = effect->lpVtbl->SetInt(effect, "i", 1); 8003 ok(hr == D3D_OK, "Got result %#x.\n", hr); 8004 8005 tech = (D3DXHANDLE)0xdeadbeef; 8006 hr = effect->lpVtbl->FindNextValidTechnique(effect, NULL, &tech); 8007 ok(hr == S_FALSE, "Got result %#x.\n", hr); 8008 hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc); 8009 ok(hr == D3D_OK, "Got result %#x.\n", hr); 8010 ok(!strcmp(desc.Name, "tech0"), "Got unexpected technique %s.\n", desc.Name); 8011 8012 hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech); 8013 ok(hr == S_FALSE, "Got result %#x.\n", hr); 8014 8015 hr = effect->lpVtbl->SetInt(effect, "i", 0); 8016 ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); 8017 8018 hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech); 8019 ok(hr == D3D_OK, "Got result %#x.\n", hr); 8020 hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc); 8021 ok(hr == D3D_OK, "Got result %#x.\n", hr); 8022 ok(!strcmp(desc.Name, "tech1"), "Got unexpected technique %s.\n", desc.Name); 8023 8024 hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech); 8025 ok(hr == S_FALSE, "Got result %#x.\n", hr); 8026 8027 hr = effect->lpVtbl->FindNextValidTechnique(effect, "nope", &tech); 8028 ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr); 8029 8030 effect->lpVtbl->Release(effect); 8031 8032 refcount = IDirect3DDevice9_Release(device); 8033 ok(!refcount, "Device has %u references left.\n", refcount); 8034 IDirect3D9_Release(d3d); 8035 DestroyWindow(window); 8036 } 8037 8038 START_TEST(effect) 8039 { 8040 IDirect3DDevice9 *device; 8041 ULONG refcount; 8042 HWND wnd; 8043 8044 if (!(device = create_device(&wnd))) 8045 return; 8046 8047 test_create_effect_and_pool(device); 8048 test_create_effect_compiler(); 8049 test_effect_parameter_value(device); 8050 test_effect_setvalue_object(device); 8051 test_effect_variable_names(device); 8052 test_effect_compilation_errors(device); 8053 test_effect_states(device); 8054 test_effect_preshader(device); 8055 test_effect_preshader_ops(device); 8056 test_effect_isparameterused(device); 8057 test_effect_out_of_bounds_selector(device); 8058 test_effect_commitchanges(device); 8059 test_effect_preshader_relative_addressing(device); 8060 test_effect_state_manager(device); 8061 test_cross_effect_handle(device); 8062 test_effect_shared_parameters(device); 8063 test_effect_large_address_aware_flag(device); 8064 test_effect_get_pass_desc(device); 8065 test_effect_skip_constants(device); 8066 8067 refcount = IDirect3DDevice9_Release(device); 8068 ok(!refcount, "Device has %u references left.\n", refcount); 8069 DestroyWindow(wnd); 8070 8071 test_effect_unsupported_shader(); 8072 test_effect_null_shader(); 8073 test_effect_clone(); 8074 test_refcount(); 8075 test_create_effect_from_file(); 8076 test_effect_find_next_valid_technique(); 8077 } 8078