vk_pipeline_cache: Properly bypass VertexA shaders
The VertexA stage is not yet implemented, but Vulkan is adding its descriptors, causing a discrepancy in the pushed descriptors and the template. This generally ends up in a driver side crash. Bypass the VertexA stage for now.
This commit is contained in:
parent
302a5f00e8
commit
37ef2ee595
|
@ -355,14 +355,12 @@ VKPipelineCache::DecompileShaders(const FixedPipelineState& fixed_state) {
|
||||||
SPIRVProgram program;
|
SPIRVProgram program;
|
||||||
std::vector<VkDescriptorSetLayoutBinding> bindings;
|
std::vector<VkDescriptorSetLayoutBinding> bindings;
|
||||||
|
|
||||||
for (std::size_t index = 0; index < Maxwell::MaxShaderProgram; ++index) {
|
for (std::size_t index = 1; index < Maxwell::MaxShaderProgram; ++index) {
|
||||||
const auto program_enum = static_cast<Maxwell::ShaderProgram>(index);
|
const auto program_enum = static_cast<Maxwell::ShaderProgram>(index);
|
||||||
|
|
||||||
// Skip stages that are not enabled
|
// Skip stages that are not enabled
|
||||||
if (!maxwell3d.regs.IsShaderConfigEnabled(index)) {
|
if (!maxwell3d.regs.IsShaderConfigEnabled(index)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const GPUVAddr gpu_addr = GetShaderAddress(maxwell3d, program_enum);
|
const GPUVAddr gpu_addr = GetShaderAddress(maxwell3d, program_enum);
|
||||||
const std::optional<VAddr> cpu_addr = gpu_memory.GpuToCpuAddress(gpu_addr);
|
const std::optional<VAddr> cpu_addr = gpu_memory.GpuToCpuAddress(gpu_addr);
|
||||||
Shader* const shader = cpu_addr ? TryGet(*cpu_addr) : null_shader.get();
|
Shader* const shader = cpu_addr ? TryGet(*cpu_addr) : null_shader.get();
|
||||||
|
@ -372,12 +370,8 @@ VKPipelineCache::DecompileShaders(const FixedPipelineState& fixed_state) {
|
||||||
const auto& entries = shader->GetEntries();
|
const auto& entries = shader->GetEntries();
|
||||||
program[stage] = {
|
program[stage] = {
|
||||||
Decompile(device, shader->GetIR(), program_type, shader->GetRegistry(), specialization),
|
Decompile(device, shader->GetIR(), program_type, shader->GetRegistry(), specialization),
|
||||||
entries};
|
entries,
|
||||||
|
};
|
||||||
if (program_enum == Maxwell::ShaderProgram::VertexA) {
|
|
||||||
// VertexB was combined with VertexA, so we skip the VertexB iteration
|
|
||||||
++index;
|
|
||||||
}
|
|
||||||
|
|
||||||
const u32 old_binding = specialization.base_binding;
|
const u32 old_binding = specialization.base_binding;
|
||||||
specialization.base_binding =
|
specialization.base_binding =
|
||||||
|
|
Loading…
Reference in New Issue