diff --git a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp index 796d4e17e3..0d4b5d6a90 100644 --- a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp +++ b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp @@ -1374,7 +1374,7 @@ void GSDevice11::PresentRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* cb.SetSource(sRect, sTex->GetSize()); cb.SetTarget(dRect, ds); cb.SetTime(shaderTime); - m_ctx->UpdateSubresource(m_present.ps_cb.get(), 0, nullptr, &cb, 0, 0); + UpdateSubresource(m_present.ps_cb.get(), &cb, &m_present.cb_uniforms, sizeof(cb)); // om @@ -1425,7 +1425,7 @@ void GSDevice11::UpdateCLUTTexture(GSTexture* sTex, float sScale, u32 offsetX, u u32 offsetX, offsetY, dOffset; }; const Uniforms cb = {sScale, {}, offsetX, offsetY, dOffset}; - m_ctx->UpdateSubresource(m_merge.cb.get(), 0, nullptr, &cb, 0, 0); + UpdateSubresource(m_merge.cb.get(), &cb, &m_merge.cb_uniforms, sizeof(cb)); const GSVector4 dRect(0, 0, dSize, 1); const ShaderConvert shader = (dSize == 16) ? ShaderConvert::CLUT_4 : ShaderConvert::CLUT_8; @@ -1443,7 +1443,7 @@ void GSDevice11::ConvertToIndexedTexture(GSTexture* sTex, float sScale, u32 offs }; const Uniforms cb = {sScale, {}, SBW, DBW, SPSM}; - m_ctx->UpdateSubresource(m_merge.cb.get(), 0, nullptr, &cb, 0, 0); + UpdateSubresource(m_merge.cb.get(), &cb, &m_merge.cb_uniforms, sizeof(cb)); const GSVector4 dRect(0, 0, dTex->GetWidth(), dTex->GetHeight()); const ShaderConvert shader = ((SPSM & 0xE) == 0) ? ShaderConvert::RGBA_TO_8I : ShaderConvert::RGB5A1_TO_8I; @@ -1464,7 +1464,7 @@ void GSDevice11::FilteredDownsampleTexture(GSTexture* sTex, GSTexture* dTex, u32 const Uniforms cb = { static_cast(downsample_factor * downsample_factor), (GSConfig.UserHacks_NativeScaling > GSNativeScaling::Aggressive) ? 2.0f : 1.0f, {}, clamp_min, static_cast(downsample_factor), 0}; - m_ctx->UpdateSubresource(m_merge.cb.get(), 0, nullptr, &cb, 0, 0); + UpdateSubresource(m_merge.cb.get(), &cb, &m_merge.cb_uniforms, sizeof(cb)); const ShaderConvert shader = ShaderConvert::DOWNSAMPLE_COPY; DoStretchRect(sTex, GSVector4::zero(), dTex, dRect, m_convert.ps[static_cast(shader)].get(), m_merge.cb.get(), nullptr, false); @@ -1556,7 +1556,6 @@ void GSDevice11::DoMultiStretchRects(const MultiStretchRect* rects, u32 num_rect DrawIndexedPrimitive(); } - void GSDevice11::DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, u32 c, const bool linear) { const GSVector4 full_r(0.0f, 0.0f, 1.0f, 1.0f); @@ -1573,7 +1572,7 @@ void GSDevice11::DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, if (feedback_write_2 || feedback_write_1 || sTex[0]) { const MergeConstantBuffer cb = {GSVector4::unorm8(c), EXTBUF.EMODA, EXTBUF.EMODC}; - m_ctx->UpdateSubresource(m_merge.cb.get(), 0, nullptr, &cb, 0, 0); + UpdateSubresource(m_merge.cb.get(), &cb, &m_merge.cb_uniforms, sizeof(cb)); } if (sTex[1] && (PMODE.SLBG == 0 || feedback_write_2_but_blend_bg)) @@ -1609,7 +1608,7 @@ void GSDevice11::DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, void GSDevice11::DoInterlace(GSTexture* sTex, const GSVector4& sRect, GSTexture* dTex, const GSVector4& dRect, ShaderInterlace shader, bool linear, const InterlaceConstantBuffer& cb) { - m_ctx->UpdateSubresource(m_interlace.cb.get(), 0, nullptr, &cb, 0, 0); + UpdateSubresource(m_interlace.cb.get(), &cb, &m_interlace.cb_uniforms, sizeof(cb)); DoStretchRect(sTex, sRect, dTex, dRect, m_interlace.ps[static_cast(shader)].get(), m_interlace.cb.get(), linear); } @@ -1647,7 +1646,7 @@ void GSDevice11::DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float para const GSVector4 sRect(0, 0, 1, 1); const GSVector4 dRect(0, 0, s.x, s.y); - m_ctx->UpdateSubresource(m_shadeboost.cb.get(), 0, nullptr, params, 0, 0); + UpdateSubresource(m_shadeboost.cb.get(), ¶ms, &m_shadeboost.cb_uniforms, sizeof(float) * 4); DoStretchRect(sTex, sRect, dTex, dRect, m_shadeboost.ps.get(), m_shadeboost.cb.get(), false); } @@ -2059,7 +2058,7 @@ void GSDevice11::RenderImGui() const float B = static_cast(m_window_info.surface_height); // clang-format off - const float ortho_projection[4][4] = + const float ortho_projection[4][4] = { { 2.0f/(R-L), 0.0f, 0.0f, 0.0f }, { 0.0f, 2.0f/(T-B), 0.0f, 0.0f }, @@ -2068,7 +2067,7 @@ void GSDevice11::RenderImGui() }; // clang-format on - m_ctx->UpdateSubresource(m_imgui.vs_cb.get(), 0, nullptr, ortho_projection, 0, 0); + UpdateSubresource(m_imgui.vs_cb.get(), &ortho_projection, &m_imgui.vs_cb_uniforms, sizeof(ortho_projection)); const UINT vb_stride = sizeof(ImDrawVert); const UINT vb_offset = 0; @@ -2558,6 +2557,15 @@ void GSDevice11::SetScissor(const GSVector4i& scissor) } } +void GSDevice11::UpdateSubresource(ID3D11Buffer* buffer, const void* cb_uniforms, void* cached_cb_uniforms, size_t cb_uniforms_size) +{ + if (memcmp(cb_uniforms, cached_cb_uniforms, cb_uniforms_size) != 0) + { + memcpy(cached_cb_uniforms, cb_uniforms, cb_uniforms_size); + m_ctx->UpdateSubresource(buffer, 0, nullptr, cached_cb_uniforms, 0, 0); + } +} + void GSDevice11::ShaderMacro::AddMacro(const char* n, int d) { AddMacro(n, std::to_string(d)); diff --git a/pcsx2/GS/Renderers/DX11/GSDevice11.h b/pcsx2/GS/Renderers/DX11/GSDevice11.h index 761646e52b..f0a80d440e 100644 --- a/pcsx2/GS/Renderers/DX11/GSDevice11.h +++ b/pcsx2/GS/Renderers/DX11/GSDevice11.h @@ -189,6 +189,7 @@ private: wil::com_ptr_nothrow vs; wil::com_ptr_nothrow ps[static_cast(PresentShader::Count)]; wil::com_ptr_nothrow ps_cb; + DisplayConstantBuffer cb_uniforms{}; } m_present; struct @@ -196,12 +197,14 @@ private: wil::com_ptr_nothrow ps[2]; wil::com_ptr_nothrow cb; wil::com_ptr_nothrow bs; + MergeConstantBuffer cb_uniforms{}; } m_merge; struct { wil::com_ptr_nothrow ps[NUM_INTERLACE_SHADERS]; wil::com_ptr_nothrow cb; + float cb_uniforms[4]{}; } m_interlace; wil::com_ptr_nothrow m_fxaa_ps; @@ -210,6 +213,7 @@ private: { wil::com_ptr_nothrow ps; wil::com_ptr_nothrow cb; + float cb_uniforms[4]{}; } m_shadeboost; struct @@ -233,6 +237,7 @@ private: wil::com_ptr_nothrow ps; wil::com_ptr_nothrow bs; wil::com_ptr_nothrow vs_cb; + float vs_cb_uniforms[4][4]{}; } m_imgui; // Shaders... @@ -340,6 +345,8 @@ public: void SetViewport(const GSVector2i& viewport); void SetScissor(const GSVector4i& scissor); + void UpdateSubresource(ID3D11Buffer* buffer, const void* cb_uniforms, void* cached_cb_uniforms, size_t cb_uniforms_size); + void SetupVS(VSSelector sel, const GSHWDrawConfig::VSConstantBuffer* cb); void SetupPS(const PSSelector& sel, const GSHWDrawConfig::PSConstantBuffer* cb, PSSamplerSelector ssel); void SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, u8 afix);