1 #if API < 11 2 extern "C" HRESULT STDMETHODCALLTYPE D3D10CreateBlob( 3 SIZE_T num_bytes, 4 LPD3D10BLOB *out_buffer 5 ); 6 7 HRESULT STDMETHODCALLTYPE D3D10CreateBlob( 8 SIZE_T num_bytes, 9 LPD3D10BLOB *out_buffer 10 ) 11 { 12 void* data = malloc(num_bytes); 13 if(!data) 14 return E_OUTOFMEMORY; 15 *out_buffer = new GalliumD3DBlob(data, num_bytes); 16 return S_OK; 17 } 18 19 LPCSTR STDMETHODCALLTYPE D3D10GetPixelShaderProfile( 20 ID3D10Device *device 21 ) 22 { 23 return "ps_4_0"; 24 } 25 26 LPCSTR STDMETHODCALLTYPE D3D10GetVertexShaderProfile( 27 ID3D10Device *device 28 ) 29 { 30 return "vs_4_0"; 31 } 32 33 LPCSTR STDMETHODCALLTYPE D3D10GetGeometryShaderProfile( 34 ID3D10Device *device 35 ) 36 { 37 return "gs_4_0"; 38 } 39 40 static 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 49 HRESULT D3D10GetInputSignatureBlob( 50 const void *shader_bytecode, 51 SIZE_T bytecode_length, 52 ID3D10Blob **signature_blob 53 ) 54 { 55 dxbc_chunk_signature* sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_INPUT_SIGNATURE); 56 if(!sig) 57 return E_FAIL; 58 59 return dxbc_assemble_as_blob((dxbc_chunk_header**)&sig, 1, signature_blob); 60 } 61 62 HRESULT D3D10GetOutputSignatureBlob( 63 const void *shader_bytecode, 64 SIZE_T bytecode_length, 65 ID3D10Blob **signature_blob 66 ) 67 { 68 dxbc_chunk_signature* sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_OUTPUT_SIGNATURE); 69 if(!sig) 70 return E_FAIL; 71 72 return dxbc_assemble_as_blob((dxbc_chunk_header**)&sig, 1, signature_blob); 73 } 74 75 HRESULT D3D10GetInputAndOutputSignatureBlob( 76 const void *shader_bytecode, 77 SIZE_T bytecode_length, 78 ID3D10Blob **signature_blob 79 ) 80 { 81 dxbc_chunk_signature* sigs[2]; 82 sigs[0] = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_INPUT_SIGNATURE); 83 if(!sigs[0]) 84 return E_FAIL; 85 sigs[1] = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_OUTPUT_SIGNATURE); 86 if(!sigs[1]) 87 return E_FAIL; 88 89 return dxbc_assemble_as_blob((dxbc_chunk_header**)&sigs, 2, signature_blob); 90 } 91 92 #endif 93