diff --git a/plugins/GSdx/GSDevice11.cpp b/plugins/GSdx/GSDevice11.cpp index 2f32f502c8..7202752fdb 100644 --- a/plugins/GSdx/GSDevice11.cpp +++ b/plugins/GSdx/GSDevice11.cpp @@ -271,7 +271,12 @@ bool GSDevice11::Create(GSWnd* wnd) hr = m_dev->CreateBuffer(&bd, NULL, &m_fxaa.cb); - CompileShader(IDR_FXAA_FX, "ps_main", NULL, &m_fxaa.ps); + try { + CompileShader("shader.fx", "ps_main", NULL, &m_fxaa.ps); + } + catch (GSDXRecoverableError) { + CompileShader(IDR_FXAA_FX, "ps_main", NULL, &m_fxaa.ps); + } // @@ -1368,6 +1373,72 @@ void GSDevice11::CompileShader(uint32 id, const char* entry, D3D11_SHADER_MACRO* } } +void GSDevice11::CompileShader(const char* fn, const char* entry, D3D11_SHADER_MACRO* macro, ID3D11VertexShader** vs, D3D11_INPUT_ELEMENT_DESC* layout, int count, ID3D11InputLayout** il) +{ + HRESULT hr; + + vector m; + + PrepareShaderMacro(m, macro); + + CComPtr shader, error; + + hr = D3DX11CompileFromFile(fn, &m[0], NULL, entry, m_shader.vs.c_str(), 0, 0, NULL, &shader, &error, NULL); + + if(error) + { + printf("%s\n", (const char*)error->GetBufferPointer()); + } + + if(FAILED(hr)) + { + throw GSDXRecoverableError(); + } + + hr = m_dev->CreateVertexShader((void*)shader->GetBufferPointer(), shader->GetBufferSize(), NULL, vs); + + if(FAILED(hr)) + { + throw GSDXRecoverableError(); + } + + hr = m_dev->CreateInputLayout(layout, count, shader->GetBufferPointer(), shader->GetBufferSize(), il); + + if(FAILED(hr)) + { + throw GSDXRecoverableError(); + } +} + +void GSDevice11::CompileShader(const char* fn, const char* entry, D3D11_SHADER_MACRO* macro, ID3D11PixelShader** ps) +{ + HRESULT hr; + + vector m; + + PrepareShaderMacro(m, macro); + + CComPtr shader, error; + + hr = D3DX11CompileFromFile(fn, &m[0], NULL, entry, m_shader.ps.c_str(), 0, 0, NULL, &shader, &error, NULL); + + if(error) + { + printf("%s\n", (const char*)error->GetBufferPointer()); + } + + if(FAILED(hr)) + { + throw GSDXRecoverableError(); + } + + hr = m_dev->CreatePixelShader((void*)shader->GetBufferPointer(), shader->GetBufferSize(),NULL, ps); + + if(FAILED(hr)) + { + throw GSDXRecoverableError(); + } +} void GSDevice11::CompileShader(const char* fn, const char* entry, D3D11_SHADER_MACRO* macro, ID3D11ComputeShader** cs) { HRESULT hr; diff --git a/plugins/GSdx/GSDevice11.h b/plugins/GSdx/GSDevice11.h index 700c7a395b..eb5c21cd38 100644 --- a/plugins/GSdx/GSDevice11.h +++ b/plugins/GSdx/GSDevice11.h @@ -219,5 +219,7 @@ public: void CompileShader(uint32 id, const char* entry, D3D11_SHADER_MACRO* macro, ID3D11PixelShader** ps); void CompileShader(uint32 id, const char* entry, D3D11_SHADER_MACRO* macro, ID3D11ComputeShader** cs); void CompileShader(const char* fn, const char* entry, D3D11_SHADER_MACRO* macro, ID3D11ComputeShader** cs); + void CompileShader(const char* fn, const char* entry, D3D11_SHADER_MACRO* macro, ID3D11VertexShader** vs, D3D11_INPUT_ELEMENT_DESC* layout, int count, ID3D11InputLayout** il); + void CompileShader(const char* fn, const char* entry, D3D11_SHADER_MACRO* macro, ID3D11PixelShader** ps); }; diff --git a/plugins/GSdx/GSDevice9.cpp b/plugins/GSdx/GSDevice9.cpp index 76fb47d75e..583b727373 100644 --- a/plugins/GSdx/GSDevice9.cpp +++ b/plugins/GSdx/GSDevice9.cpp @@ -360,7 +360,12 @@ bool GSDevice9::Create(GSWnd* wnd) // fxaa - CompileShader(IDR_FXAA_FX, "ps_main", NULL, &m_fxaa.ps); + try { + CompileShader("shader.fx", "ps_main", NULL, &m_fxaa.ps); + } + catch (GSDXRecoverableError) { + CompileShader(IDR_FXAA_FX, "ps_main", NULL, &m_fxaa.ps); + } // create shader layout @@ -1342,6 +1347,83 @@ void GSDevice9::OMSetRenderTargets(GSTexture* rt, GSTexture* ds, const GSVector4 } } +void GSDevice9::CompileShader(const char* fn, const string& entry, const D3DXMACRO* macro, IDirect3DVertexShader9** vs, const D3DVERTEXELEMENT9* layout, int count, IDirect3DVertexDeclaration9** il) +{ + vector m; + + PrepareShaderMacro(m, macro); + + HRESULT hr; + + CComPtr shader, error; + + hr = D3DXCompileShaderFromFile(fn, &m[0], NULL, entry.c_str(), m_shader.vs.c_str(), 0, &shader, &error, NULL); + + if(SUCCEEDED(hr)) + { + hr = m_dev->CreateVertexShader((DWORD*)shader->GetBufferPointer(), vs); + } + else if(error) + { + printf("%s\n", (const char*)error->GetBufferPointer()); + } + + ASSERT(SUCCEEDED(hr)); + + if(FAILED(hr)) + { + throw GSDXRecoverableError(); + } + + hr = m_dev->CreateVertexDeclaration(layout, il); + + if(FAILED(hr)) + { + throw GSDXRecoverableError(); + } +} + +void GSDevice9::CompileShader(const char* fn, const string& entry, const D3DXMACRO* macro, IDirect3DPixelShader9** ps) +{ + uint32 flags = 0; + + if(m_shader.level >= D3D_FEATURE_LEVEL_9_3) + { + flags |= D3DXSHADER_AVOID_FLOW_CONTROL; + } + else + { + flags |= D3DXSHADER_SKIPVALIDATION; + } + + vector m; + + PrepareShaderMacro(m, macro); + + HRESULT hr; + + CComPtr shader, error; + + hr = D3DXCompileShaderFromFile(fn, &m[0], NULL, entry.c_str(), m_shader.ps.c_str(), flags, &shader, &error, NULL); + + if(SUCCEEDED(hr)) + { + hr = m_dev->CreatePixelShader((DWORD*)shader->GetBufferPointer(), ps); + } + else if(error) + { + printf("%s\n", (const char*)error->GetBufferPointer()); + } + + ASSERT(SUCCEEDED(hr)); + + if(FAILED(hr)) + { + throw GSDXRecoverableError(); + } +} + + void GSDevice9::CompileShader(uint32 id, const string& entry, const D3DXMACRO* macro, IDirect3DVertexShader9** vs, const D3DVERTEXELEMENT9* layout, int count, IDirect3DVertexDeclaration9** il) { vector m; diff --git a/plugins/GSdx/GSDevice9.h b/plugins/GSdx/GSDevice9.h index 40549ba156..60831b2eb2 100644 --- a/plugins/GSdx/GSDevice9.h +++ b/plugins/GSdx/GSDevice9.h @@ -224,6 +224,9 @@ public: void CompileShader(uint32 id, const string& entry, const D3DXMACRO* macro, IDirect3DVertexShader9** vs, const D3DVERTEXELEMENT9* layout, int count, IDirect3DVertexDeclaration9** il); void CompileShader(uint32 id, const string& entry, const D3DXMACRO* macro, IDirect3DPixelShader9** ps); + void CompileShader(const char* fn, const string& entry, const D3DXMACRO* macro, IDirect3DVertexShader9** vs, const D3DVERTEXELEMENT9* layout, int count, IDirect3DVertexDeclaration9** il); + void CompileShader(const char* fn, const string& entry, const D3DXMACRO* macro, IDirect3DPixelShader9** ps); + void SetupVS(VSSelector sel, const VSConstantBuffer* cb); void SetupGS(GSSelector sel) {} void SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel); diff --git a/plugins/GSdx/GSRenderer.cpp b/plugins/GSdx/GSRenderer.cpp index 728e78d149..90af803824 100644 --- a/plugins/GSdx/GSRenderer.cpp +++ b/plugins/GSdx/GSRenderer.cpp @@ -554,7 +554,7 @@ void GSRenderer::KeyEvent(GSKeyEventData* e) return; case VK_PRIOR: m_fxaa = !m_fxaa; - printf("GSdx: fxaa is now %s.\n", m_fxaa ? "enabled" : "disabled"); + printf("GSdx: Post-processing shader is now %s.\n", m_fxaa ? "enabled" : "disabled"); return; }