Controlled SPV features on QCOM

This commit is contained in:
CamilleLaVey 2025-11-26 21:11:18 -04:00 committed by Caio Oliveira
parent f40774a4b9
commit d6f14f5519
No known key found for this signature in database
GPG key ID: AAAE6C7FD4186B0C
6 changed files with 418 additions and 88 deletions

View file

@ -228,7 +228,9 @@ ShaderCache::ShaderCache(Tegra::MaxwellDeviceMemoryManager& device_memory_,
.need_fastmath_off = device.NeedsFastmathOff(),
.need_gather_subpixel_offset = device.IsAmd() || device.IsIntel(),
.has_broken_spirv_clamp = true,
.has_broken_spirv_clamp = true,
.has_broken_spirv_vector_access_chain = false,
.has_broken_spirv_access_chain_opt = false,
.has_broken_unsigned_image_offsets = true,
.has_broken_signed_operations = true,
.has_broken_fp16_float_controls = false,
@ -541,7 +543,9 @@ std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline(
case Settings::ShaderBackend::SpirV:
ConvertLegacyToGeneric(program, runtime_info);
sources_spirv[stage_index] =
EmitSPIRV(profile, runtime_info, program, binding, this->optimize_spirv_output);
const bool optimize_shader{this->optimize_spirv_output &&
!profile.has_broken_spirv_access_chain_opt};
EmitSPIRV(profile, runtime_info, program, binding, optimize_shader);
break;
}
previous_program = &program;
@ -600,7 +604,9 @@ std::unique_ptr<ComputePipeline> ShaderCache::CreateComputePipeline(
code = EmitGLASM(profile, info, program);
break;
case Settings::ShaderBackend::SpirV:
code_spirv = EmitSPIRV(profile, program, this->optimize_spirv_output);
const bool optimize_shader{this->optimize_spirv_output &&
!profile.has_broken_spirv_access_chain_opt};
code_spirv = EmitSPIRV(profile, program, optimize_shader);
break;
}

View file

@ -377,6 +377,8 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_,
driver_id == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA,
.has_broken_spirv_clamp = driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS,
.has_broken_spirv_vector_access_chain = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY,
.has_broken_spirv_access_chain_opt = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY,
.has_broken_spirv_position_input = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY,
.has_broken_unsigned_image_offsets = false,
.has_broken_signed_operations = false,
@ -703,7 +705,10 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline(
const auto runtime_info{MakeRuntimeInfo(programs, key, program, previous_stage, device)};
ConvertLegacyToGeneric(program, runtime_info);
const std::vector<u32> code{EmitSPIRV(profile, runtime_info, program, binding, this->optimize_spirv_output)};
const bool optimize_shader{this->optimize_spirv_output &&
!profile.has_broken_spirv_access_chain_opt};
const std::vector<u32> code{EmitSPIRV(profile, runtime_info, program, binding,
optimize_shader)};
device.SaveShader(code);
modules[stage_index] = BuildShader(device, code);
if (device.HasDebuggingToolAttached()) {
@ -810,7 +815,9 @@ std::unique_ptr<ComputePipeline> PipelineCache::CreateComputePipeline(
max_shared_memory / 1024);
program.shared_memory_size = max_shared_memory;
}
const std::vector<u32> code{EmitSPIRV(profile, program, this->optimize_spirv_output)};
const bool optimize_shader{this->optimize_spirv_output &&
!profile.has_broken_spirv_access_chain_opt};
const std::vector<u32> code{EmitSPIRV(profile, program, optimize_shader)};
device.SaveShader(code);
vk::ShaderModule spv_module{BuildShader(device, code)};
if (device.HasDebuggingToolAttached()) {