summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2021-04-21 00:48:45 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:28 +0200
commitdd860b684c7695097107c1186e96a70e754e5990 (patch)
tree14cbd25c655798f846b75582d5364aef0508f8b0 /src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
parentshader: Add constant propagation for arithmetic right shifts (diff)
downloadyuzu-dd860b684c7695097107c1186e96a70e754e5990.tar
yuzu-dd860b684c7695097107c1186e96a70e754e5990.tar.gz
yuzu-dd860b684c7695097107c1186e96a70e754e5990.tar.bz2
yuzu-dd860b684c7695097107c1186e96a70e754e5990.tar.lz
yuzu-dd860b684c7695097107c1186e96a70e754e5990.tar.xz
yuzu-dd860b684c7695097107c1186e96a70e754e5990.tar.zst
yuzu-dd860b684c7695097107c1186e96a70e754e5990.zip
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp')
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
index d5e9dae0f..08f00b9ce 100644
--- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
+++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
@@ -169,20 +169,31 @@ void GraphicsPipeline::Configure(bool is_indexed) {
++index;
}
const auto& cbufs{maxwell3d.state.shader_stages[stage].const_buffers};
- const auto read_handle{[&](u32 cbuf_index, u32 cbuf_offset) {
- ASSERT(cbufs[cbuf_index].enabled);
- const GPUVAddr addr{cbufs[cbuf_index].address + cbuf_offset};
- const u32 raw_handle{gpu_memory.Read<u32>(addr)};
- return TextureHandle(raw_handle, via_header_index);
+ const auto read_handle{[&](const auto& desc) {
+ ASSERT(cbufs[desc.cbuf_index].enabled);
+ const GPUVAddr addr{cbufs[desc.cbuf_index].address + desc.cbuf_offset};
+ if constexpr (std::is_same_v<decltype(desc), const Shader::TextureDescriptor&> ||
+ std::is_same_v<decltype(desc), const Shader::TextureBufferDescriptor&>) {
+ if (desc.has_secondary) {
+ ASSERT(cbufs[desc.secondary_cbuf_index].enabled);
+ const GPUVAddr separate_addr{cbufs[desc.secondary_cbuf_index].address +
+ desc.secondary_cbuf_offset};
+ const u32 lhs_raw{gpu_memory.Read<u32>(addr)};
+ const u32 rhs_raw{gpu_memory.Read<u32>(separate_addr)};
+ const u32 raw{lhs_raw | rhs_raw};
+ return TextureHandle{raw, via_header_index};
+ }
+ }
+ return TextureHandle{gpu_memory.Read<u32>(addr), via_header_index};
}};
const auto add_image{[&](const auto& desc) {
- const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
+ const TextureHandle handle{read_handle(desc)};
image_view_indices.push_back(handle.image);
}};
std::ranges::for_each(info.texture_buffer_descriptors, add_image);
std::ranges::for_each(info.image_buffer_descriptors, add_image);
for (const auto& desc : info.texture_descriptors) {
- const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
+ const TextureHandle handle{read_handle(desc)};
image_view_indices.push_back(handle.image);
Sampler* const sampler{texture_cache.GetGraphicsSampler(handle.sampler)};