From b06280e86696903438f11afbb06d8935b2dc8503 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sat, 29 Nov 2014 21:55:14 +0100 Subject: [PATCH] D3D: Add anaglyph stereoscopy support. --- Source/Core/DolphinWX/VideoConfigDiag.cpp | 4 +-- .../VideoBackends/D3D/PixelShaderCache.cpp | 25 +++++++++++++++++++ .../Core/VideoBackends/D3D/PixelShaderCache.h | 1 + Source/Core/VideoBackends/D3D/Render.cpp | 2 +- Source/Core/VideoCommon/VideoConfig.h | 2 +- 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Source/Core/DolphinWX/VideoConfigDiag.cpp b/Source/Core/DolphinWX/VideoConfigDiag.cpp index 5c5e253888..6ccba4251d 100644 --- a/Source/Core/DolphinWX/VideoConfigDiag.cpp +++ b/Source/Core/DolphinWX/VideoConfigDiag.cpp @@ -453,9 +453,9 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con { wxFlexGridSizer* const szr_stereo = new wxFlexGridSizer(2, 5, 5); - const wxString stereo_choices[] = { "Off", "Side-by-Side", "Top-and-Bottom", vconfig.backend_info.bSupports3DVision ? "Nvidia 3D Vision" : "Anaglyph" }; + const wxString stereo_choices[] = { "Off", "Side-by-Side", "Top-and-Bottom", "Anaglyph", "Nvidia 3D Vision" }; szr_stereo->Add(new wxStaticText(page_enh, wxID_ANY, _("Stereoscopic 3D Mode:")), 1, wxALIGN_CENTER_VERTICAL, 0); - szr_stereo->Add(CreateChoice(page_enh, vconfig.iStereoMode, wxGetTranslation(stereo_3d_desc), 4, stereo_choices)); + szr_stereo->Add(CreateChoice(page_enh, vconfig.iStereoMode, wxGetTranslation(stereo_3d_desc), vconfig.backend_info.bSupports3DVision ? 5 : 4, stereo_choices)); wxSlider* const sep_slider = new wxSlider(page_enh, wxID_ANY, vconfig.iStereoSeparation, 0, 100, wxDefaultPosition, wxDefaultSize); sep_slider->Bind(wxEVT_SLIDER, &VideoConfigDiag::Event_StereoSep, this); diff --git a/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp b/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp index 7220264367..621ae34cea 100644 --- a/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp +++ b/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp @@ -35,6 +35,7 @@ ID3D11PixelShader* s_ColorMatrixProgram[2] = {nullptr}; ID3D11PixelShader* s_ColorCopyProgram[2] = {nullptr}; ID3D11PixelShader* s_DepthMatrixProgram[2] = {nullptr}; ID3D11PixelShader* s_ClearProgram = nullptr; +ID3D11PixelShader* s_AnaglyphProgram = nullptr; ID3D11PixelShader* s_rgba6_to_rgb8[2] = {nullptr}; ID3D11PixelShader* s_rgb8_to_rgba6[2] = {nullptr}; ID3D11Buffer* pscbuf = nullptr; @@ -60,6 +61,19 @@ const char color_copy_program_code[] = { "}\n" }; +const char anaglyph_program_code[] = { + "sampler samp0 : register(s0);\n" + "Texture2DArray Tex0 : register(t0);\n" + "void main(\n" + "out float4 ocol0 : SV_Target,\n" + "in float4 pos : SV_Position,\n" + "in float3 uv0 : TEXCOORD0){\n" + "float4 c0 = Tex0.Sample(samp0, float3(uv0.xy, 0));\n" + "float4 c1 = Tex0.Sample(samp0, float3(uv0.xy, 1));\n" + "ocol0 = float4(pow(0.7 * c0.g + 0.3 * c0.b, 1.5), c1.gba);" + "}\n" +}; + // TODO: Improve sampling algorithm! const char color_copy_program_code_msaa[] = { "sampler samp0 : register(s0);\n" @@ -385,6 +399,11 @@ ID3D11PixelShader* PixelShaderCache::GetClearProgram() return s_ClearProgram; } +ID3D11PixelShader* PixelShaderCache::GetAnaglyphProgram() +{ + return s_AnaglyphProgram; +} + ID3D11Buffer* &PixelShaderCache::GetConstantBuffer() { // TODO: divide the global variables of the generated shaders into about 5 constant buffers to speed this up @@ -424,6 +443,11 @@ void PixelShaderCache::Init() CHECK(s_ClearProgram!=nullptr, "Create clear pixel shader"); D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ClearProgram, "clear pixel shader"); + // used for anaglyph stereoscopy + s_AnaglyphProgram = D3D::CompileAndCreatePixelShader(anaglyph_program_code); + CHECK(s_AnaglyphProgram != nullptr, "Create anaglyph pixel shader"); + D3D::SetDebugObjectName((ID3D11DeviceChild*)s_AnaglyphProgram, "anaglyph pixel shader"); + // used when copying/resolving the color buffer s_ColorCopyProgram[0] = D3D::CompileAndCreatePixelShader(color_copy_program_code); CHECK(s_ColorCopyProgram[0]!=nullptr, "Create color copy pixel shader"); @@ -484,6 +508,7 @@ void PixelShaderCache::Shutdown() SAFE_RELEASE(pscbuf); SAFE_RELEASE(s_ClearProgram); + SAFE_RELEASE(s_AnaglyphProgram); for (int i = 0; i < 2; ++i) { SAFE_RELEASE(s_ColorCopyProgram[i]); diff --git a/Source/Core/VideoBackends/D3D/PixelShaderCache.h b/Source/Core/VideoBackends/D3D/PixelShaderCache.h index 55a31379e3..413a7c31a4 100644 --- a/Source/Core/VideoBackends/D3D/PixelShaderCache.h +++ b/Source/Core/VideoBackends/D3D/PixelShaderCache.h @@ -30,6 +30,7 @@ public: static ID3D11PixelShader* GetColorCopyProgram(bool multisampled); static ID3D11PixelShader* GetDepthMatrixProgram(bool multisampled); static ID3D11PixelShader* GetClearProgram(); + static ID3D11PixelShader* GetAnaglyphProgram(); static ID3D11PixelShader* ReinterpRGBA6ToRGB8(bool multisampled); static ID3D11PixelShader* ReinterpRGB8ToRGBA6(bool multisampled); diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp index 2dcb8ee6b7..9db7d2ac0d 100644 --- a/Source/Core/VideoBackends/D3D/Render.cpp +++ b/Source/Core/VideoBackends/D3D/Render.cpp @@ -838,7 +838,7 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co } else { - D3D::drawShadedTexQuad(read_texture->GetSRV(), targetRc.AsRECT(), Renderer::GetTargetWidth(), Renderer::GetTargetHeight(), PixelShaderCache::GetColorCopyProgram(false), VertexShaderCache::GetSimpleVertexShader(), VertexShaderCache::GetSimpleInputLayout(), nullptr, Gamma); + D3D::drawShadedTexQuad(read_texture->GetSRV(), targetRc.AsRECT(), Renderer::GetTargetWidth(), Renderer::GetTargetHeight(), (g_Config.iStereoMode == STEREO_ANAGLYPH) ? PixelShaderCache::GetAnaglyphProgram() : PixelShaderCache::GetColorCopyProgram(false), VertexShaderCache::GetSimpleVertexShader(), VertexShaderCache::GetSimpleInputLayout(), nullptr, Gamma); } } diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h index 879c0726a9..fa5a52772b 100644 --- a/Source/Core/VideoCommon/VideoConfig.h +++ b/Source/Core/VideoCommon/VideoConfig.h @@ -50,7 +50,7 @@ enum StereoMode STEREO_SBS, STEREO_TAB, STEREO_ANAGLYPH, - STEREO_3DVISION = STEREO_ANAGLYPH + STEREO_3DVISION }; // NEVER inherit from this class.