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:
ReinUsesLisp 2021-01-23 03:58:35 -03:00
parent 302a5f00e8
commit 37ef2ee595

View file

@ -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 =