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