Browse Source

texture_cache: Add getter to query if image view is rescaled

nce_cpp
ReinUsesLisp 4 years ago
committed by Fernando Sahmkow
parent
commit
0100b5e700
  1. 3
      src/video_core/renderer_opengl/gl_compute_pipeline.cpp
  2. 3
      src/video_core/renderer_opengl/gl_graphics_pipeline.cpp
  3. 3
      src/video_core/renderer_vulkan/pipeline_helper.h
  4. 16
      src/video_core/texture_cache/texture_cache.h
  5. 9
      src/video_core/texture_cache/texture_cache_base.h

3
src/video_core/renderer_opengl/gl_compute_pipeline.cpp

@ -186,8 +186,7 @@ void ComputePipeline::Configure() {
for (u32 index = 0; index < desc.count; ++index) { for (u32 index = 0; index < desc.count; ++index) {
ImageView& image_view{texture_cache.GetImageView((views_it++)->id)}; ImageView& image_view{texture_cache.GetImageView((views_it++)->id)};
textures[texture_binding] = image_view.Handle(desc.type); textures[texture_binding] = image_view.Handle(desc.type);
if (True(texture_cache.GetImage(image_view.image_id).flags &
VideoCommon::ImageFlagBits::Rescaled)) {
if (texture_cache.IsRescaling(image_view)) {
scaling_mask |= 1u << texture_binding; scaling_mask |= 1u << texture_binding;
} }
++texture_binding; ++texture_binding;

3
src/video_core/renderer_opengl/gl_graphics_pipeline.cpp

@ -472,8 +472,7 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) {
for (u32 index = 0; index < desc.count; ++index) { for (u32 index = 0; index < desc.count; ++index) {
ImageView& image_view{texture_cache.GetImageView((views_it++)->id)}; ImageView& image_view{texture_cache.GetImageView((views_it++)->id)};
textures[texture_binding] = image_view.Handle(desc.type); textures[texture_binding] = image_view.Handle(desc.type);
if (True(texture_cache.GetImage(image_view.image_id).flags &
VideoCommon::ImageFlagBits::Rescaled)) {
if (texture_cache.IsRescaling(image_view)) {
scaling_mask |= 1u << stage_texture_binding; scaling_mask |= 1u << stage_texture_binding;
} }
++texture_binding; ++texture_binding;

3
src/video_core/renderer_vulkan/pipeline_helper.h

@ -168,10 +168,9 @@ inline void PushImageDescriptors(TextureCache& texture_cache,
const VideoCommon::ImageViewId image_view_id{(views++)->id}; const VideoCommon::ImageViewId image_view_id{(views++)->id};
const VkSampler sampler{*(samplers++)}; const VkSampler sampler{*(samplers++)};
ImageView& image_view{texture_cache.GetImageView(image_view_id)}; ImageView& image_view{texture_cache.GetImageView(image_view_id)};
const Image& image{texture_cache.GetImage(image_view.image_id)};
const VkImageView vk_image_view{image_view.Handle(desc.type)}; const VkImageView vk_image_view{image_view.Handle(desc.type)};
update_descriptor_queue.AddSampledImage(vk_image_view, sampler); update_descriptor_queue.AddSampledImage(vk_image_view, sampler);
rescaling.PushTexture(True(image.flags & VideoCommon::ImageFlagBits::Rescaled));
rescaling.PushTexture(texture_cache.IsRescaling(image_view));
} }
} }
for (const auto& desc : info.image_descriptors) { for (const auto& desc : info.image_descriptors) {

16
src/video_core/texture_cache/texture_cache.h

@ -119,16 +119,6 @@ typename P::ImageView& TextureCache<P>::GetImageView(ImageViewId id) noexcept {
return slot_image_views[id]; return slot_image_views[id];
} }
template <class P>
const typename P::Image& TextureCache<P>::GetImage(ImageId id) const noexcept {
return slot_images[id];
}
template <class P>
typename P::Image& TextureCache<P>::GetImage(ImageId id) noexcept {
return slot_images[id];
}
template <class P> template <class P>
void TextureCache<P>::MarkModification(ImageId id) noexcept { void TextureCache<P>::MarkModification(ImageId id) noexcept {
MarkModification(slot_images[id]); MarkModification(slot_images[id]);
@ -634,6 +624,12 @@ bool TextureCache<P>::IsRescaling() const noexcept {
return is_rescaling; return is_rescaling;
} }
template <class P>
bool TextureCache<P>::IsRescaling(const ImageViewBase& image_view) const noexcept {
const ImageBase& image = slot_images[image_view.image_id];
return True(image.flags & ImageFlagBits::Rescaled);
}
template <class P> template <class P>
bool TextureCache<P>::IsRegionGpuModified(VAddr addr, size_t size) { bool TextureCache<P>::IsRegionGpuModified(VAddr addr, size_t size) {
bool is_modified = false; bool is_modified = false;

9
src/video_core/texture_cache/texture_cache_base.h

@ -21,6 +21,7 @@
#include "video_core/texture_cache/descriptor_table.h" #include "video_core/texture_cache/descriptor_table.h"
#include "video_core/texture_cache/image_base.h" #include "video_core/texture_cache/image_base.h"
#include "video_core/texture_cache/image_info.h" #include "video_core/texture_cache/image_info.h"
#include "video_core/texture_cache/image_view_base.h"
#include "video_core/texture_cache/image_view_info.h" #include "video_core/texture_cache/image_view_info.h"
#include "video_core/texture_cache/render_targets.h" #include "video_core/texture_cache/render_targets.h"
#include "video_core/texture_cache/slot_vector.h" #include "video_core/texture_cache/slot_vector.h"
@ -100,12 +101,6 @@ public:
/// Return a reference to the given image view id /// Return a reference to the given image view id
[[nodiscard]] ImageView& GetImageView(ImageViewId id) noexcept; [[nodiscard]] ImageView& GetImageView(ImageViewId id) noexcept;
/// Return a constant reference to the given image id
[[nodiscard]] const Image& GetImage(ImageId id) const noexcept;
/// Return a reference to the given image id
[[nodiscard]] Image& GetImage(ImageId id) noexcept;
/// Mark an image as modified from the GPU /// Mark an image as modified from the GPU
void MarkModification(ImageId id) noexcept; void MarkModification(ImageId id) noexcept;
@ -181,6 +176,8 @@ public:
[[nodiscard]] bool IsRescaling() const noexcept; [[nodiscard]] bool IsRescaling() const noexcept;
[[nodiscard]] bool IsRescaling(const ImageViewBase& image_view) const noexcept;
[[nodiscard]] bool BlackListImage(ImageId image_id); [[nodiscard]] bool BlackListImage(ImageId image_id);
std::mutex mutex; std::mutex mutex;

Loading…
Cancel
Save