mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
886 lines
44 KiB
C
886 lines
44 KiB
C
/*
|
|
* Copyright 2010 Rico Schüller
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
/*
|
|
* Nearly all compiler functions need the shader blob and the size. The size
|
|
* is always located at DWORD #6 in the shader blob (blob[6]).
|
|
* The functions are e.g.: D3DGet*SignatureBlob, D3DReflect
|
|
*/
|
|
|
|
#define COBJMACROS
|
|
#include "d3dcompiler.h"
|
|
#include "wine/test.h"
|
|
|
|
/*
|
|
* This doesn't belong here, but for some functions it is possible to return that value,
|
|
* see http://msdn.microsoft.com/en-us/library/bb205278%28v=VS.85%29.aspx
|
|
* The original definition is in D3DX10core.h.
|
|
*/
|
|
#define D3DERR_INVALIDCALL 0x8876086c
|
|
|
|
static HRESULT (WINAPI *pD3DCreateBlob)(SIZE_T, ID3DBlob **);
|
|
static HRESULT (WINAPI *pD3DGetBlobPart)(const void *, SIZE_T, D3D_BLOB_PART, UINT, ID3DBlob **);
|
|
static HRESULT (WINAPI *pD3DReadFileToBlob)(const WCHAR *, ID3DBlob **);
|
|
static HRESULT (WINAPI *pD3DStripShader)(const void *, SIZE_T, UINT, ID3DBlob **);
|
|
|
|
#define MAKE_TAG(ch0, ch1, ch2, ch3) \
|
|
((DWORD)(ch0) | ((DWORD)(ch1) << 8) | \
|
|
((DWORD)(ch2) << 16) | ((DWORD)(ch3) << 24 ))
|
|
#define TAG_Aon9 MAKE_TAG('A', 'o', 'n', '9')
|
|
#define TAG_DXBC MAKE_TAG('D', 'X', 'B', 'C')
|
|
#define TAG_ISGN MAKE_TAG('I', 'S', 'G', 'N')
|
|
#define TAG_OSGN MAKE_TAG('O', 'S', 'G', 'N')
|
|
#define TAG_PCSG MAKE_TAG('P', 'C', 'S', 'G')
|
|
#define TAG_RDEF MAKE_TAG('R', 'D', 'E', 'F')
|
|
#define TAG_SDBG MAKE_TAG('S', 'D', 'B', 'G')
|
|
#define TAG_SHDR MAKE_TAG('S', 'H', 'D', 'R')
|
|
#define TAG_SHEX MAKE_TAG('S', 'H', 'E', 'X')
|
|
#define TAG_STAT MAKE_TAG('S', 'T', 'A', 'T')
|
|
#define TAG_XNAP MAKE_TAG('X', 'N', 'A', 'P')
|
|
#define TAG_XNAS MAKE_TAG('X', 'N', 'A', 'S')
|
|
|
|
static void test_create_blob(void)
|
|
{
|
|
ID3D10Blob *blob;
|
|
HRESULT hr;
|
|
ULONG refcount;
|
|
|
|
hr = pD3DCreateBlob(1, NULL);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DCreateBlob failed with %x\n", hr);
|
|
|
|
hr = pD3DCreateBlob(0, NULL);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DCreateBlob failed with %x\n", hr);
|
|
|
|
hr = pD3DCreateBlob(0, &blob);
|
|
ok(hr == S_OK, "D3DCreateBlob failed with %x\n", hr);
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
}
|
|
|
|
static const D3D_BLOB_PART parts[] =
|
|
{
|
|
D3D_BLOB_INPUT_SIGNATURE_BLOB, D3D_BLOB_OUTPUT_SIGNATURE_BLOB, D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB,
|
|
D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB, D3D_BLOB_ALL_SIGNATURE_BLOB, D3D_BLOB_DEBUG_INFO,
|
|
D3D_BLOB_LEGACY_SHADER, D3D_BLOB_XNA_PREPASS_SHADER, D3D_BLOB_XNA_SHADER,
|
|
D3D_BLOB_TEST_ALTERNATE_SHADER, D3D_BLOB_TEST_COMPILE_DETAILS, D3D_BLOB_TEST_COMPILE_PERF
|
|
};
|
|
|
|
/*
|
|
* test_blob_part - fxc.exe /E VS /Tvs_4_0_level_9_0 /Fx
|
|
*/
|
|
#if 0
|
|
float4 VS(float4 position : POSITION, float4 pos : SV_POSITION) : SV_POSITION
|
|
{
|
|
return position;
|
|
}
|
|
#endif
|
|
static DWORD test_blob_part[] = {
|
|
0x43425844, 0x0ef2a70f, 0x6a548011, 0x91ff9409, 0x9973a43d, 0x00000001, 0x000002e0, 0x00000008,
|
|
0x00000040, 0x0000008c, 0x000000d8, 0x0000013c, 0x00000180, 0x000001fc, 0x00000254, 0x000002ac,
|
|
0x53414e58, 0x00000044, 0x00000044, 0xfffe0200, 0x00000020, 0x00000024, 0x00240000, 0x00240000,
|
|
0x00240000, 0x00240000, 0x00240000, 0xfffe0200, 0x0200001f, 0x80000005, 0x900f0000, 0x02000001,
|
|
0xc00f0000, 0x80e40000, 0x0000ffff, 0x50414e58, 0x00000044, 0x00000044, 0xfffe0200, 0x00000020,
|
|
0x00000024, 0x00240000, 0x00240000, 0x00240000, 0x00240000, 0x00240000, 0xfffe0200, 0x0200001f,
|
|
0x80000005, 0x900f0000, 0x02000001, 0xc00f0000, 0x80e40000, 0x0000ffff, 0x396e6f41, 0x0000005c,
|
|
0x0000005c, 0xfffe0200, 0x00000034, 0x00000028, 0x00240000, 0x00240000, 0x00240000, 0x00240000,
|
|
0x00240001, 0x00000000, 0xfffe0200, 0x0200001f, 0x80000005, 0x900f0000, 0x04000004, 0xc0030000,
|
|
0x90ff0000, 0xa0e40000, 0x90e40000, 0x02000001, 0xc00c0000, 0x90e40000, 0x0000ffff, 0x52444853,
|
|
0x0000003c, 0x00010040, 0x0000000f, 0x0300005f, 0x001010f2, 0x00000000, 0x04000067, 0x001020f2,
|
|
0x00000000, 0x00000001, 0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000000, 0x0100003e,
|
|
0x54415453, 0x00000074, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x46454452,
|
|
0x00000050, 0x00000000, 0x00000000, 0x00000000, 0x0000001c, 0xfffe0400, 0x00000100, 0x0000001c,
|
|
0x7263694d, 0x666f736f, 0x52282074, 0x4c482029, 0x53204c53, 0x65646168, 0x6f432072, 0x6c69706d,
|
|
0x39207265, 0x2e39322e, 0x2e323539, 0x31313133, 0xababab00, 0x4e475349, 0x00000050, 0x00000002,
|
|
0x00000008, 0x00000038, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f, 0x00000041,
|
|
0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x0000000f, 0x49534f50, 0x4e4f4954, 0x5f565300,
|
|
0x49534f50, 0x4e4f4954, 0xababab00, 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020,
|
|
0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000000f, 0x505f5653, 0x5449534f, 0x004e4f49,
|
|
};
|
|
|
|
static void test_get_blob_part(void)
|
|
{
|
|
ID3DBlob *blob, *blob2;
|
|
HRESULT hr;
|
|
ULONG refcount;
|
|
DWORD *dword;
|
|
SIZE_T size;
|
|
UINT i;
|
|
|
|
hr = pD3DCreateBlob(1, &blob2);
|
|
ok(hr == S_OK, "D3DCreateBlob failed with %x\n", hr);
|
|
blob = blob2;
|
|
|
|
/* invalid cases */
|
|
hr = pD3DGetBlobPart(NULL, test_blob_part[6], D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, &blob);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr);
|
|
ok(blob2 == blob, "D3DGetBlobPart failed got %p, expected %p\n", blob, blob2);
|
|
|
|
hr = pD3DGetBlobPart(NULL, 0, D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, &blob);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr);
|
|
ok(blob2 == blob, "D3DGetBlobPart failed got %p, expected %p\n", blob, blob2);
|
|
|
|
hr = pD3DGetBlobPart(NULL, test_blob_part[6], D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, NULL);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr);
|
|
|
|
hr = pD3DGetBlobPart(NULL, 0, D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, NULL);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr);
|
|
|
|
hr = pD3DGetBlobPart(test_blob_part, 0, D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, &blob);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr);
|
|
ok(blob2 == blob, "D3DGetBlobPart failed got %p, expected %p\n", blob, blob2);
|
|
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, NULL);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr);
|
|
|
|
hr = pD3DGetBlobPart(test_blob_part, 0, D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, NULL);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr);
|
|
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_INPUT_SIGNATURE_BLOB, 1, &blob);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr);
|
|
ok(blob2 == blob, "D3DGetBlobPart failed got %p, expected %p\n", blob, blob2);
|
|
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], 0xffffffff, 0, &blob);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DGetBlobPart failed with %x\n", hr);
|
|
ok(blob2 == blob, "D3DGetBlobPart failed got %p, expected %p\n", blob, blob2);
|
|
|
|
refcount = ID3D10Blob_Release(blob2);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3D_BLOB_INPUT_SIGNATURE_BLOB */
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, &blob);
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 124, "GetBufferSize failed, got %lu, expected %u\n", size, 124);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC);
|
|
ok(TAG_ISGN == *(dword+9), "ISGN got %#x, expected %#x.\n", *(dword+9), TAG_ISGN);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(parts); i++)
|
|
{
|
|
hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2);
|
|
|
|
if (parts[i] == D3D_BLOB_INPUT_SIGNATURE_BLOB)
|
|
{
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
refcount = ID3D10Blob_Release(blob2);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
}
|
|
else
|
|
{
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
}
|
|
}
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3D_BLOB_OUTPUT_SIGNATURE_BLOB */
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_OUTPUT_SIGNATURE_BLOB, 0, &blob);
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 88, "GetBufferSize failed, got %lu, expected %u\n", size, 88);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC);
|
|
ok(TAG_OSGN == *(dword+9), "OSGN got %#x, expected %#x.\n", *(dword+9), TAG_OSGN);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(parts); i++)
|
|
{
|
|
hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2);
|
|
|
|
if (parts[i] == D3D_BLOB_OUTPUT_SIGNATURE_BLOB)
|
|
{
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
refcount = ID3D10Blob_Release(blob2);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
}
|
|
else
|
|
{
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
}
|
|
}
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB */
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB, 0, &blob);
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 180, "GetBufferSize failed, got %lu, expected %u\n", size, 180);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC);
|
|
ok(TAG_ISGN == *(dword+10), "ISGN got %#x, expected %#x.\n", *(dword+10), TAG_ISGN);
|
|
ok(TAG_OSGN == *(dword+32), "OSGN got %#x, expected %#x.\n", *(dword+32), TAG_OSGN);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(parts); i++)
|
|
{
|
|
hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2);
|
|
|
|
if (parts[i] == D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB
|
|
|| parts[i] == D3D_BLOB_INPUT_SIGNATURE_BLOB
|
|
|| parts[i] == D3D_BLOB_OUTPUT_SIGNATURE_BLOB)
|
|
{
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
refcount = ID3D10Blob_Release(blob2);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
}
|
|
else
|
|
{
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
}
|
|
}
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB */
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB, 0, &blob);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
/* D3D_BLOB_ALL_SIGNATURE_BLOB */
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_ALL_SIGNATURE_BLOB, 0, &blob);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
/* D3D_BLOB_DEBUG_INFO */
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_DEBUG_INFO, 0, &blob);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
/* D3D_BLOB_LEGACY_SHADER */
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_LEGACY_SHADER, 0, &blob);
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 92, "GetBufferSize failed, got %lu, expected %u\n", size, 92);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(test_blob_part[0] != *dword, "DXBC failed got %#x.\n", *dword);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(parts); i++)
|
|
{
|
|
/* There isn't a full DXBC blob returned for D3D_BLOB_LEGACY_SHADER */
|
|
hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
}
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3D_BLOB_XNA_PREPASS_SHADER */
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_XNA_PREPASS_SHADER, 0, &blob);
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 68, "GetBufferSize failed, got %lu, expected %u\n", size, 68);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(test_blob_part[0] != *dword, "DXBC failed got %#x.\n", *dword);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(parts); i++)
|
|
{
|
|
/* There isn't a full DXBC blob returned for D3D_BLOB_XNA_PREPASS_SHADER */
|
|
hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
}
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3D_BLOB_XNA_SHADER */
|
|
hr = pD3DGetBlobPart(test_blob_part, test_blob_part[6], D3D_BLOB_XNA_SHADER, 0, &blob);
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 68, "GetBufferSize failed, got %lu, expected %u\n", size, 68);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(test_blob_part[0] != *dword, "DXBC failed got %#x.\n", *dword);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(parts); i++)
|
|
{
|
|
/* There isn't a full DXBC blob returned for D3D_BLOB_XNA_SHADER */
|
|
hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
}
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* check corner cases for D3DStripShader */
|
|
hr = pD3DStripShader(test_blob_part, test_blob_part[6], 0xffffffff, &blob);
|
|
ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
hr = pD3DStripShader(test_blob_part, test_blob_part[6], 0, &blob);
|
|
ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
hr = pD3DStripShader(NULL, test_blob_part[6], 0, &blob);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DStripShader failed, got %x, expected %x\n", hr, D3DERR_INVALIDCALL);
|
|
|
|
hr = pD3DStripShader(test_blob_part, 2, 0, &blob);
|
|
ok(hr == D3DERR_INVALIDCALL, "D3DStripShader failed, got %x, expected %x\n", hr, D3DERR_INVALIDCALL);
|
|
|
|
hr = pD3DStripShader(test_blob_part, test_blob_part[6], 0, NULL);
|
|
ok(hr == E_FAIL, "D3DStripShader failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
hr = pD3DStripShader(NULL, test_blob_part[6], 0, NULL);
|
|
ok(hr == E_FAIL, "D3DStripShader failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
hr = pD3DStripShader(test_blob_part, 0, 0, NULL);
|
|
ok(hr == E_FAIL, "D3DStripShader failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
/* D3DCOMPILER_STRIP_DEBUG_INFO */
|
|
hr = pD3DStripShader(test_blob_part, test_blob_part[6], D3DCOMPILER_STRIP_DEBUG_INFO, &blob);
|
|
ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 736, "GetBufferSize failed, got %lu, expected %u\n", size, 736);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC);
|
|
ok(TAG_XNAS == *(dword+16), "XNAS got %#x, expected %#x.\n", *(dword+16), TAG_XNAS);
|
|
ok(TAG_XNAP == *(dword+35), "XNAP got %#x, expected %#x.\n", *(dword+35), TAG_XNAP);
|
|
ok(TAG_Aon9 == *(dword+54), "Aon9 got %#x, expected %#x.\n", *(dword+54), TAG_Aon9);
|
|
ok(TAG_SHDR == *(dword+79), "SHDR got %#x, expected %#x.\n", *(dword+79), TAG_SHDR);
|
|
ok(TAG_STAT == *(dword+96), "STAT got %#x, expected %#x.\n", *(dword+96), TAG_STAT);
|
|
ok(TAG_RDEF == *(dword+127), "RDEF got %#x, expected %#x.\n", *(dword+127), TAG_RDEF);
|
|
ok(TAG_ISGN == *(dword+149), "ISGN got %#x, expected %#x.\n", *(dword+149), TAG_ISGN);
|
|
ok(TAG_OSGN == *(dword+171), "OSGN got %#x, expected %#x.\n", *(dword+171), TAG_OSGN);
|
|
|
|
hr = pD3DGetBlobPart(dword, size, D3D_BLOB_DEBUG_INFO, 0, &blob2);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3DCOMPILER_STRIP_REFLECTION_DATA */
|
|
hr = pD3DStripShader(test_blob_part, test_blob_part[6], D3DCOMPILER_STRIP_REFLECTION_DATA, &blob);
|
|
ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 516, "GetBufferSize failed, got %lu, expected %u\n", size, 516);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC);
|
|
ok(TAG_XNAS == *(dword+14), "XNAS got %#x, expected %#x.\n", *(dword+14), TAG_XNAS);
|
|
ok(TAG_XNAP == *(dword+33), "XNAP got %#x, expected %#x.\n", *(dword+33), TAG_XNAP);
|
|
ok(TAG_Aon9 == *(dword+52), "Aon9 got %#x, expected %#x.\n", *(dword+52), TAG_Aon9);
|
|
ok(TAG_SHDR == *(dword+77), "SHDR got %#x, expected %#x.\n", *(dword+77), TAG_SHDR);
|
|
ok(TAG_ISGN == *(dword+94), "ISGN got %#x, expected %#x.\n", *(dword+94), TAG_ISGN);
|
|
ok(TAG_OSGN == *(dword+116), "OSGN got %#x, expected %#x.\n", *(dword+116), TAG_OSGN);
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
}
|
|
|
|
/*
|
|
* test_blob_part2 - fxc.exe /E BHS /Ths_5_0 /Zi
|
|
*/
|
|
#if 0
|
|
struct VSO { float3 p : POSITION; };
|
|
struct HSDO { float e[4] : SV_TessFactor; float i[2] : SV_InsideTessFactor; };
|
|
struct HSO { float3 p : BEZIERPOS; };
|
|
HSDO BCHS( InputPatch<VSO, 8> ip, uint PatchID : SV_PrimitiveID )
|
|
{
|
|
HSDO res;
|
|
res.e[0] = res.e[1] = res.e[2] = res.e[3] = 1.0f;
|
|
res.i[0] = res.i[1] = 1.0f;
|
|
return res;
|
|
}
|
|
[domain("quad")]
|
|
[partitioning("integer")]
|
|
[outputtopology("triangle_cw")]
|
|
[outputcontrolpoints(8)]
|
|
[patchconstantfunc("BCHS")]
|
|
HSO BHS( InputPatch<VSO, 8> p, uint i : SV_OutputControlPointID, uint PatchID : SV_PrimitiveID )
|
|
{
|
|
HSO res;
|
|
res.p = p[i].p;
|
|
return res;
|
|
}
|
|
#endif
|
|
static DWORD test_blob_part2[] = {
|
|
0x43425844, 0xa9d455ae, 0x4cf9c0df, 0x4cf806dc, 0xc57a8c2c, 0x00000001, 0x0000139b, 0x00000007,
|
|
0x0000003c, 0x000000b4, 0x000000e8, 0x0000011c, 0x000001e0, 0x00000320, 0x000003bc, 0x46454452,
|
|
0x00000070, 0x00000000, 0x00000000, 0x00000000, 0x0000003c, 0x48530500, 0x00000101, 0x0000003c,
|
|
0x31314452, 0x0000003c, 0x00000018, 0x00000020, 0x00000028, 0x00000024, 0x0000000c, 0x00000000,
|
|
0x7263694d, 0x666f736f, 0x52282074, 0x4c482029, 0x53204c53, 0x65646168, 0x6f432072, 0x6c69706d,
|
|
0x39207265, 0x2e39322e, 0x2e323539, 0x31313133, 0xababab00, 0x4e475349, 0x0000002c, 0x00000001,
|
|
0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000707, 0x49534f50,
|
|
0x4e4f4954, 0xababab00, 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000,
|
|
0x00000000, 0x00000003, 0x00000000, 0x00000807, 0x495a4542, 0x4f505245, 0xabab0053, 0x47534350,
|
|
0x000000bc, 0x00000006, 0x00000008, 0x00000098, 0x00000000, 0x0000000b, 0x00000003, 0x00000000,
|
|
0x00000e01, 0x00000098, 0x00000001, 0x0000000b, 0x00000003, 0x00000001, 0x00000e01, 0x00000098,
|
|
0x00000002, 0x0000000b, 0x00000003, 0x00000002, 0x00000e01, 0x00000098, 0x00000003, 0x0000000b,
|
|
0x00000003, 0x00000003, 0x00000e01, 0x000000a6, 0x00000000, 0x0000000c, 0x00000003, 0x00000004,
|
|
0x00000e01, 0x000000a6, 0x00000001, 0x0000000c, 0x00000003, 0x00000005, 0x00000e01, 0x545f5653,
|
|
0x46737365, 0x6f746361, 0x56530072, 0x736e495f, 0x54656469, 0x46737365, 0x6f746361, 0xabab0072,
|
|
0x58454853, 0x00000138, 0x00030050, 0x0000004e, 0x01000071, 0x01004093, 0x01004094, 0x01001895,
|
|
0x01000896, 0x01001897, 0x0100086a, 0x01000073, 0x02000099, 0x00000004, 0x0200005f, 0x00017000,
|
|
0x04000067, 0x00102012, 0x00000000, 0x0000000b, 0x04000067, 0x00102012, 0x00000001, 0x0000000c,
|
|
0x04000067, 0x00102012, 0x00000002, 0x0000000d, 0x04000067, 0x00102012, 0x00000003, 0x0000000e,
|
|
0x02000068, 0x00000001, 0x0400005b, 0x00102012, 0x00000000, 0x00000004, 0x04000036, 0x00100012,
|
|
0x00000000, 0x0001700a, 0x06000036, 0x00902012, 0x0010000a, 0x00000000, 0x00004001, 0x3f800000,
|
|
0x0100003e, 0x01000073, 0x02000099, 0x00000002, 0x0200005f, 0x00017000, 0x04000067, 0x00102012,
|
|
0x00000004, 0x0000000f, 0x04000067, 0x00102012, 0x00000005, 0x00000010, 0x02000068, 0x00000001,
|
|
0x0400005b, 0x00102012, 0x00000004, 0x00000002, 0x04000036, 0x00100012, 0x00000000, 0x0001700a,
|
|
0x07000036, 0x00d02012, 0x00000004, 0x0010000a, 0x00000000, 0x00004001, 0x3f800000, 0x0100003e,
|
|
0x54415453, 0x00000094, 0x00000006, 0x00000001, 0x00000000, 0x00000005, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x0000000f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000008, 0x00000003, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x47424453,
|
|
0x00000fd7, 0x00000054, 0x000002d5, 0x00000306, 0x0000030a, 0x00000101, 0x00000001, 0x00000000,
|
|
0x00000006, 0x00000010, 0x00000006, 0x00000958, 0x00000000, 0x000009e8, 0x00000008, 0x000009e8,
|
|
0x00000006, 0x00000a88, 0x00000007, 0x00000b00, 0x00000c34, 0x00000c64, 0x00000000, 0x0000004a,
|
|
0x0000004a, 0x0000026a, 0x00000000, 0x00000036, 0x00000001, 0x00000004, 0x00000000, 0xffffffff,
|
|
0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000003, 0x00000000,
|
|
0x00000003, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007,
|
|
0x00000000, 0x00000003, 0x00000024, 0x00000000, 0x00000000, 0x00000001, 0x00000036, 0x00000001,
|
|
0x00000001, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000,
|
|
0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000000, 0x00000000,
|
|
0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x00000003, 0x00000024, 0x00000000, 0x00000000,
|
|
0x00000002, 0x0000003e, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x00000003,
|
|
0x00000024, 0x00000000, 0x00000000, 0x00000003, 0x00000036, 0x00000001, 0x00000004, 0x00000000,
|
|
0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000001,
|
|
0x00000000, 0x00000001, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000007, 0x00000000, 0x00000003, 0x00000024, 0x00000000, 0x00000000, 0x00000004, 0x00000036,
|
|
0x00000001, 0x00000001, 0x00000004, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff,
|
|
0x00000004, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000000,
|
|
0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x00000003, 0x00000024, 0x00000000,
|
|
0x00000000, 0x00000005, 0x0000003e, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000000,
|
|
0x00000003, 0x00000024, 0x00000000, 0x00000000, 0x00000006, 0x00000003, 0xffffffff, 0xffffffff,
|
|
0x00000003, 0x00000000, 0x00000006, 0x00000003, 0xffffffff, 0xffffffff, 0x00000003, 0x00000001,
|
|
0x00000006, 0x00000003, 0xffffffff, 0xffffffff, 0x00000003, 0x00000002, 0x00000006, 0x00000003,
|
|
0xffffffff, 0xffffffff, 0x00000003, 0x00000003, 0x00000006, 0x00000003, 0xffffffff, 0xffffffff,
|
|
0x00000003, 0x00000004, 0x00000006, 0x00000003, 0xffffffff, 0xffffffff, 0x00000003, 0x00000005,
|
|
0x00000000, 0x00000002, 0x00000014, 0x00000007, 0x000002c1, 0x00000000, 0x00000002, 0x00000030,
|
|
0x00000007, 0x000002c8, 0x00000000, 0x00000004, 0x0000001e, 0x00000002, 0x00000102, 0x00000000,
|
|
0x00000004, 0x00000027, 0x00000007, 0x0000010b, 0x00000000, 0x00000006, 0x00000009, 0x00000003,
|
|
0x00000131, 0x00000000, 0x00000001, 0x00000014, 0x00000006, 0x000002cf, 0x00000000, 0x00000004,
|
|
0x00000005, 0x00000004, 0x000000e9, 0x00000000, 0x00000009, 0x00000004, 0x00000000, 0x00000000,
|
|
0x00000003, 0x00000051, 0x00000003, 0x00000001, 0x00000000, 0x00000003, 0x00000076, 0x00000004,
|
|
0x00000002, 0x00000004, 0x00000000, 0x000002b4, 0x00000007, 0x00000001, 0x0000000c, 0x00000003,
|
|
0x00000076, 0x00000004, 0x00000002, 0x00000004, 0x00000001, 0x000002bb, 0x00000006, 0x00000001,
|
|
0x00000010, 0x00000004, 0x000000e9, 0x00000004, 0x00000003, 0x00000014, 0x00000005, 0x00000000,
|
|
0x00000001, 0x00000001, 0x00000003, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
|
|
0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0xffffffff, 0x00000001,
|
|
0x00000014, 0x00000004, 0x00000004, 0xffffffff, 0x00000001, 0x00000000, 0x00000000, 0x00000001,
|
|
0x00000001, 0xffffffff, 0x00000001, 0x00000008, 0x00000004, 0x00000002, 0xffffffff, 0x00000006,
|
|
0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000006, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000001, 0x00000020, 0x0000000c, 0x00000018, 0xffffffff, 0x00000003, 0x00000000, 0x00000000,
|
|
0x00000001, 0x00000001, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xffffffff,
|
|
0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000006, 0xffffffff, 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000006,
|
|
0x00000004, 0x00000005, 0x00000006, 0x00000008, 0x00000004, 0x00000005, 0x00000002, 0x505c3a43,
|
|
0x72676f72, 0x656d6d61, 0x63694d5c, 0x6f736f72, 0x44207466, 0x63657269, 0x53205874, 0x28204b44,
|
|
0x656e754a, 0x31303220, 0x555c2930, 0x696c6974, 0x73656974, 0x6e69625c, 0x3638785c, 0x6165685c,
|
|
0x2e726564, 0x74737866, 0x74637572, 0x4f535620, 0x66207b20, 0x74616f6c, 0x20702033, 0x4f50203a,
|
|
0x49544953, 0x203b4e4f, 0x730a3b7d, 0x63757274, 0x53482074, 0x7b204f44, 0x6f6c6620, 0x65207461,
|
|
0x205d345b, 0x5653203a, 0x7365545f, 0x63614673, 0x3b726f74, 0x6f6c6620, 0x69207461, 0x205d325b,
|
|
0x5653203a, 0x736e495f, 0x54656469, 0x46737365, 0x6f746361, 0x7d203b72, 0x74730a3b, 0x74637572,
|
|
0x4f534820, 0x66207b20, 0x74616f6c, 0x20702033, 0x4542203a, 0x5245495a, 0x3b534f50, 0x0a3b7d20,
|
|
0x4f445348, 0x48434220, 0x49202853, 0x7475706e, 0x63746150, 0x53563c68, 0x38202c4f, 0x7069203e,
|
|
0x6975202c, 0x5020746e, 0x68637461, 0x3a204449, 0x5f565320, 0x6d697250, 0x76697469, 0x20444965,
|
|
0x0a7b0a29, 0x20202020, 0x4f445348, 0x73657220, 0x20200a3b, 0x65722020, 0x5b652e73, 0x3d205d30,
|
|
0x73657220, 0x315b652e, 0x203d205d, 0x2e736572, 0x5d325b65, 0x72203d20, 0x652e7365, 0x205d335b,
|
|
0x2e31203d, 0x0a3b6630, 0x20202020, 0x2e736572, 0x5d305b69, 0x72203d20, 0x692e7365, 0x205d315b,
|
|
0x2e31203d, 0x0a3b6630, 0x20202020, 0x75746572, 0x72206e72, 0x0a3b7365, 0x645b0a7d, 0x69616d6f,
|
|
0x7122286e, 0x22646175, 0x5b0a5d29, 0x74726170, 0x6f697469, 0x676e696e, 0x6e692228, 0x65676574,
|
|
0x5d292272, 0x756f5b0a, 0x74757074, 0x6f706f74, 0x79676f6c, 0x72742228, 0x676e6169, 0x635f656c,
|
|
0x5d292277, 0x756f5b0a, 0x74757074, 0x746e6f63, 0x706c6f72, 0x746e696f, 0x29382873, 0x705b0a5d,
|
|
0x68637461, 0x736e6f63, 0x746e6174, 0x636e7566, 0x43422228, 0x29225348, 0x53480a5d, 0x4842204f,
|
|
0x49202853, 0x7475706e, 0x63746150, 0x53563c68, 0x38202c4f, 0x2c70203e, 0x6e697520, 0x20692074,
|
|
0x5653203a, 0x74754f5f, 0x43747570, 0x72746e6f, 0x6f506c6f, 0x49746e69, 0x75202c44, 0x20746e69,
|
|
0x63746150, 0x20444968, 0x5653203a, 0x6972505f, 0x6974696d, 0x44496576, 0x7b0a2920, 0x2020200a,
|
|
0x4f534820, 0x73657220, 0x20200a3b, 0x65722020, 0x20702e73, 0x5b70203d, 0x702e5d69, 0x20200a3b,
|
|
0x65722020, 0x6e727574, 0x73657220, 0x0a7d0a3b, 0x626f6c47, 0x4c736c61, 0x6c61636f, 0x44534873,
|
|
0x653a3a4f, 0x4f445348, 0x56693a3a, 0x3a3a4f53, 0x63694d70, 0x6f736f72, 0x28207466, 0x48202952,
|
|
0x204c534c, 0x64616853, 0x43207265, 0x69706d6f, 0x2072656c, 0x39322e39, 0x3235392e, 0x3131332e,
|
|
0x48420031, 0x73680053, 0x305f355f, 0x6e6f6320, 0x6c6f7274, 0x696f7020, 0x0000746e,
|
|
};
|
|
|
|
static void test_get_blob_part2(void)
|
|
{
|
|
ID3DBlob *blob, *blob2;
|
|
HRESULT hr;
|
|
ULONG refcount;
|
|
DWORD *dword;
|
|
SIZE_T size;
|
|
UINT i;
|
|
|
|
/* D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB */
|
|
hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB, 0, &blob);
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 232, "GetBufferSize failed, got %lu, expected %u\n", size, 232);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC);
|
|
ok(TAG_PCSG == *(dword+9), "PCSG got %#x, expected %#x.\n", *(dword+9), TAG_PCSG);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(parts); i++)
|
|
{
|
|
hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2);
|
|
|
|
if (parts[i] == D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB)
|
|
{
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
refcount = ID3D10Blob_Release(blob2);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
}
|
|
else
|
|
{
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
}
|
|
}
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3D_BLOB_ALL_SIGNATURE_BLOB */
|
|
hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_ALL_SIGNATURE_BLOB, 0, &blob);
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 344, "GetBufferSize failed, got %lu, expected %u\n", size, 344);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC);
|
|
ok(TAG_ISGN == *(dword+11), "ISGN got %#x, expected %#x.\n", *(dword+11), TAG_ISGN);
|
|
ok(TAG_OSGN == *(dword+24), "OSGN got %#x, expected %#x.\n", *(dword+24), TAG_OSGN);
|
|
ok(TAG_PCSG == *(dword+37), "PCSG got %#x, expected %#x.\n", *(dword+37), TAG_PCSG);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(parts); i++)
|
|
{
|
|
hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2);
|
|
|
|
if (parts[i] == D3D_BLOB_ALL_SIGNATURE_BLOB
|
|
|| parts[i] == D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB
|
|
|| parts[i] == D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB
|
|
|| parts[i] == D3D_BLOB_INPUT_SIGNATURE_BLOB
|
|
|| parts[i] == D3D_BLOB_OUTPUT_SIGNATURE_BLOB)
|
|
{
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
refcount = ID3D10Blob_Release(blob2);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
}
|
|
else
|
|
{
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
}
|
|
}
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3D_BLOB_DEBUG_INFO */
|
|
hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_DEBUG_INFO, 0, &blob);
|
|
ok(hr == S_OK, "D3DGetBlobPart failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 4055, "GetBufferSize failed, got %lu, expected %u\n", size, 4055);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(TAG_DXBC != *dword, "DXBC failed got %#x.\n", *dword);
|
|
|
|
for (i = 0; i < ARRAY_SIZE(parts); i++)
|
|
{
|
|
/* There isn't a full DXBC blob returned for D3D_BLOB_DEBUG_INFO */
|
|
hr = pD3DGetBlobPart(dword, size, parts[i], 0, &blob2);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
}
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3D_BLOB_LEGACY_SHADER */
|
|
hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_LEGACY_SHADER, 0, &blob);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
/* D3D_BLOB_XNA_PREPASS_SHADER */
|
|
hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_XNA_PREPASS_SHADER, 0, &blob);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
/* D3D_BLOB_XNA_SHADER */
|
|
hr = pD3DGetBlobPart(test_blob_part2, test_blob_part2[6], D3D_BLOB_XNA_SHADER, 0, &blob);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
/* D3DCOMPILER_STRIP_DEBUG_INFO */
|
|
hr = pD3DStripShader(test_blob_part2, test_blob_part2[6], D3DCOMPILER_STRIP_DEBUG_INFO, &blob);
|
|
ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 952, "GetBufferSize failed, got %lu, expected %u\n", size, 952);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC);
|
|
ok(TAG_RDEF == *(dword+14), "RDEF got %#x, expected %#x.\n", *(dword+14), TAG_RDEF);
|
|
ok(TAG_ISGN == *(dword+44), "ISGN got %#x, expected %#x.\n", *(dword+44), TAG_ISGN);
|
|
ok(TAG_OSGN == *(dword+57), "OSGN got %#x, expected %#x.\n", *(dword+57), TAG_OSGN);
|
|
ok(TAG_PCSG == *(dword+70), "PCSG got %#x, expected %#x.\n", *(dword+70), TAG_PCSG);
|
|
ok(TAG_SHEX == *(dword+119), "SHEX got %#x, expected %#x.\n", *(dword+119), TAG_SHEX);
|
|
ok(TAG_STAT == *(dword+199), "STAT got %#x, expected %#x.\n", *(dword+199), TAG_STAT);
|
|
|
|
hr = pD3DGetBlobPart(dword, size, D3D_BLOB_DEBUG_INFO, 0, &blob2);
|
|
ok(hr == E_FAIL, "D3DGetBlobPart failed, got %x, expected %x\n", hr, E_FAIL);
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
|
|
/* D3DCOMPILER_STRIP_REFLECTION_DATA */
|
|
hr = pD3DStripShader(test_blob_part2, test_blob_part2[6], D3DCOMPILER_STRIP_REFLECTION_DATA, &blob);
|
|
ok(hr == S_OK, "D3DStripShader failed, got %x, expected %x\n", hr, S_OK);
|
|
|
|
size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(size == 4735, "GetBufferSize failed, got %lu, expected %u\n", size, 4735);
|
|
|
|
dword = ((DWORD*)ID3D10Blob_GetBufferPointer(blob));
|
|
ok(TAG_DXBC == *dword, "DXBC got %#x, expected %#x.\n", *dword, TAG_DXBC);
|
|
ok(TAG_ISGN == *(dword+13), "ISGN got %#x, expected %#x.\n", *(dword+13), TAG_ISGN);
|
|
ok(TAG_OSGN == *(dword+26), "OSGN got %#x, expected %#x.\n", *(dword+26), TAG_OSGN);
|
|
ok(TAG_PCSG == *(dword+39), "PCSG got %#x, expected %#x.\n", *(dword+39), TAG_PCSG);
|
|
ok(TAG_SHEX == *(dword+88), "SHEX got %#x, expected %#x.\n", *(dword+88), TAG_SHEX);
|
|
ok(TAG_SDBG == *(dword+168), "SDBG got %#x, expected %#x.\n", *(dword+168), TAG_SDBG);
|
|
|
|
refcount = ID3D10Blob_Release(blob);
|
|
ok(!refcount, "ID3DBlob has %u references left\n", refcount);
|
|
}
|
|
|
|
static BOOL load_d3dcompiler_43(void)
|
|
{
|
|
HMODULE module;
|
|
|
|
if (!(module = LoadLibraryA("d3dcompiler_43.dll"))) return FALSE;
|
|
|
|
pD3DCreateBlob = (void*)GetProcAddress(module, "D3DCreateBlob");
|
|
pD3DGetBlobPart = (void*)GetProcAddress(module, "D3DGetBlobPart");
|
|
pD3DStripShader = (void*)GetProcAddress(module, "D3DStripShader");
|
|
return TRUE;
|
|
}
|
|
|
|
static BOOL load_d3dcompiler_47(void)
|
|
{
|
|
HMODULE module;
|
|
|
|
if (!(module = LoadLibraryA("d3dcompiler_47.dll")))
|
|
return FALSE;
|
|
|
|
pD3DReadFileToBlob = (void *)GetProcAddress(module, "D3DReadFileToBlob");
|
|
return TRUE;
|
|
}
|
|
|
|
static BOOL create_file(WCHAR *filename, const DWORD *data, DWORD data_size)
|
|
{
|
|
static WCHAR temp_dir[MAX_PATH];
|
|
DWORD written;
|
|
HANDLE file;
|
|
|
|
if (!temp_dir[0])
|
|
GetTempPathW(ARRAY_SIZE(temp_dir), temp_dir);
|
|
GetTempFileNameW(temp_dir, NULL, 0, filename);
|
|
file = CreateFileW(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
|
|
if (file == INVALID_HANDLE_VALUE)
|
|
return FALSE;
|
|
|
|
if (data)
|
|
{
|
|
WriteFile(file, data, data_size, &written, NULL);
|
|
if (written != data_size)
|
|
{
|
|
CloseHandle(file);
|
|
DeleteFileW(filename);
|
|
return FALSE;
|
|
}
|
|
}
|
|
CloseHandle(file);
|
|
return TRUE;
|
|
}
|
|
|
|
/* test_cso_data - fxc.exe file.hlsl /Fo file.cso */
|
|
static const DWORD test_cso_data[] =
|
|
{
|
|
#if 0
|
|
struct PSInput
|
|
{
|
|
float4 value : SV_POSITION;
|
|
};
|
|
|
|
PSInput main(float4 position : POSITION)
|
|
{
|
|
PSInput result;
|
|
result.value = position;
|
|
return result;
|
|
}
|
|
#endif
|
|
0xfffe0200, 0x0014fffe, 0x42415443, 0x0000001c, 0x00000023, 0xfffe0200, 0x00000000, 0x00000000,
|
|
0x00000100, 0x0000001c, 0x325f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
|
|
0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x30312072, 0xab00312e, 0x0200001f, 0x80000000,
|
|
0x900f0000, 0x02000001, 0xc00f0000, 0x90e40000, 0x0000ffff
|
|
};
|
|
|
|
static void test_D3DReadFileToBlob(void)
|
|
{
|
|
WCHAR filename[MAX_PATH] = {'n','o','n','e','x','i','s','t','e','n','t',0};
|
|
ID3DBlob *blob = NULL;
|
|
SIZE_T data_size;
|
|
DWORD *data;
|
|
HRESULT hr;
|
|
|
|
hr = pD3DReadFileToBlob(filename, NULL);
|
|
ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Got unexpected hr %#x.\n", hr);
|
|
|
|
hr = pD3DReadFileToBlob(filename, &blob);
|
|
ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Got unexpected hr %#x.\n", hr);
|
|
|
|
if (0)
|
|
{
|
|
/* Crashes on Windows. */
|
|
create_file(filename, test_cso_data, ARRAY_SIZE(test_cso_data));
|
|
pD3DReadFileToBlob(filename, NULL);
|
|
DeleteFileW(filename);
|
|
}
|
|
|
|
if (!create_file(filename, NULL, 0))
|
|
{
|
|
win_skip("File creation failed.\n");
|
|
return;
|
|
}
|
|
hr = pD3DReadFileToBlob(filename, &blob);
|
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
|
data_size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(!data_size, "Got unexpected data size.\n");
|
|
DeleteFileW(filename);
|
|
ID3D10Blob_Release(blob);
|
|
|
|
if (!create_file(filename, test_cso_data, ARRAY_SIZE(test_cso_data)))
|
|
{
|
|
win_skip("File creation failed.\n");
|
|
return;
|
|
}
|
|
hr = pD3DReadFileToBlob(filename, &blob);
|
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
|
data_size = ID3D10Blob_GetBufferSize(blob);
|
|
ok(data_size == ARRAY_SIZE(test_cso_data), "Got unexpected data size.\n");
|
|
data = ID3D10Blob_GetBufferPointer(blob);
|
|
ok(!memcmp(data, test_cso_data, ARRAY_SIZE(test_cso_data)), "Got unexpected data.\n");
|
|
DeleteFileW(filename);
|
|
ID3D10Blob_Release(blob);
|
|
}
|
|
|
|
START_TEST(blob)
|
|
{
|
|
if (load_d3dcompiler_43())
|
|
{
|
|
test_create_blob();
|
|
test_get_blob_part();
|
|
test_get_blob_part2();
|
|
}
|
|
else
|
|
{
|
|
win_skip("Could not load d3dcompiler_43.dll\n");
|
|
}
|
|
|
|
if (load_d3dcompiler_47())
|
|
{
|
|
test_D3DReadFileToBlob();
|
|
}
|
|
else
|
|
{
|
|
win_skip("Could not load d3dcompiler_47.dll.\n");
|
|
}
|
|
}
|