diff options
Diffstat (limited to 'src/video_core/texture_cache')
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 58 |
1 files changed, 25 insertions, 33 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index d1080300f..b1da69971 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -103,9 +103,6 @@ public: | |||
| 103 | /// Notify the cache that a new frame has been queued | 103 | /// Notify the cache that a new frame has been queued |
| 104 | void TickFrame(); | 104 | void TickFrame(); |
| 105 | 105 | ||
| 106 | /// Return an unique mutually exclusive lock for the cache | ||
| 107 | [[nodiscard]] std::unique_lock<std::mutex> AcquireLock(); | ||
| 108 | |||
| 109 | /// Return a constant reference to the given image view id | 106 | /// Return a constant reference to the given image view id |
| 110 | [[nodiscard]] const ImageView& GetImageView(ImageViewId id) const noexcept; | 107 | [[nodiscard]] const ImageView& GetImageView(ImageViewId id) const noexcept; |
| 111 | 108 | ||
| @@ -179,6 +176,8 @@ public: | |||
| 179 | /// Return true when a CPU region is modified from the GPU | 176 | /// Return true when a CPU region is modified from the GPU |
| 180 | [[nodiscard]] bool IsRegionGpuModified(VAddr addr, size_t size); | 177 | [[nodiscard]] bool IsRegionGpuModified(VAddr addr, size_t size); |
| 181 | 178 | ||
| 179 | std::mutex mutex; | ||
| 180 | |||
| 182 | private: | 181 | private: |
| 183 | /// Iterate over all page indices in a range | 182 | /// Iterate over all page indices in a range |
| 184 | template <typename Func> | 183 | template <typename Func> |
| @@ -212,8 +211,8 @@ private: | |||
| 212 | void RefreshContents(Image& image); | 211 | void RefreshContents(Image& image); |
| 213 | 212 | ||
| 214 | /// Upload data from guest to an image | 213 | /// Upload data from guest to an image |
| 215 | template <typename MapBuffer> | 214 | template <typename StagingBuffer> |
| 216 | void UploadImageContents(Image& image, MapBuffer& map, size_t buffer_offset); | 215 | void UploadImageContents(Image& image, StagingBuffer& staging_buffer); |
| 217 | 216 | ||
| 218 | /// Find or create an image view from a guest descriptor | 217 | /// Find or create an image view from a guest descriptor |
| 219 | [[nodiscard]] ImageViewId FindImageView(const TICEntry& config); | 218 | [[nodiscard]] ImageViewId FindImageView(const TICEntry& config); |
| @@ -325,8 +324,6 @@ private: | |||
| 325 | 324 | ||
| 326 | RenderTargets render_targets; | 325 | RenderTargets render_targets; |
| 327 | 326 | ||
| 328 | std::mutex mutex; | ||
| 329 | |||
| 330 | std::unordered_map<TICEntry, ImageViewId> image_views; | 327 | std::unordered_map<TICEntry, ImageViewId> image_views; |
| 331 | std::unordered_map<TSCEntry, SamplerId> samplers; | 328 | std::unordered_map<TSCEntry, SamplerId> samplers; |
| 332 | std::unordered_map<RenderTargets, FramebufferId> framebuffers; | 329 | std::unordered_map<RenderTargets, FramebufferId> framebuffers; |
| @@ -386,11 +383,6 @@ void TextureCache<P>::TickFrame() { | |||
| 386 | } | 383 | } |
| 387 | 384 | ||
| 388 | template <class P> | 385 | template <class P> |
| 389 | std::unique_lock<std::mutex> TextureCache<P>::AcquireLock() { | ||
| 390 | return std::unique_lock{mutex}; | ||
| 391 | } | ||
| 392 | |||
| 393 | template <class P> | ||
| 394 | const typename P::ImageView& TextureCache<P>::GetImageView(ImageViewId id) const noexcept { | 386 | const typename P::ImageView& TextureCache<P>::GetImageView(ImageViewId id) const noexcept { |
| 395 | return slot_image_views[id]; | 387 | return slot_image_views[id]; |
| 396 | } | 388 | } |
| @@ -598,11 +590,11 @@ void TextureCache<P>::DownloadMemory(VAddr cpu_addr, size_t size) { | |||
| 598 | }); | 590 | }); |
| 599 | for (const ImageId image_id : images) { | 591 | for (const ImageId image_id : images) { |
| 600 | Image& image = slot_images[image_id]; | 592 | Image& image = slot_images[image_id]; |
| 601 | auto map = runtime.MapDownloadBuffer(image.unswizzled_size_bytes); | 593 | auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); |
| 602 | const auto copies = FullDownloadCopies(image.info); | 594 | const auto copies = FullDownloadCopies(image.info); |
| 603 | image.DownloadMemory(map, 0, copies); | 595 | image.DownloadMemory(map, copies); |
| 604 | runtime.Finish(); | 596 | runtime.Finish(); |
| 605 | SwizzleImage(gpu_memory, image.gpu_addr, image.info, copies, map.Span()); | 597 | SwizzleImage(gpu_memory, image.gpu_addr, image.info, copies, map.mapped_span); |
| 606 | } | 598 | } |
| 607 | } | 599 | } |
| 608 | 600 | ||
| @@ -757,25 +749,25 @@ void TextureCache<P>::PopAsyncFlushes() { | |||
| 757 | for (const ImageId image_id : download_ids) { | 749 | for (const ImageId image_id : download_ids) { |
| 758 | total_size_bytes += slot_images[image_id].unswizzled_size_bytes; | 750 | total_size_bytes += slot_images[image_id].unswizzled_size_bytes; |
| 759 | } | 751 | } |
| 760 | auto download_map = runtime.MapDownloadBuffer(total_size_bytes); | 752 | auto download_map = runtime.DownloadStagingBuffer(total_size_bytes); |
| 761 | size_t buffer_offset = 0; | 753 | const size_t original_offset = download_map.offset; |
| 762 | for (const ImageId image_id : download_ids) { | 754 | for (const ImageId image_id : download_ids) { |
| 763 | Image& image = slot_images[image_id]; | 755 | Image& image = slot_images[image_id]; |
| 764 | const auto copies = FullDownloadCopies(image.info); | 756 | const auto copies = FullDownloadCopies(image.info); |
| 765 | image.DownloadMemory(download_map, buffer_offset, copies); | 757 | image.DownloadMemory(download_map, copies); |
| 766 | buffer_offset += image.unswizzled_size_bytes; | 758 | download_map.offset += image.unswizzled_size_bytes; |
| 767 | } | 759 | } |
| 768 | // Wait for downloads to finish | 760 | // Wait for downloads to finish |
| 769 | runtime.Finish(); | 761 | runtime.Finish(); |
| 770 | 762 | ||
| 771 | buffer_offset = 0; | 763 | download_map.offset = original_offset; |
| 772 | const std::span<u8> download_span = download_map.Span(); | 764 | std::span<u8> download_span = download_map.mapped_span; |
| 773 | for (const ImageId image_id : download_ids) { | 765 | for (const ImageId image_id : download_ids) { |
| 774 | const ImageBase& image = slot_images[image_id]; | 766 | const ImageBase& image = slot_images[image_id]; |
| 775 | const auto copies = FullDownloadCopies(image.info); | 767 | const auto copies = FullDownloadCopies(image.info); |
| 776 | const std::span<u8> image_download_span = download_span.subspan(buffer_offset); | 768 | SwizzleImage(gpu_memory, image.gpu_addr, image.info, copies, download_span); |
| 777 | SwizzleImage(gpu_memory, image.gpu_addr, image.info, copies, image_download_span); | 769 | download_map.offset += image.unswizzled_size_bytes; |
| 778 | buffer_offset += image.unswizzled_size_bytes; | 770 | download_span = download_span.subspan(image.unswizzled_size_bytes); |
| 779 | } | 771 | } |
| 780 | committed_downloads.pop(); | 772 | committed_downloads.pop(); |
| 781 | } | 773 | } |
| @@ -806,32 +798,32 @@ void TextureCache<P>::RefreshContents(Image& image) { | |||
| 806 | LOG_WARNING(HW_GPU, "MSAA image uploads are not implemented"); | 798 | LOG_WARNING(HW_GPU, "MSAA image uploads are not implemented"); |
| 807 | return; | 799 | return; |
| 808 | } | 800 | } |
| 809 | auto map = runtime.MapUploadBuffer(MapSizeBytes(image)); | 801 | auto staging = runtime.UploadStagingBuffer(MapSizeBytes(image)); |
| 810 | UploadImageContents(image, map, 0); | 802 | UploadImageContents(image, staging); |
| 811 | runtime.InsertUploadMemoryBarrier(); | 803 | runtime.InsertUploadMemoryBarrier(); |
| 812 | } | 804 | } |
| 813 | 805 | ||
| 814 | template <class P> | 806 | template <class P> |
| 815 | template <typename MapBuffer> | 807 | template <typename StagingBuffer> |
| 816 | void TextureCache<P>::UploadImageContents(Image& image, MapBuffer& map, size_t buffer_offset) { | 808 | void TextureCache<P>::UploadImageContents(Image& image, StagingBuffer& staging) { |
| 817 | const std::span<u8> mapped_span = map.Span().subspan(buffer_offset); | 809 | const std::span<u8> mapped_span = staging.mapped_span; |
| 818 | const GPUVAddr gpu_addr = image.gpu_addr; | 810 | const GPUVAddr gpu_addr = image.gpu_addr; |
| 819 | 811 | ||
| 820 | if (True(image.flags & ImageFlagBits::AcceleratedUpload)) { | 812 | if (True(image.flags & ImageFlagBits::AcceleratedUpload)) { |
| 821 | gpu_memory.ReadBlockUnsafe(gpu_addr, mapped_span.data(), mapped_span.size_bytes()); | 813 | gpu_memory.ReadBlockUnsafe(gpu_addr, mapped_span.data(), mapped_span.size_bytes()); |
| 822 | const auto uploads = FullUploadSwizzles(image.info); | 814 | const auto uploads = FullUploadSwizzles(image.info); |
| 823 | runtime.AccelerateImageUpload(image, map, buffer_offset, uploads); | 815 | runtime.AccelerateImageUpload(image, staging, uploads); |
| 824 | } else if (True(image.flags & ImageFlagBits::Converted)) { | 816 | } else if (True(image.flags & ImageFlagBits::Converted)) { |
| 825 | std::vector<u8> unswizzled_data(image.unswizzled_size_bytes); | 817 | std::vector<u8> unswizzled_data(image.unswizzled_size_bytes); |
| 826 | auto copies = UnswizzleImage(gpu_memory, gpu_addr, image.info, unswizzled_data); | 818 | auto copies = UnswizzleImage(gpu_memory, gpu_addr, image.info, unswizzled_data); |
| 827 | ConvertImage(unswizzled_data, image.info, mapped_span, copies); | 819 | ConvertImage(unswizzled_data, image.info, mapped_span, copies); |
| 828 | image.UploadMemory(map, buffer_offset, copies); | 820 | image.UploadMemory(staging, copies); |
| 829 | } else if (image.info.type == ImageType::Buffer) { | 821 | } else if (image.info.type == ImageType::Buffer) { |
| 830 | const std::array copies{UploadBufferCopy(gpu_memory, gpu_addr, image, mapped_span)}; | 822 | const std::array copies{UploadBufferCopy(gpu_memory, gpu_addr, image, mapped_span)}; |
| 831 | image.UploadMemory(map, buffer_offset, copies); | 823 | image.UploadMemory(staging, copies); |
| 832 | } else { | 824 | } else { |
| 833 | const auto copies = UnswizzleImage(gpu_memory, gpu_addr, image.info, mapped_span); | 825 | const auto copies = UnswizzleImage(gpu_memory, gpu_addr, image.info, mapped_span); |
| 834 | image.UploadMemory(map, buffer_offset, copies); | 826 | image.UploadMemory(staging, copies); |
| 835 | } | 827 | } |
| 836 | } | 828 | } |
| 837 | 829 | ||