d3d11_misc.h revision e7624e23a3a374896863f54fe30dafd0bff8a91a
1#if API < 11
2extern "C" HRESULT STDMETHODCALLTYPE D3D10CreateBlob(
3	__in   SIZE_T NumBytes,
4	__out  LPD3D10BLOB *ppBuffer
5);
6
7HRESULT STDMETHODCALLTYPE D3D10CreateBlob(
8	__in   SIZE_T NumBytes,
9	__out  LPD3D10BLOB *ppBuffer
10)
11{
12	void* data = malloc(NumBytes);
13	if(!data)
14		return E_OUTOFMEMORY;
15	*ppBuffer = new GalliumD3DBlob(data, NumBytes);
16	return S_OK;
17}
18
19LPCSTR STDMETHODCALLTYPE D3D10GetPixelShaderProfile(
20	__in  ID3D10Device *pDevice
21)
22{
23	return "ps_4_0";
24}
25
26LPCSTR STDMETHODCALLTYPE D3D10GetVertexShaderProfile(
27	__in  ID3D10Device *pDevice
28)
29{
30	return "vs_4_0";
31}
32
33LPCSTR STDMETHODCALLTYPE D3D10GetGeometryShaderProfile(
34	__in  ID3D10Device *pDevice
35)
36{
37	return "gs_4_0";
38}
39
40static HRESULT dxbc_assemble_as_blob(struct dxbc_chunk_header** chunks, unsigned num_chunks, ID3D10Blob** blob)
41{
42	std::pair<void*, size_t> p = dxbc_assemble(chunks, num_chunks);
43	if(!p.first)
44		return E_OUTOFMEMORY;
45	*blob = new GalliumD3DBlob(p.first, p.second);
46	return S_OK;
47}
48
49HRESULT  D3D10GetInputSignatureBlob(
50	__in   const void *pShaderBytecode,
51	__in   SIZE_T BytecodeLength,
52	__out  ID3D10Blob **ppSignatureBlob
53)
54{
55	dxbc_chunk_signature* sig = dxbc_find_signature(pShaderBytecode, BytecodeLength, false);
56	if(!sig)
57		return E_FAIL;
58
59	return dxbc_assemble_as_blob((dxbc_chunk_header**)&sig, 1, ppSignatureBlob);
60}
61
62HRESULT  D3D10GetOutputSignatureBlob(
63	__in   const void *pShaderBytecode,
64	__in   SIZE_T BytecodeLength,
65	__out  ID3D10Blob **ppSignatureBlob
66)
67{
68	dxbc_chunk_signature* sig = dxbc_find_signature(pShaderBytecode, BytecodeLength, true);
69	if(!sig)
70		return E_FAIL;
71
72	return dxbc_assemble_as_blob((dxbc_chunk_header**)&sig, 1, ppSignatureBlob);
73}
74
75HRESULT  D3D10GetInputOutputSignatureBlob(
76	__in   const void *pShaderBytecode,
77	__in   SIZE_T BytecodeLength,
78	__out  ID3D10Blob **ppSignatureBlob
79)
80{
81	dxbc_chunk_signature* sigs[2];
82	sigs[0] = dxbc_find_signature(pShaderBytecode, BytecodeLength, false);
83	if(!sigs[0])
84		return E_FAIL;
85	sigs[1] = dxbc_find_signature(pShaderBytecode, BytecodeLength, true);
86	if(!sigs[1])
87		return E_FAIL;
88
89	return dxbc_assemble_as_blob((dxbc_chunk_header**)&sigs, 2, ppSignatureBlob);
90}
91
92#endif
93