renderer_vulkan: Silence MoltenVK primitive restart warning spam.

This commit is contained in:
squidbus 2025-04-09 10:46:07 -07:00
parent 1c72fa871f
commit 0d3b0f9efc
4 changed files with 32 additions and 27 deletions

View File

@ -28,6 +28,15 @@ static constexpr std::array LogicalStageToStageBit = {
vk::ShaderStageFlagBits::eCompute, vk::ShaderStageFlagBits::eCompute,
}; };
static bool IsPrimitiveTopologyList(const vk::PrimitiveTopology topology) {
return topology == vk::PrimitiveTopology::ePointList ||
topology == vk::PrimitiveTopology::eLineList ||
topology == vk::PrimitiveTopology::eTriangleList ||
topology == vk::PrimitiveTopology::eLineListWithAdjacency ||
topology == vk::PrimitiveTopology::eTriangleListWithAdjacency ||
topology == vk::PrimitiveTopology::ePatchList;
}
GraphicsPipeline::GraphicsPipeline( GraphicsPipeline::GraphicsPipeline(
const Instance& instance, Scheduler& scheduler, DescriptorHeap& desc_heap, const Instance& instance, Scheduler& scheduler, DescriptorHeap& desc_heap,
const Shader::Profile& profile, const GraphicsPipelineKey& key_, const Shader::Profile& profile, const GraphicsPipelineKey& key_,
@ -75,8 +84,13 @@ GraphicsPipeline::GraphicsPipeline(
.pVertexAttributeDescriptions = vertex_attributes.data(), .pVertexAttributeDescriptions = vertex_attributes.data(),
}; };
const auto topology = LiverpoolToVK::PrimitiveType(key.prim_type);
const vk::PipelineInputAssemblyStateCreateInfo input_assembly = { const vk::PipelineInputAssemblyStateCreateInfo input_assembly = {
.topology = LiverpoolToVK::PrimitiveType(key.prim_type), .topology = topology,
// Avoid warning spam on all pipelines about unsupported restart disable, if not supported.
// However, must be false for list topologies to avoid validation errors.
.primitiveRestartEnable =
!instance.IsPrimitiveRestartDisableSupported() && !IsPrimitiveTopologyList(topology),
}; };
const bool is_rect_list = key.prim_type == AmdGpu::PrimitiveType::RectList; const bool is_rect_list = key.prim_type == AmdGpu::PrimitiveType::RectList;
@ -114,10 +128,13 @@ GraphicsPipeline::GraphicsPipeline(
vk::DynamicState::eDepthBiasEnableEXT, vk::DynamicState::eDepthBias, vk::DynamicState::eDepthBiasEnableEXT, vk::DynamicState::eDepthBias,
vk::DynamicState::eStencilTestEnableEXT, vk::DynamicState::eStencilReference, vk::DynamicState::eStencilTestEnableEXT, vk::DynamicState::eStencilReference,
vk::DynamicState::eStencilCompareMask, vk::DynamicState::eStencilWriteMask, vk::DynamicState::eStencilCompareMask, vk::DynamicState::eStencilWriteMask,
vk::DynamicState::eStencilOpEXT, vk::DynamicState::ePrimitiveRestartEnableEXT, vk::DynamicState::eStencilOpEXT, vk::DynamicState::eCullModeEXT,
vk::DynamicState::eCullModeEXT, vk::DynamicState::eFrontFaceEXT, vk::DynamicState::eFrontFaceEXT,
}; };
if (instance.IsPrimitiveRestartDisableSupported()) {
dynamic_states.push_back(vk::DynamicState::ePrimitiveRestartEnableEXT);
}
if (instance.IsDepthBoundsSupported()) { if (instance.IsDepthBoundsSupported()) {
dynamic_states.push_back(vk::DynamicState::eDepthBoundsTestEnableEXT); dynamic_states.push_back(vk::DynamicState::eDepthBoundsTestEnableEXT);
dynamic_states.push_back(vk::DynamicState::eDepthBounds); dynamic_states.push_back(vk::DynamicState::eDepthBounds);

View File

@ -292,6 +292,11 @@ public:
properties.limits.framebufferStencilSampleCounts; properties.limits.framebufferStencilSampleCounts;
} }
/// Returns whether disabling primitive restart is supported.
bool IsPrimitiveRestartDisableSupported() const {
return driver_id != vk::DriverId::eMoltenvk;
}
private: private:
/// Creates the logical device opportunistically enabling extensions /// Creates the logical device opportunistically enabling extensions
bool CreateDevice(); bool CreateDevice();

View File

@ -1133,33 +1133,14 @@ void Rasterizer::UpdateDepthStencilState() const {
} }
} }
static bool IsPrimitiveListTopology(const AmdGpu::PrimitiveType prim_type) {
return prim_type == AmdGpu::PrimitiveType::PointList ||
prim_type == AmdGpu::PrimitiveType::LineList ||
prim_type == AmdGpu::PrimitiveType::TriangleList ||
prim_type == AmdGpu::PrimitiveType::AdjLineList ||
prim_type == AmdGpu::PrimitiveType::AdjTriangleList ||
prim_type == AmdGpu::PrimitiveType::RectList ||
prim_type == AmdGpu::PrimitiveType::QuadList;
}
void Rasterizer::UpdatePrimitiveState() const { void Rasterizer::UpdatePrimitiveState() const {
const auto& regs = liverpool->regs; const auto& regs = liverpool->regs;
auto& dynamic_state = scheduler.GetDynamicState(); auto& dynamic_state = scheduler.GetDynamicState();
auto prim_restart = (regs.enable_primitive_restart & 1) != 0; const auto prim_restart = (regs.enable_primitive_restart & 1) != 0;
if (prim_restart) { ASSERT_MSG(!prim_restart || regs.primitive_restart_index == 0xFFFF ||
ASSERT_MSG(regs.primitive_restart_index == 0xFFFF || regs.primitive_restart_index == 0xFFFFFFFF,
regs.primitive_restart_index == 0xFFFFFFFF, "Primitive restart index other than -1 is not supported yet");
"Primitive restart index other than -1 is not supported yet");
if (IsPrimitiveListTopology(regs.primitive_type) && !instance.IsListRestartSupported()) {
LOG_TRACE(
Render_Vulkan,
"Primitive restart is enabled for list topology but not supported by driver.");
prim_restart = false;
}
}
const auto cull_mode = LiverpoolToVK::IsPrimitiveCulled(regs.primitive_type) const auto cull_mode = LiverpoolToVK::IsPrimitiveCulled(regs.primitive_type)
? LiverpoolToVK::CullMode(regs.polygon_control.CullingMode()) ? LiverpoolToVK::CullMode(regs.polygon_control.CullingMode())

View File

@ -290,7 +290,9 @@ void DynamicState::Commit(const Instance& instance, const vk::CommandBuffer& cmd
} }
if (dirty_state.primitive_restart_enable) { if (dirty_state.primitive_restart_enable) {
dirty_state.primitive_restart_enable = false; dirty_state.primitive_restart_enable = false;
cmdbuf.setPrimitiveRestartEnableEXT(primitive_restart_enable); if (instance.IsPrimitiveRestartDisableSupported()) {
cmdbuf.setPrimitiveRestartEnableEXT(primitive_restart_enable);
}
} }
if (dirty_state.cull_mode) { if (dirty_state.cull_mode) {
dirty_state.cull_mode = false; dirty_state.cull_mode = false;