From e5318d262428bda1a7c5c80eae117981384a7fe5 Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 3 Feb 2014 16:56:17 +0100 Subject: move shared parts from VertexManager::vFlush into VideoCommon --- Source/Core/VideoCommon/VertexManagerBase.cpp | 8 +++++++- Source/Core/VideoCommon/VertexManagerBase.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoCommon') diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp index c4980ae190..cd2eec39ce 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.cpp +++ b/Source/Core/VideoCommon/VertexManagerBase.cpp @@ -11,6 +11,7 @@ #include "RenderBase.h" #include "BPStructs.h" #include "XFMemory.h" +#include "Debugger.h" #include "VertexManagerBase.h" #include "MainBase.h" @@ -216,8 +217,13 @@ void VertexManager::Flush() VertexShaderManager::SetConstants(); PixelShaderManager::SetConstants(); + bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate + && bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24; + // TODO: need to merge more stuff into VideoCommon - g_vertex_manager->vFlush(); + g_vertex_manager->vFlush(useDstAlpha); + + GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true); IsFlushed = true; } diff --git a/Source/Core/VideoCommon/VertexManagerBase.h b/Source/Core/VideoCommon/VertexManagerBase.h index 6854bc5b73..997cf308d1 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.h +++ b/Source/Core/VideoCommon/VertexManagerBase.h @@ -58,7 +58,7 @@ private: //virtual void Draw(u32 stride, bool alphapass) = 0; // temp - virtual void vFlush() = 0; + virtual void vFlush(bool useDstAlpha) = 0; }; extern VertexManager *g_vertex_manager; -- cgit v1.2.3 From 5a660c27bc0188727c3c56f957938eda87cd89da Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 4 Feb 2014 10:45:38 +0100 Subject: rename UpdateViewport to SetViewport like all others setters in RenderBase.h --- Source/Core/VideoCommon/RenderBase.cpp | 4 ++-- Source/Core/VideoCommon/RenderBase.h | 6 +++--- Source/Core/VideoCommon/VertexShaderManager.cpp | 5 ++--- 3 files changed, 7 insertions(+), 8 deletions(-) (limited to 'Source/Core/VideoCommon') diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index 7f046e53a3..836a0ec03d 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -509,8 +509,8 @@ void Renderer::RecordVideoMemory() FifoRecorder::GetInstance().SetVideoMemory(bpMem, cpMem, xfMem, xfRegs, sizeof(XFRegisters) / 4); } -void UpdateViewport() +void SetViewport() { if (xfregs.viewport.wd != 0 && xfregs.viewport.ht != 0) - g_renderer->UpdateViewport(); + g_renderer->SetViewport(); } diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h index 81ca9f75fd..acb6797264 100644 --- a/Source/Core/VideoCommon/RenderBase.h +++ b/Source/Core/VideoCommon/RenderBase.h @@ -57,6 +57,7 @@ public: virtual void SetLineWidth() = 0; virtual void SetSamplerState(int stage,int texindex) = 0; virtual void SetInterlacingMode() = 0; + virtual void SetViewport() = 0; virtual void ApplyState(bool bUseDstAlpha) = 0; virtual void RestoreState() = 0; @@ -107,8 +108,6 @@ public: // Finish up the current frame, print some stats virtual void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f) = 0; - virtual void UpdateViewport() = 0; - virtual bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc) = 0; static unsigned int GetPrevPixelFormat() { return prev_efb_format; } @@ -160,4 +159,5 @@ private: extern Renderer *g_renderer; -void UpdateViewport(); +extern void SetViewport(); + diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp index 4632d098c4..169de08e4e 100644 --- a/Source/Core/VideoCommon/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/VertexShaderManager.cpp @@ -18,6 +18,7 @@ #include "XFMemory.h" #include "VideoCommon.h" #include "VertexManagerBase.h" +#include "RenderBase.h" #include "RenderBase.h" float GC_ALIGNED16(g_fProjectionMatrix[16]); @@ -173,8 +174,6 @@ static void ViewportCorrectionMatrix(Matrix44& result) result.data[4*1+3] = (-intendedHt + 2.f * (Y - intendedY)) / Ht + 1.f; } -void UpdateViewport(); - void VertexShaderManager::Init() { Dirty(); @@ -373,7 +372,7 @@ void VertexShaderManager::SetConstants() constants.depthparams[1] = xfregs.viewport.zRange / 16777216.0f; dirty = true; // This is so implementation-dependent that we can't have it here. - UpdateViewport(); + SetViewport(); // Update projection if the viewport isn't 1:1 useable if(!g_ActiveConfig.backend_info.bSupportsOversizedViewports) -- cgit v1.2.3 From 1f4219b5b4c5877efa12ac07d7647ed5285b288c Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 4 Feb 2014 20:16:03 +0100 Subject: move perfquery enable checks into videocommon (caller side) --- Source/Core/VideoCommon/BPStructs.cpp | 3 ++- Source/Core/VideoCommon/PerfQueryBase.cpp | 2 +- Source/Core/VideoCommon/PerfQueryBase.h | 2 +- Source/Core/VideoCommon/VertexManagerBase.cpp | 6 +++++- 4 files changed, 9 insertions(+), 4 deletions(-) (limited to 'Source/Core/VideoCommon') diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index 5482dae102..2434d347fa 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -423,7 +423,8 @@ void BPWritten(const BPCmd& bp) case BPMEM_CLEAR_PIXEL_PERF: // GXClearPixMetric writes 0xAAA here, Sunshine alternates this register between values 0x000 and 0xAAA - g_perf_query->ResetQuery(); + if(PerfQueryBase::ShouldEmulate()) + g_perf_query->ResetQuery(); break; case BPMEM_PRELOAD_ADDR: diff --git a/Source/Core/VideoCommon/PerfQueryBase.cpp b/Source/Core/VideoCommon/PerfQueryBase.cpp index af8bfa72e5..ada539c05e 100644 --- a/Source/Core/VideoCommon/PerfQueryBase.cpp +++ b/Source/Core/VideoCommon/PerfQueryBase.cpp @@ -3,7 +3,7 @@ PerfQueryBase* g_perf_query = 0; -bool PerfQueryBase::ShouldEmulate() const +bool PerfQueryBase::ShouldEmulate() { return g_ActiveConfig.bPerfQueriesEnable; } diff --git a/Source/Core/VideoCommon/PerfQueryBase.h b/Source/Core/VideoCommon/PerfQueryBase.h index 64a22c2712..ad112ede9d 100644 --- a/Source/Core/VideoCommon/PerfQueryBase.h +++ b/Source/Core/VideoCommon/PerfQueryBase.h @@ -29,7 +29,7 @@ public: // Checks if performance queries are enabled in the gameini configuration. // NOTE: Called from CPU+GPU thread - bool ShouldEmulate() const; + static bool ShouldEmulate(); // Begin querying the specified value for the following host GPU commands virtual void EnableQuery(PerfQueryGroup type) {} diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp index cd2eec39ce..0ea44d9a57 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.cpp +++ b/Source/Core/VideoCommon/VertexManagerBase.cpp @@ -12,6 +12,7 @@ #include "BPStructs.h" #include "XFMemory.h" #include "Debugger.h" +#include "PerfQueryBase.h" #include "VertexManagerBase.h" #include "MainBase.h" @@ -220,8 +221,11 @@ void VertexManager::Flush() bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate && bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24; - // TODO: need to merge more stuff into VideoCommon + if(PerfQueryBase::ShouldEmulate()) + g_perf_query->EnableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP); g_vertex_manager->vFlush(useDstAlpha); + if(PerfQueryBase::ShouldEmulate()) + g_perf_query->DisableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP); GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true); -- cgit v1.2.3 From 3551259c7a278ef27b365e25dfcda0865c012c99 Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 4 Feb 2014 21:17:38 +0100 Subject: use EFBRectangle for scissor rect This one is backend independed. The backend should recalc such things on their own. --- Source/Core/VideoCommon/BPFunctions.cpp | 3 +-- Source/Core/VideoCommon/RenderBase.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoCommon') diff --git a/Source/Core/VideoCommon/BPFunctions.cpp b/Source/Core/VideoCommon/BPFunctions.cpp index 43623a94a8..3cc1764f3b 100644 --- a/Source/Core/VideoCommon/BPFunctions.cpp +++ b/Source/Core/VideoCommon/BPFunctions.cpp @@ -47,8 +47,7 @@ void SetScissor() if (rc.left > rc.right) rc.right = rc.left; if (rc.top > rc.bottom) rc.bottom = rc.top; - TargetRectangle trc = g_renderer->ConvertEFBRectangle(rc); - g_renderer->SetScissorRect(trc); + g_renderer->SetScissorRect(rc); } void SetLineWidth() diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h index acb6797264..df176c1346 100644 --- a/Source/Core/VideoCommon/RenderBase.h +++ b/Source/Core/VideoCommon/RenderBase.h @@ -49,7 +49,7 @@ public: virtual void SetColorMask() = 0; virtual void SetBlendMode(bool forceUpdate) = 0; - virtual void SetScissorRect(const TargetRectangle& rc) = 0; + virtual void SetScissorRect(const EFBRectangle& rc) = 0; virtual void SetGenerationMode() = 0; virtual void SetDepthMode() = 0; virtual void SetLogicOpMode() = 0; -- cgit v1.2.3 From d5f1f0d4a9482359a99a2c737ec077d3e6ef9291 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 5 Feb 2014 11:48:45 +0100 Subject: merge some common parts of Swap() into VideoCommon --- Source/Core/VideoCommon/MainBase.cpp | 2 +- Source/Core/VideoCommon/RenderBase.cpp | 22 +++++++++++++++++++++- Source/Core/VideoCommon/RenderBase.h | 3 ++- 3 files changed, 24 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoCommon') diff --git a/Source/Core/VideoCommon/MainBase.cpp b/Source/Core/VideoCommon/MainBase.cpp index 7d81e4a10a..128570780b 100644 --- a/Source/Core/VideoCommon/MainBase.cpp +++ b/Source/Core/VideoCommon/MainBase.cpp @@ -72,7 +72,7 @@ void VideoFifo_CheckSwapRequest() if (Common::AtomicLoadAcquire(s_swapRequested)) { EFBRectangle rc; - g_renderer->Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight,rc); + Renderer::Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight,rc); Common::AtomicStoreRelease(s_swapRequested, false); } } diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index 836a0ec03d..31d5d091c7 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -30,6 +30,9 @@ #include "XFMemory.h" #include "FifoPlayer/FifoRecorder.h" #include "AVIDump.h" +#include "Debugger.h" +#include "Statistics.h" +#include "Core.h" #include #include @@ -117,7 +120,7 @@ void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRect } else { - g_renderer->Swap(xfbAddr, fbWidth, fbHeight,sourceRc,Gamma); + Swap(xfbAddr, fbWidth, fbHeight,sourceRc,Gamma); Common::AtomicStoreRelease(s_swapRequested, false); } } @@ -514,3 +517,20 @@ void SetViewport() if (xfregs.viewport.wd != 0 && xfregs.viewport.ht != 0) g_renderer->SetViewport(); } + +void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc, float Gamma) +{ + // TODO: merge more generic parts into VideoCommon + g_renderer->SwapImpl(xfbAddr, fbWidth, fbHeight, rc, Gamma); + + frameCount++; + GFX_DEBUGGER_PAUSE_AT(NEXT_FRAME, true); + + // Begin new frame + // Set default viewport and scissor, for the clear to work correctly + // New frame + stats.ResetFrame(); + + Core::Callback_VideoCopiedToXFB(XFBWrited || (g_ActiveConfig.bUseXFB && g_ActiveConfig.bUseRealXFB)); + XFBWrited = false; +} diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h index df176c1346..6744767d14 100644 --- a/Source/Core/VideoCommon/RenderBase.h +++ b/Source/Core/VideoCommon/RenderBase.h @@ -106,7 +106,8 @@ public: virtual void RestoreAPIState() = 0; // Finish up the current frame, print some stats - virtual void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f) = 0; + static void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f); + virtual void SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f) = 0; virtual bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc) = 0; -- cgit v1.2.3 From 647aad0a19acc2a7bcb637160bb43d794771ed41 Mon Sep 17 00:00:00 2001 From: degasus Date: Sat, 15 Feb 2014 18:57:55 +0100 Subject: inline SetViewport into VertexShaderManager --- Source/Core/VideoCommon/RenderBase.cpp | 6 ------ Source/Core/VideoCommon/RenderBase.h | 2 -- Source/Core/VideoCommon/VertexShaderManager.cpp | 2 +- 3 files changed, 1 insertion(+), 9 deletions(-) (limited to 'Source/Core/VideoCommon') diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index 31d5d091c7..45bd870670 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -512,12 +512,6 @@ void Renderer::RecordVideoMemory() FifoRecorder::GetInstance().SetVideoMemory(bpMem, cpMem, xfMem, xfRegs, sizeof(XFRegisters) / 4); } -void SetViewport() -{ - if (xfregs.viewport.wd != 0 && xfregs.viewport.ht != 0) - g_renderer->SetViewport(); -} - void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc, float Gamma) { // TODO: merge more generic parts into VideoCommon diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h index 6744767d14..fb99362a2a 100644 --- a/Source/Core/VideoCommon/RenderBase.h +++ b/Source/Core/VideoCommon/RenderBase.h @@ -160,5 +160,3 @@ private: extern Renderer *g_renderer; -extern void SetViewport(); - diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp index 169de08e4e..f39bd6231f 100644 --- a/Source/Core/VideoCommon/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/VertexShaderManager.cpp @@ -372,7 +372,7 @@ void VertexShaderManager::SetConstants() constants.depthparams[1] = xfregs.viewport.zRange / 16777216.0f; dirty = true; // This is so implementation-dependent that we can't have it here. - SetViewport(); + g_renderer->SetViewport(); // Update projection if the viewport isn't 1:1 useable if(!g_ActiveConfig.backend_info.bSupportsOversizedViewports) -- cgit v1.2.3