diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 17ad6bfaf..ab765d9a3 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -51,11 +51,26 @@ namespace dxvk { m_defaultMsState.minSampleShading = 0.0f; m_context->setMultisampleState(m_defaultMsState); - m_defaultCbState = new DxvkBlendState( - VK_FALSE, VK_LOGIC_OP_CLEAR, 0, nullptr); + DxvkLogicOpState loState; + loState.enableLogicOp = VK_FALSE; + loState.logicOp = VK_LOGIC_OP_CLEAR; + m_context->setLogicOpState(loState); + + m_defaultBlendMode.enableBlending = VK_FALSE; + m_defaultBlendMode.colorSrcFactor = VK_BLEND_FACTOR_ONE; + m_defaultBlendMode.colorDstFactor = VK_BLEND_FACTOR_ZERO; + m_defaultBlendMode.colorBlendOp = VK_BLEND_OP_ADD; + m_defaultBlendMode.alphaSrcFactor = VK_BLEND_FACTOR_ONE; + m_defaultBlendMode.alphaDstFactor = VK_BLEND_FACTOR_ZERO; + m_defaultBlendMode.alphaBlendOp = VK_BLEND_OP_ADD; + m_defaultBlendMode.writeMask = VK_COLOR_COMPONENT_R_BIT + | VK_COLOR_COMPONENT_G_BIT + | VK_COLOR_COMPONENT_B_BIT + | VK_COLOR_COMPONENT_A_BIT; + + for (uint32_t i = 0; i < DxvkLimits::MaxNumRenderTargets; i++) + m_context->setBlendMode(i, m_defaultBlendMode); - m_context->setDepthStencilState(m_defaultDsState); - m_context->setBlendState(m_defaultCbState); } diff --git a/src/d3d11/d3d11_context.h b/src/d3d11/d3d11_context.h index 53d65ff81..a69d61488 100644 --- a/src/d3d11/d3d11_context.h +++ b/src/d3d11/d3d11_context.h @@ -550,7 +550,7 @@ namespace dxvk { DxvkRasterizerState m_defaultRsState; DxvkDepthStencilState m_defaultDsState; DxvkMultisampleState m_defaultMsState; - Rc m_defaultCbState; + DxvkBlendMode m_defaultBlendMode; D3D11ContextState m_state; diff --git a/src/dxgi/dxgi_presenter.cpp b/src/dxgi/dxgi_presenter.cpp index c2c026319..ba7295b43 100644 --- a/src/dxgi/dxgi_presenter.cpp +++ b/src/dxgi/dxgi_presenter.cpp @@ -92,33 +92,36 @@ namespace dxvk { stencilOp.reference = 0; DxvkDepthStencilState dsState; - dsState.enableDepthTest = VK_FALSE; - dsState.enableDepthWrite = VK_FALSE; - dsState.enableDepthBounds = VK_FALSE; - dsState.enableStencilTest = VK_FALSE; - dsState.depthCompareOp = VK_COMPARE_OP_ALWAYS; - dsState.stencilOpFront = stencilOp; - dsState.stencilOpBack = stencilOp; - dsState.depthBoundsMin = 0.0f; - dsState.depthBoundsMax = 1.0f; + dsState.enableDepthTest = VK_FALSE; + dsState.enableDepthWrite = VK_FALSE; + dsState.enableDepthBounds = VK_FALSE; + dsState.enableStencilTest = VK_FALSE; + dsState.depthCompareOp = VK_COMPARE_OP_ALWAYS; + dsState.stencilOpFront = stencilOp; + dsState.stencilOpBack = stencilOp; + dsState.depthBoundsMin = 0.0f; + dsState.depthBoundsMax = 1.0f; - VkPipelineColorBlendAttachmentState blendAttachment; - blendAttachment.blendEnable = VK_FALSE; - blendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; - blendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; - blendAttachment.colorBlendOp = VK_BLEND_OP_ADD; - blendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; - blendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; - blendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; - blendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT - | VK_COLOR_COMPONENT_G_BIT - | VK_COLOR_COMPONENT_B_BIT - | VK_COLOR_COMPONENT_A_BIT; + DxvkLogicOpState loState; + loState.enableLogicOp = VK_FALSE; + loState.logicOp = VK_LOGIC_OP_NO_OP; + m_context->setLogicOpState(loState); - m_context->setBlendState( - new DxvkBlendState( - VK_FALSE, VK_LOGIC_OP_NO_OP, - 1, &blendAttachment)); + DxvkBlendMode blendMode; + blendMode.enableBlending = VK_FALSE; + blendMode.colorSrcFactor = VK_BLEND_FACTOR_ONE; + blendMode.colorDstFactor = VK_BLEND_FACTOR_ZERO; + blendMode.colorBlendOp = VK_BLEND_OP_ADD; + blendMode.alphaSrcFactor = VK_BLEND_FACTOR_ONE; + blendMode.alphaDstFactor = VK_BLEND_FACTOR_ZERO; + blendMode.alphaBlendOp = VK_BLEND_OP_ADD; + blendMode.writeMask = VK_COLOR_COMPONENT_R_BIT + | VK_COLOR_COMPONENT_G_BIT + | VK_COLOR_COMPONENT_B_BIT + | VK_COLOR_COMPONENT_A_BIT; + + for (uint32_t i = 0; i < DxvkLimits::MaxNumRenderTargets; i++) + m_context->setBlendMode(i, blendMode); m_context->bindShader( VK_SHADER_STAGE_VERTEX_BIT, diff --git a/src/dxvk/dxvk_constant_state.cpp b/src/dxvk/dxvk_constant_state.cpp deleted file mode 100644 index 88ce00177..000000000 --- a/src/dxvk/dxvk_constant_state.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include - -#include "dxvk_constant_state.h" - -namespace dxvk { - - DxvkBlendState::DxvkBlendState( - VkBool32 enableLogicOp, - VkLogicOp logicOp, - uint32_t attachmentCount, - const VkPipelineColorBlendAttachmentState* attachmentState) { - // Copy the provided blend states into the array - for (uint32_t i = 0; i < attachmentCount; i++) - m_attachments.at(i) = attachmentState[i]; - - // Use default values for the remaining attachments - for (uint32_t i = attachmentCount; i < m_attachments.size(); i++) { - m_attachments.at(i).blendEnable = VK_FALSE; - m_attachments.at(i).srcColorBlendFactor = VK_BLEND_FACTOR_ONE; - m_attachments.at(i).dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; - m_attachments.at(i).colorBlendOp = VK_BLEND_OP_ADD; - m_attachments.at(i).srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; - m_attachments.at(i).dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; - m_attachments.at(i).alphaBlendOp = VK_BLEND_OP_ADD; - m_attachments.at(i).colorWriteMask = - VK_COLOR_COMPONENT_R_BIT - | VK_COLOR_COMPONENT_G_BIT - | VK_COLOR_COMPONENT_B_BIT - | VK_COLOR_COMPONENT_A_BIT; - } - - m_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; - m_info.pNext = nullptr; - m_info.flags = 0; - m_info.logicOpEnable = enableLogicOp; - m_info.logicOp = logicOp; - m_info.attachmentCount = m_attachments.size(); - m_info.pAttachments = m_attachments.data(); - - for (uint32_t i = 0; i < 4; i++) - m_info.blendConstants[i] = 0.0f; - } - -} \ No newline at end of file diff --git a/src/dxvk/dxvk_constant_state.h b/src/dxvk/dxvk_constant_state.h index 3d948337c..7e09949fa 100644 --- a/src/dxvk/dxvk_constant_state.h +++ b/src/dxvk/dxvk_constant_state.h @@ -90,14 +90,14 @@ namespace dxvk { * Blend modes can be set separately for each attachment. */ struct DxvkBlendMode { - VkBool32 blendEnable; - VkBlendFactor srcColorBlendFactor; - VkBlendFactor dstColorBlendFactor; + VkBool32 enableBlending; + VkBlendFactor colorSrcFactor; + VkBlendFactor colorDstFactor; VkBlendOp colorBlendOp; - VkBlendFactor srcAlphaBlendFactor; - VkBlendFactor dstAlphaBlendFactor; + VkBlendFactor alphaSrcFactor; + VkBlendFactor alphaDstFactor; VkBlendOp alphaBlendOp; - VkColorComponentFlags colorWriteMask; + VkColorComponentFlags writeMask; }; @@ -141,9 +141,4 @@ namespace dxvk { std::array bindings; }; - - struct DxvkConstantStateObjects { - Rc blendState; - }; - } \ No newline at end of file diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index a56ba3968..b86cea90a 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -561,15 +561,25 @@ namespace dxvk { gpState.dsDepthBoundsMin = m_state.ds.depthBoundsMin; gpState.dsDepthBoundsMax = m_state.ds.depthBoundsMax; - const auto& om = m_state.co.blendState->info(); - gpState.omEnableLogicOp = om.logicOpEnable; - gpState.omLogicOp = om.logicOp; + gpState.omEnableLogicOp = m_state.lo.enableLogicOp; + gpState.omLogicOp = m_state.lo.logicOp; gpState.omRenderPass = m_state.om.framebuffer->renderPass(); const auto& rt = m_state.om.framebuffer->renderTargets(); + for (uint32_t i = 0; i < DxvkLimits::MaxNumRenderTargets; i++) { - if (rt.getColorTarget(i) != nullptr) - gpState.omBlendAttachments[i] = om.pAttachments[i]; + if (rt.getColorTarget(i) != nullptr) { + const DxvkBlendMode& mode = m_state.om.blendModes.at(i); + + gpState.omBlendAttachments[i].blendEnable = mode.enableBlending; + gpState.omBlendAttachments[i].srcColorBlendFactor = mode.colorSrcFactor; + gpState.omBlendAttachments[i].dstColorBlendFactor = mode.colorDstFactor; + gpState.omBlendAttachments[i].colorBlendOp = mode.colorBlendOp; + gpState.omBlendAttachments[i].srcAlphaBlendFactor = mode.alphaSrcFactor; + gpState.omBlendAttachments[i].dstAlphaBlendFactor = mode.alphaDstFactor; + gpState.omBlendAttachments[i].alphaBlendOp = mode.alphaBlendOp; + gpState.omBlendAttachments[i].colorWriteMask = mode.writeMask; + } } m_cmd->cmdBindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, diff --git a/src/dxvk/dxvk_context_state.h b/src/dxvk/dxvk_context_state.h index 849049654..7d1d319d7 100644 --- a/src/dxvk/dxvk_context_state.h +++ b/src/dxvk/dxvk_context_state.h @@ -93,15 +93,13 @@ namespace dxvk { struct DxvkContextState { DxvkInputAssemblyState ia; DxvkInputLayout il; + DxvkVertexInputState vi; + DxvkViewportState vp; DxvkRasterizerState rs; DxvkMultisampleState ms; DxvkDepthStencilState ds; DxvkLogicOpState lo; - - DxvkVertexInputState vi; - DxvkViewportState vp; DxvkOutputMergerState om; - DxvkConstantStateObjects co; DxvkGraphicsPipelineState gp; DxvkComputePipelineState cp; diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index b8a0098bb..27936330c 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -4,7 +4,6 @@ dxvk_src = files([ 'dxvk_buffer.cpp', 'dxvk_cmdlist.cpp', 'dxvk_compute.cpp', - 'dxvk_constant_state.cpp', 'dxvk_context.cpp', 'dxvk_data.cpp', 'dxvk_descriptor.cpp', diff --git a/tests/dxvk/test_dxvk_triangle.cpp b/tests/dxvk/test_dxvk_triangle.cpp index 2ffe42dc7..44ac11a59 100644 --- a/tests/dxvk/test_dxvk_triangle.cpp +++ b/tests/dxvk/test_dxvk_triangle.cpp @@ -120,10 +120,26 @@ public: dsState.depthBoundsMax = 1.0f; m_dxvkContext->setDepthStencilState(dsState); - m_dxvkContext->setBlendState( - new DxvkBlendState( - VK_FALSE, VK_LOGIC_OP_COPY, - 0, nullptr)); + DxvkLogicOpState loState; + loState.enableLogicOp = VK_FALSE; + loState.logicOp = VK_LOGIC_OP_NO_OP; + m_dxvkContext->setLogicOpState(loState); + + DxvkBlendMode blendMode; + blendMode.enableBlending = VK_FALSE; + blendMode.colorSrcFactor = VK_BLEND_FACTOR_ONE; + blendMode.colorDstFactor = VK_BLEND_FACTOR_ZERO; + blendMode.colorBlendOp = VK_BLEND_OP_ADD; + blendMode.alphaSrcFactor = VK_BLEND_FACTOR_ONE; + blendMode.alphaDstFactor = VK_BLEND_FACTOR_ZERO; + blendMode.alphaBlendOp = VK_BLEND_OP_ADD; + blendMode.writeMask = VK_COLOR_COMPONENT_R_BIT + | VK_COLOR_COMPONENT_G_BIT + | VK_COLOR_COMPONENT_B_BIT + | VK_COLOR_COMPONENT_A_BIT; + + for (uint32_t i = 0; i < DxvkLimits::MaxNumRenderTargets; i++) + m_dxvkContext->setBlendMode(i, blendMode); m_dxvkVertexShader = m_dxvkDevice->createShader( VK_SHADER_STAGE_VERTEX_BIT, 0, nullptr,