summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends
diff options
context:
space:
mode:
authorTony Wasserka <neobrainx@gmail.com>2014-02-16 22:08:28 +0100
committerTony Wasserka <neobrainx@gmail.com>2014-02-16 22:08:28 +0100
commitde5bfd0bced8b12811d461b8e6683effa6b672fb (patch)
treedc1209fbb812f995c831583c314a01506a099a89 /Source/Core/VideoBackends
parent2a7a94387ca0e096f698c0468307bfe6b1d365d7 (diff)
parent647aad0a19acc2a7bcb637160bb43d794771ed41 (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.cpp21
-rw-r--r--Source/Core/VideoBackends/D3D/Render.cpp30
-rw-r--r--Source/Core/VideoBackends/D3D/Render.h7
-rw-r--r--Source/Core/VideoBackends/D3D/VertexManager.cpp9
-rw-r--r--Source/Core/VideoBackends/D3D/VertexManager.h2
-rw-r--r--Source/Core/VideoBackends/OGL/PerfQuery.cpp21
-rw-r--r--Source/Core/VideoBackends/OGL/Render.cpp24
-rw-r--r--Source/Core/VideoBackends/OGL/Render.h7
-rw-r--r--Source/Core/VideoBackends/OGL/VertexManager.cpp11
-rw-r--r--Source/Core/VideoBackends/OGL/VertexManager.h2
-rw-r--r--Source/Core/VideoBackends/OGL/main.cpp2
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";