From b406e4e1f2c696ba5f6bec04ea2e6a8cc03a02d1 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sun, 14 Dec 2014 21:23:13 +0100 Subject: VideoCommon: Add a separate constants buffer for the geometry shader. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 82 +++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Source/Core/VideoCommon/GeometryShaderManager.cpp (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp new file mode 100644 index 0000000000..f754961cbc --- /dev/null +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -0,0 +1,82 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include +#include + +#include "VideoCommon/GeometryShaderGen.h" +#include "VideoCommon/GeometryShaderManager.h" +#include "VideoCommon/VideoCommon.h" +#include "VideoCommon/VideoConfig.h" +#include "VideoCommon/XFMemory.h" + +// track changes +static bool s_projection_changed, s_viewport_changed; + +GeometryShaderConstants GeometryShaderManager::constants; +bool GeometryShaderManager::dirty; + +void GeometryShaderManager::Init() +{ + memset(&constants, 0, sizeof(constants)); + + Dirty(); +} + +void GeometryShaderManager::Shutdown() +{ +} + +void GeometryShaderManager::Dirty() +{ + s_projection_changed = true; + s_viewport_changed = true; + + dirty = true; +} + +// Syncs the shader constant buffers with xfmem +void GeometryShaderManager::SetConstants() +{ + if (s_projection_changed) + { + s_projection_changed = false; + + if (g_ActiveConfig.iStereoMode > 0 && xfmem.projection.type == GX_PERSPECTIVE) + { + float offset = (g_ActiveConfig.iStereoSeparation / 1000.0f) * (g_ActiveConfig.iStereoSeparationPercent / 100.0f); + constants.stereoparams[0] = (g_ActiveConfig.bStereoSwapEyes) ? offset : -offset; + constants.stereoparams[1] = (g_ActiveConfig.bStereoSwapEyes) ? -offset : offset; + constants.stereoparams[2] = (g_ActiveConfig.iStereoConvergence / 10.0f) * (g_ActiveConfig.iStereoConvergencePercent / 100.0f); + } + else + { + constants.stereoparams[0] = constants.stereoparams[1] = 0; + } + } + + dirty = true; +} + +void GeometryShaderManager::SetViewportChanged() +{ + s_viewport_changed = true; +} + +void GeometryShaderManager::SetProjectionChanged() +{ + s_projection_changed = true; +} + +void GeometryShaderManager::DoState(PointerWrap &p) +{ + p.Do(dirty); + + if (p.GetMode() == PointerWrap::MODE_READ) + { + // Reload current state from global GPU state + // NOTE: This requires that all GPU memory has been loaded already. + Dirty(); + } +} -- cgit v1.2.3 From 332ba4b2100ec4dcda4b2e83eb5b0e2d21e6abc4 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sun, 14 Dec 2014 21:44:33 +0100 Subject: GeometryShaderManager: Upload Line/Point width constants. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 43 ++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index f754961cbc..70bb151666 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -5,6 +5,7 @@ #include #include +#include "VideoCommon/BPMemory.h" #include "VideoCommon/GeometryShaderGen.h" #include "VideoCommon/GeometryShaderManager.h" #include "VideoCommon/VideoCommon.h" @@ -12,7 +13,11 @@ #include "VideoCommon/XFMemory.h" // track changes -static bool s_projection_changed, s_viewport_changed; +static bool s_projection_changed, s_viewport_changed, s_lineptwidth_changed; + +static const float LINE_PT_TEX_OFFSETS[8] = { + 0.f, 0.0625f, 0.125f, 0.25f, 0.5f, 1.f, 1.f, 1.f +}; GeometryShaderConstants GeometryShaderManager::constants; bool GeometryShaderManager::dirty; @@ -32,6 +37,16 @@ void GeometryShaderManager::Dirty() { s_projection_changed = true; s_viewport_changed = true; + s_lineptwidth_changed = true; + + SetTexCoordChanged(0); + SetTexCoordChanged(1); + SetTexCoordChanged(2); + SetTexCoordChanged(3); + SetTexCoordChanged(4); + SetTexCoordChanged(5); + SetTexCoordChanged(6); + SetTexCoordChanged(7); dirty = true; } @@ -39,6 +54,20 @@ void GeometryShaderManager::Dirty() // Syncs the shader constant buffers with xfmem void GeometryShaderManager::SetConstants() { + if (s_lineptwidth_changed) + { + constants.lineptwidth[0] = bpmem.lineptwidth.linesize / 6.f; + constants.lineptwidth[1] = bpmem.lineptwidth.pointsize / 6.f; + constants.lineptwidth[2] = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.lineoff]; + constants.lineptwidth[3] = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.pointoff]; + } + + if (s_viewport_changed) + { + constants.viewport[0] = 2.0f * xfmem.viewport.wd; + constants.viewport[1] = -2.0f * xfmem.viewport.ht; + } + if (s_projection_changed) { s_projection_changed = false; @@ -69,6 +98,18 @@ void GeometryShaderManager::SetProjectionChanged() s_projection_changed = true; } +void GeometryShaderManager::SetLinePtWidthChanged() +{ + s_lineptwidth_changed = true; +} + +void GeometryShaderManager::SetTexCoordChanged(u8 texmapid) +{ + TCoordInfo& tc = bpmem.texcoords[texmapid]; + constants.texoffsetflags[texmapid] = tc.s.line_offset + tc.s.point_offset * 2; + dirty = true; +} + void GeometryShaderManager::DoState(PointerWrap &p) { p.Do(dirty); -- cgit v1.2.3 From 0ac710339100dc6dc2f1f4c094b372846decdce5 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Tue, 16 Dec 2014 00:21:07 +0100 Subject: GeometryShaderGen: Pack uniforms more tightly. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index 70bb151666..3d05a7161c 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -15,8 +15,8 @@ // track changes static bool s_projection_changed, s_viewport_changed, s_lineptwidth_changed; -static const float LINE_PT_TEX_OFFSETS[8] = { - 0.f, 0.0625f, 0.125f, 0.25f, 0.5f, 1.f, 1.f, 1.f +static const int LINE_PT_TEX_OFFSETS[8] = { + 0, 16, 8, 4, 2, 1, 1, 1 }; GeometryShaderConstants GeometryShaderManager::constants; @@ -56,16 +56,16 @@ void GeometryShaderManager::SetConstants() { if (s_lineptwidth_changed) { - constants.lineptwidth[0] = bpmem.lineptwidth.linesize / 6.f; - constants.lineptwidth[1] = bpmem.lineptwidth.pointsize / 6.f; - constants.lineptwidth[2] = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.lineoff]; - constants.lineptwidth[3] = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.pointoff]; + constants.lineptparams[2] = bpmem.lineptwidth.linesize / 6.f; + constants.lineptparams[3] = bpmem.lineptwidth.pointsize / 6.f; + constants.texoffset[2] = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.lineoff]; + constants.texoffset[3] = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.pointoff]; } if (s_viewport_changed) { - constants.viewport[0] = 2.0f * xfmem.viewport.wd; - constants.viewport[1] = -2.0f * xfmem.viewport.ht; + constants.lineptparams[0] = 2.0f * xfmem.viewport.wd; + constants.lineptparams[1] = -2.0f * xfmem.viewport.ht; } if (s_projection_changed) @@ -106,7 +106,11 @@ void GeometryShaderManager::SetLinePtWidthChanged() void GeometryShaderManager::SetTexCoordChanged(u8 texmapid) { TCoordInfo& tc = bpmem.texcoords[texmapid]; - constants.texoffsetflags[texmapid] = tc.s.line_offset + tc.s.point_offset * 2; + int bitmask = 1 << texmapid; + constants.texoffset[0] &= ~bitmask; + constants.texoffset[0] |= tc.s.line_offset << texmapid; + constants.texoffset[1] &= ~bitmask; + constants.texoffset[1] |= tc.s.point_offset << texmapid; dirty = true; } -- cgit v1.2.3 From 1af3d8447a47ea7a8be86060ca879cafe1c57824 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 17 Dec 2014 03:11:23 +0100 Subject: GeometryShaderManager: Set the constants within the callbacks. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 78 ++++++++--------------- 1 file changed, 25 insertions(+), 53 deletions(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index 3d05a7161c..2ca0965343 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -12,9 +12,6 @@ #include "VideoCommon/VideoConfig.h" #include "VideoCommon/XFMemory.h" -// track changes -static bool s_projection_changed, s_viewport_changed, s_lineptwidth_changed; - static const int LINE_PT_TEX_OFFSETS[8] = { 0, 16, 8, 4, 2, 1, 1, 1 }; @@ -35,72 +32,47 @@ void GeometryShaderManager::Shutdown() void GeometryShaderManager::Dirty() { - s_projection_changed = true; - s_viewport_changed = true; - s_lineptwidth_changed = true; - - SetTexCoordChanged(0); - SetTexCoordChanged(1); - SetTexCoordChanged(2); - SetTexCoordChanged(3); - SetTexCoordChanged(4); - SetTexCoordChanged(5); - SetTexCoordChanged(6); - SetTexCoordChanged(7); + SetViewportChanged(); + SetProjectionChanged(); + SetLinePtWidthChanged(); + + for (int i = 0; i < 8; i++) + SetTexCoordChanged(i); dirty = true; } -// Syncs the shader constant buffers with xfmem -void GeometryShaderManager::SetConstants() +void GeometryShaderManager::SetViewportChanged() { - if (s_lineptwidth_changed) - { - constants.lineptparams[2] = bpmem.lineptwidth.linesize / 6.f; - constants.lineptparams[3] = bpmem.lineptwidth.pointsize / 6.f; - constants.texoffset[2] = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.lineoff]; - constants.texoffset[3] = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.pointoff]; - } + constants.lineptparams[0] = 2.0f * xfmem.viewport.wd; + constants.lineptparams[1] = -2.0f * xfmem.viewport.ht; + dirty = true; +} - if (s_viewport_changed) +void GeometryShaderManager::SetProjectionChanged() +{ + if (g_ActiveConfig.iStereoMode > 0 && xfmem.projection.type == GX_PERSPECTIVE) { - constants.lineptparams[0] = 2.0f * xfmem.viewport.wd; - constants.lineptparams[1] = -2.0f * xfmem.viewport.ht; + float offset = (g_ActiveConfig.iStereoSeparation / 1000.0f) * (g_ActiveConfig.iStereoSeparationPercent / 100.0f); + constants.stereoparams[0] = (g_ActiveConfig.bStereoSwapEyes) ? offset : -offset; + constants.stereoparams[1] = (g_ActiveConfig.bStereoSwapEyes) ? -offset : offset; + constants.stereoparams[2] = (g_ActiveConfig.iStereoConvergence / 10.0f) * (g_ActiveConfig.iStereoConvergencePercent / 100.0f); } - - if (s_projection_changed) + else { - s_projection_changed = false; - - if (g_ActiveConfig.iStereoMode > 0 && xfmem.projection.type == GX_PERSPECTIVE) - { - float offset = (g_ActiveConfig.iStereoSeparation / 1000.0f) * (g_ActiveConfig.iStereoSeparationPercent / 100.0f); - constants.stereoparams[0] = (g_ActiveConfig.bStereoSwapEyes) ? offset : -offset; - constants.stereoparams[1] = (g_ActiveConfig.bStereoSwapEyes) ? -offset : offset; - constants.stereoparams[2] = (g_ActiveConfig.iStereoConvergence / 10.0f) * (g_ActiveConfig.iStereoConvergencePercent / 100.0f); - } - else - { - constants.stereoparams[0] = constants.stereoparams[1] = 0; - } + constants.stereoparams[0] = constants.stereoparams[1] = 0; } dirty = true; } -void GeometryShaderManager::SetViewportChanged() -{ - s_viewport_changed = true; -} - -void GeometryShaderManager::SetProjectionChanged() -{ - s_projection_changed = true; -} - void GeometryShaderManager::SetLinePtWidthChanged() { - s_lineptwidth_changed = true; + constants.lineptparams[2] = bpmem.lineptwidth.linesize / 6.f; + constants.lineptparams[3] = bpmem.lineptwidth.pointsize / 6.f; + constants.texoffset[2] = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.lineoff]; + constants.texoffset[3] = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.pointoff]; + dirty = true; } void GeometryShaderManager::SetTexCoordChanged(u8 texmapid) -- cgit v1.2.3 From 69df23f725205a4bcd10c6315f2421d3041e614e Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 17 Dec 2014 09:18:40 +0100 Subject: VideoCommon: Only use interface blocks when geometry shaders are supported. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index 2ca0965343..09adad56c0 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -88,8 +88,6 @@ void GeometryShaderManager::SetTexCoordChanged(u8 texmapid) void GeometryShaderManager::DoState(PointerWrap &p) { - p.Do(dirty); - if (p.GetMode() == PointerWrap::MODE_READ) { // Reload current state from global GPU state -- cgit v1.2.3 From d09af2dbba4f375cd4e0577124a422ffc8669398 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sat, 20 Dec 2014 13:01:37 +0100 Subject: GeometryShaderManager: Set stereo parameters in a SetConstants() call. Doing it in SetProjectionChanged() is too early because the projection type is not set yet. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 38 +++++++++++++++-------- 1 file changed, 25 insertions(+), 13 deletions(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index 09adad56c0..957a1a65ca 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -19,6 +19,8 @@ static const int LINE_PT_TEX_OFFSETS[8] = { GeometryShaderConstants GeometryShaderManager::constants; bool GeometryShaderManager::dirty; +static bool s_projection_changed; + void GeometryShaderManager::Init() { memset(&constants, 0, sizeof(constants)); @@ -42,6 +44,28 @@ void GeometryShaderManager::Dirty() dirty = true; } +void GeometryShaderManager::SetConstants() +{ + if (s_projection_changed && g_ActiveConfig.iStereoMode > 0) + { + s_projection_changed = false; + + if (xfmem.projection.type == GX_PERSPECTIVE) + { + float offset = (g_ActiveConfig.iStereoSeparation / 1000.0f) * (g_ActiveConfig.iStereoSeparationPercent / 100.0f); + constants.stereoparams[0] = (g_ActiveConfig.bStereoSwapEyes) ? offset : -offset; + constants.stereoparams[1] = (g_ActiveConfig.bStereoSwapEyes) ? -offset : offset; + constants.stereoparams[2] = (g_ActiveConfig.iStereoConvergence / 10.0f) * (g_ActiveConfig.iStereoConvergencePercent / 100.0f); + } + else + { + constants.stereoparams[0] = constants.stereoparams[1] = 0; + } + + dirty = true; + } +} + void GeometryShaderManager::SetViewportChanged() { constants.lineptparams[0] = 2.0f * xfmem.viewport.wd; @@ -51,19 +75,7 @@ void GeometryShaderManager::SetViewportChanged() void GeometryShaderManager::SetProjectionChanged() { - if (g_ActiveConfig.iStereoMode > 0 && xfmem.projection.type == GX_PERSPECTIVE) - { - float offset = (g_ActiveConfig.iStereoSeparation / 1000.0f) * (g_ActiveConfig.iStereoSeparationPercent / 100.0f); - constants.stereoparams[0] = (g_ActiveConfig.bStereoSwapEyes) ? offset : -offset; - constants.stereoparams[1] = (g_ActiveConfig.bStereoSwapEyes) ? -offset : offset; - constants.stereoparams[2] = (g_ActiveConfig.iStereoConvergence / 10.0f) * (g_ActiveConfig.iStereoConvergencePercent / 100.0f); - } - else - { - constants.stereoparams[0] = constants.stereoparams[1] = 0; - } - - dirty = true; + s_projection_changed = true; } void GeometryShaderManager::SetLinePtWidthChanged() -- cgit v1.2.3 From 70b898e2c6bbb2759a98d36e2f0dd84bfc56db3f Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sun, 21 Dec 2014 14:06:16 +0100 Subject: VideoConfig: Rename Separation to Depth and update descriptions. More accurate since it's not a real IPD and Nvidia also calls it depth. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index 957a1a65ca..db3ac3f627 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -52,10 +52,10 @@ void GeometryShaderManager::SetConstants() if (xfmem.projection.type == GX_PERSPECTIVE) { - float offset = (g_ActiveConfig.iStereoSeparation / 1000.0f) * (g_ActiveConfig.iStereoSeparationPercent / 100.0f); + float offset = (g_ActiveConfig.iStereoDepth / 1000.0f) * (g_ActiveConfig.iStereoDepthPercentage / 100.0f); constants.stereoparams[0] = (g_ActiveConfig.bStereoSwapEyes) ? offset : -offset; constants.stereoparams[1] = (g_ActiveConfig.bStereoSwapEyes) ? -offset : offset; - constants.stereoparams[2] = (g_ActiveConfig.iStereoConvergence / 10.0f) * (g_ActiveConfig.iStereoConvergencePercent / 100.0f); + constants.stereoparams[2] = (g_ActiveConfig.iStereoConvergence / 10.0f) * (g_ActiveConfig.iStereoConvergencePercentage / 100.0f); } else { -- cgit v1.2.3 From c424aa1ac634200eab9eb3d5a2244eab7e11f2a0 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sun, 21 Dec 2014 14:18:21 +0100 Subject: GeometryShaderManager: Boost convergence value. Most game don't require much granularity regarding the convergence value. The default convergence was also too low, this commit increases it tenfold. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index db3ac3f627..e392398f13 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -53,9 +53,9 @@ void GeometryShaderManager::SetConstants() if (xfmem.projection.type == GX_PERSPECTIVE) { float offset = (g_ActiveConfig.iStereoDepth / 1000.0f) * (g_ActiveConfig.iStereoDepthPercentage / 100.0f); - constants.stereoparams[0] = (g_ActiveConfig.bStereoSwapEyes) ? offset : -offset; - constants.stereoparams[1] = (g_ActiveConfig.bStereoSwapEyes) ? -offset : offset; - constants.stereoparams[2] = (g_ActiveConfig.iStereoConvergence / 10.0f) * (g_ActiveConfig.iStereoConvergencePercentage / 100.0f); + constants.stereoparams[0] = g_ActiveConfig.bStereoSwapEyes ? offset : -offset; + constants.stereoparams[1] = g_ActiveConfig.bStereoSwapEyes ? -offset : offset; + constants.stereoparams[2] = g_ActiveConfig.iStereoConvergence * (g_ActiveConfig.iStereoConvergencePercent / 100.0f); } else { -- cgit v1.2.3 From 86120bfc971d28baa74a29080a68f86818c15923 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 26 Dec 2014 17:58:59 +0100 Subject: GeometryShaderManager: Set viewport in SetConstants(). Setting it in the callback is too early. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index 957a1a65ca..9eb70954a3 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -20,6 +20,7 @@ GeometryShaderConstants GeometryShaderManager::constants; bool GeometryShaderManager::dirty; static bool s_projection_changed; +static bool s_viewport_changed; void GeometryShaderManager::Init() { @@ -64,13 +65,21 @@ void GeometryShaderManager::SetConstants() dirty = true; } + + if (s_viewport_changed) + { + s_viewport_changed = false; + + constants.lineptparams[0] = 2.0f * xfmem.viewport.wd; + constants.lineptparams[1] = -2.0f * xfmem.viewport.ht; + + dirty = true; + } } void GeometryShaderManager::SetViewportChanged() { - constants.lineptparams[0] = 2.0f * xfmem.viewport.wd; - constants.lineptparams[1] = -2.0f * xfmem.viewport.ht; - dirty = true; + s_viewport_changed = true; } void GeometryShaderManager::SetProjectionChanged() -- cgit v1.2.3 From da058b3078b19e3d46ff28af18a76104e56cfe59 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Mon, 29 Dec 2014 12:00:51 +0100 Subject: VideoConfig: Fix convergence parameter. Looks like a rebase failed somewhere. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index c9bbd3c482..1d7d5ec029 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -56,7 +56,7 @@ void GeometryShaderManager::SetConstants() float offset = (g_ActiveConfig.iStereoDepth / 1000.0f) * (g_ActiveConfig.iStereoDepthPercentage / 100.0f); constants.stereoparams[0] = g_ActiveConfig.bStereoSwapEyes ? offset : -offset; constants.stereoparams[1] = g_ActiveConfig.bStereoSwapEyes ? -offset : offset; - constants.stereoparams[2] = g_ActiveConfig.iStereoConvergence * (g_ActiveConfig.iStereoConvergencePercent / 100.0f); + constants.stereoparams[2] = g_ActiveConfig.iStereoConvergence * (g_ActiveConfig.iStereoConvergencePercentage / 100.0f); } else { -- cgit v1.2.3 From b816ee1f79a6c4f8a2f05f0da91a936ee2d44fff Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 2 Jan 2015 15:27:37 +0100 Subject: VideoConfig: Define a per-game minimum convergence value instead of a percentage boost. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index 1d7d5ec029..3e96592625 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -56,13 +56,14 @@ void GeometryShaderManager::SetConstants() float offset = (g_ActiveConfig.iStereoDepth / 1000.0f) * (g_ActiveConfig.iStereoDepthPercentage / 100.0f); constants.stereoparams[0] = g_ActiveConfig.bStereoSwapEyes ? offset : -offset; constants.stereoparams[1] = g_ActiveConfig.bStereoSwapEyes ? -offset : offset; - constants.stereoparams[2] = g_ActiveConfig.iStereoConvergence * (g_ActiveConfig.iStereoConvergencePercentage / 100.0f); } else { constants.stereoparams[0] = constants.stereoparams[1] = 0; } + constants.stereoparams[2] = (float)(g_ActiveConfig.iStereoConvergenceMinimum + g_ActiveConfig.iStereoConvergence); + dirty = true; } -- cgit v1.2.3 From e88c02dece0e5e8d3b019fd0137eab790d6d2036 Mon Sep 17 00:00:00 2001 From: Scott Mansell Date: Fri, 16 Jan 2015 05:29:39 +1300 Subject: Ensure that ZSlopes save/restore state correctly. Had to re-do *ShaderManager so they saved their constant arrays instead of completly rebuilding them on restore state. --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index 3e96592625..0a07cf683c 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -26,7 +26,11 @@ void GeometryShaderManager::Init() { memset(&constants, 0, sizeof(constants)); - Dirty(); + // Init any intial constants which aren't zero when bpmem is zero. + SetViewportChanged(); + SetProjectionChanged(); + + dirty = true; } void GeometryShaderManager::Shutdown() @@ -35,12 +39,9 @@ void GeometryShaderManager::Shutdown() void GeometryShaderManager::Dirty() { - SetViewportChanged(); - SetProjectionChanged(); - SetLinePtWidthChanged(); - - for (int i = 0; i < 8; i++) - SetTexCoordChanged(i); + // This function is called after a savestate is loaded. + // Any constants that can changed based on settings should be re-calculated + s_projection_changed = true; dirty = true; } @@ -110,9 +111,14 @@ void GeometryShaderManager::SetTexCoordChanged(u8 texmapid) void GeometryShaderManager::DoState(PointerWrap &p) { + p.Do(s_projection_changed); + p.Do(s_viewport_changed); + + p.Do(constants); + if (p.GetMode() == PointerWrap::MODE_READ) { - // Reload current state from global GPU state + // Fixup the current state from global GPU state // NOTE: This requires that all GPU memory has been loaded already. Dirty(); } -- cgit v1.2.3 From cefcb0ace9d363b3679b4e93bcc9ec05f1e5f4f8 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Mon, 18 May 2015 01:08:10 +0200 Subject: Update license headers to GPLv2+ --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index 0a07cf683c..f7332a79a0 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -1,5 +1,5 @@ // Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 +// Licensed under GPLv2+ // Refer to the license.txt file included. #include -- cgit v1.2.3 From 30ebb2459eb97ba544547183854775df8460b475 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Sun, 24 May 2015 06:55:12 +0200 Subject: Set copyright year to when a file was created --- Source/Core/VideoCommon/GeometryShaderManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp') diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp index f7332a79a0..19a480692f 100644 --- a/Source/Core/VideoCommon/GeometryShaderManager.cpp +++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp @@ -1,4 +1,4 @@ -// Copyright 2013 Dolphin Emulator Project +// Copyright 2014 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. -- cgit v1.2.3