summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h11
-rw-r--r--src/video_core/engines/maxwell_3d.cpp8
-rw-r--r--src/video_core/memory_manager.cpp3
-rw-r--r--src/video_core/rasterizer_interface.h3
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp4
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h1
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h1
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>
419void BufferCache<P>::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, 421void 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
434template <class P> 432template <class P>
433void BufferCache<P>::DisableGraphicsUniformBuffer(size_t stage, u32 index) {
434 uniform_buffers[stage][index] = NULL_BINDING;
435}
436
437template <class P>
435void BufferCache<P>::UpdateGraphicsBuffers(bool is_indexed) { 438void 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
165std::optional<VAddr> MemoryManager::GpuToCpuAddress(GPUVAddr gpu_addr) const { 165std::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
529void RasterizerOpenGL::DisableGraphicsUniformBuffer(size_t stage, u32 index) {
530 buffer_cache.DisableGraphicsUniformBuffer(stage, index);
531}
532
529void RasterizerOpenGL::FlushAll() {} 533void RasterizerOpenGL::FlushAll() {}
530 534
531void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { 535void 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
479void Vulkan::RasterizerVulkan::DisableGraphicsUniformBuffer(size_t stage, u32 index) {
480 buffer_cache.DisableGraphicsUniformBuffer(stage, index);
481}
482
479void RasterizerVulkan::FlushAll() {} 483void RasterizerVulkan::FlushAll() {}
480 484
481void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) { 485void 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;