summaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-04-06 20:14:55 -0300
committerGravatar ameerj2021-07-22 21:51:26 -0400
commite9a91bc5cc2c39b476ba8946f66930f5ab5608b2 (patch)
treead75617771ba4093c5609a505e3c8926668eb533 /src/video_core/texture_cache
parentshader: Fix F2I (diff)
downloadyuzu-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.cpp9
-rw-r--r--src/video_core/texture_cache/image_view_base.h1
-rw-r--r--src/video_core/texture_cache/texture_cache.h13
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
39ImageViewBase::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
39ImageViewBase::ImageViewBase(const NullImageParams&) {} 48ImageViewBase::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)
27struct ImageViewBase { 27struct 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) {
993template <class P> 990template <class P>
994ImageViewId TextureCache<P>::CreateImageView(const TICEntry& config) { 991ImageViewId 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