1 /* 2 * Copyright 2010 Rico Schüller 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 /* 20 * Nearly all compiler functions need the shader blob and the size. The size 21 * is always located at DWORD #6 in the shader blob (blob[6]). 22 * The functions are e.g.: D3DGet*SignatureBlob, D3DReflect 23 */ 24 25 #define COBJMACROS 26 #include "d3dcompiler.h" 27 #include "wine/test.h" 28 29 /* 30 * This doesn't belong here, but for some functions it is possible to return that value, 31 * see http://msdn.microsoft.com/en-us/library/bb205278%28v=VS.85%29.aspx 32 * The original definition is in D3DX10core.h. 33 */ 34 #define D3DERR_INVALIDCALL 0x8876086c 35 36 static HRESULT (WINAPI *pD3DCreateBlob)(SIZE_T, ID3DBlob **); 37 static HRESULT (WINAPI *pD3DGetBlobPart)(const void *, SIZE_T, D3D_BLOB_PART, UINT, ID3DBlob **); 38 static HRESULT (WINAPI *pD3DReadFileToBlob)(const WCHAR *, ID3DBlob **); 39 static HRESULT (WINAPI *pD3DStripShader)(const void *, SIZE_T, UINT, ID3DBlob **); 40 41 #define MAKE_TAG(ch0, ch1, ch2, ch3) \ 42 ((DWORD)(ch0) | ((DWORD)(ch1) << 8) | \ 43 ((DWORD)(ch2) << 16) | ((DWORD)(ch3) << 24 )) 44 #define TAG_Aon9 MAKE_TAG('A', 'o', 'n', '9') 45 #define TAG_DXBC MAKE_TAG('D', 'X', 'B', 'C') 46 #define TAG_ISGN MAKE_TAG('I', 'S', 'G', 'N') 47 #define TAG_OSGN MAKE_TAG('O', 'S', 'G', 'N') 48 #define TAG_PCSG MAKE_TAG('P', 'C', 'S', 'G') 49 #define TAG_RDEF MAKE_TAG('R', 'D', 'E', 'F') 50 #define TAG_SDBG MAKE_TAG('S', 'D', 'B', 'G') 51 #define TAG_SHDR MAKE_TAG('S', 'H', 'D', 'R') 52 #define TAG_SHEX MAKE_TAG('S', 'H', 'E', 'X') 53 #define TAG_STAT MAKE_TAG('S', 'T', 'A', 'T') 54 #define TAG_XNAP MAKE_TAG('X', 'N', 'A', 'P') 55 #define TAG_XNAS MAKE_TAG('X', 'N', 'A', 'S') 56 57 static void test_create_blob(void) 58 { 59 ID3D10Blob *blob; 60 HRESULT hr; 61 ULONG refcount; 62 63 hr = pD3DCreateBlob(1, NULL); 64 ok(hr == D3DERR_INVALIDCALL, "D3DCreateBlob failed with %x\n", hr); 65 66 hr = pD3DCreateBlob(0, NULL); 67 ok(hr == D3DERR_INVALIDCALL, "D3DCreateBlob failed with %x\n", hr); 68 69 hr = pD3DCreateBlob(0, &blob); 70 ok(hr == S_OK, "D3DCreateBlob failed with %x\n", hr); 71 72 refcount = ID3D10Blob_Release(blob); 73 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 74 } 75 76 static const D3D_BLOB_PART parts[] = 77 { 78 D3D_BLOB_INPUT_SIGNATURE_BLOB, D3D_BLOB_OUTPUT_SIGNATURE_BLOB, D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB, 79 D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB, D3D_BLOB_ALL_SIGNATURE_BLOB, D3D_BLOB_DEBUG_INFO, 80 D3D_BLOB_LEGACY_SHADER, D3D_BLOB_XNA_PREPASS_SHADER, D3D_BLOB_XNA_SHADER, 81 D3D_BLOB_TEST_ALTERNATE_SHADER, D3D_BLOB_TEST_COMPILE_DETAILS, D3D_BLOB_TEST_COMPILE_PERF 82 }; 83 84 /* 85 * test_blob_part - fxc.exe /E VS /Tvs_4_0_level_9_0 /Fx 86 */ 87 #if 0 88 float4 VS(float4 position : POSITION, float4 pos : SV_POSITION) : SV_POSITION 89 { 90 return position; 91 } 92 #endif 93 static DWORD test_blob_part[] = { 94 0x43425844, 0x0ef2a70f, 0x6a548011, 0x91ff9409, 0x9973a43d, 0x00000001, 0x000002e0, 0x00000008, 95 0x00000040, 0x0000008c, 0x000000d8, 0x0000013c, 0x00000180, 0x000001fc, 0x00000254, 0x000002ac, 96 0x53414e58, 0x00000044, 0x00000044, 0xfffe0200, 0x00000020, 0x00000024, 0x00240000, 0x00240000, 97 0x00240000, 0x00240000, 0x00240000, 0xfffe0200, 0x0200001f, 0x80000005, 0x900f0000, 0x02000001, 98 0xc00f0000, 0x80e40000, 0x0000ffff, 0x50414e58, 0x00000044, 0x00000044, 0xfffe0200, 0x00000020, 99 0x00000024, 0x00240000, 0x00240000, 0x00240000, 0x00240000, 0x00240000, 0xfffe0200, 0x0200001f, 100 0x80000005, 0x900f0000, 0x02000001, 0xc00f0000, 0x80e40000, 0x0000ffff, 0x396e6f41, 0x0000005c, 101 0x0000005c, 0xfffe0200, 0x00000034, 0x00000028, 0x00240000, 0x00240000, 0x00240000, 0x00240000, 102 0x00240001, 0x00000000, 0xfffe0200, 0x0200001f, 0x80000005, 0x900f0000, 0x04000004, 0xc0030000, 103 0x90ff0000, 0xa0e40000, 0x90e40000, 0x02000001, 0xc00c0000, 0x90e40000, 0x0000ffff, 0x52444853, 104 0x0000003c, 0x00010040, 0x0000000f, 0x0300005f, 0x001010f2, 0x00000000, 0x04000067, 0x001020f2, 105 0x00000000, 0x00000001, 0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000000, 0x0100003e, 106 0x54415453, 0x00000074, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 107 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 108 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 109 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x46454452, 110 0x00000050, 0x00000000, 0x00000000, 0x00000000, 0x0000001c, 0xfffe0400, 0x00000100, 0x0000001c, 111 0x7263694d, 0x666f736f, 0x52282074, 0x4c482029, 0x53204c53, 0x65646168, 0x6f432072, 0x6c69706d, 112 0x39207265, 0x2e39322e, 0x2e323539, 0x31313133, 0xababab00, 0x4e475349, 0x00000050, 0x00000002, 113 0x00000008, 0x00000038, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f, 0x00000041, 114 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x0000000f, 0x49534f50, 0x4e4f4954, 0x5f565300, 115 0x49534f50, 0x4e4f4954, 0xababab00, 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 116 0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000000f, 0x505f5653, 0x5449534f, 0x004e4f49, 117 }; 118 119 static void test_get_blob_part(void) 120 { 121 ID3DBlob *blob, *blob2; 122 HRESULT hr; 123 ULONG refcount; 124 DWORD *dword; 125 SIZE_T size; 126 UINT i; 127 128 hr = pD3DCreateBlob(1, &blob2); 129 ok(hr == S_OK, "D3DCreateBlob failed with %x\n", hr); 130 blob = blob2; 131 132 /* invalid cases */ 133 hr = pD3DGetBlobPart(NULL, test_blob_part[6], D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, &blob); 134 ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr); 135 ok(blob2 == blob, "D3DGetBlobPart failed got %p, expected %p\n", blob, blob2); 136 137 hr = pD3DGetBlobPart(NULL, 0, D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, &blob); 138 ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr); 139 ok(blob2 == blob, "D3DGetBlobPart failed got %p, expected %p\n", blob, blob2); 140 141 hr = pD3DGetBlobPart(NULL, test_blob_part[6], D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, NULL); 142 ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr); 143 144 hr = pD3DGetBlobPart(NULL, 0, D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, NULL); 145 ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr); 146 147 hr = pD3DGetBlobPart(test_blob_part, 0, D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, &blob); 148 ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr); 149 ok(blob2 == blob, "D3DGetBlobPart failed got %p, expected %p\n", blob, blob2); 150 151 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, NULL); 152 ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr); 153 154 hr = pD3DGetBlobPart(test_blob_part, 0, D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, NULL); 155 ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr); 156 157 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_INPUT_SIGNATURE_BLOB, 1, &blob); 158 ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr); 159 ok(blob2 == blob, "D3DGetBlobPart failed got %p, expected %p\n", blob, blob2); 160 161 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], 0xffffffff, 0, &blob); 162 ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr); 163 ok(blob2 == blob, "D3DGetBlobPart failed got %p, expected %p\n", blob, blob2); 164 165 refcount = ID3D10Blob_Release(blob2); 166 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 167 168 /* D3D_BLOB_INPUT_SIGNATURE_BLOB */ 169 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, &blob); 170 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 171 172 size = ID3D10Blob_GetBufferSize(blob); 173 ok(size == 124, "GetBufferSize failed, got %lu, expected %u\n", size, 124); 174 175 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 176 ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC); 177 ok(TAG_ISGN == *(dword+9), "ISGN got %#x, expected %#x.\n", *(dword+9), TAG_ISGN); 178 179 for (i = 0; i < ARRAY_SIZE(parts); i++) 180 { 181 hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2); 182 183 if (parts[i] == D3D_BLOB_INPUT_SIGNATURE_BLOB) 184 { 185 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 186 187 refcount = ID3D10Blob_Release(blob2); 188 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 189 } 190 else 191 { 192 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 193 } 194 } 195 196 refcount = ID3D10Blob_Release(blob); 197 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 198 199 /* D3D_BLOB_OUTPUT_SIGNATURE_BLOB */ 200 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_OUTPUT_SIGNATURE_BLOB, 0, &blob); 201 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 202 203 size = ID3D10Blob_GetBufferSize(blob); 204 ok(size == 88, "GetBufferSize failed, got %lu, expected %u\n", size, 88); 205 206 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 207 ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC); 208 ok(TAG_OSGN == *(dword+9), "OSGN got %#x, expected %#x.\n", *(dword+9), TAG_OSGN); 209 210 for (i = 0; i < ARRAY_SIZE(parts); i++) 211 { 212 hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2); 213 214 if (parts[i] == D3D_BLOB_OUTPUT_SIGNATURE_BLOB) 215 { 216 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 217 218 refcount = ID3D10Blob_Release(blob2); 219 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 220 } 221 else 222 { 223 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 224 } 225 } 226 227 refcount = ID3D10Blob_Release(blob); 228 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 229 230 /* D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB */ 231 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB, 0, &blob); 232 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 233 234 size = ID3D10Blob_GetBufferSize(blob); 235 ok(size == 180, "GetBufferSize failed, got %lu, expected %u\n", size, 180); 236 237 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 238 ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC); 239 ok(TAG_ISGN == *(dword+10), "ISGN got %#x, expected %#x.\n", *(dword+10), TAG_ISGN); 240 ok(TAG_OSGN == *(dword+32), "OSGN got %#x, expected %#x.\n", *(dword+32), TAG_OSGN); 241 242 for (i = 0; i < ARRAY_SIZE(parts); i++) 243 { 244 hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2); 245 246 if (parts[i] == D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB 247 || parts[i] == D3D_BLOB_INPUT_SIGNATURE_BLOB 248 || parts[i] == D3D_BLOB_OUTPUT_SIGNATURE_BLOB) 249 { 250 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 251 252 refcount = ID3D10Blob_Release(blob2); 253 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 254 } 255 else 256 { 257 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 258 } 259 } 260 261 refcount = ID3D10Blob_Release(blob); 262 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 263 264 /* D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB */ 265 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB, 0, &blob); 266 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 267 268 /* D3D_BLOB_ALL_SIGNATURE_BLOB */ 269 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_ALL_SIGNATURE_BLOB, 0, &blob); 270 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 271 272 /* D3D_BLOB_DEBUG_INFO */ 273 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_DEBUG_INFO, 0, &blob); 274 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 275 276 /* D3D_BLOB_LEGACY_SHADER */ 277 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_LEGACY_SHADER, 0, &blob); 278 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 279 280 size = ID3D10Blob_GetBufferSize(blob); 281 ok(size == 92, "GetBufferSize failed, got %lu, expected %u\n", size, 92); 282 283 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 284 ok(test_blob_part[0] != *dword, "DXBC failed got %#x.\n", *dword); 285 286 for (i = 0; i < ARRAY_SIZE(parts); i++) 287 { 288 /* There isn't a full DXBC blob returned for D3D_BLOB_LEGACY_SHADER */ 289 hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2); 290 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 291 } 292 293 refcount = ID3D10Blob_Release(blob); 294 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 295 296 /* D3D_BLOB_XNA_PREPASS_SHADER */ 297 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_XNA_PREPASS_SHADER, 0, &blob); 298 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 299 300 size = ID3D10Blob_GetBufferSize(blob); 301 ok(size == 68, "GetBufferSize failed, got %lu, expected %u\n", size, 68); 302 303 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 304 ok(test_blob_part[0] != *dword, "DXBC failed got %#x.\n", *dword); 305 306 for (i = 0; i < ARRAY_SIZE(parts); i++) 307 { 308 /* There isn't a full DXBC blob returned for D3D_BLOB_XNA_PREPASS_SHADER */ 309 hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2); 310 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 311 } 312 313 refcount = ID3D10Blob_Release(blob); 314 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 315 316 /* D3D_BLOB_XNA_SHADER */ 317 hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_XNA_SHADER, 0, &blob); 318 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 319 320 size = ID3D10Blob_GetBufferSize(blob); 321 ok(size == 68, "GetBufferSize failed, got %lu, expected %u\n", size, 68); 322 323 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 324 ok(test_blob_part[0] != *dword, "DXBC failed got %#x.\n", *dword); 325 326 for (i = 0; i < ARRAY_SIZE(parts); i++) 327 { 328 /* There isn't a full DXBC blob returned for D3D_BLOB_XNA_SHADER */ 329 hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2); 330 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 331 } 332 333 refcount = ID3D10Blob_Release(blob); 334 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 335 336 /* check corner cases for D3DStripShader */ 337 hr = pD3DStripShader(test_blob_part, test_blob_part[6], 0xffffffff, &blob); 338 ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK); 339 340 refcount = ID3D10Blob_Release(blob); 341 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 342 343 hr = pD3DStripShader(test_blob_part, test_blob_part[6], 0, &blob); 344 ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK); 345 346 refcount = ID3D10Blob_Release(blob); 347 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 348 349 hr = pD3DStripShader(NULL, test_blob_part[6], 0, &blob); 350 ok(hr == D3DERR_INVALIDCALL, "D3DStripShader failed, got %x, expected %x\n", hr, D3DERR_INVALIDCALL); 351 352 hr = pD3DStripShader(test_blob_part, 2, 0, &blob); 353 ok(hr == D3DERR_INVALIDCALL, "D3DStripShader failed, got %x, expected %x\n", hr, D3DERR_INVALIDCALL); 354 355 hr = pD3DStripShader(test_blob_part, test_blob_part[6], 0, NULL); 356 ok(hr == E_FAIL, "D3DStripShader failed, got %x, expected %x\n", hr, E_FAIL); 357 358 hr = pD3DStripShader(NULL, test_blob_part[6], 0, NULL); 359 ok(hr == E_FAIL, "D3DStripShader failed, got %x, expected %x\n", hr, E_FAIL); 360 361 hr = pD3DStripShader(test_blob_part, 0, 0, NULL); 362 ok(hr == E_FAIL, "D3DStripShader failed, got %x, expected %x\n", hr, E_FAIL); 363 364 /* D3DCOMPILER_STRIP_DEBUG_INFO */ 365 hr = pD3DStripShader(test_blob_part, test_blob_part[6], D3DCOMPILER_STRIP_DEBUG_INFO, &blob); 366 ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK); 367 368 size = ID3D10Blob_GetBufferSize(blob); 369 ok(size == 736, "GetBufferSize failed, got %lu, expected %u\n", size, 736); 370 371 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 372 ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC); 373 ok(TAG_XNAS == *(dword+16), "XNAS got %#x, expected %#x.\n", *(dword+16), TAG_XNAS); 374 ok(TAG_XNAP == *(dword+35), "XNAP got %#x, expected %#x.\n", *(dword+35), TAG_XNAP); 375 ok(TAG_Aon9 == *(dword+54), "Aon9 got %#x, expected %#x.\n", *(dword+54), TAG_Aon9); 376 ok(TAG_SHDR == *(dword+79), "SHDR got %#x, expected %#x.\n", *(dword+79), TAG_SHDR); 377 ok(TAG_STAT == *(dword+96), "STAT got %#x, expected %#x.\n", *(dword+96), TAG_STAT); 378 ok(TAG_RDEF == *(dword+127), "RDEF got %#x, expected %#x.\n", *(dword+127), TAG_RDEF); 379 ok(TAG_ISGN == *(dword+149), "ISGN got %#x, expected %#x.\n", *(dword+149), TAG_ISGN); 380 ok(TAG_OSGN == *(dword+171), "OSGN got %#x, expected %#x.\n", *(dword+171), TAG_OSGN); 381 382 hr = pD3DGetBlobPart(dword, size, D3D_BLOB_DEBUG_INFO, 0, &blob2); 383 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 384 385 refcount = ID3D10Blob_Release(blob); 386 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 387 388 /* D3DCOMPILER_STRIP_REFLECTION_DATA */ 389 hr = pD3DStripShader(test_blob_part, test_blob_part[6], D3DCOMPILER_STRIP_REFLECTION_DATA, &blob); 390 ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK); 391 392 size = ID3D10Blob_GetBufferSize(blob); 393 ok(size == 516, "GetBufferSize failed, got %lu, expected %u\n", size, 516); 394 395 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 396 ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC); 397 ok(TAG_XNAS == *(dword+14), "XNAS got %#x, expected %#x.\n", *(dword+14), TAG_XNAS); 398 ok(TAG_XNAP == *(dword+33), "XNAP got %#x, expected %#x.\n", *(dword+33), TAG_XNAP); 399 ok(TAG_Aon9 == *(dword+52), "Aon9 got %#x, expected %#x.\n", *(dword+52), TAG_Aon9); 400 ok(TAG_SHDR == *(dword+77), "SHDR got %#x, expected %#x.\n", *(dword+77), TAG_SHDR); 401 ok(TAG_ISGN == *(dword+94), "ISGN got %#x, expected %#x.\n", *(dword+94), TAG_ISGN); 402 ok(TAG_OSGN == *(dword+116), "OSGN got %#x, expected %#x.\n", *(dword+116), TAG_OSGN); 403 404 refcount = ID3D10Blob_Release(blob); 405 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 406 } 407 408 /* 409 * test_blob_part2 - fxc.exe /E BHS /Ths_5_0 /Zi 410 */ 411 #if 0 412 struct VSO { float3 p : POSITION; }; 413 struct HSDO { float e[4] : SV_TessFactor; float i[2] : SV_InsideTessFactor; }; 414 struct HSO { float3 p : BEZIERPOS; }; 415 HSDO BCHS( InputPatch<VSO, 8> ip, uint PatchID : SV_PrimitiveID ) 416 { 417 HSDO res; 418 res.e[0] = res.e[1] = res.e[2] = res.e[3] = 1.0f; 419 res.i[0] = res.i[1] = 1.0f; 420 return res; 421 } 422 [domain("quad")] 423 [partitioning("integer")] 424 [outputtopology("triangle_cw")] 425 [outputcontrolpoints(8)] 426 [patchconstantfunc("BCHS")] 427 HSO BHS( InputPatch<VSO, 8> p, uint i : SV_OutputControlPointID, uint PatchID : SV_PrimitiveID ) 428 { 429 HSO res; 430 res.p = p[i].p; 431 return res; 432 } 433 #endif 434 static DWORD test_blob_part2[] = { 435 0x43425844, 0xa9d455ae, 0x4cf9c0df, 0x4cf806dc, 0xc57a8c2c, 0x00000001, 0x0000139b, 0x00000007, 436 0x0000003c, 0x000000b4, 0x000000e8, 0x0000011c, 0x000001e0, 0x00000320, 0x000003bc, 0x46454452, 437 0x00000070, 0x00000000, 0x00000000, 0x00000000, 0x0000003c, 0x48530500, 0x00000101, 0x0000003c, 438 0x31314452, 0x0000003c, 0x00000018, 0x00000020, 0x00000028, 0x00000024, 0x0000000c, 0x00000000, 439 0x7263694d, 0x666f736f, 0x52282074, 0x4c482029, 0x53204c53, 0x65646168, 0x6f432072, 0x6c69706d, 440 0x39207265, 0x2e39322e, 0x2e323539, 0x31313133, 0xababab00, 0x4e475349, 0x0000002c, 0x00000001, 441 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000707, 0x49534f50, 442 0x4e4f4954, 0xababab00, 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 443 0x00000000, 0x00000003, 0x00000000, 0x00000807, 0x495a4542, 0x4f505245, 0xabab0053, 0x47534350, 444 0x000000bc, 0x00000006, 0x00000008, 0x00000098, 0x00000000, 0x0000000b, 0x00000003, 0x00000000, 445 0x00000e01, 0x00000098, 0x00000001, 0x0000000b, 0x00000003, 0x00000001, 0x00000e01, 0x00000098, 446 0x00000002, 0x0000000b, 0x00000003, 0x00000002, 0x00000e01, 0x00000098, 0x00000003, 0x0000000b, 447 0x00000003, 0x00000003, 0x00000e01, 0x000000a6, 0x00000000, 0x0000000c, 0x00000003, 0x00000004, 448 0x00000e01, 0x000000a6, 0x00000001, 0x0000000c, 0x00000003, 0x00000005, 0x00000e01, 0x545f5653, 449 0x46737365, 0x6f746361, 0x56530072, 0x736e495f, 0x54656469, 0x46737365, 0x6f746361, 0xabab0072, 450 0x58454853, 0x00000138, 0x00030050, 0x0000004e, 0x01000071, 0x01004093, 0x01004094, 0x01001895, 451 0x01000896, 0x01001897, 0x0100086a, 0x01000073, 0x02000099, 0x00000004, 0x0200005f, 0x00017000, 452 0x04000067, 0x00102012, 0x00000000, 0x0000000b, 0x04000067, 0x00102012, 0x00000001, 0x0000000c, 453 0x04000067, 0x00102012, 0x00000002, 0x0000000d, 0x04000067, 0x00102012, 0x00000003, 0x0000000e, 454 0x02000068, 0x00000001, 0x0400005b, 0x00102012, 0x00000000, 0x00000004, 0x04000036, 0x00100012, 455 0x00000000, 0x0001700a, 0x06000036, 0x00902012, 0x0010000a, 0x00000000, 0x00004001, 0x3f800000, 456 0x0100003e, 0x01000073, 0x02000099, 0x00000002, 0x0200005f, 0x00017000, 0x04000067, 0x00102012, 457 0x00000004, 0x0000000f, 0x04000067, 0x00102012, 0x00000005, 0x00000010, 0x02000068, 0x00000001, 458 0x0400005b, 0x00102012, 0x00000004, 0x00000002, 0x04000036, 0x00100012, 0x00000000, 0x0001700a, 459 0x07000036, 0x00d02012, 0x00000004, 0x0010000a, 0x00000000, 0x00004001, 0x3f800000, 0x0100003e, 460 0x54415453, 0x00000094, 0x00000006, 0x00000001, 0x00000000, 0x00000005, 0x00000000, 0x00000000, 461 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 462 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 463 0x00000000, 0x0000000f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 464 0x00000008, 0x00000003, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x47424453, 465 0x00000fd7, 0x00000054, 0x000002d5, 0x00000306, 0x0000030a, 0x00000101, 0x00000001, 0x00000000, 466 0x00000006, 0x00000010, 0x00000006, 0x00000958, 0x00000000, 0x000009e8, 0x00000008, 0x000009e8, 467 0x00000006, 0x00000a88, 0x00000007, 0x00000b00, 0x00000c34, 0x00000c64, 0x00000000, 0x0000004a, 468 0x0000004a, 0x0000026a, 0x00000000, 0x00000036, 0x00000001, 0x00000004, 0x00000000, 0xffffffff, 469 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000003, 0x00000000, 470 0x00000003, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 471 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 472 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 473 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 474 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 475 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 476 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 477 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 478 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 479 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 480 0x00000000, 0x00000003, 0x00000024, 0x00000000, 0x00000000, 0x00000001, 0x00000036, 0x00000001, 481 0x00000001, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 482 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000000, 0x00000000, 483 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 484 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 485 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 486 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 487 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 488 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 489 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 490 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 491 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 492 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x00000003, 0x00000024, 0x00000000, 0x00000000, 493 0x00000002, 0x0000003e, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 494 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 495 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 496 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 497 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 498 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 499 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 500 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 501 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 502 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 503 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 504 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x00000003, 505 0x00000024, 0x00000000, 0x00000000, 0x00000003, 0x00000036, 0x00000001, 0x00000004, 0x00000000, 506 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000001, 507 0x00000000, 0x00000001, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 508 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 509 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 510 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 511 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 512 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 513 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 514 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 515 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 516 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 517 0x00000007, 0x00000000, 0x00000003, 0x00000024, 0x00000000, 0x00000000, 0x00000004, 0x00000036, 518 0x00000001, 0x00000001, 0x00000004, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 519 0x00000004, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000000, 520 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 521 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 522 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 523 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 524 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 525 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 526 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 527 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 528 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 529 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x00000003, 0x00000024, 0x00000000, 530 0x00000000, 0x00000005, 0x0000003e, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 531 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 532 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 533 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 534 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 535 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 536 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 537 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 538 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 539 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 540 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 541 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 542 0x00000003, 0x00000024, 0x00000000, 0x00000000, 0x00000006, 0x00000003, 0xffffffff, 0xffffffff, 543 0x00000003, 0x00000000, 0x00000006, 0x00000003, 0xffffffff, 0xffffffff, 0x00000003, 0x00000001, 544 0x00000006, 0x00000003, 0xffffffff, 0xffffffff, 0x00000003, 0x00000002, 0x00000006, 0x00000003, 545 0xffffffff, 0xffffffff, 0x00000003, 0x00000003, 0x00000006, 0x00000003, 0xffffffff, 0xffffffff, 546 0x00000003, 0x00000004, 0x00000006, 0x00000003, 0xffffffff, 0xffffffff, 0x00000003, 0x00000005, 547 0x00000000, 0x00000002, 0x00000014, 0x00000007, 0x000002c1, 0x00000000, 0x00000002, 0x00000030, 548 0x00000007, 0x000002c8, 0x00000000, 0x00000004, 0x0000001e, 0x00000002, 0x00000102, 0x00000000, 549 0x00000004, 0x00000027, 0x00000007, 0x0000010b, 0x00000000, 0x00000006, 0x00000009, 0x00000003, 550 0x00000131, 0x00000000, 0x00000001, 0x00000014, 0x00000006, 0x000002cf, 0x00000000, 0x00000004, 551 0x00000005, 0x00000004, 0x000000e9, 0x00000000, 0x00000009, 0x00000004, 0x00000000, 0x00000000, 552 0x00000003, 0x00000051, 0x00000003, 0x00000001, 0x00000000, 0x00000003, 0x00000076, 0x00000004, 553 0x00000002, 0x00000004, 0x00000000, 0x000002b4, 0x00000007, 0x00000001, 0x0000000c, 0x00000003, 554 0x00000076, 0x00000004, 0x00000002, 0x00000004, 0x00000001, 0x000002bb, 0x00000006, 0x00000001, 555 0x00000010, 0x00000004, 0x000000e9, 0x00000004, 0x00000003, 0x00000014, 0x00000005, 0x00000000, 556 0x00000001, 0x00000001, 0x00000003, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 557 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0xffffffff, 0x00000001, 558 0x00000014, 0x00000004, 0x00000004, 0xffffffff, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 559 0x00000001, 0xffffffff, 0x00000001, 0x00000008, 0x00000004, 0x00000002, 0xffffffff, 0x00000006, 560 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 561 0x00000006, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 562 0x00000001, 0x00000020, 0x0000000c, 0x00000018, 0xffffffff, 0x00000003, 0x00000000, 0x00000000, 563 0x00000001, 0x00000001, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xffffffff, 564 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 565 0x00000000, 0x00000006, 0xffffffff, 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000006, 566 0x00000004, 0x00000005, 0x00000006, 0x00000008, 0x00000004, 0x00000005, 0x00000002, 0x505c3a43, 567 0x72676f72, 0x656d6d61, 0x63694d5c, 0x6f736f72, 0x44207466, 0x63657269, 0x53205874, 0x28204b44, 568 0x656e754a, 0x31303220, 0x555c2930, 0x696c6974, 0x73656974, 0x6e69625c, 0x3638785c, 0x6165685c, 569 0x2e726564, 0x74737866, 0x74637572, 0x4f535620, 0x66207b20, 0x74616f6c, 0x20702033, 0x4f50203a, 570 0x49544953, 0x203b4e4f, 0x730a3b7d, 0x63757274, 0x53482074, 0x7b204f44, 0x6f6c6620, 0x65207461, 571 0x205d345b, 0x5653203a, 0x7365545f, 0x63614673, 0x3b726f74, 0x6f6c6620, 0x69207461, 0x205d325b, 572 0x5653203a, 0x736e495f, 0x54656469, 0x46737365, 0x6f746361, 0x7d203b72, 0x74730a3b, 0x74637572, 573 0x4f534820, 0x66207b20, 0x74616f6c, 0x20702033, 0x4542203a, 0x5245495a, 0x3b534f50, 0x0a3b7d20, 574 0x4f445348, 0x48434220, 0x49202853, 0x7475706e, 0x63746150, 0x53563c68, 0x38202c4f, 0x7069203e, 575 0x6975202c, 0x5020746e, 0x68637461, 0x3a204449, 0x5f565320, 0x6d697250, 0x76697469, 0x20444965, 576 0x0a7b0a29, 0x20202020, 0x4f445348, 0x73657220, 0x20200a3b, 0x65722020, 0x5b652e73, 0x3d205d30, 577 0x73657220, 0x315b652e, 0x203d205d, 0x2e736572, 0x5d325b65, 0x72203d20, 0x652e7365, 0x205d335b, 578 0x2e31203d, 0x0a3b6630, 0x20202020, 0x2e736572, 0x5d305b69, 0x72203d20, 0x692e7365, 0x205d315b, 579 0x2e31203d, 0x0a3b6630, 0x20202020, 0x75746572, 0x72206e72, 0x0a3b7365, 0x645b0a7d, 0x69616d6f, 580 0x7122286e, 0x22646175, 0x5b0a5d29, 0x74726170, 0x6f697469, 0x676e696e, 0x6e692228, 0x65676574, 581 0x5d292272, 0x756f5b0a, 0x74757074, 0x6f706f74, 0x79676f6c, 0x72742228, 0x676e6169, 0x635f656c, 582 0x5d292277, 0x756f5b0a, 0x74757074, 0x746e6f63, 0x706c6f72, 0x746e696f, 0x29382873, 0x705b0a5d, 583 0x68637461, 0x736e6f63, 0x746e6174, 0x636e7566, 0x43422228, 0x29225348, 0x53480a5d, 0x4842204f, 584 0x49202853, 0x7475706e, 0x63746150, 0x53563c68, 0x38202c4f, 0x2c70203e, 0x6e697520, 0x20692074, 585 0x5653203a, 0x74754f5f, 0x43747570, 0x72746e6f, 0x6f506c6f, 0x49746e69, 0x75202c44, 0x20746e69, 586 0x63746150, 0x20444968, 0x5653203a, 0x6972505f, 0x6974696d, 0x44496576, 0x7b0a2920, 0x2020200a, 587 0x4f534820, 0x73657220, 0x20200a3b, 0x65722020, 0x20702e73, 0x5b70203d, 0x702e5d69, 0x20200a3b, 588 0x65722020, 0x6e727574, 0x73657220, 0x0a7d0a3b, 0x626f6c47, 0x4c736c61, 0x6c61636f, 0x44534873, 589 0x653a3a4f, 0x4f445348, 0x56693a3a, 0x3a3a4f53, 0x63694d70, 0x6f736f72, 0x28207466, 0x48202952, 590 0x204c534c, 0x64616853, 0x43207265, 0x69706d6f, 0x2072656c, 0x39322e39, 0x3235392e, 0x3131332e, 591 0x48420031, 0x73680053, 0x305f355f, 0x6e6f6320, 0x6c6f7274, 0x696f7020, 0x0000746e, 592 }; 593 594 static void test_get_blob_part2(void) 595 { 596 ID3DBlob *blob, *blob2; 597 HRESULT hr; 598 ULONG refcount; 599 DWORD *dword; 600 SIZE_T size; 601 UINT i; 602 603 /* D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB */ 604 hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB, 0, &blob); 605 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 606 607 size = ID3D10Blob_GetBufferSize(blob); 608 ok(size == 232, "GetBufferSize failed, got %lu, expected %u\n", size, 232); 609 610 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 611 ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC); 612 ok(TAG_PCSG == *(dword+9), "PCSG got %#x, expected %#x.\n", *(dword+9), TAG_PCSG); 613 614 for (i = 0; i < ARRAY_SIZE(parts); i++) 615 { 616 hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2); 617 618 if (parts[i] == D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB) 619 { 620 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 621 622 refcount = ID3D10Blob_Release(blob2); 623 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 624 } 625 else 626 { 627 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 628 } 629 } 630 631 refcount = ID3D10Blob_Release(blob); 632 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 633 634 /* D3D_BLOB_ALL_SIGNATURE_BLOB */ 635 hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_ALL_SIGNATURE_BLOB, 0, &blob); 636 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 637 638 size = ID3D10Blob_GetBufferSize(blob); 639 ok(size == 344, "GetBufferSize failed, got %lu, expected %u\n", size, 344); 640 641 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 642 ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC); 643 ok(TAG_ISGN == *(dword+11), "ISGN got %#x, expected %#x.\n", *(dword+11), TAG_ISGN); 644 ok(TAG_OSGN == *(dword+24), "OSGN got %#x, expected %#x.\n", *(dword+24), TAG_OSGN); 645 ok(TAG_PCSG == *(dword+37), "PCSG got %#x, expected %#x.\n", *(dword+37), TAG_PCSG); 646 647 for (i = 0; i < ARRAY_SIZE(parts); i++) 648 { 649 hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2); 650 651 if (parts[i] == D3D_BLOB_ALL_SIGNATURE_BLOB 652 || parts[i] == D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB 653 || parts[i] == D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB 654 || parts[i] == D3D_BLOB_INPUT_SIGNATURE_BLOB 655 || parts[i] == D3D_BLOB_OUTPUT_SIGNATURE_BLOB) 656 { 657 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 658 659 refcount = ID3D10Blob_Release(blob2); 660 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 661 } 662 else 663 { 664 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 665 } 666 } 667 668 refcount = ID3D10Blob_Release(blob); 669 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 670 671 /* D3D_BLOB_DEBUG_INFO */ 672 hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_DEBUG_INFO, 0, &blob); 673 ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK); 674 675 size = ID3D10Blob_GetBufferSize(blob); 676 ok(size == 4055, "GetBufferSize failed, got %lu, expected %u\n", size, 4055); 677 678 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 679 ok(TAG_DXBC != *dword, "DXBC failed got %#x.\n", *dword); 680 681 for (i = 0; i < ARRAY_SIZE(parts); i++) 682 { 683 /* There isn't a full DXBC blob returned for D3D_BLOB_DEBUG_INFO */ 684 hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2); 685 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 686 } 687 688 refcount = ID3D10Blob_Release(blob); 689 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 690 691 /* D3D_BLOB_LEGACY_SHADER */ 692 hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_LEGACY_SHADER, 0, &blob); 693 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 694 695 /* D3D_BLOB_XNA_PREPASS_SHADER */ 696 hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_XNA_PREPASS_SHADER, 0, &blob); 697 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 698 699 /* D3D_BLOB_XNA_SHADER */ 700 hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_XNA_SHADER, 0, &blob); 701 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 702 703 /* D3DCOMPILER_STRIP_DEBUG_INFO */ 704 hr = pD3DStripShader(test_blob_part2, test_blob_part2[6], D3DCOMPILER_STRIP_DEBUG_INFO, &blob); 705 ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK); 706 707 size = ID3D10Blob_GetBufferSize(blob); 708 ok(size == 952, "GetBufferSize failed, got %lu, expected %u\n", size, 952); 709 710 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 711 ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC); 712 ok(TAG_RDEF == *(dword+14), "RDEF got %#x, expected %#x.\n", *(dword+14), TAG_RDEF); 713 ok(TAG_ISGN == *(dword+44), "ISGN got %#x, expected %#x.\n", *(dword+44), TAG_ISGN); 714 ok(TAG_OSGN == *(dword+57), "OSGN got %#x, expected %#x.\n", *(dword+57), TAG_OSGN); 715 ok(TAG_PCSG == *(dword+70), "PCSG got %#x, expected %#x.\n", *(dword+70), TAG_PCSG); 716 ok(TAG_SHEX == *(dword+119), "SHEX got %#x, expected %#x.\n", *(dword+119), TAG_SHEX); 717 ok(TAG_STAT == *(dword+199), "STAT got %#x, expected %#x.\n", *(dword+199), TAG_STAT); 718 719 hr = pD3DGetBlobPart(dword, size, D3D_BLOB_DEBUG_INFO, 0, &blob2); 720 ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL); 721 722 refcount = ID3D10Blob_Release(blob); 723 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 724 725 /* D3DCOMPILER_STRIP_REFLECTION_DATA */ 726 hr = pD3DStripShader(test_blob_part2, test_blob_part2[6], D3DCOMPILER_STRIP_REFLECTION_DATA, &blob); 727 ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK); 728 729 size = ID3D10Blob_GetBufferSize(blob); 730 ok(size == 4735, "GetBufferSize failed, got %lu, expected %u\n", size, 4735); 731 732 dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob)); 733 ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC); 734 ok(TAG_ISGN == *(dword+13), "ISGN got %#x, expected %#x.\n", *(dword+13), TAG_ISGN); 735 ok(TAG_OSGN == *(dword+26), "OSGN got %#x, expected %#x.\n", *(dword+26), TAG_OSGN); 736 ok(TAG_PCSG == *(dword+39), "PCSG got %#x, expected %#x.\n", *(dword+39), TAG_PCSG); 737 ok(TAG_SHEX == *(dword+88), "SHEX got %#x, expected %#x.\n", *(dword+88), TAG_SHEX); 738 ok(TAG_SDBG == *(dword+168), "SDBG got %#x, expected %#x.\n", *(dword+168), TAG_SDBG); 739 740 refcount = ID3D10Blob_Release(blob); 741 ok(!refcount, "ID3DBlob has %u references left\n", refcount); 742 } 743 744 static BOOL load_d3dcompiler_43(void) 745 { 746 HMODULE module; 747 748 if (!(module = LoadLibraryA("d3dcompiler_43.dll"))) return FALSE; 749 750 pD3DCreateBlob = (void*)GetProcAddress(module, "D3DCreateBlob"); 751 pD3DGetBlobPart = (void*)GetProcAddress(module, "D3DGetBlobPart"); 752 pD3DStripShader = (void*)GetProcAddress(module, "D3DStripShader"); 753 return TRUE; 754 } 755 756 static BOOL load_d3dcompiler_47(void) 757 { 758 HMODULE module; 759 760 if (!(module = LoadLibraryA("d3dcompiler_47.dll"))) 761 return FALSE; 762 763 pD3DReadFileToBlob = (void *)GetProcAddress(module, "D3DReadFileToBlob"); 764 return TRUE; 765 } 766 767 static BOOL create_file(WCHAR *filename, const DWORD *data, DWORD data_size) 768 { 769 static WCHAR temp_dir[MAX_PATH]; 770 DWORD written; 771 HANDLE file; 772 773 if (!temp_dir[0]) 774 GetTempPathW(ARRAY_SIZE(temp_dir), temp_dir); 775 GetTempFileNameW(temp_dir, NULL, 0, filename); 776 file = CreateFileW(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); 777 if (file == INVALID_HANDLE_VALUE) 778 return FALSE; 779 780 if (data) 781 { 782 WriteFile(file, data, data_size, &written, NULL); 783 if (written != data_size) 784 { 785 CloseHandle(file); 786 DeleteFileW(filename); 787 return FALSE; 788 } 789 } 790 CloseHandle(file); 791 return TRUE; 792 } 793 794 /* test_cso_data - fxc.exe file.hlsl /Fo file.cso */ 795 static const DWORD test_cso_data[] = 796 { 797 #if 0 798 struct PSInput 799 { 800 float4 value : SV_POSITION; 801 }; 802 803 PSInput main(float4 position : POSITION) 804 { 805 PSInput result; 806 result.value = position; 807 return result; 808 } 809 #endif 810 0xfffe0200, 0x0014fffe, 0x42415443, 0x0000001c, 0x00000023, 0xfffe0200, 0x00000000, 0x00000000, 811 0x00000100, 0x0000001c, 0x325f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 812 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x30312072, 0xab00312e, 0x0200001f, 0x80000000, 813 0x900f0000, 0x02000001, 0xc00f0000, 0x90e40000, 0x0000ffff 814 }; 815 816 static void test_D3DReadFileToBlob(void) 817 { 818 WCHAR filename[MAX_PATH] = {'n','o','n','e','x','i','s','t','e','n','t',0}; 819 ID3DBlob *blob = NULL; 820 SIZE_T data_size; 821 DWORD *data; 822 HRESULT hr; 823 824 hr = pD3DReadFileToBlob(filename, NULL); 825 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Got unexpected hr %#x.\n", hr); 826 827 hr = pD3DReadFileToBlob(filename, &blob); 828 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Got unexpected hr %#x.\n", hr); 829 830 if (0) 831 { 832 /* Crashes on Windows. */ 833 create_file(filename, test_cso_data, ARRAY_SIZE(test_cso_data)); 834 pD3DReadFileToBlob(filename, NULL); 835 DeleteFileW(filename); 836 } 837 838 if (!create_file(filename, NULL, 0)) 839 { 840 win_skip("File creation failed.\n"); 841 return; 842 } 843 hr = pD3DReadFileToBlob(filename, &blob); 844 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); 845 data_size = ID3D10Blob_GetBufferSize(blob); 846 ok(!data_size, "Got unexpected data size.\n"); 847 DeleteFileW(filename); 848 ID3D10Blob_Release(blob); 849 850 if (!create_file(filename, test_cso_data, ARRAY_SIZE(test_cso_data))) 851 { 852 win_skip("File creation failed.\n"); 853 return; 854 } 855 hr = pD3DReadFileToBlob(filename, &blob); 856 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); 857 data_size = ID3D10Blob_GetBufferSize(blob); 858 ok(data_size == ARRAY_SIZE(test_cso_data), "Got unexpected data size.\n"); 859 data = ID3D10Blob_GetBufferPointer(blob); 860 ok(!memcmp(data, test_cso_data, ARRAY_SIZE(test_cso_data)), "Got unexpected data.\n"); 861 DeleteFileW(filename); 862 ID3D10Blob_Release(blob); 863 } 864 865 START_TEST(blob) 866 { 867 if (load_d3dcompiler_43()) 868 { 869 test_create_blob(); 870 test_get_blob_part(); 871 test_get_blob_part2(); 872 } 873 else 874 { 875 win_skip("Could not load d3dcompiler_43.dll\n"); 876 } 877 878 if (load_d3dcompiler_47()) 879 { 880 test_D3DReadFileToBlob(); 881 } 882 else 883 { 884 win_skip("Could not load d3dcompiler_47.dll.\n"); 885 } 886 } 887