diff options
| author | 2021-12-28 00:46:37 -0800 | |
|---|---|---|
| committer | 2021-12-28 00:46:37 -0800 | |
| commit | f67605e6aa5ec3a5e7a7e44ab30a24991bac6e6d (patch) | |
| tree | a14f73749158e0ad38e99d0c222d401441376911 | |
| parent | Merge pull request #7621 from bunnei/set-mem-perm (diff) | |
| parent | vk_texture_cache: Fix invalidated pointer access (diff) | |
| download | yuzu-f67605e6aa5ec3a5e7a7e44ab30a24991bac6e6d.tar.gz yuzu-f67605e6aa5ec3a5e7a7e44ab30a24991bac6e6d.tar.xz yuzu-f67605e6aa5ec3a5e7a7e44ab30a24991bac6e6d.zip | |
Merge pull request #7622 from ameerj/vk-rescale-invalid-ptr
vk_texture_cache: Fix invalidated pointer access
5 files changed, 21 insertions, 8 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 14e6522f2..3c1f79a27 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp | |||
| @@ -1047,7 +1047,7 @@ bool Image::ScaleDown(bool ignore) { | |||
| 1047 | } | 1047 | } |
| 1048 | 1048 | ||
| 1049 | ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, | 1049 | ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, |
| 1050 | ImageId image_id_, Image& image) | 1050 | ImageId image_id_, Image& image, const SlotVector<Image>&) |
| 1051 | : VideoCommon::ImageViewBase{info, image.info, image_id_}, views{runtime.null_image_views} { | 1051 | : VideoCommon::ImageViewBase{info, image.info, image_id_}, views{runtime.null_image_views} { |
| 1052 | const Device& device = runtime.device; | 1052 | const Device& device = runtime.device; |
| 1053 | if (True(image.flags & ImageFlagBits::Converted)) { | 1053 | if (True(image.flags & ImageFlagBits::Converted)) { |
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index dbf1df79c..7f425631f 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h | |||
| @@ -36,6 +36,7 @@ using VideoCommon::ImageViewType; | |||
| 36 | using VideoCommon::NUM_RT; | 36 | using VideoCommon::NUM_RT; |
| 37 | using VideoCommon::Region2D; | 37 | using VideoCommon::Region2D; |
| 38 | using VideoCommon::RenderTargets; | 38 | using VideoCommon::RenderTargets; |
| 39 | using VideoCommon::SlotVector; | ||
| 39 | 40 | ||
| 40 | struct ImageBufferMap { | 41 | struct ImageBufferMap { |
| 41 | ~ImageBufferMap(); | 42 | ~ImageBufferMap(); |
| @@ -234,7 +235,8 @@ class ImageView : public VideoCommon::ImageViewBase { | |||
| 234 | friend Image; | 235 | friend Image; |
| 235 | 236 | ||
| 236 | public: | 237 | public: |
| 237 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageViewInfo&, ImageId, Image&); | 238 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageViewInfo&, ImageId, Image&, |
| 239 | const SlotVector<Image>&); | ||
| 238 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageInfo&, | 240 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageInfo&, |
| 239 | const VideoCommon::ImageViewInfo&, GPUVAddr); | 241 | const VideoCommon::ImageViewInfo&, GPUVAddr); |
| 240 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageInfo& info, | 242 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageInfo& info, |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 1941170cb..c3050887c 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -1473,8 +1473,7 @@ bool Image::BlitScaleHelper(bool scale_up) { | |||
| 1473 | ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, | 1473 | ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, |
| 1474 | ImageId image_id_, Image& image) | 1474 | ImageId image_id_, Image& image) |
| 1475 | : VideoCommon::ImageViewBase{info, image.info, image_id_}, device{&runtime.device}, | 1475 | : VideoCommon::ImageViewBase{info, image.info, image_id_}, device{&runtime.device}, |
| 1476 | src_image{&image}, image_handle{image.Handle()}, | 1476 | image_handle{image.Handle()}, samples(ConvertSampleCount(image.info.num_samples)) { |
| 1477 | samples(ConvertSampleCount(image.info.num_samples)) { | ||
| 1478 | using Shader::TextureType; | 1477 | using Shader::TextureType; |
| 1479 | 1478 | ||
| 1480 | const VkImageAspectFlags aspect_mask = ImageViewAspectMask(info); | 1479 | const VkImageAspectFlags aspect_mask = ImageViewAspectMask(info); |
| @@ -1557,6 +1556,12 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 1557 | } | 1556 | } |
| 1558 | } | 1557 | } |
| 1559 | 1558 | ||
| 1559 | ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, | ||
| 1560 | ImageId image_id_, Image& image, const SlotVector<Image>& slot_imgs) | ||
| 1561 | : ImageView{runtime, info, image_id_, image} { | ||
| 1562 | slot_images = &slot_imgs; | ||
| 1563 | } | ||
| 1564 | |||
| 1560 | ImageView::ImageView(TextureCacheRuntime&, const VideoCommon::ImageInfo& info, | 1565 | ImageView::ImageView(TextureCacheRuntime&, const VideoCommon::ImageInfo& info, |
| 1561 | const VideoCommon::ImageViewInfo& view_info, GPUVAddr gpu_addr_) | 1566 | const VideoCommon::ImageViewInfo& view_info, GPUVAddr gpu_addr_) |
| 1562 | : VideoCommon::ImageViewBase{info, view_info}, gpu_addr{gpu_addr_}, | 1567 | : VideoCommon::ImageViewBase{info, view_info}, gpu_addr{gpu_addr_}, |
| @@ -1613,10 +1618,12 @@ VkImageView ImageView::StorageView(Shader::TextureType texture_type, | |||
| 1613 | } | 1618 | } |
| 1614 | 1619 | ||
| 1615 | bool ImageView::IsRescaled() const noexcept { | 1620 | bool ImageView::IsRescaled() const noexcept { |
| 1616 | if (!src_image) { | 1621 | if (!slot_images) { |
| 1617 | return false; | 1622 | return false; |
| 1618 | } | 1623 | } |
| 1619 | return src_image->IsRescaled(); | 1624 | const auto& slots = *slot_images; |
| 1625 | const auto& src_image = slots[image_id]; | ||
| 1626 | return src_image.IsRescaled(); | ||
| 1620 | } | 1627 | } |
| 1621 | 1628 | ||
| 1622 | vk::ImageView ImageView::MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask) { | 1629 | vk::ImageView ImageView::MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask) { |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index c592f2666..2f12be78b 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h | |||
| @@ -23,6 +23,7 @@ using VideoCommon::ImageId; | |||
| 23 | using VideoCommon::NUM_RT; | 23 | using VideoCommon::NUM_RT; |
| 24 | using VideoCommon::Region2D; | 24 | using VideoCommon::Region2D; |
| 25 | using VideoCommon::RenderTargets; | 25 | using VideoCommon::RenderTargets; |
| 26 | using VideoCommon::SlotVector; | ||
| 26 | using VideoCore::Surface::PixelFormat; | 27 | using VideoCore::Surface::PixelFormat; |
| 27 | 28 | ||
| 28 | class ASTCDecoderPass; | 29 | class ASTCDecoderPass; |
| @@ -170,6 +171,8 @@ private: | |||
| 170 | class ImageView : public VideoCommon::ImageViewBase { | 171 | class ImageView : public VideoCommon::ImageViewBase { |
| 171 | public: | 172 | public: |
| 172 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageViewInfo&, ImageId, Image&); | 173 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageViewInfo&, ImageId, Image&); |
| 174 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageViewInfo&, ImageId, Image&, | ||
| 175 | const SlotVector<Image>&); | ||
| 173 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageInfo&, | 176 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageInfo&, |
| 174 | const VideoCommon::ImageViewInfo&, GPUVAddr); | 177 | const VideoCommon::ImageViewInfo&, GPUVAddr); |
| 175 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::NullImageViewParams&); | 178 | explicit ImageView(TextureCacheRuntime&, const VideoCommon::NullImageViewParams&); |
| @@ -226,7 +229,7 @@ private: | |||
| 226 | [[nodiscard]] vk::ImageView MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask); | 229 | [[nodiscard]] vk::ImageView MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask); |
| 227 | 230 | ||
| 228 | const Device* device = nullptr; | 231 | const Device* device = nullptr; |
| 229 | const Image* src_image{}; | 232 | const SlotVector<Image>* slot_images = nullptr; |
| 230 | 233 | ||
| 231 | std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> image_views; | 234 | std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> image_views; |
| 232 | std::unique_ptr<StorageViews> storage_views; | 235 | std::unique_ptr<StorageViews> storage_views; |
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 2e19fced2..b494152b8 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -1397,7 +1397,8 @@ ImageViewId TextureCache<P>::FindOrEmplaceImageView(ImageId image_id, const Imag | |||
| 1397 | if (const ImageViewId image_view_id = image.FindView(info); image_view_id) { | 1397 | if (const ImageViewId image_view_id = image.FindView(info); image_view_id) { |
| 1398 | return image_view_id; | 1398 | return image_view_id; |
| 1399 | } | 1399 | } |
| 1400 | const ImageViewId image_view_id = slot_image_views.insert(runtime, info, image_id, image); | 1400 | const ImageViewId image_view_id = |
| 1401 | slot_image_views.insert(runtime, info, image_id, image, slot_images); | ||
| 1401 | image.InsertView(info, image_view_id); | 1402 | image.InsertView(info, image_view_id); |
| 1402 | return image_view_id; | 1403 | return image_view_id; |
| 1403 | } | 1404 | } |