summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar bunnei2021-02-21 21:23:45 -0700
committerGravatar GitHub2021-02-21 21:23:45 -0700
commit20245e660f54d1b2277d6eba9ea9df87664f9a96 (patch)
tree5f359812f65bb55cd91737ed52349d6548ce28f3 /src/video_core/renderer_vulkan
parentMerge pull request #5971 from ameerj/reslimit-dtor (diff)
parentReview 1 (diff)
downloadyuzu-20245e660f54d1b2277d6eba9ea9df87664f9a96.tar.gz
yuzu-20245e660f54d1b2277d6eba9ea9df87664f9a96.tar.xz
yuzu-20245e660f54d1b2277d6eba9ea9df87664f9a96.zip
Merge pull request #5936 from Kelebek1/Offsets
Offsets for TexelFetch and TextureGather in Vulkan
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_shader_decompiler.cpp31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 40e2e0d38..c6846d886 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -1845,13 +1845,21 @@ private:
1845 1845
1846 Expression TextureGather(Operation operation) { 1846 Expression TextureGather(Operation operation) {
1847 const auto& meta = std::get<MetaTexture>(operation.GetMeta()); 1847 const auto& meta = std::get<MetaTexture>(operation.GetMeta());
1848 UNIMPLEMENTED_IF(!meta.aoffi.empty());
1849 1848
1850 const Id coords = GetCoordinates(operation, Type::Float); 1849 const Id coords = GetCoordinates(operation, Type::Float);
1850
1851 spv::ImageOperandsMask mask = spv::ImageOperandsMask::MaskNone;
1852 std::vector<Id> operands;
1851 Id texture{}; 1853 Id texture{};
1854
1855 if (!meta.aoffi.empty()) {
1856 mask = mask | spv::ImageOperandsMask::Offset;
1857 operands.push_back(GetOffsetCoordinates(operation));
1858 }
1859
1852 if (meta.sampler.is_shadow) { 1860 if (meta.sampler.is_shadow) {
1853 texture = OpImageDrefGather(t_float4, GetTextureSampler(operation), coords, 1861 texture = OpImageDrefGather(t_float4, GetTextureSampler(operation), coords,
1854 AsFloat(Visit(meta.depth_compare))); 1862 AsFloat(Visit(meta.depth_compare)), mask, operands);
1855 } else { 1863 } else {
1856 u32 component_value = 0; 1864 u32 component_value = 0;
1857 if (meta.component) { 1865 if (meta.component) {
@@ -1860,7 +1868,7 @@ private:
1860 component_value = component->GetValue(); 1868 component_value = component->GetValue();
1861 } 1869 }
1862 texture = OpImageGather(t_float4, GetTextureSampler(operation), coords, 1870 texture = OpImageGather(t_float4, GetTextureSampler(operation), coords,
1863 Constant(t_uint, component_value)); 1871 Constant(t_uint, component_value), mask, operands);
1864 } 1872 }
1865 return GetTextureElement(operation, texture, Type::Float); 1873 return GetTextureElement(operation, texture, Type::Float);
1866 } 1874 }
@@ -1928,13 +1936,22 @@ private:
1928 1936
1929 const Id image = GetTextureImage(operation); 1937 const Id image = GetTextureImage(operation);
1930 const Id coords = GetCoordinates(operation, Type::Int); 1938 const Id coords = GetCoordinates(operation, Type::Int);
1939
1940 spv::ImageOperandsMask mask = spv::ImageOperandsMask::MaskNone;
1941 std::vector<Id> operands;
1931 Id fetch; 1942 Id fetch;
1943
1932 if (meta.lod && !meta.sampler.is_buffer) { 1944 if (meta.lod && !meta.sampler.is_buffer) {
1933 fetch = OpImageFetch(t_float4, image, coords, spv::ImageOperandsMask::Lod, 1945 mask = mask | spv::ImageOperandsMask::Lod;
1934 AsInt(Visit(meta.lod))); 1946 operands.push_back(AsInt(Visit(meta.lod)));
1935 } else { 1947 }
1936 fetch = OpImageFetch(t_float4, image, coords); 1948
1949 if (!meta.aoffi.empty()) {
1950 mask = mask | spv::ImageOperandsMask::Offset;
1951 operands.push_back(GetOffsetCoordinates(operation));
1937 } 1952 }
1953
1954 fetch = OpImageFetch(t_float4, image, coords, mask, operands);
1938 return GetTextureElement(operation, fetch, Type::Float); 1955 return GetTextureElement(operation, fetch, Type::Float);
1939 } 1956 }
1940 1957