diff --git a/src/dxvk/dxvk_graphics.cpp b/src/dxvk/dxvk_graphics.cpp index 58d984d16..63afdb51f 100644 --- a/src/dxvk/dxvk_graphics.cpp +++ b/src/dxvk/dxvk_graphics.cpp @@ -73,6 +73,9 @@ namespace dxvk { if (gs != nullptr && gs->hasCapability(spv::CapabilityTransformFeedback)) m_flags.set(DxvkGraphicsPipelineFlag::HasTransformFeedback); + if (m_layout->hasStorageDescriptors()) + m_flags.set(DxvkGraphicsPipelineFlag::HasStorageDescriptors); + m_common.msSampleShadingEnable = fs != nullptr && fs->hasCapability(spv::CapabilitySampleRateShading); m_common.msSampleShadingFactor = 1.0f; } diff --git a/src/dxvk/dxvk_graphics.h b/src/dxvk/dxvk_graphics.h index 128bec101..999ffce08 100644 --- a/src/dxvk/dxvk_graphics.h +++ b/src/dxvk/dxvk_graphics.h @@ -21,6 +21,7 @@ namespace dxvk { */ enum class DxvkGraphicsPipelineFlag { HasTransformFeedback, + HasStorageDescriptors, }; using DxvkGraphicsCommonPipelineFlags = Flags; diff --git a/src/dxvk/dxvk_pipelayout.h b/src/dxvk/dxvk_pipelayout.h index 6c8f1444f..185f0829f 100644 --- a/src/dxvk/dxvk_pipelayout.h +++ b/src/dxvk/dxvk_pipelayout.h @@ -217,6 +217,21 @@ namespace dxvk { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER); } + + /** + * \brief Checks whether buffers or images are written to + * + * It is assumed that storage images and buffers + * will be written to if they are present. Used + * for synchronization purposes. + */ + bool hasStorageDescriptors() const { + return m_descriptorTypes.any( + VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, + VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER); + } private: