7 changes: 3 additions & 4 deletions Source/Core/VideoBackends/OGL/Render.h
Expand Up @@ -46,14 +46,15 @@ class Renderer : public ::Renderer

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;
void SetDitherMode() override;
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 {}
Expand All @@ -70,14 +71,12 @@ class Renderer : public ::Renderer

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:
Expand Down
11 changes: 1 addition & 10 deletions Source/Core/VideoBackends/OGL/VertexManager.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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();
Expand All @@ -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;

Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/OGL/VertexManager.h
Expand Up @@ -43,7 +43,7 @@ class VertexManager : public ::VertexManager
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;
};
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/OGL/main.cpp
Expand Up @@ -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";
Expand Down
3 changes: 1 addition & 2 deletions Source/Core/VideoCommon/BPFunctions.cpp
Expand Up @@ -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()
Expand Down
3 changes: 2 additions & 1 deletion Source/Core/VideoCommon/BPStructs.cpp
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoCommon/MainBase.cpp
Expand Up @@ -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);
}
}
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoCommon/PerfQueryBase.cpp
Expand Up @@ -3,7 +3,7 @@

PerfQueryBase* g_perf_query = 0;

bool PerfQueryBase::ShouldEmulate() const
bool PerfQueryBase::ShouldEmulate()
{
return g_ActiveConfig.bPerfQueriesEnable;
}
2 changes: 1 addition & 1 deletion Source/Core/VideoCommon/PerfQueryBase.h
Expand Up @@ -29,7 +29,7 @@ class PerfQueryBase

// 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) {}
Expand Down
22 changes: 18 additions & 4 deletions Source/Core/VideoCommon/RenderBase.cpp
Expand Up @@ -30,6 +30,9 @@
#include "XFMemory.h"
#include "FifoPlayer/FifoRecorder.h"
#include "AVIDump.h"
#include "Debugger.h"
#include "Statistics.h"
#include "Core.h"

#include <cmath>
#include <string>
Expand Down Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -509,8 +512,19 @@ void Renderer::RecordVideoMemory()
FifoRecorder::GetInstance().SetVideoMemory(bpMem, cpMem, xfMem, xfRegs, sizeof(XFRegisters) / 4);
}

void UpdateViewport()
void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc, float Gamma)
{
if (xfregs.viewport.wd != 0 && xfregs.viewport.ht != 0)
g_renderer->UpdateViewport();
// 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;
}
9 changes: 4 additions & 5 deletions Source/Core/VideoCommon/RenderBase.h
Expand Up @@ -49,14 +49,15 @@ class Renderer

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;
virtual void SetDitherMode() = 0;
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;
Expand Down Expand Up @@ -105,9 +106,8 @@ class Renderer
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;

virtual void UpdateViewport() = 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;

Expand Down Expand Up @@ -160,4 +160,3 @@ class Renderer

extern Renderer *g_renderer;

void UpdateViewport();
14 changes: 12 additions & 2 deletions Source/Core/VideoCommon/VertexManagerBase.cpp
Expand Up @@ -11,6 +11,8 @@
#include "RenderBase.h"
#include "BPStructs.h"
#include "XFMemory.h"
#include "Debugger.h"
#include "PerfQueryBase.h"

#include "VertexManagerBase.h"
#include "MainBase.h"
Expand Down Expand Up @@ -216,8 +218,16 @@ void VertexManager::Flush()
VertexShaderManager::SetConstants();
PixelShaderManager::SetConstants();

// TODO: need to merge more stuff into VideoCommon
g_vertex_manager->vFlush();
bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate
&& bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24;

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);

IsFlushed = true;
}
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoCommon/VertexManagerBase.h
Expand Up @@ -58,7 +58,7 @@ class VertexManager

//virtual void Draw(u32 stride, bool alphapass) = 0;
// temp
virtual void vFlush() = 0;
virtual void vFlush(bool useDstAlpha) = 0;
};

extern VertexManager *g_vertex_manager;
5 changes: 2 additions & 3 deletions Source/Core/VideoCommon/VertexShaderManager.cpp
Expand Up @@ -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]);
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
g_renderer->SetViewport();

// Update projection if the viewport isn't 1:1 useable
if(!g_ActiveConfig.backend_info.bSupportsOversizedViewports)
Expand Down