diff options
| author | 2021-04-14 21:36:36 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:27 -0400 | |
| commit | 416e1b7441d34512fcb0ffed014daf7ca4bb62bd (patch) | |
| tree | fa14781ad4969613919a8bcd68b887b9b7a98304 /src/video_core/buffer_cache | |
| parent | spirv: Implement Layer stores (diff) | |
| download | yuzu-416e1b7441d34512fcb0ffed014daf7ca4bb62bd.tar.gz yuzu-416e1b7441d34512fcb0ffed014daf7ca4bb62bd.tar.xz yuzu-416e1b7441d34512fcb0ffed014daf7ca4bb62bd.zip | |
spirv: Implement image buffers
Diffstat (limited to 'src/video_core/buffer_cache')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 24 |
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, | |||
| 700 | template <class P> | 702 | template <class P> |
| 701 | void BufferCache<P>::UnbindGraphicsTextureBuffers(size_t stage) { | 703 | void 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 | ||
| 705 | template <class P> | 708 | template <class P> |
| 706 | void BufferCache<P>::BindGraphicsTextureBuffer(size_t stage, size_t tbo_index, GPUVAddr gpu_addr, | 709 | void 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, | |||
| 732 | template <class P> | 736 | template <class P> |
| 733 | void BufferCache<P>::UnbindComputeTextureBuffers() { | 737 | void 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 | ||
| 737 | template <class P> | 742 | template <class P> |
| 738 | void BufferCache<P>::BindComputeTextureBuffer(size_t tbo_index, GPUVAddr gpu_addr, u32 size, | 743 | void 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 | ||