From 9cb0d6d6103746dccedadfa874154e3193c5f8f3 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 30 Jul 2022 23:14:31 +0200 Subject: [PATCH] [dxvk] Make fragment shader state usable with lookup tables --- src/dxvk/dxvk_graphics.cpp | 59 ++++++++++++++++++++++++++++++++++++++ src/dxvk/dxvk_graphics.h | 4 +++ 2 files changed, 63 insertions(+) diff --git a/src/dxvk/dxvk_graphics.cpp b/src/dxvk/dxvk_graphics.cpp index 08f1b5e7b..c79bee70e 100644 --- a/src/dxvk/dxvk_graphics.cpp +++ b/src/dxvk/dxvk_graphics.cpp @@ -542,6 +542,65 @@ namespace dxvk { } + bool DxvkGraphicsPipelineFragmentShaderState::eq(const DxvkGraphicsPipelineFragmentShaderState& other) const { + bool eq = dsInfo.depthTestEnable == other.dsInfo.depthTestEnable + && dsInfo.depthBoundsTestEnable == other.dsInfo.depthBoundsTestEnable + && dsInfo.stencilTestEnable == other.dsInfo.stencilTestEnable; + + if (eq && dsInfo.depthTestEnable) { + eq = dsInfo.depthWriteEnable == other.dsInfo.depthWriteEnable + && dsInfo.depthCompareOp == other.dsInfo.depthCompareOp; + } + + if (eq && dsInfo.stencilTestEnable) { + eq = dsInfo.front.failOp == other.dsInfo.front.failOp + && dsInfo.front.passOp == other.dsInfo.front.passOp + && dsInfo.front.depthFailOp == other.dsInfo.front.depthFailOp + && dsInfo.front.compareOp == other.dsInfo.front.compareOp + && dsInfo.front.compareMask == other.dsInfo.front.compareMask + && dsInfo.front.writeMask == other.dsInfo.front.writeMask + && dsInfo.back.failOp == other.dsInfo.back.failOp + && dsInfo.back.passOp == other.dsInfo.back.passOp + && dsInfo.back.depthFailOp == other.dsInfo.back.depthFailOp + && dsInfo.back.compareOp == other.dsInfo.back.compareOp + && dsInfo.back.compareMask == other.dsInfo.back.compareMask + && dsInfo.back.writeMask == other.dsInfo.back.writeMask; + } + + return eq; + } + + + size_t DxvkGraphicsPipelineFragmentShaderState::hash() const { + DxvkHashState hash; + hash.add(dsInfo.depthTestEnable); + hash.add(dsInfo.depthBoundsTestEnable); + hash.add(dsInfo.stencilTestEnable); + + if (dsInfo.depthTestEnable) { + hash.add(dsInfo.depthWriteEnable); + hash.add(dsInfo.depthCompareOp); + } + + if (dsInfo.stencilTestEnable) { + hash.add(dsInfo.front.failOp); + hash.add(dsInfo.front.passOp); + hash.add(dsInfo.front.depthFailOp); + hash.add(dsInfo.front.compareOp); + hash.add(dsInfo.front.compareMask); + hash.add(dsInfo.front.writeMask); + hash.add(dsInfo.back.failOp); + hash.add(dsInfo.back.passOp); + hash.add(dsInfo.back.depthFailOp); + hash.add(dsInfo.back.compareOp); + hash.add(dsInfo.back.compareMask); + hash.add(dsInfo.back.writeMask); + } + + return hash; + } + + DxvkGraphicsPipeline::DxvkGraphicsPipeline( DxvkDevice* device, DxvkPipelineManager* pipeMgr, diff --git a/src/dxvk/dxvk_graphics.h b/src/dxvk/dxvk_graphics.h index 013fc91c3..58489c016 100644 --- a/src/dxvk/dxvk_graphics.h +++ b/src/dxvk/dxvk_graphics.h @@ -180,6 +180,10 @@ namespace dxvk { const DxvkGraphicsPipelineStateInfo& state); VkPipelineDepthStencilStateCreateInfo dsInfo = { VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO }; + + bool eq(const DxvkGraphicsPipelineFragmentShaderState& other) const; + + size_t hash() const; };