summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bunnei2019-09-25 17:46:02 -0400
committerGravatar GitHub2019-09-25 17:46:02 -0400
commitda0737359900c6fad1ab8818f883b3da0b79f63e (patch)
tree0ac43a4a6ea205dbf8d2fedbf5debec81fd8cfbe
parentMerge pull request #2869 from ReinUsesLisp/suld (diff)
parentgl_shader_decompiler: Add tailing return for HUnpack2 (diff)
downloadyuzu-da0737359900c6fad1ab8818f883b3da0b79f63e.tar.gz
yuzu-da0737359900c6fad1ab8818f883b3da0b79f63e.tar.xz
yuzu-da0737359900c6fad1ab8818f883b3da0b79f63e.zip
Merge pull request #2864 from ReinUsesLisp/fix-clang-decompiler
gl_shader_decompiler: Fix clang build issues
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp51
1 files changed, 25 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..8fa9e6534 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) {
242 } 242 }
243} 243}
244 244
245constexpr const char* GetImageTypeDeclaration(Tegra::Shader::ImageType image_type) {
246 switch (image_type) {
247 case Tegra::Shader::ImageType::Texture1D:
248 return "1D";
249 case Tegra::Shader::ImageType::TextureBuffer:
250 return "Buffer";
251 case Tegra::Shader::ImageType::Texture1DArray:
252 return "1DArray";
253 case Tegra::Shader::ImageType::Texture2D:
254 return "2D";
255 case Tegra::Shader::ImageType::Texture2DArray:
256 return "2DArray";
257 case Tegra::Shader::ImageType::Texture3D:
258 return "3D";
259 default:
260 UNREACHABLE();
261 return "1D";
262 }
263}
264
245/// Generates code to use for a swizzle operation. 265/// Generates code to use for a swizzle operation.
246constexpr const char* GetSwizzle(u32 element) { 266constexpr const char* GetSwizzle(u32 element) {
247 constexpr std::array swizzle = {".x", ".y", ".z", ".w"}; 267 constexpr std::array swizzle = {".x", ".y", ".z", ".w"};
@@ -721,26 +741,6 @@ private:
721 void DeclareImages() { 741 void DeclareImages() {
722 const auto& images{ir.GetImages()}; 742 const auto& images{ir.GetImages()};
723 for (const auto& [offset, image] : images) { 743 for (const auto& [offset, image] : images) {
724 const char* image_type = [&] {
725 switch (image.GetType()) {
726 case Tegra::Shader::ImageType::Texture1D:
727 return "1D";
728 case Tegra::Shader::ImageType::TextureBuffer:
729 return "Buffer";
730 case Tegra::Shader::ImageType::Texture1DArray:
731 return "1DArray";
732 case Tegra::Shader::ImageType::Texture2D:
733 return "2D";
734 case Tegra::Shader::ImageType::Texture2DArray:
735 return "2DArray";
736 case Tegra::Shader::ImageType::Texture3D:
737 return "3D";
738 default:
739 UNREACHABLE();
740 return "1D";
741 }
742 }();
743
744 std::string qualifier = "coherent volatile"; 744 std::string qualifier = "coherent volatile";
745 if (image.IsRead() && !image.IsWritten()) { 745 if (image.IsRead() && !image.IsWritten()) {
746 qualifier += " readonly"; 746 qualifier += " readonly";
@@ -748,13 +748,10 @@ private:
748 qualifier += " writeonly"; 748 qualifier += " writeonly";
749 } 749 }
750 750
751 std::string format; 751 const char* format = image.IsAtomic() ? "r32ui, " : "";
752 if (image.IsAtomic()) { 752 const char* type_declaration = GetImageTypeDeclaration(image.GetType());
753 format = "r32ui, ";
754 }
755
756 code.AddLine("layout ({}binding = IMAGE_BINDING_{}) {} uniform uimage{} {};", format, 753 code.AddLine("layout ({}binding = IMAGE_BINDING_{}) {} uniform uimage{} {};", format,
757 image.GetIndex(), qualifier, image_type, GetImage(image)); 754 image.GetIndex(), qualifier, type_declaration, GetImage(image));
758 } 755 }
759 if (!images.empty()) { 756 if (!images.empty()) {
760 code.AddNewLine(); 757 code.AddNewLine();
@@ -1494,6 +1491,8 @@ private:
1494 case Tegra::Shader::HalfType::H1_H1: 1491 case Tegra::Shader::HalfType::H1_H1:
1495 return {fmt::format("vec2({}[1])", operand.AsHalfFloat()), Type::HalfFloat}; 1492 return {fmt::format("vec2({}[1])", operand.AsHalfFloat()), Type::HalfFloat};
1496 } 1493 }
1494 UNREACHABLE();
1495 return {"0", Type::Int};
1497 } 1496 }
1498 1497
1499 Expression HMergeF32(Operation operation) { 1498 Expression HMergeF32(Operation operation) {