summaryrefslogtreecommitdiffstats
path: root/src/video_core
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2019-09-24 06:03:27 +0200
committerReinUsesLisp <reinuseslisp@airmail.cc>2019-09-24 06:03:27 +0200
commit25bfaffdffc96f1e32800eaca0eb97715fa651a6 (patch)
treed79978ebee91098879d6ee9c221bf81ad5e02773 /src/video_core
parentMerge pull request #2869 from ReinUsesLisp/suld (diff)
downloadyuzu-25bfaffdffc96f1e32800eaca0eb97715fa651a6.tar
yuzu-25bfaffdffc96f1e32800eaca0eb97715fa651a6.tar.gz
yuzu-25bfaffdffc96f1e32800eaca0eb97715fa651a6.tar.bz2
yuzu-25bfaffdffc96f1e32800eaca0eb97715fa651a6.tar.lz
yuzu-25bfaffdffc96f1e32800eaca0eb97715fa651a6.tar.xz
yuzu-25bfaffdffc96f1e32800eaca0eb97715fa651a6.tar.zst
yuzu-25bfaffdffc96f1e32800eaca0eb97715fa651a6.zip
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp49
1 files changed, 23 insertions, 26 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index e6b36a0f2..1eda0cb44 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -242,6 +242,26 @@ constexpr const char* GetTypeString(Type type) {
}
}
+constexpr const char* GetImageTypeDeclaration(Tegra::Shader::ImageType image_type) {
+ switch (image_type) {
+ case Tegra::Shader::ImageType::Texture1D:
+ return "1D";
+ case Tegra::Shader::ImageType::TextureBuffer:
+ return "Buffer";
+ case Tegra::Shader::ImageType::Texture1DArray:
+ return "1DArray";
+ case Tegra::Shader::ImageType::Texture2D:
+ return "2D";
+ case Tegra::Shader::ImageType::Texture2DArray:
+ return "2DArray";
+ case Tegra::Shader::ImageType::Texture3D:
+ return "3D";
+ default:
+ UNREACHABLE();
+ return "1D";
+ }
+}
+
/// Generates code to use for a swizzle operation.
constexpr const char* GetSwizzle(u32 element) {
constexpr std::array swizzle = {".x", ".y", ".z", ".w"};
@@ -721,26 +741,6 @@ private:
void DeclareImages() {
const auto& images{ir.GetImages()};
for (const auto& [offset, image] : images) {
- const char* image_type = [&] {
- switch (image.GetType()) {
- case Tegra::Shader::ImageType::Texture1D:
- return "1D";
- case Tegra::Shader::ImageType::TextureBuffer:
- return "Buffer";
- case Tegra::Shader::ImageType::Texture1DArray:
- return "1DArray";
- case Tegra::Shader::ImageType::Texture2D:
- return "2D";
- case Tegra::Shader::ImageType::Texture2DArray:
- return "2DArray";
- case Tegra::Shader::ImageType::Texture3D:
- return "3D";
- default:
- UNREACHABLE();
- return "1D";
- }
- }();
-
std::string qualifier = "coherent volatile";
if (image.IsRead() && !image.IsWritten()) {
qualifier += " readonly";
@@ -748,13 +748,10 @@ private:
qualifier += " writeonly";
}
- std::string format;
- if (image.IsAtomic()) {
- format = "r32ui, ";
- }
-
+ const char* format = image.IsAtomic() ? "r32ui, " : "";
+ const char* type_declaration = GetImageTypeDeclaration(image.GetType());
code.AddLine("layout ({}binding = IMAGE_BINDING_{}) {} uniform uimage{} {};", format,
- image.GetIndex(), qualifier, image_type, GetImage(image));
+ image.GetIndex(), qualifier, type_declaration, GetImage(image));
}
if (!images.empty()) {
code.AddNewLine();