BOOLEAN RosCompiler::Compile(UINT * puiShaderCodeSize) { assert(puiShaderCodeSize); *puiShaderCodeSize = 0; Disassemble_Signatures(); Disassemble_HLSL(); UINT versionToken = m_pCode[0]; UINT programType = (versionToken & D3D10_SB_TOKENIZED_PROGRAM_TYPE_MASK) >> D3D10_SB_TOKENIZED_PROGRAM_TYPE_SHIFT; if (D3D10_SB_VERTEX_SHADER == programType) { // Implement vertex shader compiling __debugbreak(); } else if (D3D10_SB_PIXEL_SHADER == programType) { #if VC4 m_HwCodeSize = 9 * sizeof(VC4_QPU_INSTRUCTION); m_pHwCode = new BYTE[m_HwCodeSize]; // // TODO: Before shader compiler is online, use a hard-coded shader for testing // UINT * pShaderCode = (UINT *)m_pHwCode; *pShaderCode++ = 0x958e0dbf; *pShaderCode++ = 0xd1724823; // mov r0, vary; mov r3.8d, 1.0 *pShaderCode++ = 0x818e7176; *pShaderCode++ = 0x40024821; // fadd r0, r0, r5; mov r1, vary *pShaderCode++ = 0x818e7376; *pShaderCode++ = 0x10024862; // fadd r1, r1, r5; mov r2, vary *pShaderCode++ = 0x819e7540; *pShaderCode++ = 0x114248a3; // fadd r2, r2, r5; mov r3.8a, r0 *pShaderCode++ = 0x809e7009; *pShaderCode++ = 0x115049e3; // nop; mov r3.8b, r1 *pShaderCode++ = 0x809e7012; *pShaderCode++ = 0x116049e3; // nop; mov r3.8c, r2 *pShaderCode++ = 0x159e76c0; *pShaderCode++ = 0x30020ba7; // mov tlbc, r3; nop; thrend *pShaderCode++ = 0x009e7000; *pShaderCode++ = 0x100009e7; // nop; nop; nop *pShaderCode++ = 0x009e7000; *pShaderCode++ = 0x500009e7; // nop; nop; sbdone Disassemble_HW(); *puiShaderCodeSize = PAGE_SIZE; return TRUE; #else __debugbreak(); #endif } return FALSE; }
HRESULT RosCompiler::Compile() { HRESULT hr = E_NOTIMPL; assert(m_pCode); assert(m_ProgramType == (D3D10_SB_TOKENIZED_PROGRAM_TYPE)((m_pCode[0] & D3D10_SB_TOKENIZED_PROGRAM_TYPE_MASK) >> D3D10_SB_TOKENIZED_PROGRAM_TYPE_SHIFT)); #if DBG // Disassemble HLSL Disassemble_Signatures(); Disassemble_HLSL(); #endif // DBG #if VC4 Vc4Shader Vc4ShaderCompiler(this); // Set HLSL bytecode. Vc4ShaderCompiler.SetShaderCode(m_pCode); switch (m_ProgramType) { case D3D10_SB_VERTEX_SHADER: // Set output hw shader storage. // for vertex shader. Vc4ShaderCompiler.SetShaderStorage( &m_Storage[ROS_VERTEX_SHADER_STORAGE], &m_Storage[ROS_VERTEX_SHADER_UNIFORM_STORAGE]); // for coordinate shader Vc4ShaderCompiler.SetShaderStorageAux( &m_Storage[ROS_COORDINATE_SHADER_STORAGE], &m_Storage[ROS_COORDINATE_SHADER_UNIFORM_STORAGE]); // Compile shader hr = Vc4ShaderCompiler.Translate_VS(); #if DBG // Disassemble h/w shader. Disassemble_HW(m_Storage[ROS_VERTEX_SHADER_STORAGE], TEXT("VC4 Vertex shader")); Disassemble_HW(m_Storage[ROS_COORDINATE_SHADER_STORAGE], TEXT("VC4 Coordinate shader")); #endif break; case D3D10_SB_PIXEL_SHADER: // Set output hw shader storage. Vc4ShaderCompiler.SetShaderStorage( &m_Storage[ROS_PIXEL_SHADER_STORAGE], &m_Storage[ROS_PIXEL_SHADER_UNIFORM_STORAGE]);; // Compile shader hr = Vc4ShaderCompiler.Translate_PS(); #if DBG // Disassemble h/w shader. Disassemble_HW(m_Storage[ROS_PIXEL_SHADER_STORAGE], TEXT("VC4 Pixel shader")); #endif break; default: assert(false); } #else assert(false); #endif // VC4 return hr; }
HRESULT RosCompiler::Compile() { HRESULT hr = E_NOTIMPL; assert(m_pCode); assert(m_ProgramType == (D3D10_SB_TOKENIZED_PROGRAM_TYPE)((m_pCode[0] & D3D10_SB_TOKENIZED_PROGRAM_TYPE_MASK) >> D3D10_SB_TOKENIZED_PROGRAM_TYPE_SHIFT)); #if DBG // Disassemble HLSL Disassemble_Signatures(); Disassemble_HLSL(); #endif // DBG #if VC4 Vc4Shader Vc4ShaderCompiler(this); // Set HLSL bytecode. Vc4ShaderCompiler.SetShaderCode(m_pCode); if (m_pDownstreamCode) { Vc4ShaderCompiler.SetDownstreamShaderCode(m_pDownstreamCode); } if (m_pUpstreamCode) { Vc4ShaderCompiler.SetUpstreamShaderCode(m_pUpstreamCode); } switch (m_ProgramType) { case D3D10_SB_VERTEX_SHADER: // Set output hw shader storage. // for vertex shader. Vc4ShaderCompiler.SetShaderStorage( &m_Storage[ROS_VERTEX_SHADER_STORAGE], &m_Storage[ROS_VERTEX_SHADER_UNIFORM_STORAGE]); // for coordinate shader Vc4ShaderCompiler.SetShaderStorageAux( &m_Storage[ROS_COORDINATE_SHADER_STORAGE], &m_Storage[ROS_COORDINATE_SHADER_UNIFORM_STORAGE]); try { // Compile shader hr = Vc4ShaderCompiler.Translate_VS(); } catch (RosCompilerException & e) { hr = e.GetError(); } if (SUCCEEDED(hr)) { m_cShaderInput = Vc4ShaderCompiler.GetInputCount(); m_cShaderOutput = Vc4ShaderCompiler.GetOutputCount(); #if DBG // Disassemble h/w shader. Disassemble_HW(m_Storage[ROS_VERTEX_SHADER_STORAGE], TEXT("VC4 Vertex shader")); Dump_UniformTable(m_Storage[ROS_VERTEX_SHADER_UNIFORM_STORAGE], TEXT("VC4 Vertex shader Uniform")); Disassemble_HW(m_Storage[ROS_COORDINATE_SHADER_STORAGE], TEXT("VC4 Coordinate shader")); Dump_UniformTable(m_Storage[ROS_COORDINATE_SHADER_UNIFORM_STORAGE], TEXT("VC4 Coordinate shader Uniform")); #endif // DBG } break; case D3D10_SB_PIXEL_SHADER: // Set output hw shader storage. Vc4ShaderCompiler.SetShaderStorage( &m_Storage[ROS_PIXEL_SHADER_STORAGE], &m_Storage[ROS_PIXEL_SHADER_UNIFORM_STORAGE]);; try { // Compile shader hr = Vc4ShaderCompiler.Translate_PS(); } catch (RosCompilerException & e) { hr = e.GetError(); } if (SUCCEEDED(hr)) { m_cShaderInput = Vc4ShaderCompiler.GetInputCount(); m_cShaderOutput = Vc4ShaderCompiler.GetOutputCount(); #if DBG // Disassemble h/w shader. Disassemble_HW(m_Storage[ROS_PIXEL_SHADER_STORAGE], TEXT("VC4 Pixel shader")); Dump_UniformTable(m_Storage[ROS_PIXEL_SHADER_UNIFORM_STORAGE], TEXT("VC4 Vertex shader Uniform")); #endif // DBG } break; default: assert(false); } #else assert(false); #endif // VC4 return hr; }