mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-26 13:49:00 +02:00
[vk, pipeline_cache, qcom] Resolving pipeline usage for QCOM
This commit is contained in:
parent
0d3cef65ad
commit
ea5e15cde5
2 changed files with 28 additions and 1 deletions
|
|
@ -677,7 +677,17 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline(
|
||||||
|
|
||||||
const auto runtime_info{MakeRuntimeInfo(programs, key, program, previous_stage)};
|
const auto runtime_info{MakeRuntimeInfo(programs, key, program, previous_stage)};
|
||||||
ConvertLegacyToGeneric(program, runtime_info);
|
ConvertLegacyToGeneric(program, runtime_info);
|
||||||
const std::vector<u32> code{EmitSPIRV(profile, runtime_info, program, binding, this->optimize_spirv_output)};
|
|
||||||
|
// Adreno don't support subgroup operations in vertex stages
|
||||||
|
// Disable subgroup features for vertex shaders if not supported by the device
|
||||||
|
Shader::Profile stage_profile = profile;
|
||||||
|
if (program.stage == Shader::Stage::VertexA || program.stage == Shader::Stage::VertexB) {
|
||||||
|
if (!device.IsSubgroupSupportedForStage(VK_SHADER_STAGE_VERTEX_BIT)) {
|
||||||
|
stage_profile.support_vote = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<u32> code{EmitSPIRV(stage_profile, runtime_info, program, binding, this->optimize_spirv_output)};
|
||||||
device.SaveShader(code);
|
device.SaveShader(code);
|
||||||
modules[stage_index] = BuildShader(device, code);
|
modules[stage_index] = BuildShader(device, code);
|
||||||
if (device.HasDebuggingToolAttached()) {
|
if (device.HasDebuggingToolAttached()) {
|
||||||
|
|
@ -771,6 +781,17 @@ std::unique_ptr<ComputePipeline> PipelineCache::CreateComputePipeline(
|
||||||
}
|
}
|
||||||
|
|
||||||
auto program{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)};
|
auto program{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)};
|
||||||
|
|
||||||
|
// Adreno have lower shared memory limits (32KB)
|
||||||
|
// Clamp shared memory usage to device maximum to avoid validation errors
|
||||||
|
const u32 max_shared_memory = device.GetMaxComputeSharedMemorySize();
|
||||||
|
if (program.shared_memory_size > max_shared_memory) {
|
||||||
|
LOG_WARNING(Render_Vulkan,
|
||||||
|
"Compute shader 0x{:016x} requests {}KB shared memory but device max is {}KB - clamping",
|
||||||
|
key.unique_hash, program.shared_memory_size / 1024, max_shared_memory / 1024);
|
||||||
|
program.shared_memory_size = max_shared_memory;
|
||||||
|
}
|
||||||
|
|
||||||
const std::vector<u32> code{EmitSPIRV(profile, program, this->optimize_spirv_output)};
|
const std::vector<u32> code{EmitSPIRV(profile, program, this->optimize_spirv_output)};
|
||||||
device.SaveShader(code);
|
device.SaveShader(code);
|
||||||
vk::ShaderModule spv_module{BuildShader(device, code)};
|
vk::ShaderModule spv_module{BuildShader(device, code)};
|
||||||
|
|
|
||||||
|
|
@ -365,6 +365,12 @@ public:
|
||||||
return properties.subgroup_properties.supportedOperations & feature;
|
return properties.subgroup_properties.supportedOperations & feature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if subgroup operations are supported in the specified shader stage.
|
||||||
|
/// Mobile GPUs (Qualcomm Adreno) often only support subgroups in fragment/compute stages.
|
||||||
|
bool IsSubgroupSupportedForStage(VkShaderStageFlagBits stage) const {
|
||||||
|
return properties.subgroup_properties.supportedStages & stage;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the maximum number of push descriptors.
|
/// Returns the maximum number of push descriptors.
|
||||||
u32 MaxPushDescriptors() const {
|
u32 MaxPushDescriptors() const {
|
||||||
return properties.push_descriptor.maxPushDescriptors;
|
return properties.push_descriptor.maxPushDescriptors;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue