diff options
| author | 2021-06-01 13:26:43 -0400 | |
|---|---|---|
| committer | 2021-06-01 13:26:58 -0400 | |
| commit | 859ba21f6db184f7ada03314ed02b42e49eb8149 (patch) | |
| tree | d6e4b35187bb52371c102b982eb8a90af56420d2 /src | |
| parent | Merge pull request #6396 from lat9nq/mingw-sdl-fix (diff) | |
| download | yuzu-859ba21f6db184f7ada03314ed02b42e49eb8149.tar.gz yuzu-859ba21f6db184f7ada03314ed02b42e49eb8149.tar.xz yuzu-859ba21f6db184f7ada03314ed02b42e49eb8149.zip | |
buffer_cache: Simplify uniform disabling logic
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 11 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/memory_manager.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/rasterizer_interface.h | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 1 |
8 files changed, 29 insertions, 6 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 9e6b87960..d371b842f 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -110,6 +110,8 @@ public: | |||
| 110 | 110 | ||
| 111 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size); | 111 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size); |
| 112 | 112 | ||
| 113 | void DisableGraphicsUniformBuffer(size_t stage, u32 index); | ||
| 114 | |||
| 113 | void UpdateGraphicsBuffers(bool is_indexed); | 115 | void UpdateGraphicsBuffers(bool is_indexed); |
| 114 | 116 | ||
| 115 | void UpdateComputeBuffers(); | 117 | void UpdateComputeBuffers(); |
| @@ -419,10 +421,6 @@ template <class P> | |||
| 419 | void BufferCache<P>::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, | 421 | void BufferCache<P>::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, |
| 420 | u32 size) { | 422 | u32 size) { |
| 421 | const std::optional<VAddr> cpu_addr = gpu_memory.GpuToCpuAddress(gpu_addr); | 423 | const std::optional<VAddr> cpu_addr = gpu_memory.GpuToCpuAddress(gpu_addr); |
| 422 | if (!cpu_addr) { | ||
| 423 | uniform_buffers[stage][index] = NULL_BINDING; | ||
| 424 | return; | ||
| 425 | } | ||
| 426 | const Binding binding{ | 424 | const Binding binding{ |
| 427 | .cpu_addr = *cpu_addr, | 425 | .cpu_addr = *cpu_addr, |
| 428 | .size = size, | 426 | .size = size, |
| @@ -432,6 +430,11 @@ void BufferCache<P>::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr | |||
| 432 | } | 430 | } |
| 433 | 431 | ||
| 434 | template <class P> | 432 | template <class P> |
| 433 | void BufferCache<P>::DisableGraphicsUniformBuffer(size_t stage, u32 index) { | ||
| 434 | uniform_buffers[stage][index] = NULL_BINDING; | ||
| 435 | } | ||
| 436 | |||
| 437 | template <class P> | ||
| 435 | void BufferCache<P>::UpdateGraphicsBuffers(bool is_indexed) { | 438 | void BufferCache<P>::UpdateGraphicsBuffers(bool is_indexed) { |
| 436 | MICROPROFILE_SCOPE(GPU_PrepareBuffers); | 439 | MICROPROFILE_SCOPE(GPU_PrepareBuffers); |
| 437 | do { | 440 | do { |
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 75517a4f7..aab6b8f7a 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp | |||
| @@ -578,8 +578,12 @@ void Maxwell3D::ProcessCBBind(size_t stage_index) { | |||
| 578 | buffer.size = regs.const_buffer.cb_size; | 578 | buffer.size = regs.const_buffer.cb_size; |
| 579 | 579 | ||
| 580 | const bool is_enabled = bind_data.valid.Value() != 0; | 580 | const bool is_enabled = bind_data.valid.Value() != 0; |
| 581 | const GPUVAddr gpu_addr = is_enabled ? regs.const_buffer.BufferAddress() : 0; | 581 | if (!is_enabled) { |
| 582 | const u32 size = is_enabled ? regs.const_buffer.cb_size : 0; | 582 | rasterizer->DisableGraphicsUniformBuffer(stage_index, bind_data.index); |
| 583 | return; | ||
| 584 | } | ||
| 585 | const GPUVAddr gpu_addr = regs.const_buffer.BufferAddress(); | ||
| 586 | const u32 size = regs.const_buffer.cb_size; | ||
| 583 | rasterizer->BindGraphicsUniformBuffer(stage_index, bind_data.index, gpu_addr, size); | 587 | rasterizer->BindGraphicsUniformBuffer(stage_index, bind_data.index, gpu_addr, size); |
| 584 | } | 588 | } |
| 585 | 589 | ||
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index eb58ac6b6..7124c755c 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -163,6 +163,9 @@ std::optional<GPUVAddr> MemoryManager::FindFreeRange(std::size_t size, std::size | |||
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | std::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr gpu_addr) const { | 165 | std::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr gpu_addr) const { |
| 166 | if (gpu_addr == 0) { | ||
| 167 | return std::nullopt; | ||
| 168 | } | ||
| 166 | const auto page_entry{GetPageEntry(gpu_addr)}; | 169 | const auto page_entry{GetPageEntry(gpu_addr)}; |
| 167 | if (!page_entry.IsValid()) { | 170 | if (!page_entry.IsValid()) { |
| 168 | return std::nullopt; | 171 | return std::nullopt; |
diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h index 50491b758..f968b5b16 100644 --- a/src/video_core/rasterizer_interface.h +++ b/src/video_core/rasterizer_interface.h | |||
| @@ -54,6 +54,9 @@ public: | |||
| 54 | virtual void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, | 54 | virtual void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, |
| 55 | u32 size) = 0; | 55 | u32 size) = 0; |
| 56 | 56 | ||
| 57 | /// Signal disabling of a uniform buffer | ||
| 58 | virtual void DisableGraphicsUniformBuffer(size_t stage, u32 index) = 0; | ||
| 59 | |||
| 57 | /// Signal a GPU based semaphore as a fence | 60 | /// Signal a GPU based semaphore as a fence |
| 58 | virtual void SignalSemaphore(GPUVAddr addr, u32 value) = 0; | 61 | virtual void SignalSemaphore(GPUVAddr addr, u32 value) = 0; |
| 59 | 62 | ||
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index a5dbb9adf..f87bb269b 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -526,6 +526,10 @@ void RasterizerOpenGL::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAd | |||
| 526 | buffer_cache.BindGraphicsUniformBuffer(stage, index, gpu_addr, size); | 526 | buffer_cache.BindGraphicsUniformBuffer(stage, index, gpu_addr, size); |
| 527 | } | 527 | } |
| 528 | 528 | ||
| 529 | void RasterizerOpenGL::DisableGraphicsUniformBuffer(size_t stage, u32 index) { | ||
| 530 | buffer_cache.DisableGraphicsUniformBuffer(stage, index); | ||
| 531 | } | ||
| 532 | |||
| 529 | void RasterizerOpenGL::FlushAll() {} | 533 | void RasterizerOpenGL::FlushAll() {} |
| 530 | 534 | ||
| 531 | void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { | 535 | void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 3745cf637..76298517f 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -72,6 +72,7 @@ public: | |||
| 72 | void ResetCounter(VideoCore::QueryType type) override; | 72 | void ResetCounter(VideoCore::QueryType type) override; |
| 73 | void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override; | 73 | void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override; |
| 74 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; | 74 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; |
| 75 | void DisableGraphicsUniformBuffer(size_t stage, u32 index) override; | ||
| 75 | void FlushAll() override; | 76 | void FlushAll() override; |
| 76 | void FlushRegion(VAddr addr, u64 size) override; | 77 | void FlushRegion(VAddr addr, u64 size) override; |
| 77 | bool MustFlushRegion(VAddr addr, u64 size) override; | 78 | bool MustFlushRegion(VAddr addr, u64 size) override; |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index e9a0e7811..1c9120170 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -476,6 +476,10 @@ void RasterizerVulkan::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAd | |||
| 476 | buffer_cache.BindGraphicsUniformBuffer(stage, index, gpu_addr, size); | 476 | buffer_cache.BindGraphicsUniformBuffer(stage, index, gpu_addr, size); |
| 477 | } | 477 | } |
| 478 | 478 | ||
| 479 | void Vulkan::RasterizerVulkan::DisableGraphicsUniformBuffer(size_t stage, u32 index) { | ||
| 480 | buffer_cache.DisableGraphicsUniformBuffer(stage, index); | ||
| 481 | } | ||
| 482 | |||
| 479 | void RasterizerVulkan::FlushAll() {} | 483 | void RasterizerVulkan::FlushAll() {} |
| 480 | 484 | ||
| 481 | void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) { | 485 | void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) { |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 235afc6f3..cb8c5c279 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -64,6 +64,7 @@ public: | |||
| 64 | void ResetCounter(VideoCore::QueryType type) override; | 64 | void ResetCounter(VideoCore::QueryType type) override; |
| 65 | void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override; | 65 | void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override; |
| 66 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; | 66 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; |
| 67 | void DisableGraphicsUniformBuffer(size_t stage, u32 index) override; | ||
| 67 | void FlushAll() override; | 68 | void FlushAll() override; |
| 68 | void FlushRegion(VAddr addr, u64 size) override; | 69 | void FlushRegion(VAddr addr, u64 size) override; |
| 69 | bool MustFlushRegion(VAddr addr, u64 size) override; | 70 | bool MustFlushRegion(VAddr addr, u64 size) override; |