소스 검색

Merge pull request #1554 from FernandoS27/pointsize

Implement PointSize Output Attribute.
bunnei 7 년 전
부모
커밋
69b35d7615

+ 1 - 0
src/video_core/engines/shader_bytecode.h

@@ -79,6 +79,7 @@ union Attribute {
     constexpr explicit Attribute(u64 value) : value(value) {}
     constexpr explicit Attribute(u64 value) : value(value) {}
 
 
     enum class Index : u64 {
     enum class Index : u64 {
+        PointSize = 6,
         Position = 7,
         Position = 7,
         Attribute_0 = 8,
         Attribute_0 = 8,
         Attribute_31 = 39,
         Attribute_31 = 39,

+ 27 - 2
src/video_core/renderer_opengl/gl_shader_decompiler.cpp

@@ -6,6 +6,7 @@
 #include <set>
 #include <set>
 #include <string>
 #include <string>
 #include <string_view>
 #include <string_view>
+#include <unordered_set>
 
 
 #include <boost/optional.hpp>
 #include <boost/optional.hpp>
 #include <fmt/format.h>
 #include <fmt/format.h>
@@ -276,7 +277,8 @@ public:
     GLSLRegisterManager(ShaderWriter& shader, ShaderWriter& declarations,
     GLSLRegisterManager(ShaderWriter& shader, ShaderWriter& declarations,
                         const Maxwell3D::Regs::ShaderStage& stage, const std::string& suffix,
                         const Maxwell3D::Regs::ShaderStage& stage, const std::string& suffix,
                         const Tegra::Shader::Header& header)
                         const Tegra::Shader::Header& header)
-        : shader{shader}, declarations{declarations}, stage{stage}, suffix{suffix}, header{header} {
+        : shader{shader}, declarations{declarations}, stage{stage}, suffix{suffix}, header{header},
+          fixed_pipeline_output_attributes_used{} {
         BuildRegisterList();
         BuildRegisterList();
         BuildInputList();
         BuildInputList();
     }
     }
@@ -480,7 +482,12 @@ public:
                                std::to_string(static_cast<u32>(attribute)) + ']' +
                                std::to_string(static_cast<u32>(attribute)) + ']' +
                                GetSwizzle(elem) + " = " + src + ';');
                                GetSwizzle(elem) + " = " + src + ';');
             } else {
             } else {
-                shader.AddLine(dest + GetSwizzle(elem) + " = " + src + ';');
+                if (attribute == Attribute::Index::PointSize) {
+                    fixed_pipeline_output_attributes_used.insert(attribute);
+                    shader.AddLine(dest + " = " + src + ';');
+                } else {
+                    shader.AddLine(dest + GetSwizzle(elem) + " = " + src + ';');
+                }
             }
             }
         }
         }
     }
     }
@@ -524,6 +531,7 @@ public:
 
 
     /// Add declarations.
     /// Add declarations.
     void GenerateDeclarations(const std::string& suffix) {
     void GenerateDeclarations(const std::string& suffix) {
+        GenerateVertex();
         GenerateRegisters(suffix);
         GenerateRegisters(suffix);
         GenerateInternalFlags();
         GenerateInternalFlags();
         GenerateInputAttrs();
         GenerateInputAttrs();
@@ -683,6 +691,20 @@ private:
         declarations.AddNewLine();
         declarations.AddNewLine();
     }
     }
 
 
+    void GenerateVertex() {
+        if (stage != Maxwell3D::Regs::ShaderStage::Vertex)
+            return;
+        declarations.AddLine("out gl_PerVertex {");
+        ++declarations.scope;
+        declarations.AddLine("vec4 gl_Position;");
+        for (auto& o : fixed_pipeline_output_attributes_used) {
+            if (o == Attribute::Index::PointSize)
+                declarations.AddLine("float gl_PointSize;");
+        }
+        --declarations.scope;
+        declarations.AddLine("};");
+    }
+
     /// Generates code representing a temporary (GPR) register.
     /// Generates code representing a temporary (GPR) register.
     std::string GetRegister(const Register& reg, unsigned elem) {
     std::string GetRegister(const Register& reg, unsigned elem) {
         if (reg == Register::ZeroIndex) {
         if (reg == Register::ZeroIndex) {
@@ -836,6 +858,8 @@ private:
     /// Generates code representing the declaration name of an output attribute register.
     /// Generates code representing the declaration name of an output attribute register.
     std::string GetOutputAttribute(Attribute::Index attribute) {
     std::string GetOutputAttribute(Attribute::Index attribute) {
         switch (attribute) {
         switch (attribute) {
+        case Attribute::Index::PointSize:
+            return "gl_PointSize";
         case Attribute::Index::Position:
         case Attribute::Index::Position:
             return "position";
             return "position";
         default:
         default:
@@ -870,6 +894,7 @@ private:
     const Maxwell3D::Regs::ShaderStage& stage;
     const Maxwell3D::Regs::ShaderStage& stage;
     const std::string& suffix;
     const std::string& suffix;
     const Tegra::Shader::Header& header;
     const Tegra::Shader::Header& header;
+    std::unordered_set<Attribute::Index> fixed_pipeline_output_attributes_used;
 };
 };
 
 
 class GLSLGenerator {
 class GLSLGenerator {

+ 0 - 3
src/video_core/renderer_opengl/gl_shader_gen.cpp

@@ -19,9 +19,6 @@ ProgramResult GenerateVertexShader(const ShaderSetup& setup) {
     out += Decompiler::GetCommonDeclarations();
     out += Decompiler::GetCommonDeclarations();
 
 
     out += R"(
     out += R"(
-out gl_PerVertex {
-    vec4 gl_Position;
-};
 
 
 layout (location = 0) out vec4 position;
 layout (location = 0) out vec4 position;