diff options
| author | 2021-02-21 21:23:45 -0700 | |
|---|---|---|
| committer | 2021-02-21 21:23:45 -0700 | |
| commit | 20245e660f54d1b2277d6eba9ea9df87664f9a96 (patch) | |
| tree | 5f359812f65bb55cd91737ed52349d6548ce28f3 /src/video_core/renderer_vulkan | |
| parent | Merge pull request #5971 from ameerj/reslimit-dtor (diff) | |
| parent | Review 1 (diff) | |
| download | yuzu-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.cpp | 31 |
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 | ||