Esempio n. 1
0
    static bool dx11_compile_shader( ShaderCode& out_shader, const ShaderCode& source, const char* entry, const char* profile_str, FileSystem* /*fs*/, const char* /*include_dir*/ )
    {
        LPD3DBLOB code_blob = NULL;
        LPD3DBLOB error_blob = NULL;

        uint32 flags = D3D10_SHADER_DEBUG | D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY;

        HRESULT hr = D3DCompile(source.data(), source.size(), "", NULL, NULL, entry, profile_str, flags, 0, &code_blob, &error_blob);

        out_shader.clear();

        if( hr == S_OK )
        {
            size_t size = code_blob->GetBufferSize();
            out_shader.resize(size);
            memcpy(out_shader.data(), code_blob->GetBufferPointer(), size);
        }

        if( error_blob != NULL )
        {
            char* error_str = (char*)error_blob->GetBufferPointer();
            Log::error("Failed to compile shader\n%s", error_str);
        }

        SafeRelease(code_blob);
        SafeRelease(error_blob);

        if( hr == S_OK )
        {
            return true;
        }
        else
        {
            return false;
        }
    }
Esempio n. 2
0
    static bool dx9_compile_shader(ShaderCode& out_shader, const ShaderCode& source, ShaderType::type type, FileSystem* fs=NULL, const char* include_dir=NULL)
    {
        R_ASSERT(source.type == ShaderCodeType_Text);

        HRESULT hr = S_OK;

        ID3DXBuffer* error_buffer = NULL;
        ID3DXBuffer* shader_buffer = NULL;
        ID3DXConstantTable* constant_table = NULL;

        uint32 flags = D3DXSHADER_DEBUG;

        const char* profile = shader_profile_string(type);

        static const char dummy_vertex_shader[] = "float4 vertex() : POSITION { return 1; }";
        static const char dummy_pixel_shader[]  = "float4 pixel() : COLOR { return float4(1,0,1,1); }";

        DX9ShaderIncluder includer(fs, include_dir);        

        hr = D3DXCompileShader(source.data(), (UINT)source.size(), NULL, &includer, "main", profile, flags, &shader_buffer, &error_buffer, &constant_table );

        if( hr!=S_OK && error_buffer && error_buffer->GetBufferPointer() )
        {
            char* tmp = (char*)error_buffer->GetBufferPointer();
            R_ERROR_MESSAGE_BOX(tmp, "Shader compile error");   

            shader_buffer = NULL;
            error_buffer = NULL;

            //create dummy shader
            if( type == ShaderType::Pixel )
            {
                hr = D3DXCompileShader(
                    dummy_pixel_shader, uint32(strlen(dummy_pixel_shader)), NULL, NULL, "pixel", "ps_2_0", 
                    flags, &shader_buffer, &error_buffer, NULL );
                validate_d3d_result(hr, true);
            }
            else if( type == ShaderType::Vertex )
            {
                hr = D3DXCompileShader(
                    dummy_vertex_shader, uint32(strlen(dummy_vertex_shader)), NULL, NULL, "vertex", "vs_2_0", 
                    flags, &shader_buffer, &error_buffer, NULL );
                validate_d3d_result(hr, true);
            }
        }

        out_shader.type = ShaderCodeType_Binary;
        out_shader.clear();
        uint32 size = shader_buffer->GetBufferSize();   
        if( size )
        {
            out_shader.resize(size);
            memcpy(out_shader.data(), shader_buffer->GetBufferPointer(), size);
        }

        if(error_buffer) error_buffer->Release();
        if(shader_buffer) shader_buffer->Release();
        if(constant_table) constant_table->Release();

        return true;
    }