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;
}
Ejemplo n.º 2
0
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;
}