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