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