Browse Source
[gl, vk] Implement SampledView method for ImageView
eds-true-adreno-fixes
CamilleLaVey
4 weeks ago
committed by
Caio Oliveira
No known key found for this signature in database
GPG Key ID: AAAE6C7FD4186B0C
7 changed files with
46 additions and
3 deletions
-
src/video_core/renderer_opengl/gl_compute_pipeline.cpp
-
src/video_core/renderer_opengl/gl_graphics_pipeline.cpp
-
src/video_core/renderer_opengl/gl_texture_cache.cpp
-
src/video_core/renderer_opengl/gl_texture_cache.h
-
src/video_core/renderer_vulkan/pipeline_helper.h
-
src/video_core/renderer_vulkan/vk_texture_cache.cpp
-
src/video_core/renderer_vulkan/vk_texture_cache.h
|
|
|
@ -205,7 +205,8 @@ void ComputePipeline::Configure() { |
|
|
|
for (const auto& desc : info.texture_descriptors) { |
|
|
|
for (u32 index = 0; index < desc.count; ++index) { |
|
|
|
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)) { |
|
|
|
texture_scaling_mask |= 1u << texture_binding; |
|
|
|
} |
|
|
|
|
|
|
|
@ -483,7 +483,8 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
for (const auto& desc : info.texture_descriptors) { |
|
|
|
for (u32 index = 0; index < desc.count; ++index) { |
|
|
|
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)) { |
|
|
|
texture_scaling_mask |= 1u << stage_texture_binding; |
|
|
|
} |
|
|
|
|
|
|
|
@ -1229,6 +1229,13 @@ GLuint ImageView::StorageView(Shader::TextureType texture_type, Shader::ImageFor |
|
|
|
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) { |
|
|
|
views[static_cast<size_t>(view_type)] = MakeView(view_type, internal_format); |
|
|
|
} |
|
|
|
|
|
|
|
@ -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-License-Identifier: GPL-2.0-or-later |
|
|
|
|
|
|
|
@ -264,6 +267,9 @@ public: |
|
|
|
[[nodiscard]] GLuint StorageView(Shader::TextureType texture_type, |
|
|
|
Shader::ImageFormat image_format); |
|
|
|
|
|
|
|
[[nodiscard]] GLuint SampledView(Shader::TextureType view_type, |
|
|
|
Shader::SamplerComponentType component_type); |
|
|
|
|
|
|
|
[[nodiscard]] GLuint Handle(Shader::TextureType handle_type) const noexcept { |
|
|
|
return views[static_cast<size_t>(handle_type)]; |
|
|
|
} |
|
|
|
|
|
|
|
@ -189,7 +189,8 @@ inline void PushImageDescriptors(TextureCache& texture_cache, |
|
|
|
const VideoCommon::ImageViewId image_view_id{(views++)->id}; |
|
|
|
const VideoCommon::SamplerId sampler_id{*(samplers++)}; |
|
|
|
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 bool use_fallback_sampler{sampler.HasAddedAnisotropy() && |
|
|
|
!image_view.SupportsAnisotropy()}; |
|
|
|
|
|
|
|
@ -24,6 +24,7 @@ |
|
|
|
#include "video_core/renderer_vulkan/vk_render_pass_cache.h"
|
|
|
|
#include "video_core/renderer_vulkan/vk_scheduler.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/samples_helper.h"
|
|
|
|
#include "video_core/texture_cache/util.h"
|
|
|
|
@ -2211,6 +2212,29 @@ VkImageView ImageView::ColorView() { |
|
|
|
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, |
|
|
|
Shader::ImageFormat image_format) { |
|
|
|
if (!image_handle) { |
|
|
|
|
|
|
|
@ -239,6 +239,9 @@ public: |
|
|
|
|
|
|
|
[[nodiscard]] VkImageView ColorView(); |
|
|
|
|
|
|
|
[[nodiscard]] VkImageView SampledView(Shader::TextureType texture_type, |
|
|
|
Shader::SamplerComponentType component_type); |
|
|
|
|
|
|
|
[[nodiscard]] VkImageView StorageView(Shader::TextureType texture_type, |
|
|
|
Shader::ImageFormat image_format); |
|
|
|
|
|
|
|
|