|
|
@ -207,7 +207,7 @@ std::array<Shader, Maxwell::MaxShaderProgram> VKPipelineCache::GetShaders() {
|
|
|
|
const GPUVAddr program_addr{GetShaderAddress(system, program)};
|
|
|
|
const GPUVAddr program_addr{GetShaderAddress(system, program)};
|
|
|
|
const std::optional cpu_addr = memory_manager.GpuToCpuAddress(program_addr);
|
|
|
|
const std::optional cpu_addr = memory_manager.GpuToCpuAddress(program_addr);
|
|
|
|
ASSERT(cpu_addr);
|
|
|
|
ASSERT(cpu_addr);
|
|
|
|
auto shader = cpu_addr ? TryGet(*cpu_addr) : nullptr;
|
|
|
|
auto shader = cpu_addr ? TryGet(*cpu_addr) : null_shader;
|
|
|
|
if (!shader) {
|
|
|
|
if (!shader) {
|
|
|
|
const auto host_ptr{memory_manager.GetPointer(program_addr)};
|
|
|
|
const auto host_ptr{memory_manager.GetPointer(program_addr)};
|
|
|
|
|
|
|
|
|
|
|
@ -218,7 +218,11 @@ std::array<Shader, Maxwell::MaxShaderProgram> VKPipelineCache::GetShaders() {
|
|
|
|
|
|
|
|
|
|
|
|
shader = std::make_shared<CachedShader>(system, stage, program_addr, *cpu_addr,
|
|
|
|
shader = std::make_shared<CachedShader>(system, stage, program_addr, *cpu_addr,
|
|
|
|
std::move(code), stage_offset);
|
|
|
|
std::move(code), stage_offset);
|
|
|
|
Register(shader);
|
|
|
|
if (cpu_addr) {
|
|
|
|
|
|
|
|
Register(shader);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
null_shader = shader;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
shaders[index] = std::move(shader);
|
|
|
|
shaders[index] = std::move(shader);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -261,7 +265,7 @@ VKComputePipeline& VKPipelineCache::GetComputePipeline(const ComputePipelineCach
|
|
|
|
const auto cpu_addr = memory_manager.GpuToCpuAddress(program_addr);
|
|
|
|
const auto cpu_addr = memory_manager.GpuToCpuAddress(program_addr);
|
|
|
|
ASSERT(cpu_addr);
|
|
|
|
ASSERT(cpu_addr);
|
|
|
|
|
|
|
|
|
|
|
|
auto shader = cpu_addr ? TryGet(*cpu_addr) : nullptr;
|
|
|
|
auto shader = cpu_addr ? TryGet(*cpu_addr) : null_kernel;
|
|
|
|
if (!shader) {
|
|
|
|
if (!shader) {
|
|
|
|
// No shader found - create a new one
|
|
|
|
// No shader found - create a new one
|
|
|
|
const auto host_ptr = memory_manager.GetPointer(program_addr);
|
|
|
|
const auto host_ptr = memory_manager.GetPointer(program_addr);
|
|
|
@ -271,7 +275,11 @@ VKComputePipeline& VKPipelineCache::GetComputePipeline(const ComputePipelineCach
|
|
|
|
shader = std::make_shared<CachedShader>(system, Tegra::Engines::ShaderType::Compute,
|
|
|
|
shader = std::make_shared<CachedShader>(system, Tegra::Engines::ShaderType::Compute,
|
|
|
|
program_addr, *cpu_addr, std::move(code),
|
|
|
|
program_addr, *cpu_addr, std::move(code),
|
|
|
|
kernel_main_offset);
|
|
|
|
kernel_main_offset);
|
|
|
|
Register(shader);
|
|
|
|
if (cpu_addr) {
|
|
|
|
|
|
|
|
Register(shader);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
null_kernel = shader;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Specialization specialization;
|
|
|
|
Specialization specialization;
|
|
|
|