diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index e90378fae..0d9336849 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -349,6 +349,13 @@ namespace dxvk { extensionsEnabled.merge(m_extraExtensions); DxvkNameList extensionNameList = extensionsEnabled.toNameList(); + // Always enable robust buffer access + enabledFeatures.core.features.robustBufferAccess = VK_TRUE; + + // Enable variable multisample rate if supported + enabledFeatures.core.features.variableMultisampleRate = + m_deviceFeatures.core.features.variableMultisampleRate; + // Optionally used by some client API extensions enabledFeatures.vk12.drawIndirectCount = m_deviceFeatures.vk12.drawIndirectCount; diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 1bb99be28..b79e47717 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -54,6 +54,13 @@ namespace dxvk { // that we don't have to scan device features at draw time if (m_device->mustTrackPipelineLifetime()) m_features.set(DxvkContextFeature::TrackGraphicsPipeline); + + // Variable multisample rate is needed to efficiently support + // rendering without bound render targets, otherwise we may + // have to interrupt the current render pass whenever the + // requested rasterizer sample count changes + if (m_device->features().core.features.variableMultisampleRate) + m_features.set(DxvkContextFeature::VariableMultisampleRate); } @@ -2458,6 +2465,11 @@ namespace dxvk { m_flags.set(DxvkContextFlag::GpDirtyRasterizerState); } + if (unlikely(!m_features.test(DxvkContextFeature::VariableMultisampleRate))) { + if (rs.sampleCount != m_state.gp.state.rs.sampleCount()) + m_flags.set(DxvkContextFlag::GpDirtyFramebuffer); + } + DxvkRsInfo rsInfo( rs.depthClipEnable, rs.depthBiasEnable, diff --git a/src/dxvk/dxvk_context_state.h b/src/dxvk/dxvk_context_state.h index c13d996ca..922d2fb72 100644 --- a/src/dxvk/dxvk_context_state.h +++ b/src/dxvk/dxvk_context_state.h @@ -62,6 +62,7 @@ namespace dxvk { */ enum class DxvkContextFeature : uint32_t { TrackGraphicsPipeline, + VariableMultisampleRate, FeatureCount };