diff options
| author | Tony Wasserka <neobrainx@gmail.com> | 2014-02-16 22:08:28 +0100 |
|---|---|---|
| committer | Tony Wasserka <neobrainx@gmail.com> | 2014-02-16 22:08:28 +0100 |
| commit | de5bfd0bced8b12811d461b8e6683effa6b672fb (patch) | |
| tree | dc1209fbb812f995c831583c314a01506a099a89 /Source/Core/VideoBackends | |
| parent | 2a7a94387ca0e096f698c0468307bfe6b1d365d7 (diff) | |
| parent | 647aad0a19acc2a7bcb637160bb43d794771ed41 (diff) | |
Merge pull request #37 from degasus/VideoCommonApiFixes
VideoCommon API cleanups
Diffstat (limited to 'Source/Core/VideoBackends')
| -rw-r--r-- | Source/Core/VideoBackends/D3D/PerfQuery.cpp | 21 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/D3D/Render.cpp | 30 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/D3D/Render.h | 7 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/D3D/VertexManager.cpp | 9 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/D3D/VertexManager.h | 2 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/PerfQuery.cpp | 21 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/Render.cpp | 24 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/Render.h | 7 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/VertexManager.cpp | 11 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/VertexManager.h | 2 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/main.cpp | 2 |
11 files changed, 28 insertions, 108 deletions
diff --git a/Source/Core/VideoBackends/D3D/PerfQuery.cpp b/Source/Core/VideoBackends/D3D/PerfQuery.cpp index 869b7428d6..c7eb97ee0b 100644 --- a/Source/Core/VideoBackends/D3D/PerfQuery.cpp +++ b/Source/Core/VideoBackends/D3D/PerfQuery.cpp @@ -29,9 +29,6 @@ PerfQuery::~PerfQuery() void PerfQuery::EnableQuery(PerfQueryGroup type) { - if (!ShouldEmulate()) - return; - // Is this sane? if (m_query_count > m_query_buffer.size() / 2) WeakFlush(); @@ -57,9 +54,6 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) void PerfQuery::DisableQuery(PerfQueryGroup type) { - if (!ShouldEmulate()) - return; - // stop query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { @@ -76,9 +70,6 @@ void PerfQuery::ResetQuery() u32 PerfQuery::GetQueryResult(PerfQueryType type) { - if (!ShouldEmulate()) - return 0; - u32 result = 0; if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC) @@ -103,9 +94,6 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type) void PerfQuery::FlushOne() { - if (!ShouldEmulate()) - return; - auto& entry = m_query_buffer[m_query_read_pos]; UINT64 result = 0; @@ -126,18 +114,12 @@ void PerfQuery::FlushOne() // TODO: could selectively flush things, but I don't think that will do much void PerfQuery::FlushResults() { - if (!ShouldEmulate()) - return; - while (!IsFlushed()) FlushOne(); } void PerfQuery::WeakFlush() { - if (!ShouldEmulate()) - return; - while (!IsFlushed()) { auto& entry = m_query_buffer[m_query_read_pos]; @@ -162,9 +144,6 @@ void PerfQuery::WeakFlush() bool PerfQuery::IsFlushed() const { - if (!ShouldEmulate()) - return true; - return 0 == m_query_count; } diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp index b48995c410..cb0b0a3d66 100644 --- a/Source/Core/VideoBackends/D3D/Render.cpp +++ b/Source/Core/VideoBackends/D3D/Render.cpp @@ -7,7 +7,6 @@ #include "Timer.h" -#include "Debugger.h" #include "EmuWindow.h" #include "Fifo.h" #include "OnScreenDisplay.h" @@ -303,9 +302,10 @@ bool Renderer::CheckForResize() return false; } -void Renderer::SetScissorRect(const TargetRectangle& rc) +void Renderer::SetScissorRect(const EFBRectangle& rc) { - D3D::context->RSSetScissorRects(1, rc.AsRECT()); + TargetRectangle trc = ConvertEFBRectangle(rc); + D3D::context->RSSetScissorRects(1, trc.AsRECT()); } void Renderer::SetColorMask() @@ -475,8 +475,7 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) } -// Called from VertexShaderManager -void Renderer::UpdateViewport() +void Renderer::SetViewport() { // reversed gxsetviewport(xorig, yorig, width, height, nearz, farz) // [0] = width/2 @@ -486,6 +485,10 @@ void Renderer::UpdateViewport() // [4] = yorig + height/2 + 342 // [5] = 16777215 * farz + // D3D crashes for zero viewports + if (xfregs.viewport.wd == 0 || xfregs.viewport.ht == 0) + return; + int scissorXOff = bpmem.scissorOffset.x * 2; int scissorYOff = bpmem.scissorOffset.y * 2; @@ -724,7 +727,7 @@ void formatBufferDump(const u8* in, u8* out, int w, int h, int p) } // This function has the final picture. We adjust the aspect ratio here. -void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma) +void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma) { if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight) { @@ -944,9 +947,6 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& r OSD::DrawMessages(); D3D::EndFrame(); - frameCount++; - - GFX_DEBUGGER_PAUSE_AT(NEXT_FRAME, true); TextureCache::Cleanup(); @@ -973,11 +973,6 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& r if (XFBWrited) s_fps = UpdateFPSCounter(); - // Begin new frame - // Set default viewport and scissor, for the clear to work correctly - // New frame - stats.ResetFrame(); - // Flip/present backbuffer to frontbuffer here D3D::Present(); @@ -1017,10 +1012,7 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& r RestoreAPIState(); D3D::BeginFrame(); D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV()); - UpdateViewport(); - - Core::Callback_VideoCopiedToXFB(XFBWrited || (g_ActiveConfig.bUseXFB && g_ActiveConfig.bUseRealXFB)); - XFBWrited = false; + SetViewport(); } // ALWAYS call RestoreAPIState for each ResetAPIState call you're doing @@ -1037,7 +1029,7 @@ void Renderer::RestoreAPIState() D3D::stateman->PopBlendState(); D3D::stateman->PopDepthState(); D3D::stateman->PopRasterizerState(); - UpdateViewport(); + SetViewport(); BPFunctions::SetScissor(); } diff --git a/Source/Core/VideoBackends/D3D/Render.h b/Source/Core/VideoBackends/D3D/Render.h index f391e4b47d..5c5a922cf1 100644 --- a/Source/Core/VideoBackends/D3D/Render.h +++ b/Source/Core/VideoBackends/D3D/Render.h @@ -13,7 +13,7 @@ public: void SetColorMask(); void SetBlendMode(bool forceUpdate); - void SetScissorRect(const TargetRectangle& rc); + void SetScissorRect(const EFBRectangle& rc); void SetGenerationMode(); void SetDepthMode(); void SetLogicOpMode(); @@ -21,6 +21,7 @@ public: void SetLineWidth(); void SetSamplerState(int stage,int texindex); void SetInterlacingMode(); + void SetViewport(); // TODO: Fix confusing names (see ResetAPIState and RestoreAPIState) void ApplyState(bool bUseDstAlpha); @@ -38,14 +39,12 @@ public: TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc); - void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma); + void SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma); void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z); void ReinterpretPixelData(unsigned int convtype); - void UpdateViewport(); - bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc); static bool CheckForResize(); diff --git a/Source/Core/VideoBackends/D3D/VertexManager.cpp b/Source/Core/VideoBackends/D3D/VertexManager.cpp index f8274ee283..a85c85027d 100644 --- a/Source/Core/VideoBackends/D3D/VertexManager.cpp +++ b/Source/Core/VideoBackends/D3D/VertexManager.cpp @@ -197,11 +197,8 @@ void VertexManager::Draw(UINT stride) } } -void VertexManager::vFlush() +void VertexManager::vFlush(bool useDstAlpha) { - bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate && - bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24; - if (!PixelShaderCache::SetShader( useDstAlpha ? DSTALPHA_DUAL_SOURCE_BLEND : DSTALPHA_NONE, g_nativeVertexFmt->m_components)) @@ -219,11 +216,7 @@ void VertexManager::vFlush() g_nativeVertexFmt->SetupVertexPointers(); g_renderer->ApplyState(useDstAlpha); - g_perf_query->EnableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP); Draw(stride); - g_perf_query->DisableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP); - - GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true); g_renderer->RestoreState(); } diff --git a/Source/Core/VideoBackends/D3D/VertexManager.h b/Source/Core/VideoBackends/D3D/VertexManager.h index db8be6de62..fea814bac2 100644 --- a/Source/Core/VideoBackends/D3D/VertexManager.h +++ b/Source/Core/VideoBackends/D3D/VertexManager.h @@ -30,7 +30,7 @@ private: void PrepareDrawBuffers(); void Draw(u32 stride); // temp - void vFlush(); + void vFlush(bool useDstAlpha); u32 m_vertex_buffer_cursor; u32 m_vertex_draw_offset; diff --git a/Source/Core/VideoBackends/OGL/PerfQuery.cpp b/Source/Core/VideoBackends/OGL/PerfQuery.cpp index 4ab148cbfa..4f30658a59 100644 --- a/Source/Core/VideoBackends/OGL/PerfQuery.cpp +++ b/Source/Core/VideoBackends/OGL/PerfQuery.cpp @@ -28,9 +28,6 @@ PerfQuery::~PerfQuery() void PerfQuery::EnableQuery(PerfQueryGroup type) { - if (!ShouldEmulate()) - return; - // Is this sane? if (m_query_count > m_query_buffer.size() / 2) WeakFlush(); @@ -55,9 +52,6 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) void PerfQuery::DisableQuery(PerfQueryGroup type) { - if (!ShouldEmulate()) - return; - // stop query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { @@ -67,17 +61,11 @@ void PerfQuery::DisableQuery(PerfQueryGroup type) bool PerfQuery::IsFlushed() const { - if (!ShouldEmulate()) - return true; - return 0 == m_query_count; } void PerfQuery::FlushOne() { - if (!ShouldEmulate()) - return; - auto& entry = m_query_buffer[m_query_read_pos]; GLuint result = 0; @@ -93,18 +81,12 @@ void PerfQuery::FlushOne() // TODO: could selectively flush things, but I don't think that will do much void PerfQuery::FlushResults() { - if (!ShouldEmulate()) - return; - while (!IsFlushed()) FlushOne(); } void PerfQuery::WeakFlush() { - if (!ShouldEmulate()) - return; - while (!IsFlushed()) { auto& entry = m_query_buffer[m_query_read_pos]; @@ -131,9 +113,6 @@ void PerfQuery::ResetQuery() u32 PerfQuery::GetQueryResult(PerfQueryType type) { - if (!ShouldEmulate()) - return 0; - u32 result = 0; if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC) diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index f863a93064..8fe0f0931a 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -44,7 +44,6 @@ #include "StringUtil.h" #include "FramebufferManager.h" #include "Fifo.h" -#include "Debugger.h" #include "Core.h" #include "Movie.h" #include "BPFunctions.h" @@ -862,9 +861,10 @@ TargetRectangle Renderer::ConvertEFBRectangle(const EFBRectangle& rc) // Renderer::GetTargetHeight() = the fixed ini file setting // donkopunchstania - it appears scissorBR is the bottom right pixel inside the scissor box // therefore the width and height are (scissorBR + 1) - scissorTL -void Renderer::SetScissorRect(const TargetRectangle& rc) +void Renderer::SetScissorRect(const EFBRectangle& rc) { - glScissor(rc.left, rc.bottom, rc.GetWidth(), rc.GetHeight()); + TargetRectangle trc = g_renderer->ConvertEFBRectangle(rc); + glScissor(trc.left, trc.bottom, trc.GetWidth(), trc.GetHeight()); } void Renderer::SetColorMask() @@ -1077,8 +1077,7 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) return 0; } -// Called from VertexShaderManager -void Renderer::UpdateViewport() +void Renderer::SetViewport() { // reversed gxsetviewport(xorig, yorig, width, height, nearz, farz) // [0] = width/2 @@ -1276,7 +1275,7 @@ void DumpFrame(const std::vector<u8>& data, int w, int h) } // This function has the final picture. We adjust the aspect ratio here. -void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma) +void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma) { static int w = 0, h = 0; if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight) @@ -1592,15 +1591,6 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& r // Clean out old stuff from caches. It's not worth it to clean out the shader caches. TextureCache::Cleanup(); - 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(); - // Render to the framebuffer. FramebufferManager::SetFramebuffer(0); @@ -1618,8 +1608,6 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& r // Renderer::SetZBufferRender(); // SaveTexture("tex.png", GL_TEXTURE_2D, s_FakeZTarget, // GetTargetWidth(), GetTargetHeight()); - Core::Callback_VideoCopiedToXFB(XFBWrited || (g_ActiveConfig.bUseXFB && g_ActiveConfig.bUseRealXFB)); - XFBWrited = false; // Invalidate EFB cache ClearEFBCache(); @@ -1650,7 +1638,7 @@ void Renderer::RestoreAPIState() SetDepthMode(); SetBlendMode(true); SetLogicOpMode(); - UpdateViewport(); + SetViewport(); if (GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL) glPolygonMode(GL_FRONT_AND_BACK, g_ActiveConfig.bWireFrame ? GL_LINE : GL_FILL); diff --git a/Source/Core/VideoBackends/OGL/Render.h b/Source/Core/VideoBackends/OGL/Render.h index feaad32aa1..fb15462921 100644 --- a/Source/Core/VideoBackends/OGL/Render.h +++ b/Source/Core/VideoBackends/OGL/Render.h @@ -46,7 +46,7 @@ public: void SetColorMask() override; void SetBlendMode(bool forceUpdate) override; - void SetScissorRect(const TargetRectangle& rc) override; + void SetScissorRect(const EFBRectangle& rc) override; void SetGenerationMode() override; void SetDepthMode() override; void SetLogicOpMode() override; @@ -54,6 +54,7 @@ public: void SetLineWidth() override; void SetSamplerState(int stage,int texindex) override; void SetInterlacingMode() override; + void SetViewport() override; // TODO: Implement and use these void ApplyState(bool bUseDstAlpha) override {} @@ -70,14 +71,12 @@ public: TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc) override; - void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma) override; + void SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma) override; void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z) override; void ReinterpretPixelData(unsigned int convtype) override; - void UpdateViewport() override; - bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc); private: diff --git a/Source/Core/VideoBackends/OGL/VertexManager.cpp b/Source/Core/VideoBackends/OGL/VertexManager.cpp index aed97e2ebd..670dd7d8a0 100644 --- a/Source/Core/VideoBackends/OGL/VertexManager.cpp +++ b/Source/Core/VideoBackends/OGL/VertexManager.cpp @@ -25,9 +25,7 @@ #include "VertexManager.h" #include "IndexGenerator.h" #include "FileUtil.h" -#include "Debugger.h" #include "StreamBuffer.h" -#include "PerfQueryBase.h" #include "Render.h" #include "main.h" @@ -131,7 +129,7 @@ void VertexManager::Draw(u32 stride) INCSTAT(stats.thisFrame.numIndexedDrawCalls); } -void VertexManager::vFlush() +void VertexManager::vFlush(bool useDstAlpha) { GLVertexFormat *nativeVertexFmt = (GLVertexFormat*)g_nativeVertexFmt; u32 stride = nativeVertexFmt->GetVertexStride(); @@ -144,9 +142,6 @@ void VertexManager::vFlush() PrepareDrawBuffers(stride); GL_REPORT_ERRORD(); - bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate - && bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24; - // Makes sure we can actually do Dual source blending bool dualSourcePossible = g_ActiveConfig.backend_info.bSupportsDualSourceBlend; @@ -177,10 +172,7 @@ void VertexManager::vFlush() g_nativeVertexFmt->SetupVertexPointers(); GL_REPORT_ERRORD(); - g_perf_query->EnableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP); Draw(stride); - g_perf_query->DisableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP); - //ERROR_LOG(VIDEO, "PerfQuery result: %d", g_perf_query->GetQueryResult(bpmem.zcontrol.early_ztest ? PQ_ZCOMP_OUTPUT_ZCOMPLOC : PQ_ZCOMP_OUTPUT)); // run through vertex groups again to set alpha if (useDstAlpha && !dualSourcePossible) @@ -200,7 +192,6 @@ void VertexManager::vFlush() if (bpmem.blendmode.blendenable || bpmem.blendmode.subtract) glEnable(GL_BLEND); } - GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true); #if defined(_DEBUG) || defined(DEBUGFAST) if (g_ActiveConfig.iLog & CONF_SAVESHADERS) diff --git a/Source/Core/VideoBackends/OGL/VertexManager.h b/Source/Core/VideoBackends/OGL/VertexManager.h index db0573e8f6..ded0ff2796 100644 --- a/Source/Core/VideoBackends/OGL/VertexManager.h +++ b/Source/Core/VideoBackends/OGL/VertexManager.h @@ -43,7 +43,7 @@ protected: virtual void ResetBuffer(u32 stride); private: void Draw(u32 stride); - void vFlush() override; + void vFlush(bool useDstAlpha) override; void PrepareDrawBuffers(u32 stride); NativeVertexFormat *m_CurrentVertexFmt; }; diff --git a/Source/Core/VideoBackends/OGL/main.cpp b/Source/Core/VideoBackends/OGL/main.cpp index ba7f1a0689..184b56724d 100644 --- a/Source/Core/VideoBackends/OGL/main.cpp +++ b/Source/Core/VideoBackends/OGL/main.cpp @@ -97,7 +97,7 @@ std::string VideoBackend::GetName() std::string VideoBackend::GetDisplayName() { - if (g_renderer && GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGLES3) + if (GLInterface != nullptr && GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGLES3) return "OpenGLES"; else return "OpenGL"; |
