diff options
| author | 2020-05-22 21:01:36 -0300 | |
|---|---|---|
| committer | 2020-06-07 04:32:57 -0300 | |
| commit | 678f95e4f824740899c31a94c6aa6adaa634e699 (patch) | |
| tree | 499e736b84382a8d014f0f7df31e6b80f67fb0ce /src | |
| parent | gl_shader_cache: Use generic shader cache (diff) | |
| download | yuzu-678f95e4f824740899c31a94c6aa6adaa634e699.tar.gz yuzu-678f95e4f824740899c31a94c6aa6adaa634e699.tar.xz yuzu-678f95e4f824740899c31a94c6aa6adaa634e699.zip | |
vk_pipeline_cache: Use generic shader cache
Trivial port the generic shader cache to Vulkan.
Diffstat (limited to '')
5 files changed, 55 insertions, 58 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 7c6797e02..c28486b1d 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp | |||
| @@ -195,9 +195,9 @@ std::unordered_set<GLenum> GetSupportedFormats() { | |||
| 195 | 195 | ||
| 196 | } // Anonymous namespace | 196 | } // Anonymous namespace |
| 197 | 197 | ||
| 198 | Shader::Shader(std::shared_ptr<VideoCommon::Shader::Registry> registry, ShaderEntries entries, | 198 | Shader::Shader(std::shared_ptr<VideoCommon::Shader::Registry> registry_, ShaderEntries entries_, |
| 199 | ProgramSharedPtr program) | 199 | ProgramSharedPtr program_) |
| 200 | : registry{std::move(registry)}, entries{std::move(entries)}, program{std::move(program)} { | 200 | : registry{std::move(registry_)}, entries{std::move(entries_)}, program{std::move(program_)} { |
| 201 | handle = program->assembly_program.handle; | 201 | handle = program->assembly_program.handle; |
| 202 | if (handle == 0) { | 202 | if (handle == 0) { |
| 203 | handle = program->source_program.handle; | 203 | handle = program->source_program.handle; |
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 65a1c6245..20cbeb671 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include "video_core/renderer_vulkan/wrapper.h" | 27 | #include "video_core/renderer_vulkan/wrapper.h" |
| 28 | #include "video_core/shader/compiler_settings.h" | 28 | #include "video_core/shader/compiler_settings.h" |
| 29 | #include "video_core/shader/memory_util.h" | 29 | #include "video_core/shader/memory_util.h" |
| 30 | #include "video_core/shader_cache.h" | ||
| 30 | 31 | ||
| 31 | namespace Vulkan { | 32 | namespace Vulkan { |
| 32 | 33 | ||
| @@ -130,19 +131,18 @@ bool ComputePipelineCacheKey::operator==(const ComputePipelineCacheKey& rhs) con | |||
| 130 | return std::memcmp(&rhs, this, sizeof *this) == 0; | 131 | return std::memcmp(&rhs, this, sizeof *this) == 0; |
| 131 | } | 132 | } |
| 132 | 133 | ||
| 133 | CachedShader::CachedShader(Core::System& system, Tegra::Engines::ShaderType stage, | 134 | Shader::Shader(Core::System& system, Tegra::Engines::ShaderType stage, GPUVAddr gpu_addr, |
| 134 | GPUVAddr gpu_addr, VAddr cpu_addr, ProgramCode program_code, | 135 | VideoCommon::Shader::ProgramCode program_code, u32 main_offset) |
| 135 | u32 main_offset) | 136 | : gpu_addr{gpu_addr}, program_code{std::move(program_code)}, |
| 136 | : RasterizerCacheObject{cpu_addr}, gpu_addr{gpu_addr}, program_code{std::move(program_code)}, | ||
| 137 | registry{stage, GetEngine(system, stage)}, shader_ir{this->program_code, main_offset, | 137 | registry{stage, GetEngine(system, stage)}, shader_ir{this->program_code, main_offset, |
| 138 | compiler_settings, registry}, | 138 | compiler_settings, registry}, |
| 139 | entries{GenerateShaderEntries(shader_ir)} {} | 139 | entries{GenerateShaderEntries(shader_ir)} {} |
| 140 | 140 | ||
| 141 | CachedShader::~CachedShader() = default; | 141 | Shader::~Shader() = default; |
| 142 | 142 | ||
| 143 | Tegra::Engines::ConstBufferEngineInterface& CachedShader::GetEngine( | 143 | Tegra::Engines::ConstBufferEngineInterface& Shader::GetEngine(Core::System& system, |
| 144 | Core::System& system, Tegra::Engines::ShaderType stage) { | 144 | Tegra::Engines::ShaderType stage) { |
| 145 | if (stage == Tegra::Engines::ShaderType::Compute) { | 145 | if (stage == ShaderType::Compute) { |
| 146 | return system.GPU().KeplerCompute(); | 146 | return system.GPU().KeplerCompute(); |
| 147 | } else { | 147 | } else { |
| 148 | return system.GPU().Maxwell3D(); | 148 | return system.GPU().Maxwell3D(); |
| @@ -154,16 +154,16 @@ VKPipelineCache::VKPipelineCache(Core::System& system, RasterizerVulkan& rasteri | |||
| 154 | VKDescriptorPool& descriptor_pool, | 154 | VKDescriptorPool& descriptor_pool, |
| 155 | VKUpdateDescriptorQueue& update_descriptor_queue, | 155 | VKUpdateDescriptorQueue& update_descriptor_queue, |
| 156 | VKRenderPassCache& renderpass_cache) | 156 | VKRenderPassCache& renderpass_cache) |
| 157 | : RasterizerCache{rasterizer}, system{system}, device{device}, scheduler{scheduler}, | 157 | : VideoCommon::ShaderCache<Shader>{rasterizer}, system{system}, device{device}, |
| 158 | descriptor_pool{descriptor_pool}, update_descriptor_queue{update_descriptor_queue}, | 158 | scheduler{scheduler}, descriptor_pool{descriptor_pool}, |
| 159 | renderpass_cache{renderpass_cache} {} | 159 | update_descriptor_queue{update_descriptor_queue}, renderpass_cache{renderpass_cache} {} |
| 160 | 160 | ||
| 161 | VKPipelineCache::~VKPipelineCache() = default; | 161 | VKPipelineCache::~VKPipelineCache() = default; |
| 162 | 162 | ||
| 163 | std::array<Shader, Maxwell::MaxShaderProgram> VKPipelineCache::GetShaders() { | 163 | std::array<Shader*, Maxwell::MaxShaderProgram> VKPipelineCache::GetShaders() { |
| 164 | const auto& gpu = system.GPU().Maxwell3D(); | 164 | const auto& gpu = system.GPU().Maxwell3D(); |
| 165 | 165 | ||
| 166 | std::array<Shader, Maxwell::MaxShaderProgram> shaders; | 166 | std::array<Shader*, Maxwell::MaxShaderProgram> shaders{}; |
| 167 | for (std::size_t index = 0; index < Maxwell::MaxShaderProgram; ++index) { | 167 | for (std::size_t index = 0; index < Maxwell::MaxShaderProgram; ++index) { |
| 168 | const auto program{static_cast<Maxwell::ShaderProgram>(index)}; | 168 | const auto program{static_cast<Maxwell::ShaderProgram>(index)}; |
| 169 | 169 | ||
| @@ -176,24 +176,28 @@ std::array<Shader, Maxwell::MaxShaderProgram> VKPipelineCache::GetShaders() { | |||
| 176 | const GPUVAddr program_addr{GetShaderAddress(system, program)}; | 176 | const GPUVAddr program_addr{GetShaderAddress(system, program)}; |
| 177 | const std::optional cpu_addr = memory_manager.GpuToCpuAddress(program_addr); | 177 | const std::optional cpu_addr = memory_manager.GpuToCpuAddress(program_addr); |
| 178 | ASSERT(cpu_addr); | 178 | ASSERT(cpu_addr); |
| 179 | auto shader = cpu_addr ? TryGet(*cpu_addr) : null_shader; | 179 | |
| 180 | if (!shader) { | 180 | Shader* result = cpu_addr ? TryGet(*cpu_addr) : null_shader.get(); |
| 181 | if (!result) { | ||
| 181 | const auto host_ptr{memory_manager.GetPointer(program_addr)}; | 182 | const auto host_ptr{memory_manager.GetPointer(program_addr)}; |
| 182 | 183 | ||
| 183 | // No shader found - create a new one | 184 | // No shader found - create a new one |
| 184 | constexpr u32 stage_offset = STAGE_MAIN_OFFSET; | 185 | constexpr u32 stage_offset = STAGE_MAIN_OFFSET; |
| 185 | const auto stage = static_cast<Tegra::Engines::ShaderType>(index == 0 ? 0 : index - 1); | 186 | const auto stage = static_cast<ShaderType>(index == 0 ? 0 : index - 1); |
| 186 | ProgramCode code = GetShaderCode(memory_manager, program_addr, host_ptr, false); | 187 | ProgramCode code = GetShaderCode(memory_manager, program_addr, host_ptr, false); |
| 188 | const std::size_t size_in_bytes = code.size() * sizeof(u64); | ||
| 189 | |||
| 190 | auto shader = std::make_unique<Shader>(system, stage, program_addr, std::move(code), | ||
| 191 | stage_offset); | ||
| 192 | result = shader.get(); | ||
| 187 | 193 | ||
| 188 | shader = std::make_shared<CachedShader>(system, stage, program_addr, *cpu_addr, | ||
| 189 | std::move(code), stage_offset); | ||
| 190 | if (cpu_addr) { | 194 | if (cpu_addr) { |
| 191 | Register(shader); | 195 | Register(std::move(shader), *cpu_addr, size_in_bytes); |
| 192 | } else { | 196 | } else { |
| 193 | null_shader = shader; | 197 | null_shader = std::move(shader); |
| 194 | } | 198 | } |
| 195 | } | 199 | } |
| 196 | shaders[index] = std::move(shader); | 200 | shaders[index] = result; |
| 197 | } | 201 | } |
| 198 | return last_shaders = shaders; | 202 | return last_shaders = shaders; |
| 199 | } | 203 | } |
| @@ -234,19 +238,22 @@ VKComputePipeline& VKPipelineCache::GetComputePipeline(const ComputePipelineCach | |||
| 234 | const auto cpu_addr = memory_manager.GpuToCpuAddress(program_addr); | 238 | const auto cpu_addr = memory_manager.GpuToCpuAddress(program_addr); |
| 235 | ASSERT(cpu_addr); | 239 | ASSERT(cpu_addr); |
| 236 | 240 | ||
| 237 | auto shader = cpu_addr ? TryGet(*cpu_addr) : null_kernel; | 241 | Shader* shader = cpu_addr ? TryGet(*cpu_addr) : null_kernel.get(); |
| 238 | if (!shader) { | 242 | if (!shader) { |
| 239 | // No shader found - create a new one | 243 | // No shader found - create a new one |
| 240 | const auto host_ptr = memory_manager.GetPointer(program_addr); | 244 | const auto host_ptr = memory_manager.GetPointer(program_addr); |
| 241 | 245 | ||
| 242 | ProgramCode code = GetShaderCode(memory_manager, program_addr, host_ptr, true); | 246 | ProgramCode code = GetShaderCode(memory_manager, program_addr, host_ptr, true); |
| 243 | shader = std::make_shared<CachedShader>(system, Tegra::Engines::ShaderType::Compute, | 247 | const std::size_t size_in_bytes = code.size() * sizeof(u64); |
| 244 | program_addr, *cpu_addr, std::move(code), | 248 | |
| 245 | KERNEL_MAIN_OFFSET); | 249 | auto shader_info = std::make_unique<Shader>(system, ShaderType::Compute, program_addr, |
| 250 | std::move(code), KERNEL_MAIN_OFFSET); | ||
| 251 | shader = shader_info.get(); | ||
| 252 | |||
| 246 | if (cpu_addr) { | 253 | if (cpu_addr) { |
| 247 | Register(shader); | 254 | Register(std::move(shader_info), *cpu_addr, size_in_bytes); |
| 248 | } else { | 255 | } else { |
| 249 | null_kernel = shader; | 256 | null_kernel = std::move(shader_info); |
| 250 | } | 257 | } |
| 251 | } | 258 | } |
| 252 | 259 | ||
| @@ -262,7 +269,7 @@ VKComputePipeline& VKPipelineCache::GetComputePipeline(const ComputePipelineCach | |||
| 262 | return *entry; | 269 | return *entry; |
| 263 | } | 270 | } |
| 264 | 271 | ||
| 265 | void VKPipelineCache::Unregister(const Shader& shader) { | 272 | void VKPipelineCache::OnShaderRemoval(Shader* shader) { |
| 266 | bool finished = false; | 273 | bool finished = false; |
| 267 | const auto Finish = [&] { | 274 | const auto Finish = [&] { |
| 268 | // TODO(Rodrigo): Instead of finishing here, wait for the fences that use this pipeline and | 275 | // TODO(Rodrigo): Instead of finishing here, wait for the fences that use this pipeline and |
| @@ -294,8 +301,6 @@ void VKPipelineCache::Unregister(const Shader& shader) { | |||
| 294 | Finish(); | 301 | Finish(); |
| 295 | it = compute_cache.erase(it); | 302 | it = compute_cache.erase(it); |
| 296 | } | 303 | } |
| 297 | |||
| 298 | RasterizerCache::Unregister(shader); | ||
| 299 | } | 304 | } |
| 300 | 305 | ||
| 301 | std::pair<SPIRVProgram, std::vector<VkDescriptorSetLayoutBinding>> | 306 | std::pair<SPIRVProgram, std::vector<VkDescriptorSetLayoutBinding>> |
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h index 0b5796fef..0a36e5112 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h | |||
| @@ -17,7 +17,6 @@ | |||
| 17 | #include "common/common_types.h" | 17 | #include "common/common_types.h" |
| 18 | #include "video_core/engines/const_buffer_engine_interface.h" | 18 | #include "video_core/engines/const_buffer_engine_interface.h" |
| 19 | #include "video_core/engines/maxwell_3d.h" | 19 | #include "video_core/engines/maxwell_3d.h" |
| 20 | #include "video_core/rasterizer_cache.h" | ||
| 21 | #include "video_core/renderer_vulkan/fixed_pipeline_state.h" | 20 | #include "video_core/renderer_vulkan/fixed_pipeline_state.h" |
| 22 | #include "video_core/renderer_vulkan/vk_graphics_pipeline.h" | 21 | #include "video_core/renderer_vulkan/vk_graphics_pipeline.h" |
| 23 | #include "video_core/renderer_vulkan/vk_renderpass_cache.h" | 22 | #include "video_core/renderer_vulkan/vk_renderpass_cache.h" |
| @@ -26,6 +25,7 @@ | |||
| 26 | #include "video_core/shader/memory_util.h" | 25 | #include "video_core/shader/memory_util.h" |
| 27 | #include "video_core/shader/registry.h" | 26 | #include "video_core/shader/registry.h" |
| 28 | #include "video_core/shader/shader_ir.h" | 27 | #include "video_core/shader/shader_ir.h" |
| 28 | #include "video_core/shader_cache.h" | ||
| 29 | 29 | ||
| 30 | namespace Core { | 30 | namespace Core { |
| 31 | class System; | 31 | class System; |
| @@ -41,8 +41,6 @@ class VKFence; | |||
| 41 | class VKScheduler; | 41 | class VKScheduler; |
| 42 | class VKUpdateDescriptorQueue; | 42 | class VKUpdateDescriptorQueue; |
| 43 | 43 | ||
| 44 | class CachedShader; | ||
| 45 | using Shader = std::shared_ptr<CachedShader>; | ||
| 46 | using Maxwell = Tegra::Engines::Maxwell3D::Regs; | 44 | using Maxwell = Tegra::Engines::Maxwell3D::Regs; |
| 47 | 45 | ||
| 48 | struct GraphicsPipelineCacheKey { | 46 | struct GraphicsPipelineCacheKey { |
| @@ -102,21 +100,16 @@ struct hash<Vulkan::ComputePipelineCacheKey> { | |||
| 102 | 100 | ||
| 103 | namespace Vulkan { | 101 | namespace Vulkan { |
| 104 | 102 | ||
| 105 | class CachedShader final : public RasterizerCacheObject { | 103 | class Shader { |
| 106 | public: | 104 | public: |
| 107 | explicit CachedShader(Core::System& system, Tegra::Engines::ShaderType stage, GPUVAddr gpu_addr, | 105 | explicit Shader(Core::System& system, Tegra::Engines::ShaderType stage, GPUVAddr gpu_addr, |
| 108 | VAddr cpu_addr, VideoCommon::Shader::ProgramCode program_code, | 106 | VideoCommon::Shader::ProgramCode program_code, u32 main_offset); |
| 109 | u32 main_offset); | 107 | ~Shader(); |
| 110 | ~CachedShader(); | ||
| 111 | 108 | ||
| 112 | GPUVAddr GetGpuAddr() const { | 109 | GPUVAddr GetGpuAddr() const { |
| 113 | return gpu_addr; | 110 | return gpu_addr; |
| 114 | } | 111 | } |
| 115 | 112 | ||
| 116 | std::size_t GetSizeInBytes() const override { | ||
| 117 | return program_code.size() * sizeof(u64); | ||
| 118 | } | ||
| 119 | |||
| 120 | VideoCommon::Shader::ShaderIR& GetIR() { | 113 | VideoCommon::Shader::ShaderIR& GetIR() { |
| 121 | return shader_ir; | 114 | return shader_ir; |
| 122 | } | 115 | } |
| @@ -144,25 +137,23 @@ private: | |||
| 144 | ShaderEntries entries; | 137 | ShaderEntries entries; |
| 145 | }; | 138 | }; |
| 146 | 139 | ||
| 147 | class VKPipelineCache final : public RasterizerCache<Shader> { | 140 | class VKPipelineCache final : public VideoCommon::ShaderCache<Shader> { |
| 148 | public: | 141 | public: |
| 149 | explicit VKPipelineCache(Core::System& system, RasterizerVulkan& rasterizer, | 142 | explicit VKPipelineCache(Core::System& system, RasterizerVulkan& rasterizer, |
| 150 | const VKDevice& device, VKScheduler& scheduler, | 143 | const VKDevice& device, VKScheduler& scheduler, |
| 151 | VKDescriptorPool& descriptor_pool, | 144 | VKDescriptorPool& descriptor_pool, |
| 152 | VKUpdateDescriptorQueue& update_descriptor_queue, | 145 | VKUpdateDescriptorQueue& update_descriptor_queue, |
| 153 | VKRenderPassCache& renderpass_cache); | 146 | VKRenderPassCache& renderpass_cache); |
| 154 | ~VKPipelineCache(); | 147 | ~VKPipelineCache() override; |
| 155 | 148 | ||
| 156 | std::array<Shader, Maxwell::MaxShaderProgram> GetShaders(); | 149 | std::array<Shader*, Maxwell::MaxShaderProgram> GetShaders(); |
| 157 | 150 | ||
| 158 | VKGraphicsPipeline& GetGraphicsPipeline(const GraphicsPipelineCacheKey& key); | 151 | VKGraphicsPipeline& GetGraphicsPipeline(const GraphicsPipelineCacheKey& key); |
| 159 | 152 | ||
| 160 | VKComputePipeline& GetComputePipeline(const ComputePipelineCacheKey& key); | 153 | VKComputePipeline& GetComputePipeline(const ComputePipelineCacheKey& key); |
| 161 | 154 | ||
| 162 | protected: | 155 | protected: |
| 163 | void Unregister(const Shader& shader) override; | 156 | void OnShaderRemoval(Shader* shader) final; |
| 164 | |||
| 165 | void FlushObjectInner(const Shader& object) override {} | ||
| 166 | 157 | ||
| 167 | private: | 158 | private: |
| 168 | std::pair<SPIRVProgram, std::vector<VkDescriptorSetLayoutBinding>> DecompileShaders( | 159 | std::pair<SPIRVProgram, std::vector<VkDescriptorSetLayoutBinding>> DecompileShaders( |
| @@ -175,10 +166,10 @@ private: | |||
| 175 | VKUpdateDescriptorQueue& update_descriptor_queue; | 166 | VKUpdateDescriptorQueue& update_descriptor_queue; |
| 176 | VKRenderPassCache& renderpass_cache; | 167 | VKRenderPassCache& renderpass_cache; |
| 177 | 168 | ||
| 178 | Shader null_shader{}; | 169 | std::unique_ptr<Shader> null_shader; |
| 179 | Shader null_kernel{}; | 170 | std::unique_ptr<Shader> null_kernel; |
| 180 | 171 | ||
| 181 | std::array<Shader, Maxwell::MaxShaderProgram> last_shaders; | 172 | std::array<Shader*, Maxwell::MaxShaderProgram> last_shaders{}; |
| 182 | 173 | ||
| 183 | GraphicsPipelineCacheKey last_graphics_key; | 174 | GraphicsPipelineCacheKey last_graphics_key; |
| 184 | VKGraphicsPipeline* last_graphics_pipeline = nullptr; | 175 | VKGraphicsPipeline* last_graphics_pipeline = nullptr; |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 86328237e..ffea9ee36 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include "video_core/renderer_vulkan/vk_texture_cache.h" | 38 | #include "video_core/renderer_vulkan/vk_texture_cache.h" |
| 39 | #include "video_core/renderer_vulkan/vk_update_descriptor.h" | 39 | #include "video_core/renderer_vulkan/vk_update_descriptor.h" |
| 40 | #include "video_core/renderer_vulkan/wrapper.h" | 40 | #include "video_core/renderer_vulkan/wrapper.h" |
| 41 | #include "video_core/shader_cache.h" | ||
| 41 | 42 | ||
| 42 | namespace Vulkan { | 43 | namespace Vulkan { |
| 43 | 44 | ||
| @@ -98,7 +99,7 @@ VkRect2D GetScissorState(const Maxwell& regs, std::size_t index) { | |||
| 98 | } | 99 | } |
| 99 | 100 | ||
| 100 | std::array<GPUVAddr, Maxwell::MaxShaderProgram> GetShaderAddresses( | 101 | std::array<GPUVAddr, Maxwell::MaxShaderProgram> GetShaderAddresses( |
| 101 | const std::array<Shader, Maxwell::MaxShaderProgram>& shaders) { | 102 | const std::array<Shader*, Maxwell::MaxShaderProgram>& shaders) { |
| 102 | std::array<GPUVAddr, Maxwell::MaxShaderProgram> addresses; | 103 | std::array<GPUVAddr, Maxwell::MaxShaderProgram> addresses; |
| 103 | for (std::size_t i = 0; i < std::size(addresses); ++i) { | 104 | for (std::size_t i = 0; i < std::size(addresses); ++i) { |
| 104 | addresses[i] = shaders[i] ? shaders[i]->GetGpuAddr() : 0; | 105 | addresses[i] = shaders[i] ? shaders[i]->GetGpuAddr() : 0; |
| @@ -775,12 +776,12 @@ RasterizerVulkan::DrawParameters RasterizerVulkan::SetupGeometry(FixedPipelineSt | |||
| 775 | } | 776 | } |
| 776 | 777 | ||
| 777 | void RasterizerVulkan::SetupShaderDescriptors( | 778 | void RasterizerVulkan::SetupShaderDescriptors( |
| 778 | const std::array<Shader, Maxwell::MaxShaderProgram>& shaders) { | 779 | const std::array<Shader*, Maxwell::MaxShaderProgram>& shaders) { |
| 779 | texture_cache.GuardSamplers(true); | 780 | texture_cache.GuardSamplers(true); |
| 780 | 781 | ||
| 781 | for (std::size_t stage = 0; stage < Maxwell::MaxShaderStage; ++stage) { | 782 | for (std::size_t stage = 0; stage < Maxwell::MaxShaderStage; ++stage) { |
| 782 | // Skip VertexA stage | 783 | // Skip VertexA stage |
| 783 | const auto& shader = shaders[stage + 1]; | 784 | Shader* const shader = shaders[stage + 1]; |
| 784 | if (!shader) { | 785 | if (!shader) { |
| 785 | continue; | 786 | continue; |
| 786 | } | 787 | } |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 0ed0e48c6..ef77c3622 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -168,7 +168,7 @@ private: | |||
| 168 | bool is_indexed, bool is_instanced); | 168 | bool is_indexed, bool is_instanced); |
| 169 | 169 | ||
| 170 | /// Setup descriptors in the graphics pipeline. | 170 | /// Setup descriptors in the graphics pipeline. |
| 171 | void SetupShaderDescriptors(const std::array<Shader, Maxwell::MaxShaderProgram>& shaders); | 171 | void SetupShaderDescriptors(const std::array<Shader*, Maxwell::MaxShaderProgram>& shaders); |
| 172 | 172 | ||
| 173 | void SetupImageTransitions(Texceptions texceptions, | 173 | void SetupImageTransitions(Texceptions texceptions, |
| 174 | const std::array<View, Maxwell::NumRenderTargets>& color_attachments, | 174 | const std::array<View, Maxwell::NumRenderTargets>& color_attachments, |