Browse Source

[gl, vk] Implement SampledView method for ImageView

eds-true-adreno-fixes
CamilleLaVey 4 weeks ago
committed by Caio Oliveira
parent
commit
bdc7acce27
No known key found for this signature in database GPG Key ID: AAAE6C7FD4186B0C
  1. 3
      src/video_core/renderer_opengl/gl_compute_pipeline.cpp
  2. 3
      src/video_core/renderer_opengl/gl_graphics_pipeline.cpp
  3. 7
      src/video_core/renderer_opengl/gl_texture_cache.cpp
  4. 6
      src/video_core/renderer_opengl/gl_texture_cache.h
  5. 3
      src/video_core/renderer_vulkan/pipeline_helper.h
  6. 24
      src/video_core/renderer_vulkan/vk_texture_cache.cpp
  7. 3
      src/video_core/renderer_vulkan/vk_texture_cache.h

3
src/video_core/renderer_opengl/gl_compute_pipeline.cpp

@ -205,7 +205,8 @@ void ComputePipeline::Configure() {
for (const auto& desc : info.texture_descriptors) { for (const auto& desc : info.texture_descriptors) {
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.SampledView(desc.type, desc.component_type);
if (texture_cache.IsRescaling(image_view)) { if (texture_cache.IsRescaling(image_view)) {
texture_scaling_mask |= 1u << texture_binding; texture_scaling_mask |= 1u << texture_binding;
} }

3
src/video_core/renderer_opengl/gl_graphics_pipeline.cpp

@ -483,7 +483,8 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) {
for (const auto& desc : info.texture_descriptors) { for (const auto& desc : info.texture_descriptors) {
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.SampledView(desc.type, desc.component_type);
if (texture_cache.IsRescaling(image_view)) { if (texture_cache.IsRescaling(image_view)) {
texture_scaling_mask |= 1u << stage_texture_binding; texture_scaling_mask |= 1u << stage_texture_binding;
} }

7
src/video_core/renderer_opengl/gl_texture_cache.cpp

@ -1229,6 +1229,13 @@ GLuint ImageView::StorageView(Shader::TextureType texture_type, Shader::ImageFor
return view; return view;
} }
GLuint ImageView::SampledView(Shader::TextureType view_type,
Shader::SamplerComponentType /*component_type*/) {
// OpenGL swizzles already configure depth/stencil selection per TIC entry,
// so fall back to the default view handle.
return Handle(view_type);
}
void ImageView::SetupView(Shader::TextureType view_type) { void ImageView::SetupView(Shader::TextureType view_type) {
views[static_cast<size_t>(view_type)] = MakeView(view_type, internal_format); views[static_cast<size_t>(view_type)] = MakeView(view_type, internal_format);
} }

6
src/video_core/renderer_opengl/gl_texture_cache.h

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -264,6 +267,9 @@ public:
[[nodiscard]] GLuint StorageView(Shader::TextureType texture_type, [[nodiscard]] GLuint StorageView(Shader::TextureType texture_type,
Shader::ImageFormat image_format); Shader::ImageFormat image_format);
[[nodiscard]] GLuint SampledView(Shader::TextureType view_type,
Shader::SamplerComponentType component_type);
[[nodiscard]] GLuint Handle(Shader::TextureType handle_type) const noexcept { [[nodiscard]] GLuint Handle(Shader::TextureType handle_type) const noexcept {
return views[static_cast<size_t>(handle_type)]; return views[static_cast<size_t>(handle_type)];
} }

3
src/video_core/renderer_vulkan/pipeline_helper.h

@ -189,7 +189,8 @@ inline void PushImageDescriptors(TextureCache& texture_cache,
const VideoCommon::ImageViewId image_view_id{(views++)->id}; const VideoCommon::ImageViewId image_view_id{(views++)->id};
const VideoCommon::SamplerId sampler_id{*(samplers++)}; const VideoCommon::SamplerId sampler_id{*(samplers++)};
ImageView& image_view{texture_cache.GetImageView(image_view_id)}; ImageView& image_view{texture_cache.GetImageView(image_view_id)};
const VkImageView vk_image_view{image_view.Handle(desc.type)};
const VkImageView vk_image_view{
image_view.SampledView(desc.type, desc.component_type)};
const Sampler& sampler{texture_cache.GetSampler(sampler_id)}; const Sampler& sampler{texture_cache.GetSampler(sampler_id)};
const bool use_fallback_sampler{sampler.HasAddedAnisotropy() && const bool use_fallback_sampler{sampler.HasAddedAnisotropy() &&
!image_view.SupportsAnisotropy()}; !image_view.SupportsAnisotropy()};

24
src/video_core/renderer_vulkan/vk_texture_cache.cpp

@ -24,6 +24,7 @@
#include "video_core/renderer_vulkan/vk_render_pass_cache.h" #include "video_core/renderer_vulkan/vk_render_pass_cache.h"
#include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/renderer_vulkan/vk_scheduler.h"
#include "video_core/renderer_vulkan/vk_staging_buffer_pool.h" #include "video_core/renderer_vulkan/vk_staging_buffer_pool.h"
#include "video_core/surface.h"
#include "video_core/texture_cache/formatter.h" #include "video_core/texture_cache/formatter.h"
#include "video_core/texture_cache/samples_helper.h" #include "video_core/texture_cache/samples_helper.h"
#include "video_core/texture_cache/util.h" #include "video_core/texture_cache/util.h"
@ -2211,6 +2212,29 @@ VkImageView ImageView::ColorView() {
return *color_view; return *color_view;
} }
VkImageView ImageView::SampledView(Shader::TextureType texture_type,
Shader::SamplerComponentType component_type) {
using VideoCore::Surface::GetFormatType;
using VideoCore::Surface::SurfaceType;
const SurfaceType surface_type = GetFormatType(format);
switch (component_type) {
case Shader::SamplerComponentType::Depth:
if (surface_type == SurfaceType::Depth || surface_type == SurfaceType::DepthStencil) {
return DepthView();
}
break;
case Shader::SamplerComponentType::Stencil:
if (surface_type == SurfaceType::Stencil || surface_type == SurfaceType::DepthStencil) {
return StencilView();
}
break;
default:
break;
}
return Handle(texture_type);
}
VkImageView ImageView::StorageView(Shader::TextureType texture_type, VkImageView ImageView::StorageView(Shader::TextureType texture_type,
Shader::ImageFormat image_format) { Shader::ImageFormat image_format) {
if (!image_handle) { if (!image_handle) {

3
src/video_core/renderer_vulkan/vk_texture_cache.h

@ -239,6 +239,9 @@ public:
[[nodiscard]] VkImageView ColorView(); [[nodiscard]] VkImageView ColorView();
[[nodiscard]] VkImageView SampledView(Shader::TextureType texture_type,
Shader::SamplerComponentType component_type);
[[nodiscard]] VkImageView StorageView(Shader::TextureType texture_type, [[nodiscard]] VkImageView StorageView(Shader::TextureType texture_type,
Shader::ImageFormat image_format); Shader::ImageFormat image_format);

Loading…
Cancel
Save