From e439055a32818c2cd7cfefbad340832713bbdb05 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 30 Jan 2017 12:07:26 +0100 Subject: [PATCH] All: Only convert raster state if dirty --- GPU/Common/FramebufferCommon.cpp | 2 +- GPU/D3D11/FramebufferManagerD3D11.cpp | 8 ++++---- GPU/D3D11/StateMappingD3D11.cpp | 3 ++- GPU/D3D11/TextureCacheD3D11.cpp | 2 +- GPU/Directx9/StateMappingDX9.cpp | 3 ++- GPU/GLES/GPU_GLES.cpp | 4 ++++ GPU/GLES/StateMappingGLES.cpp | 4 +++- GPU/GPUCommon.cpp | 6 +++--- GPU/Vulkan/StateMappingVulkan.cpp | 3 ++- 9 files changed, 22 insertions(+), 13 deletions(-) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index 719e35bdc0..e66706cf32 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -780,7 +780,7 @@ void FramebufferManagerCommon::DrawFramebufferToOutput(const u8 *srcPixels, GEBu DrawActiveTexture(x, y, w, h, (float)pixelWidth_, (float)pixelHeight_, u0, v0, u1, v1, uvRotation, flags); } - gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE); + gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE); } void FramebufferManagerCommon::DownloadFramebufferOnSwitch(VirtualFramebuffer *vfb) { diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index d93184523c..336af4d1de 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -211,7 +211,7 @@ void FramebufferManagerD3D11::DisableState() { context_->OMSetBlendState(stockD3D11.blendStateDisabledWithColorMask[0xF], nullptr, 0xFFFFFFFF); context_->RSSetState(stockD3D11.rasterStateNoCull); context_->OMSetDepthStencilState(stockD3D11.depthStencilDisabled, 0xFF); - gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE); + gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE); } void FramebufferManagerD3D11::CompilePostShader() { @@ -433,7 +433,7 @@ void FramebufferManagerD3D11::DrawActiveTexture(float x, float y, float w, float UINT offset = 0; context_->IASetVertexBuffers(0, 1, &quadBuffer_, &stride, &offset); context_->Draw(4, 0); - gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE); + gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE); } void FramebufferManagerD3D11::Bind2DShader() { @@ -510,7 +510,7 @@ void FramebufferManagerD3D11::ReformatFramebufferFrom(VirtualFramebuffer *vfb, G } RebindFramebuffer(); - gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE); + gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE); } static void CopyPixelDepthOnly(u32 *dstp, const u32 *srcp, size_t c) { @@ -713,7 +713,7 @@ void FramebufferManagerD3D11::SimpleBlit( context_->IASetVertexBuffers(0, 1, &quadBuffer_, &stride, &offset); context_->Draw(4, 0); - gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE); + gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE); } void FramebufferManagerD3D11::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) { diff --git a/GPU/D3D11/StateMappingD3D11.cpp b/GPU/D3D11/StateMappingD3D11.cpp index 0c3de6efb0..a531369414 100644 --- a/GPU/D3D11/StateMappingD3D11.cpp +++ b/GPU/D3D11/StateMappingD3D11.cpp @@ -275,7 +275,8 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { } } - { + if (gstate_c.IsDirty(DIRTY_RASTER_STATE)) { + gstate_c.Clean(DIRTY_RASTER_STATE); keys_.raster.value = 0; if (gstate.isModeClear()) { keys_.raster.cullMode = D3D11_CULL_NONE; diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index bd950eadee..beef6bf027 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -394,7 +394,7 @@ public: context_->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); context_->IASetVertexBuffers(0, 1, &vbuffer_, &stride_, &offset_); context_->Draw(4, 0); - gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE); + gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE); } protected: diff --git a/GPU/Directx9/StateMappingDX9.cpp b/GPU/Directx9/StateMappingDX9.cpp index 84a6f77980..798f48ba87 100644 --- a/GPU/Directx9/StateMappingDX9.cpp +++ b/GPU/Directx9/StateMappingDX9.cpp @@ -198,7 +198,8 @@ void DrawEngineDX9::ApplyDrawState(int prim) { bool enableStencilTest = !g_Config.bDisableStencilTest; - { + if (gstate_c.IsDirty(DIRTY_RASTER_STATE)) { + gstate_c.Clean(DIRTY_RASTER_STATE); // Set Dither if (gstate.isDitherEnabled()) { dxstate.dither.enable(); diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index 2ecd7c4b40..4c7dc2a4cd 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -692,6 +692,8 @@ void GPU_GLES::Execute_Prim(u32 op, u32 diff) { void GPU_GLES::Execute_VertexType(u32 op, u32 diff) { if (diff & (GE_VTYPE_TC_MASK | GE_VTYPE_THROUGH_MASK)) { gstate_c.Dirty(DIRTY_UVSCALEOFFSET); + if (diff & GE_VTYPE_THROUGH_MASK) + gstate_c.Dirty(DIRTY_RASTER_STATE); } } @@ -711,6 +713,8 @@ void GPU_GLES::Execute_VertexTypeSkinning(u32 op, u32 diff) { gstate_c.deferredVertTypeDirty = 0; } } + if (diff & GE_VTYPE_THROUGH_MASK) + gstate_c.Dirty(DIRTY_RASTER_STATE); } void GPU_GLES::Execute_Bezier(u32 op, u32 diff) { diff --git a/GPU/GLES/StateMappingGLES.cpp b/GPU/GLES/StateMappingGLES.cpp index 6c180eb169..5feb0185b6 100644 --- a/GPU/GLES/StateMappingGLES.cpp +++ b/GPU/GLES/StateMappingGLES.cpp @@ -253,7 +253,9 @@ void DrawEngineGLES::ApplyDrawState(int prim) { } } - { + if (gstate_c.IsDirty(DIRTY_RASTER_STATE)) { + gstate_c.Clean(DIRTY_RASTER_STATE); + // Dither if (gstate.isDitherEnabled()) { glstate.dither.enable(); diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 37c246d40a..ab8f099f60 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -94,9 +94,9 @@ const CommonCommandTableEntry commonCommandTable[] = { // Simple render state changes. Handled in StateMapping.cpp. { GE_CMD_OFFSETX, FLAG_FLUSHBEFOREONCHANGE }, { GE_CMD_OFFSETY, FLAG_FLUSHBEFOREONCHANGE }, - { GE_CMD_CULL, FLAG_FLUSHBEFOREONCHANGE }, - { GE_CMD_CULLFACEENABLE, FLAG_FLUSHBEFOREONCHANGE }, - { GE_CMD_DITHERENABLE, FLAG_FLUSHBEFOREONCHANGE }, + { GE_CMD_CULL, FLAG_FLUSHBEFOREONCHANGE, DIRTY_RASTER_STATE }, + { GE_CMD_CULLFACEENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_RASTER_STATE }, + { GE_CMD_DITHERENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_RASTER_STATE }, { GE_CMD_STENCILOP, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE }, { GE_CMD_STENCILTESTENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE }, { GE_CMD_ALPHABLENDENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE }, diff --git a/GPU/Vulkan/StateMappingVulkan.cpp b/GPU/Vulkan/StateMappingVulkan.cpp index 1c595d6148..27db7e543a 100644 --- a/GPU/Vulkan/StateMappingVulkan.cpp +++ b/GPU/Vulkan/StateMappingVulkan.cpp @@ -234,7 +234,8 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag } } - { + if (gstate_c.IsDirty(DIRTY_RASTER_STATE)) { + gstate_c.Clean(DIRTY_RASTER_STATE); if (gstate.isModeClear()) { key.cullMode = VK_CULL_MODE_NONE; } else {