diff options
Diffstat (limited to 'src/video_core/renderer_vulkan')
6 files changed, 40 insertions, 38 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 1ba544943..326d74f29 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -42,8 +42,8 @@ auto CreateStreamBuffer(const VKDevice& device, VKScheduler& scheduler) { | |||
| 42 | } // Anonymous namespace | 42 | } // Anonymous namespace |
| 43 | 43 | ||
| 44 | CachedBufferBlock::CachedBufferBlock(const VKDevice& device, VKMemoryManager& memory_manager, | 44 | CachedBufferBlock::CachedBufferBlock(const VKDevice& device, VKMemoryManager& memory_manager, |
| 45 | CacheAddr cache_addr, std::size_t size) | 45 | VAddr cpu_addr, std::size_t size) |
| 46 | : VideoCommon::BufferBlock{cache_addr, size} { | 46 | : VideoCommon::BufferBlock{cpu_addr, size} { |
| 47 | const vk::BufferCreateInfo buffer_ci({}, static_cast<vk::DeviceSize>(size), | 47 | const vk::BufferCreateInfo buffer_ci({}, static_cast<vk::DeviceSize>(size), |
| 48 | BufferUsage | vk::BufferUsageFlagBits::eTransferSrc | | 48 | BufferUsage | vk::BufferUsageFlagBits::eTransferSrc | |
| 49 | vk::BufferUsageFlagBits::eTransferDst, | 49 | vk::BufferUsageFlagBits::eTransferDst, |
| @@ -68,8 +68,8 @@ VKBufferCache::VKBufferCache(VideoCore::RasterizerInterface& rasterizer, Core::S | |||
| 68 | 68 | ||
| 69 | VKBufferCache::~VKBufferCache() = default; | 69 | VKBufferCache::~VKBufferCache() = default; |
| 70 | 70 | ||
| 71 | Buffer VKBufferCache::CreateBlock(CacheAddr cache_addr, std::size_t size) { | 71 | Buffer VKBufferCache::CreateBlock(VAddr cpu_addr, std::size_t size) { |
| 72 | return std::make_shared<CachedBufferBlock>(device, memory_manager, cache_addr, size); | 72 | return std::make_shared<CachedBufferBlock>(device, memory_manager, cpu_addr, size); |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | const vk::Buffer* VKBufferCache::ToHandle(const Buffer& buffer) { | 75 | const vk::Buffer* VKBufferCache::ToHandle(const Buffer& buffer) { |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 3f38eed0c..508214618 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -30,7 +30,7 @@ class VKScheduler; | |||
| 30 | class CachedBufferBlock final : public VideoCommon::BufferBlock { | 30 | class CachedBufferBlock final : public VideoCommon::BufferBlock { |
| 31 | public: | 31 | public: |
| 32 | explicit CachedBufferBlock(const VKDevice& device, VKMemoryManager& memory_manager, | 32 | explicit CachedBufferBlock(const VKDevice& device, VKMemoryManager& memory_manager, |
| 33 | CacheAddr cache_addr, std::size_t size); | 33 | VAddr cpu_addr, std::size_t size); |
| 34 | ~CachedBufferBlock(); | 34 | ~CachedBufferBlock(); |
| 35 | 35 | ||
| 36 | const vk::Buffer* GetHandle() const { | 36 | const vk::Buffer* GetHandle() const { |
| @@ -55,7 +55,7 @@ public: | |||
| 55 | protected: | 55 | protected: |
| 56 | void WriteBarrier() override {} | 56 | void WriteBarrier() override {} |
| 57 | 57 | ||
| 58 | Buffer CreateBlock(CacheAddr cache_addr, std::size_t size) override; | 58 | Buffer CreateBlock(VAddr cpu_addr, std::size_t size) override; |
| 59 | 59 | ||
| 60 | const vk::Buffer* ToHandle(const Buffer& buffer) override; | 60 | const vk::Buffer* ToHandle(const Buffer& buffer) override; |
| 61 | 61 | ||
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 557b9d662..c2a426aeb 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | |||
| @@ -158,11 +158,11 @@ u32 FillDescriptorLayout(const ShaderEntries& entries, | |||
| 158 | } // Anonymous namespace | 158 | } // Anonymous namespace |
| 159 | 159 | ||
| 160 | CachedShader::CachedShader(Core::System& system, Tegra::Engines::ShaderType stage, | 160 | CachedShader::CachedShader(Core::System& system, Tegra::Engines::ShaderType stage, |
| 161 | GPUVAddr gpu_addr, VAddr cpu_addr, u8* host_ptr, | 161 | GPUVAddr gpu_addr, VAddr cpu_addr, ProgramCode program_code, |
| 162 | ProgramCode program_code, u32 main_offset) | 162 | u32 main_offset) |
| 163 | : RasterizerCacheObject{host_ptr}, gpu_addr{gpu_addr}, cpu_addr{cpu_addr}, | 163 | : RasterizerCacheObject{cpu_addr}, gpu_addr{gpu_addr}, program_code{std::move(program_code)}, |
| 164 | program_code{std::move(program_code)}, registry{stage, GetEngine(system, stage)}, | 164 | registry{stage, GetEngine(system, stage)}, shader_ir{this->program_code, main_offset, |
| 165 | shader_ir{this->program_code, main_offset, compiler_settings, registry}, | 165 | compiler_settings, registry}, |
| 166 | entries{GenerateShaderEntries(shader_ir)} {} | 166 | entries{GenerateShaderEntries(shader_ir)} {} |
| 167 | 167 | ||
| 168 | CachedShader::~CachedShader() = default; | 168 | CachedShader::~CachedShader() = default; |
| @@ -201,19 +201,19 @@ std::array<Shader, Maxwell::MaxShaderProgram> VKPipelineCache::GetShaders() { | |||
| 201 | 201 | ||
| 202 | auto& memory_manager{system.GPU().MemoryManager()}; | 202 | auto& memory_manager{system.GPU().MemoryManager()}; |
| 203 | const GPUVAddr program_addr{GetShaderAddress(system, program)}; | 203 | const GPUVAddr program_addr{GetShaderAddress(system, program)}; |
| 204 | const auto host_ptr{memory_manager.GetPointer(program_addr)}; | 204 | const std::optional cpu_addr = memory_manager.GpuToCpuAddress(program_addr); |
| 205 | auto shader = TryGet(host_ptr); | 205 | ASSERT(cpu_addr); |
| 206 | auto shader = cpu_addr ? TryGet(*cpu_addr) : nullptr; | ||
| 206 | if (!shader) { | 207 | if (!shader) { |
| 208 | const auto host_ptr{memory_manager.GetPointer(program_addr)}; | ||
| 209 | |||
| 207 | // No shader found - create a new one | 210 | // No shader found - create a new one |
| 208 | constexpr u32 stage_offset = 10; | 211 | constexpr u32 stage_offset = 10; |
| 209 | const auto stage = static_cast<Tegra::Engines::ShaderType>(index == 0 ? 0 : index - 1); | 212 | const auto stage = static_cast<Tegra::Engines::ShaderType>(index == 0 ? 0 : index - 1); |
| 210 | auto code = GetShaderCode(memory_manager, program_addr, host_ptr, false); | 213 | auto code = GetShaderCode(memory_manager, program_addr, host_ptr, false); |
| 211 | 214 | ||
| 212 | const std::optional cpu_addr = memory_manager.GpuToCpuAddress(program_addr); | ||
| 213 | ASSERT(cpu_addr); | ||
| 214 | |||
| 215 | shader = std::make_shared<CachedShader>(system, stage, program_addr, *cpu_addr, | 215 | shader = std::make_shared<CachedShader>(system, stage, program_addr, *cpu_addr, |
| 216 | host_ptr, std::move(code), stage_offset); | 216 | std::move(code), stage_offset); |
| 217 | Register(shader); | 217 | Register(shader); |
| 218 | } | 218 | } |
| 219 | shaders[index] = std::move(shader); | 219 | shaders[index] = std::move(shader); |
| @@ -253,18 +253,19 @@ VKComputePipeline& VKPipelineCache::GetComputePipeline(const ComputePipelineCach | |||
| 253 | 253 | ||
| 254 | auto& memory_manager = system.GPU().MemoryManager(); | 254 | auto& memory_manager = system.GPU().MemoryManager(); |
| 255 | const auto program_addr = key.shader; | 255 | const auto program_addr = key.shader; |
| 256 | const auto host_ptr = memory_manager.GetPointer(program_addr); | ||
| 257 | 256 | ||
| 258 | auto shader = TryGet(host_ptr); | 257 | const auto cpu_addr = memory_manager.GpuToCpuAddress(program_addr); |
| 258 | ASSERT(cpu_addr); | ||
| 259 | |||
| 260 | auto shader = cpu_addr ? TryGet(*cpu_addr) : nullptr; | ||
| 259 | if (!shader) { | 261 | if (!shader) { |
| 260 | // No shader found - create a new one | 262 | // No shader found - create a new one |
| 261 | const auto cpu_addr = memory_manager.GpuToCpuAddress(program_addr); | 263 | const auto host_ptr = memory_manager.GetPointer(program_addr); |
| 262 | ASSERT(cpu_addr); | ||
| 263 | 264 | ||
| 264 | auto code = GetShaderCode(memory_manager, program_addr, host_ptr, true); | 265 | auto code = GetShaderCode(memory_manager, program_addr, host_ptr, true); |
| 265 | constexpr u32 kernel_main_offset = 0; | 266 | constexpr u32 kernel_main_offset = 0; |
| 266 | shader = std::make_shared<CachedShader>(system, Tegra::Engines::ShaderType::Compute, | 267 | shader = std::make_shared<CachedShader>(system, Tegra::Engines::ShaderType::Compute, |
| 267 | program_addr, *cpu_addr, host_ptr, std::move(code), | 268 | program_addr, *cpu_addr, std::move(code), |
| 268 | kernel_main_offset); | 269 | kernel_main_offset); |
| 269 | Register(shader); | 270 | Register(shader); |
| 270 | } | 271 | } |
| @@ -345,8 +346,9 @@ VKPipelineCache::DecompileShaders(const GraphicsPipelineCacheKey& key) { | |||
| 345 | } | 346 | } |
| 346 | 347 | ||
| 347 | const GPUVAddr gpu_addr = GetShaderAddress(system, program_enum); | 348 | const GPUVAddr gpu_addr = GetShaderAddress(system, program_enum); |
| 348 | const auto host_ptr = memory_manager.GetPointer(gpu_addr); | 349 | const auto cpu_addr = memory_manager.GpuToCpuAddress(gpu_addr); |
| 349 | const auto shader = TryGet(host_ptr); | 350 | ASSERT(cpu_addr); |
| 351 | const auto shader = TryGet(*cpu_addr); | ||
| 350 | ASSERT(shader); | 352 | ASSERT(shader); |
| 351 | 353 | ||
| 352 | const std::size_t stage = index == 0 ? 0 : index - 1; // Stage indices are 0 - 5 | 354 | const std::size_t stage = index == 0 ? 0 : index - 1; // Stage indices are 0 - 5 |
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h index c4c112290..27c01732f 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h | |||
| @@ -113,17 +113,13 @@ namespace Vulkan { | |||
| 113 | class CachedShader final : public RasterizerCacheObject { | 113 | class CachedShader final : public RasterizerCacheObject { |
| 114 | public: | 114 | public: |
| 115 | explicit CachedShader(Core::System& system, Tegra::Engines::ShaderType stage, GPUVAddr gpu_addr, | 115 | explicit CachedShader(Core::System& system, Tegra::Engines::ShaderType stage, GPUVAddr gpu_addr, |
| 116 | VAddr cpu_addr, u8* host_ptr, ProgramCode program_code, u32 main_offset); | 116 | VAddr cpu_addr, ProgramCode program_code, u32 main_offset); |
| 117 | ~CachedShader(); | 117 | ~CachedShader(); |
| 118 | 118 | ||
| 119 | GPUVAddr GetGpuAddr() const { | 119 | GPUVAddr GetGpuAddr() const { |
| 120 | return gpu_addr; | 120 | return gpu_addr; |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | VAddr GetCpuAddr() const override { | ||
| 124 | return cpu_addr; | ||
| 125 | } | ||
| 126 | |||
| 127 | std::size_t GetSizeInBytes() const override { | 123 | std::size_t GetSizeInBytes() const override { |
| 128 | return program_code.size() * sizeof(u64); | 124 | return program_code.size() * sizeof(u64); |
| 129 | } | 125 | } |
| @@ -149,7 +145,6 @@ private: | |||
| 149 | Tegra::Engines::ShaderType stage); | 145 | Tegra::Engines::ShaderType stage); |
| 150 | 146 | ||
| 151 | GPUVAddr gpu_addr{}; | 147 | GPUVAddr gpu_addr{}; |
| 152 | VAddr cpu_addr{}; | ||
| 153 | ProgramCode program_code; | 148 | ProgramCode program_code; |
| 154 | VideoCommon::Shader::Registry registry; | 149 | VideoCommon::Shader::Registry registry; |
| 155 | VideoCommon::Shader::ShaderIR shader_ir; | 150 | VideoCommon::Shader::ShaderIR shader_ir; |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 58c69b786..0a2ea4fd4 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -495,20 +495,26 @@ void RasterizerVulkan::Query(GPUVAddr gpu_addr, VideoCore::QueryType type, | |||
| 495 | 495 | ||
| 496 | void RasterizerVulkan::FlushAll() {} | 496 | void RasterizerVulkan::FlushAll() {} |
| 497 | 497 | ||
| 498 | void RasterizerVulkan::FlushRegion(CacheAddr addr, u64 size) { | 498 | void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) { |
| 499 | if (addr == 0 || size == 0) { | ||
| 500 | return; | ||
| 501 | } | ||
| 499 | texture_cache.FlushRegion(addr, size); | 502 | texture_cache.FlushRegion(addr, size); |
| 500 | buffer_cache.FlushRegion(addr, size); | 503 | buffer_cache.FlushRegion(addr, size); |
| 501 | query_cache.FlushRegion(addr, size); | 504 | query_cache.FlushRegion(addr, size); |
| 502 | } | 505 | } |
| 503 | 506 | ||
| 504 | void RasterizerVulkan::InvalidateRegion(CacheAddr addr, u64 size) { | 507 | void RasterizerVulkan::InvalidateRegion(VAddr addr, u64 size) { |
| 508 | if (addr == 0 || size == 0) { | ||
| 509 | return; | ||
| 510 | } | ||
| 505 | texture_cache.InvalidateRegion(addr, size); | 511 | texture_cache.InvalidateRegion(addr, size); |
| 506 | pipeline_cache.InvalidateRegion(addr, size); | 512 | pipeline_cache.InvalidateRegion(addr, size); |
| 507 | buffer_cache.InvalidateRegion(addr, size); | 513 | buffer_cache.InvalidateRegion(addr, size); |
| 508 | query_cache.InvalidateRegion(addr, size); | 514 | query_cache.InvalidateRegion(addr, size); |
| 509 | } | 515 | } |
| 510 | 516 | ||
| 511 | void RasterizerVulkan::FlushAndInvalidateRegion(CacheAddr addr, u64 size) { | 517 | void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size) { |
| 512 | FlushRegion(addr, size); | 518 | FlushRegion(addr, size); |
| 513 | InvalidateRegion(addr, size); | 519 | InvalidateRegion(addr, size); |
| 514 | } | 520 | } |
| @@ -540,8 +546,7 @@ bool RasterizerVulkan::AccelerateDisplay(const Tegra::FramebufferConfig& config, | |||
| 540 | return false; | 546 | return false; |
| 541 | } | 547 | } |
| 542 | 548 | ||
| 543 | const u8* host_ptr{system.Memory().GetPointer(framebuffer_addr)}; | 549 | const auto surface{texture_cache.TryFindFramebufferSurface(framebuffer_addr)}; |
| 544 | const auto surface{texture_cache.TryFindFramebufferSurface(host_ptr)}; | ||
| 545 | if (!surface) { | 550 | if (!surface) { |
| 546 | return false; | 551 | return false; |
| 547 | } | 552 | } |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 3185868e9..f642dde76 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -118,9 +118,9 @@ public: | |||
| 118 | void ResetCounter(VideoCore::QueryType type) override; | 118 | void ResetCounter(VideoCore::QueryType type) override; |
| 119 | void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override; | 119 | void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override; |
| 120 | void FlushAll() override; | 120 | void FlushAll() override; |
| 121 | void FlushRegion(CacheAddr addr, u64 size) override; | 121 | void FlushRegion(VAddr addr, u64 size) override; |
| 122 | void InvalidateRegion(CacheAddr addr, u64 size) override; | 122 | void InvalidateRegion(VAddr addr, u64 size) override; |
| 123 | void FlushAndInvalidateRegion(CacheAddr addr, u64 size) override; | 123 | void FlushAndInvalidateRegion(VAddr addr, u64 size) override; |
| 124 | void FlushCommands() override; | 124 | void FlushCommands() override; |
| 125 | void TickFrame() override; | 125 | void TickFrame() override; |
| 126 | bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src, | 126 | bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src, |