summaryrefslogtreecommitdiff
path: root/src/video_core/buffer_cache
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/buffer_cache')
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index 6701aab82..29746f61d 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -154,7 +154,7 @@ public:
154 void UnbindGraphicsTextureBuffers(size_t stage); 154 void UnbindGraphicsTextureBuffers(size_t stage);
155 155
156 void BindGraphicsTextureBuffer(size_t stage, size_t tbo_index, GPUVAddr gpu_addr, u32 size, 156 void BindGraphicsTextureBuffer(size_t stage, size_t tbo_index, GPUVAddr gpu_addr, u32 size,
157 PixelFormat format); 157 PixelFormat format, bool is_written);
158 158
159 void UnbindComputeStorageBuffers(); 159 void UnbindComputeStorageBuffers();
160 160
@@ -163,8 +163,8 @@ public:
163 163
164 void UnbindComputeTextureBuffers(); 164 void UnbindComputeTextureBuffers();
165 165
166 void BindComputeTextureBuffer(size_t tbo_index, GPUVAddr gpu_addr, u32 size, 166 void BindComputeTextureBuffer(size_t tbo_index, GPUVAddr gpu_addr, u32 size, PixelFormat format,
167 PixelFormat format); 167 bool is_written);
168 168
169 void FlushCachedWrites(); 169 void FlushCachedWrites();
170 170
@@ -393,7 +393,9 @@ private:
393 u32 written_compute_storage_buffers = 0; 393 u32 written_compute_storage_buffers = 0;
394 394
395 std::array<u32, NUM_STAGES> enabled_texture_buffers{}; 395 std::array<u32, NUM_STAGES> enabled_texture_buffers{};
396 std::array<u32, NUM_STAGES> written_texture_buffers{};
396 u32 enabled_compute_texture_buffers = 0; 397 u32 enabled_compute_texture_buffers = 0;
398 u32 written_compute_texture_buffers = 0;
397 399
398 std::array<u32, NUM_STAGES> fast_bound_uniform_buffers{}; 400 std::array<u32, NUM_STAGES> fast_bound_uniform_buffers{};
399 401
@@ -700,12 +702,14 @@ void BufferCache<P>::BindGraphicsStorageBuffer(size_t stage, size_t ssbo_index,
700template <class P> 702template <class P>
701void BufferCache<P>::UnbindGraphicsTextureBuffers(size_t stage) { 703void BufferCache<P>::UnbindGraphicsTextureBuffers(size_t stage) {
702 enabled_texture_buffers[stage] = 0; 704 enabled_texture_buffers[stage] = 0;
705 written_texture_buffers[stage] = 0;
703} 706}
704 707
705template <class P> 708template <class P>
706void BufferCache<P>::BindGraphicsTextureBuffer(size_t stage, size_t tbo_index, GPUVAddr gpu_addr, 709void BufferCache<P>::BindGraphicsTextureBuffer(size_t stage, size_t tbo_index, GPUVAddr gpu_addr,
707 u32 size, PixelFormat format) { 710 u32 size, PixelFormat format, bool is_written) {
708 enabled_texture_buffers[stage] |= 1U << tbo_index; 711 enabled_texture_buffers[stage] |= 1U << tbo_index;
712 written_texture_buffers[stage] |= (is_written ? 1U : 0U) << tbo_index;
709 texture_buffers[stage][tbo_index] = GetTextureBufferBinding(gpu_addr, size, format); 713 texture_buffers[stage][tbo_index] = GetTextureBufferBinding(gpu_addr, size, format);
710} 714}
711 715
@@ -732,12 +736,14 @@ void BufferCache<P>::BindComputeStorageBuffer(size_t ssbo_index, u32 cbuf_index,
732template <class P> 736template <class P>
733void BufferCache<P>::UnbindComputeTextureBuffers() { 737void BufferCache<P>::UnbindComputeTextureBuffers() {
734 enabled_compute_texture_buffers = 0; 738 enabled_compute_texture_buffers = 0;
739 written_compute_texture_buffers = 0;
735} 740}
736 741
737template <class P> 742template <class P>
738void BufferCache<P>::BindComputeTextureBuffer(size_t tbo_index, GPUVAddr gpu_addr, u32 size, 743void BufferCache<P>::BindComputeTextureBuffer(size_t tbo_index, GPUVAddr gpu_addr, u32 size,
739 PixelFormat format) { 744 PixelFormat format, bool is_written) {
740 enabled_compute_texture_buffers |= 1U << tbo_index; 745 enabled_compute_texture_buffers |= 1U << tbo_index;
746 written_compute_texture_buffers |= (is_written ? 1U : 0U) << tbo_index;
741 compute_texture_buffers[tbo_index] = GetTextureBufferBinding(gpu_addr, size, format); 747 compute_texture_buffers[tbo_index] = GetTextureBufferBinding(gpu_addr, size, format);
742} 748}
743 749
@@ -1274,6 +1280,10 @@ void BufferCache<P>::UpdateTextureBuffers(size_t stage) {
1274 ForEachEnabledBit(enabled_texture_buffers[stage], [&](u32 index) { 1280 ForEachEnabledBit(enabled_texture_buffers[stage], [&](u32 index) {
1275 Binding& binding = texture_buffers[stage][index]; 1281 Binding& binding = texture_buffers[stage][index];
1276 binding.buffer_id = FindBuffer(binding.cpu_addr, binding.size); 1282 binding.buffer_id = FindBuffer(binding.cpu_addr, binding.size);
1283 // Mark buffer as written if needed
1284 if (((written_texture_buffers[stage] >> index) & 1) != 0) {
1285 MarkWrittenBuffer(binding.buffer_id, binding.cpu_addr, binding.size);
1286 }
1277 }); 1287 });
1278} 1288}
1279 1289
@@ -1343,6 +1353,10 @@ void BufferCache<P>::UpdateComputeTextureBuffers() {
1343 ForEachEnabledBit(enabled_compute_texture_buffers, [&](u32 index) { 1353 ForEachEnabledBit(enabled_compute_texture_buffers, [&](u32 index) {
1344 Binding& binding = compute_texture_buffers[index]; 1354 Binding& binding = compute_texture_buffers[index];
1345 binding.buffer_id = FindBuffer(binding.cpu_addr, binding.size); 1355 binding.buffer_id = FindBuffer(binding.cpu_addr, binding.size);
1356 // Mark as written if needed
1357 if (((written_compute_texture_buffers >> index) & 1) != 0) {
1358 MarkWrittenBuffer(binding.buffer_id, binding.cpu_addr, binding.size);
1359 }
1346 }); 1360 });
1347} 1361}
1348 1362