[vulkan, qcom] Removing faulty DepthTest from QCOM drivers

This commit is contained in:
CamilleLaVey 2026-02-02 11:34:26 -04:00
parent 655377f585
commit ebacfbf4ed
4 changed files with 17 additions and 2 deletions

View File

@ -844,7 +844,6 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) {
static constexpr std::array extended{ static constexpr std::array extended{
VK_DYNAMIC_STATE_CULL_MODE_EXT, VK_DYNAMIC_STATE_CULL_MODE_EXT,
VK_DYNAMIC_STATE_FRONT_FACE_EXT, VK_DYNAMIC_STATE_FRONT_FACE_EXT,
VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT,
VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT, VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT,
VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT, VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT,
VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT,
@ -853,6 +852,10 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) {
}; };
dynamic_states.insert(dynamic_states.end(), extended.begin(), extended.end()); dynamic_states.insert(dynamic_states.end(), extended.begin(), extended.end());
if (device.SupportsDepthTestEnable()) {
dynamic_states.push_back(VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT);
}
// VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT // VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT
if (!key.state.dynamic_vertex_input) { if (!key.state.dynamic_vertex_input) {
dynamic_states.push_back(VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT); dynamic_states.push_back(VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT);

View File

@ -1026,7 +1026,9 @@ void RasterizerVulkan::UpdateDynamicStates() {
UpdateStencilOp(regs); UpdateStencilOp(regs);
if (state_tracker.TouchStateEnable()) { if (state_tracker.TouchStateEnable()) {
UpdateDepthBoundsTestEnable(regs); UpdateDepthBoundsTestEnable(regs);
UpdateDepthTestEnable(regs); if (device.SupportsDepthTestEnable()) {
UpdateDepthTestEnable(regs);
}
UpdateDepthWriteEnable(regs); UpdateDepthWriteEnable(regs);
UpdateStencilTestEnable(regs); UpdateStencilTestEnable(regs);
} }

View File

@ -502,6 +502,10 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
sets_per_pool = 1024; sets_per_pool = 1024;
LOG_INFO(Render_Vulkan, "Qualcomm: forcing {} sets per pool", sets_per_pool); LOG_INFO(Render_Vulkan, "Qualcomm: forcing {} sets per pool", sets_per_pool);
LOG_WARNING(Render_Vulkan,
"Qualcomm: Disabling broken VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT");
supports_depth_test_enable = false;
#if defined(ANDROID) && defined(ARCHITECTURE_arm64) #if defined(ANDROID) && defined(ARCHITECTURE_arm64)
// BCn patching only safe on Android 9+ (API 28+). Older versions crash on driver load. // BCn patching only safe on Android 9+ (API 28+). Older versions crash on driver load.
const auto major = (properties.properties.driverVersion >> 24) << 2; const auto major = (properties.properties.driverVersion >> 24) << 2;

View File

@ -607,6 +607,11 @@ public:
return extensions.extended_dynamic_state; return extensions.extended_dynamic_state;
} }
/// Returns true if the device supports VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT.
bool SupportsDepthTestEnable() const {
return supports_depth_test_enable;
}
/// Returns true if the device supports VK_EXT_extended_dynamic_state2. /// Returns true if the device supports VK_EXT_extended_dynamic_state2.
bool IsExtExtendedDynamicState2Supported() const { bool IsExtExtendedDynamicState2Supported() const {
return extensions.extended_dynamic_state2; return extensions.extended_dynamic_state2;
@ -1067,6 +1072,7 @@ private:
bool dynamic_state3_provoking_vertex_mode{}; bool dynamic_state3_provoking_vertex_mode{};
bool supports_conditional_barriers{}; ///< Allows barriers in conditional control flow. bool supports_conditional_barriers{}; ///< Allows barriers in conditional control flow.
bool supports_dynamic_state{true}; ///< Core Vulkan 1.0 dynamic states bool supports_dynamic_state{true}; ///< Core Vulkan 1.0 dynamic states
bool supports_depth_test_enable{true}; ///< Supports VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT
size_t sampler_heap_budget{}; ///< Sampler budget for buggy drivers (0 = unlimited). size_t sampler_heap_budget{}; ///< Sampler budget for buggy drivers (0 = unlimited).
u64 device_access_memory{}; ///< Total size of device local memory in bytes. u64 device_access_memory{}; ///< Total size of device local memory in bytes.
u32 sets_per_pool{}; ///< Sets per Description Pool u32 sets_per_pool{}; ///< Sets per Description Pool