1bb26272beaf1d2bddffaad5341235e70abcf483bLuca Barbieri#if API < 11
2e7624e23a3a374896863f54fe30dafd0bff8a91aLuca Barbieriextern "C" HRESULT STDMETHODCALLTYPE D3D10CreateBlob(
39cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	SIZE_T num_bytes,
49cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	LPD3D10BLOB *out_buffer
5e7624e23a3a374896863f54fe30dafd0bff8a91aLuca Barbieri);
6e7624e23a3a374896863f54fe30dafd0bff8a91aLuca Barbieri
7e7624e23a3a374896863f54fe30dafd0bff8a91aLuca BarbieriHRESULT STDMETHODCALLTYPE D3D10CreateBlob(
89cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	SIZE_T num_bytes,
99cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	LPD3D10BLOB *out_buffer
10f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri)
11f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri{
129cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	void* data = malloc(num_bytes);
13f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	if(!data)
14f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri		return E_OUTOFMEMORY;
159cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	*out_buffer = new GalliumD3DBlob(data, num_bytes);
16f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	return S_OK;
17f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri}
18f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
19f815b57b888d00228dcb355cbd34ed0f4c44a620Luca BarbieriLPCSTR STDMETHODCALLTYPE D3D10GetPixelShaderProfile(
209cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	ID3D10Device *device
21f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri)
22f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri{
23f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	return "ps_4_0";
24f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri}
25f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
26f815b57b888d00228dcb355cbd34ed0f4c44a620Luca BarbieriLPCSTR STDMETHODCALLTYPE D3D10GetVertexShaderProfile(
279cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	ID3D10Device *device
28f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri)
29f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri{
30f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	return "vs_4_0";
31f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri}
32f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
33f815b57b888d00228dcb355cbd34ed0f4c44a620Luca BarbieriLPCSTR STDMETHODCALLTYPE D3D10GetGeometryShaderProfile(
349cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	ID3D10Device *device
35f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri)
36f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri{
37f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	return "gs_4_0";
38f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri}
39f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
40f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieristatic HRESULT dxbc_assemble_as_blob(struct dxbc_chunk_header** chunks, unsigned num_chunks, ID3D10Blob** blob)
41f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri{
42f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	std::pair<void*, size_t> p = dxbc_assemble(chunks, num_chunks);
43f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	if(!p.first)
44f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri		return E_OUTOFMEMORY;
45bb26272beaf1d2bddffaad5341235e70abcf483bLuca Barbieri	*blob = new GalliumD3DBlob(p.first, p.second);
46f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	return S_OK;
47f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri}
48f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
496c598c78bd17642d731cf57b8369cc794f64ba2fLuca BarbieriHRESULT D3D10GetInputSignatureBlob(
509cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	const void *shader_bytecode,
519cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	SIZE_T bytecode_length,
529cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	ID3D10Blob **signature_blob
53f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri)
54f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri{
55d2cc8aedb5d544608842b58b6ae4754313ded939Christoph Bumiller	dxbc_chunk_signature* sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_INPUT_SIGNATURE);
56f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	if(!sig)
57f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri		return E_FAIL;
58f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
599cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	return dxbc_assemble_as_blob((dxbc_chunk_header**)&sig, 1, signature_blob);
60f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri}
61f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
626c598c78bd17642d731cf57b8369cc794f64ba2fLuca BarbieriHRESULT D3D10GetOutputSignatureBlob(
639cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	const void *shader_bytecode,
649cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	SIZE_T bytecode_length,
659cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	ID3D10Blob **signature_blob
66f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri)
67f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri{
68d2cc8aedb5d544608842b58b6ae4754313ded939Christoph Bumiller	dxbc_chunk_signature* sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_OUTPUT_SIGNATURE);
69f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	if(!sig)
70f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri		return E_FAIL;
71f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
729cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	return dxbc_assemble_as_blob((dxbc_chunk_header**)&sig, 1, signature_blob);
73f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri}
74f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
756c598c78bd17642d731cf57b8369cc794f64ba2fLuca BarbieriHRESULT D3D10GetInputAndOutputSignatureBlob(
769cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	const void *shader_bytecode,
779cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	SIZE_T bytecode_length,
789cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	ID3D10Blob **signature_blob
79f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri)
80f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri{
81f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	dxbc_chunk_signature* sigs[2];
82d2cc8aedb5d544608842b58b6ae4754313ded939Christoph Bumiller	sigs[0] = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_INPUT_SIGNATURE);
83f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	if(!sigs[0])
84f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri		return E_FAIL;
85d2cc8aedb5d544608842b58b6ae4754313ded939Christoph Bumiller	sigs[1] = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_OUTPUT_SIGNATURE);
86f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri	if(!sigs[1])
87f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri		return E_FAIL;
88f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
899cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	return dxbc_assemble_as_blob((dxbc_chunk_header**)&sigs, 2, signature_blob);
90f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri}
91f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri
92f815b57b888d00228dcb355cbd34ed0f4c44a620Luca Barbieri#endif
93