mirror of
https://github.com/yuzu-emu/yuzu-android.git
synced 2025-06-16 22:37:55 -05:00
shader: Interact texture buffers with buffer cache
This commit is contained in:
@ -36,6 +36,15 @@ ImageViewBase::ImageViewBase(const ImageViewInfo& info, const ImageInfo& image_i
|
||||
}
|
||||
}
|
||||
|
||||
ImageViewBase::ImageViewBase(const ImageInfo& info, const ImageViewInfo& view_info)
|
||||
: format{info.format}, type{ImageViewType::Buffer}, size{
|
||||
.width = info.size.width,
|
||||
.height = 1,
|
||||
.depth = 1,
|
||||
} {
|
||||
ASSERT_MSG(view_info.type == ImageViewType::Buffer, "Expected texture buffer");
|
||||
}
|
||||
|
||||
ImageViewBase::ImageViewBase(const NullImageParams&) {}
|
||||
|
||||
} // namespace VideoCommon
|
||||
|
@ -27,6 +27,7 @@ DECLARE_ENUM_FLAG_OPERATORS(ImageViewFlagBits)
|
||||
struct ImageViewBase {
|
||||
explicit ImageViewBase(const ImageViewInfo& info, const ImageInfo& image_info,
|
||||
ImageId image_id);
|
||||
explicit ImageViewBase(const ImageInfo& info, const ImageViewInfo& view_info);
|
||||
explicit ImageViewBase(const NullImageParams&);
|
||||
|
||||
[[nodiscard]] bool IsBuffer() const noexcept {
|
||||
|
@ -968,9 +968,6 @@ void TextureCache<P>::UploadImageContents(Image& image, StagingBuffer& staging)
|
||||
auto copies = UnswizzleImage(gpu_memory, gpu_addr, image.info, unswizzled_data);
|
||||
ConvertImage(unswizzled_data, image.info, mapped_span, copies);
|
||||
image.UploadMemory(staging, copies);
|
||||
} else if (image.info.type == ImageType::Buffer) {
|
||||
const std::array copies{UploadBufferCopy(gpu_memory, gpu_addr, image, mapped_span)};
|
||||
image.UploadMemory(staging, copies);
|
||||
} else {
|
||||
const auto copies = UnswizzleImage(gpu_memory, gpu_addr, image.info, mapped_span);
|
||||
image.UploadMemory(staging, copies);
|
||||
@ -993,7 +990,12 @@ ImageViewId TextureCache<P>::FindImageView(const TICEntry& config) {
|
||||
template <class P>
|
||||
ImageViewId TextureCache<P>::CreateImageView(const TICEntry& config) {
|
||||
const ImageInfo info(config);
|
||||
const GPUVAddr image_gpu_addr = config.Address() - config.BaseLayer() * info.layer_stride;
|
||||
if (info.type == ImageType::Buffer) {
|
||||
const ImageViewInfo view_info(config, 0);
|
||||
return slot_image_views.insert(runtime, info, view_info, config.Address());
|
||||
}
|
||||
const u32 layer_offset = config.BaseLayer() * info.layer_stride;
|
||||
const GPUVAddr image_gpu_addr = config.Address() - layer_offset;
|
||||
const ImageId image_id = FindOrInsertImage(info, image_gpu_addr);
|
||||
if (!image_id) {
|
||||
return NULL_IMAGE_VIEW_ID;
|
||||
@ -1801,6 +1803,9 @@ void TextureCache<P>::PrepareImageView(ImageViewId image_view_id, bool is_modifi
|
||||
return;
|
||||
}
|
||||
const ImageViewBase& image_view = slot_image_views[image_view_id];
|
||||
if (image_view.IsBuffer()) {
|
||||
return;
|
||||
}
|
||||
PrepareImage(image_view.image_id, is_modification, invalidate);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user