From 2dd24a14d24c8baa31e1a6941a339648bf560293 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 20 Jan 2018 15:41:06 +0100 Subject: [PATCH] [dxvk] Refactored blend constants This will make things a little less painful when capturing blend constants in a lambda function, as required for CSMT. --- src/d3d11/d3d11_context.cpp | 10 +++++++--- src/dxvk/dxvk_constant_state.h | 11 +++++++++++ src/dxvk/dxvk_context.cpp | 6 +++--- src/dxvk/dxvk_context.h | 2 +- src/dxvk/dxvk_context_state.h | 4 ++-- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index d37aa5aa..cd9d3bf4 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -39,7 +39,9 @@ namespace dxvk { m_defaultRasterizerState = static_cast(defaultRasterizerState.ptr()); m_defaultRasterizerState->BindToContext(m_context); - m_context->setBlendConstants(m_state.om.blendFactor); + m_context->setBlendConstants(DxvkBlendConstants { + m_state.om.blendFactor[0], m_state.om.blendFactor[1], + m_state.om.blendFactor[2], m_state.om.blendFactor[3] }); m_context->setStencilReference(m_state.om.stencilRef); // Create a default sampler that we're going to bind @@ -1481,9 +1483,11 @@ namespace dxvk { blendState->BindToContext(m_context, SampleMask); } - if ((BlendFactor != nullptr) && (!std::memcmp(m_state.om.blendFactor, BlendFactor, 4 * sizeof(FLOAT)))) { + if (BlendFactor != nullptr) { std::memcpy(m_state.om.blendFactor, BlendFactor, 4 * sizeof(FLOAT)); - m_context->setBlendConstants(BlendFactor); + + m_context->setBlendConstants(DxvkBlendConstants { + BlendFactor[0], BlendFactor[1], BlendFactor[2], BlendFactor[3] }); } } diff --git a/src/dxvk/dxvk_constant_state.h b/src/dxvk/dxvk_constant_state.h index 5f14c296..ffda965c 100644 --- a/src/dxvk/dxvk_constant_state.h +++ b/src/dxvk/dxvk_constant_state.h @@ -8,6 +8,17 @@ namespace dxvk { + /** + * \brief Blend constants + * + * Stores a blend factor + * as an RGBA color value. + */ + struct DxvkBlendConstants { + float r, g, b, a; + }; + + /** * \brief Input assembly state * diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 91e9d98d..0929d3bb 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1002,9 +1002,9 @@ namespace dxvk { void DxvkContext::setBlendConstants( - const float blendConstants[4]) { + const DxvkBlendConstants& blendConstants) { for (uint32_t i = 0; i < 4; i++) - m_state.om.blendConstants[i] = blendConstants[i]; + m_state.om.blendConstants = blendConstants; this->updateBlendConstants(); } @@ -1400,7 +1400,7 @@ namespace dxvk { void DxvkContext::updateBlendConstants() { - m_cmd->cmdSetBlendConstants(m_state.om.blendConstants); + m_cmd->cmdSetBlendConstants(&m_state.om.blendConstants.r); } diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 008b40b9..d188d616 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -438,7 +438,7 @@ namespace dxvk { * \param [in] blendConstants Blend constants */ void setBlendConstants( - const float blendConstants[4]); + const DxvkBlendConstants& blendConstants); /** * \brief Sets stencil reference diff --git a/src/dxvk/dxvk_context_state.h b/src/dxvk/dxvk_context_state.h index 5943be32..198514d0 100644 --- a/src/dxvk/dxvk_context_state.h +++ b/src/dxvk/dxvk_context_state.h @@ -57,8 +57,8 @@ namespace dxvk { struct DxvkOutputMergerState { Rc framebuffer; - float blendConstants[4]; - uint32_t stencilReference; + DxvkBlendConstants blendConstants; + uint32_t stencilReference; };