diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index e8a04fb3d..4e13dca8d 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -21,90 +21,4 @@ namespace dxvk { } - - VkClearValue D3D11DeviceContext::ConvertColorValue( - const FLOAT Color[4], - const DxvkFormatInfo* pFormatInfo) { - VkClearValue result; - - if (pFormatInfo->aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) { - for (uint32_t i = 0; i < 4; i++) { - if (pFormatInfo->flags.test(DxvkFormatFlag::SampledUInt)) - result.color.uint32[i] = uint32_t(std::max(0.0f, Color[i])); - else if (pFormatInfo->flags.test(DxvkFormatFlag::SampledSInt)) - result.color.int32[i] = int32_t(Color[i]); - else - result.color.float32[i] = Color[i]; - } - } else { - result.depthStencil.depth = Color[0]; - result.depthStencil.stencil = 0; - } - - return result; - } - - - void D3D11DeviceContext::InitDefaultPrimitiveTopology( - DxvkInputAssemblyState* pIaState) { - pIaState->primitiveTopology = VK_PRIMITIVE_TOPOLOGY_MAX_ENUM; - pIaState->primitiveRestart = VK_FALSE; - pIaState->patchVertexCount = 0; - } - - - void D3D11DeviceContext::InitDefaultRasterizerState( - DxvkRasterizerState* pRsState) { - pRsState->polygonMode = VK_POLYGON_MODE_FILL; - pRsState->cullMode = VK_CULL_MODE_BACK_BIT; - pRsState->frontFace = VK_FRONT_FACE_CLOCKWISE; - pRsState->depthClipEnable = VK_TRUE; - pRsState->depthBiasEnable = VK_FALSE; - pRsState->conservativeMode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT; - pRsState->sampleCount = 0; - } - - - void D3D11DeviceContext::InitDefaultDepthStencilState( - DxvkDepthStencilState* pDsState) { - VkStencilOpState stencilOp; - stencilOp.failOp = VK_STENCIL_OP_KEEP; - stencilOp.passOp = VK_STENCIL_OP_KEEP; - stencilOp.depthFailOp = VK_STENCIL_OP_KEEP; - stencilOp.compareOp = VK_COMPARE_OP_ALWAYS; - stencilOp.compareMask = D3D11_DEFAULT_STENCIL_READ_MASK; - stencilOp.writeMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; - stencilOp.reference = 0; - - pDsState->enableDepthTest = VK_TRUE; - pDsState->enableDepthWrite = VK_TRUE; - pDsState->enableStencilTest = VK_FALSE; - pDsState->depthCompareOp = VK_COMPARE_OP_LESS; - pDsState->stencilOpFront = stencilOp; - pDsState->stencilOpBack = stencilOp; - } - - - void D3D11DeviceContext::InitDefaultBlendState( - DxvkBlendMode* pCbState, - DxvkLogicOpState* pLoState, - DxvkMultisampleState* pMsState, - UINT SampleMask) { - pCbState->enableBlending = VK_FALSE; - pCbState->colorSrcFactor = VK_BLEND_FACTOR_ONE; - pCbState->colorDstFactor = VK_BLEND_FACTOR_ZERO; - pCbState->colorBlendOp = VK_BLEND_OP_ADD; - pCbState->alphaSrcFactor = VK_BLEND_FACTOR_ONE; - pCbState->alphaDstFactor = VK_BLEND_FACTOR_ZERO; - pCbState->alphaBlendOp = VK_BLEND_OP_ADD; - pCbState->writeMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT - | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; - - pLoState->enableLogicOp = VK_FALSE; - pLoState->logicOp = VK_LOGIC_OP_NO_OP; - - pMsState->sampleMask = SampleMask; - pMsState->enableAlphaToCoverage = VK_FALSE; - } - } diff --git a/src/d3d11/d3d11_context.h b/src/d3d11/d3d11_context.h index edf6f877e..f884ac398 100644 --- a/src/d3d11/d3d11_context.h +++ b/src/d3d11/d3d11_context.h @@ -27,49 +27,6 @@ namespace dxvk { ~D3D11DeviceContext(); - protected: - - VkClearValue ConvertColorValue( - const FLOAT Color[4], - const DxvkFormatInfo* pFormatInfo); - - static void InitDefaultPrimitiveTopology( - DxvkInputAssemblyState* pIaState); - - static void InitDefaultRasterizerState( - DxvkRasterizerState* pRsState); - - static void InitDefaultDepthStencilState( - DxvkDepthStencilState* pDsState); - - static void InitDefaultBlendState( - DxvkBlendMode* pCbState, - DxvkLogicOpState* pLoState, - DxvkMultisampleState* pMsState, - UINT SampleMask); - - template - const D3D11CommonShader* GetCommonShader(T* pShader) const { - return pShader != nullptr ? pShader->GetCommonShader() : nullptr; - } - - static uint32_t GetIndirectCommandStride(const D3D11CmdDrawIndirectData* cmdData, uint32_t offset, uint32_t minStride) { - if (likely(cmdData->stride)) - return cmdData->offset + cmdData->count * cmdData->stride == offset ? cmdData->stride : 0; - - uint32_t stride = offset - cmdData->offset; - return stride >= minStride && stride <= 32 ? stride : 0; - } - - static bool ValidateDrawBufferSize(ID3D11Buffer* pBuffer, UINT Offset, UINT Size) { - UINT bufferSize = 0; - - if (likely(pBuffer != nullptr)) - bufferSize = static_cast(pBuffer)->Desc()->ByteWidth; - - return bufferSize >= Offset + Size; - } - }; } diff --git a/src/d3d11/d3d11_context_common.cpp b/src/d3d11/d3d11_context_common.cpp index e6ae7410a..b4797c0e7 100644 --- a/src/d3d11/d3d11_context_common.cpp +++ b/src/d3d11/d3d11_context_common.cpp @@ -3540,6 +3540,30 @@ namespace dxvk { } + template + VkClearValue D3D11CommonContext::ConvertColorValue( + const FLOAT Color[4], + const DxvkFormatInfo* pFormatInfo) { + VkClearValue result; + + if (pFormatInfo->aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) { + for (uint32_t i = 0; i < 4; i++) { + if (pFormatInfo->flags.test(DxvkFormatFlag::SampledUInt)) + result.color.uint32[i] = uint32_t(std::max(0.0f, Color[i])); + else if (pFormatInfo->flags.test(DxvkFormatFlag::SampledSInt)) + result.color.int32[i] = int32_t(Color[i]); + else + result.color.float32[i] = Color[i]; + } + } else { + result.depthStencil.depth = Color[0]; + result.depthStencil.stencil = 0; + } + + return result; + } + + template void D3D11CommonContext::CopyBuffer( D3D11Buffer* pDstBuffer, @@ -4916,6 +4940,72 @@ namespace dxvk { } + template + void D3D11CommonContext::InitDefaultPrimitiveTopology( + DxvkInputAssemblyState* pIaState) { + pIaState->primitiveTopology = VK_PRIMITIVE_TOPOLOGY_MAX_ENUM; + pIaState->primitiveRestart = VK_FALSE; + pIaState->patchVertexCount = 0; + } + + + template + void D3D11CommonContext::InitDefaultRasterizerState( + DxvkRasterizerState* pRsState) { + pRsState->polygonMode = VK_POLYGON_MODE_FILL; + pRsState->cullMode = VK_CULL_MODE_BACK_BIT; + pRsState->frontFace = VK_FRONT_FACE_CLOCKWISE; + pRsState->depthClipEnable = VK_TRUE; + pRsState->depthBiasEnable = VK_FALSE; + pRsState->conservativeMode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT; + pRsState->sampleCount = 0; + } + + + template + void D3D11CommonContext::InitDefaultDepthStencilState( + DxvkDepthStencilState* pDsState) { + VkStencilOpState stencilOp; + stencilOp.failOp = VK_STENCIL_OP_KEEP; + stencilOp.passOp = VK_STENCIL_OP_KEEP; + stencilOp.depthFailOp = VK_STENCIL_OP_KEEP; + stencilOp.compareOp = VK_COMPARE_OP_ALWAYS; + stencilOp.compareMask = D3D11_DEFAULT_STENCIL_READ_MASK; + stencilOp.writeMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; + stencilOp.reference = 0; + + pDsState->enableDepthTest = VK_TRUE; + pDsState->enableDepthWrite = VK_TRUE; + pDsState->enableStencilTest = VK_FALSE; + pDsState->depthCompareOp = VK_COMPARE_OP_LESS; + pDsState->stencilOpFront = stencilOp; + pDsState->stencilOpBack = stencilOp; + } + + + template + void D3D11CommonContext::InitDefaultBlendState( + DxvkBlendMode* pCbState, + DxvkLogicOpState* pLoState, + DxvkMultisampleState* pMsState, + UINT SampleMask) { + pCbState->enableBlending = VK_FALSE; + pCbState->colorSrcFactor = VK_BLEND_FACTOR_ONE; + pCbState->colorDstFactor = VK_BLEND_FACTOR_ZERO; + pCbState->colorBlendOp = VK_BLEND_OP_ADD; + pCbState->alphaSrcFactor = VK_BLEND_FACTOR_ONE; + pCbState->alphaDstFactor = VK_BLEND_FACTOR_ZERO; + pCbState->alphaBlendOp = VK_BLEND_OP_ADD; + pCbState->writeMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT + | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; + + pLoState->enableLogicOp = VK_FALSE; + pLoState->logicOp = VK_LOGIC_OP_NO_OP; + + pMsState->sampleMask = SampleMask; + pMsState->enableAlphaToCoverage = VK_FALSE; + } + // Explicitly instantiate here template class D3D11CommonContext; template class D3D11CommonContext; diff --git a/src/d3d11/d3d11_context_common.h b/src/d3d11/d3d11_context_common.h index 1e8e98300..5e6a0488d 100644 --- a/src/d3d11/d3d11_context_common.h +++ b/src/d3d11/d3d11_context_common.h @@ -842,6 +842,10 @@ namespace dxvk { UINT CtrSlot, UINT Counter); + VkClearValue ConvertColorValue( + const FLOAT Color[4], + const DxvkFormatInfo* pFormatInfo); + void CopyBuffer( D3D11Buffer* pDstBuffer, VkDeviceSize DstOffset, @@ -1017,6 +1021,21 @@ namespace dxvk { ID3D11RenderTargetView* const* ppRenderTargetViews, ID3D11DepthStencilView* pDepthStencilView); + static void InitDefaultPrimitiveTopology( + DxvkInputAssemblyState* pIaState); + + static void InitDefaultRasterizerState( + DxvkRasterizerState* pRsState); + + static void InitDefaultDepthStencilState( + DxvkDepthStencilState* pDsState); + + static void InitDefaultBlendState( + DxvkBlendMode* pCbState, + DxvkLogicOpState* pLoState, + DxvkMultisampleState* pMsState, + UINT SampleMask); + template void EmitCs(Cmd&& command) { m_cmdData = nullptr; @@ -1054,6 +1073,28 @@ namespace dxvk { } } + template + const D3D11CommonShader* GetCommonShader(T* pShader) const { + return pShader != nullptr ? pShader->GetCommonShader() : nullptr; + } + + static uint32_t GetIndirectCommandStride(const D3D11CmdDrawIndirectData* cmdData, uint32_t offset, uint32_t minStride) { + if (likely(cmdData->stride)) + return cmdData->offset + cmdData->count * cmdData->stride == offset ? cmdData->stride : 0; + + uint32_t stride = offset - cmdData->offset; + return stride >= minStride && stride <= 32 ? stride : 0; + } + + static bool ValidateDrawBufferSize(ID3D11Buffer* pBuffer, UINT Offset, UINT Size) { + UINT bufferSize = 0; + + if (likely(pBuffer != nullptr)) + bufferSize = static_cast(pBuffer)->Desc()->ByteWidth; + + return bufferSize >= Offset + Size; + } + private: ContextType* GetTypedContext() {