diff options
| author | 2021-04-06 20:14:55 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:26 -0400 | |
| commit | e9a91bc5cc2c39b476ba8946f66930f5ab5608b2 (patch) | |
| tree | ad75617771ba4093c5609a505e3c8926668eb533 /src/video_core/texture_cache | |
| parent | shader: Fix F2I (diff) | |
| download | yuzu-e9a91bc5cc2c39b476ba8946f66930f5ab5608b2.tar.gz yuzu-e9a91bc5cc2c39b476ba8946f66930f5ab5608b2.tar.xz yuzu-e9a91bc5cc2c39b476ba8946f66930f5ab5608b2.zip | |
shader: Interact texture buffers with buffer cache
Diffstat (limited to 'src/video_core/texture_cache')
| -rw-r--r-- | src/video_core/texture_cache/image_view_base.cpp | 9 | ||||
| -rw-r--r-- | src/video_core/texture_cache/image_view_base.h | 1 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 13 |
3 files changed, 19 insertions, 4 deletions
diff --git a/src/video_core/texture_cache/image_view_base.cpp b/src/video_core/texture_cache/image_view_base.cpp index e8d632f9e..450becbeb 100644 --- a/src/video_core/texture_cache/image_view_base.cpp +++ b/src/video_core/texture_cache/image_view_base.cpp | |||
| @@ -36,6 +36,15 @@ ImageViewBase::ImageViewBase(const ImageViewInfo& info, const ImageInfo& image_i | |||
| 36 | } | 36 | } |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | ImageViewBase::ImageViewBase(const ImageInfo& info, const ImageViewInfo& view_info) | ||
| 40 | : format{info.format}, type{ImageViewType::Buffer}, size{ | ||
| 41 | .width = info.size.width, | ||
| 42 | .height = 1, | ||
| 43 | .depth = 1, | ||
| 44 | } { | ||
| 45 | ASSERT_MSG(view_info.type == ImageViewType::Buffer, "Expected texture buffer"); | ||
| 46 | } | ||
| 47 | |||
| 39 | ImageViewBase::ImageViewBase(const NullImageParams&) {} | 48 | ImageViewBase::ImageViewBase(const NullImageParams&) {} |
| 40 | 49 | ||
| 41 | } // namespace VideoCommon | 50 | } // namespace VideoCommon |
diff --git a/src/video_core/texture_cache/image_view_base.h b/src/video_core/texture_cache/image_view_base.h index 73954167e..903f715c5 100644 --- a/src/video_core/texture_cache/image_view_base.h +++ b/src/video_core/texture_cache/image_view_base.h | |||
| @@ -27,6 +27,7 @@ DECLARE_ENUM_FLAG_OPERATORS(ImageViewFlagBits) | |||
| 27 | struct ImageViewBase { | 27 | struct ImageViewBase { |
| 28 | explicit ImageViewBase(const ImageViewInfo& info, const ImageInfo& image_info, | 28 | explicit ImageViewBase(const ImageViewInfo& info, const ImageInfo& image_info, |
| 29 | ImageId image_id); | 29 | ImageId image_id); |
| 30 | explicit ImageViewBase(const ImageInfo& info, const ImageViewInfo& view_info); | ||
| 30 | explicit ImageViewBase(const NullImageParams&); | 31 | explicit ImageViewBase(const NullImageParams&); |
| 31 | 32 | ||
| 32 | [[nodiscard]] bool IsBuffer() const noexcept { | 33 | [[nodiscard]] bool IsBuffer() const noexcept { |
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 85ce06d56..5e8d99482 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -968,9 +968,6 @@ void TextureCache<P>::UploadImageContents(Image& image, StagingBuffer& staging) | |||
| 968 | auto copies = UnswizzleImage(gpu_memory, gpu_addr, image.info, unswizzled_data); | 968 | auto copies = UnswizzleImage(gpu_memory, gpu_addr, image.info, unswizzled_data); |
| 969 | ConvertImage(unswizzled_data, image.info, mapped_span, copies); | 969 | ConvertImage(unswizzled_data, image.info, mapped_span, copies); |
| 970 | image.UploadMemory(staging, copies); | 970 | image.UploadMemory(staging, copies); |
| 971 | } else if (image.info.type == ImageType::Buffer) { | ||
| 972 | const std::array copies{UploadBufferCopy(gpu_memory, gpu_addr, image, mapped_span)}; | ||
| 973 | image.UploadMemory(staging, copies); | ||
| 974 | } else { | 971 | } else { |
| 975 | const auto copies = UnswizzleImage(gpu_memory, gpu_addr, image.info, mapped_span); | 972 | const auto copies = UnswizzleImage(gpu_memory, gpu_addr, image.info, mapped_span); |
| 976 | image.UploadMemory(staging, copies); | 973 | image.UploadMemory(staging, copies); |
| @@ -993,7 +990,12 @@ ImageViewId TextureCache<P>::FindImageView(const TICEntry& config) { | |||
| 993 | template <class P> | 990 | template <class P> |
| 994 | ImageViewId TextureCache<P>::CreateImageView(const TICEntry& config) { | 991 | ImageViewId TextureCache<P>::CreateImageView(const TICEntry& config) { |
| 995 | const ImageInfo info(config); | 992 | const ImageInfo info(config); |
| 996 | const GPUVAddr image_gpu_addr = config.Address() - config.BaseLayer() * info.layer_stride; | 993 | if (info.type == ImageType::Buffer) { |
| 994 | const ImageViewInfo view_info(config, 0); | ||
| 995 | return slot_image_views.insert(runtime, info, view_info, config.Address()); | ||
| 996 | } | ||
| 997 | const u32 layer_offset = config.BaseLayer() * info.layer_stride; | ||
| 998 | const GPUVAddr image_gpu_addr = config.Address() - layer_offset; | ||
| 997 | const ImageId image_id = FindOrInsertImage(info, image_gpu_addr); | 999 | const ImageId image_id = FindOrInsertImage(info, image_gpu_addr); |
| 998 | if (!image_id) { | 1000 | if (!image_id) { |
| 999 | return NULL_IMAGE_VIEW_ID; | 1001 | return NULL_IMAGE_VIEW_ID; |
| @@ -1801,6 +1803,9 @@ void TextureCache<P>::PrepareImageView(ImageViewId image_view_id, bool is_modifi | |||
| 1801 | return; | 1803 | return; |
| 1802 | } | 1804 | } |
| 1803 | const ImageViewBase& image_view = slot_image_views[image_view_id]; | 1805 | const ImageViewBase& image_view = slot_image_views[image_view_id]; |
| 1806 | if (image_view.IsBuffer()) { | ||
| 1807 | return; | ||
| 1808 | } | ||
| 1804 | PrepareImage(image_view.image_id, is_modification, invalidate); | 1809 | PrepareImage(image_view.image_id, is_modification, invalidate); |
| 1805 | } | 1810 | } |
| 1806 | 1811 | ||