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 
test_create_blob(void)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 
test_get_blob_part(void)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 
test_get_blob_part2(void)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 
load_d3dcompiler_43(void)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 
load_d3dcompiler_47(void)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 
create_file(WCHAR * filename,const DWORD * data,DWORD data_size)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 
test_D3DReadFileToBlob(void)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 
START_TEST(blob)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