Просмотр исходного кода

shader: Add PointSize attribute

ameerj 5 лет назад
Родитель
Сommit
b7589fe115

+ 6 - 0
src/shader_recompiler/backend/spirv/emit_context.cpp

@@ -492,6 +492,12 @@ void EmitContext::DefineOutputs(const Info& info) {
     if (info.stores_position || stage == Stage::VertexB) {
     if (info.stores_position || stage == Stage::VertexB) {
         output_position = DefineOutput(*this, F32[4], spv::BuiltIn::Position);
         output_position = DefineOutput(*this, F32[4], spv::BuiltIn::Position);
     }
     }
+    if (info.stores_point_size) {
+        if (stage == Stage::Fragment) {
+            throw NotImplementedException("Storing PointSize in Fragment stage");
+        }
+        output_point_size = DefineOutput(*this, F32[1], spv::BuiltIn::PointSize);
+    }
     for (size_t i = 0; i < info.stores_generics.size(); ++i) {
     for (size_t i = 0; i < info.stores_generics.size(); ++i) {
         if (info.stores_generics[i]) {
         if (info.stores_generics[i]) {
             output_generics[i] = DefineOutput(*this, F32[4]);
             output_generics[i] = DefineOutput(*this, F32[4]);

+ 1 - 0
src/shader_recompiler/backend/spirv/emit_context.h

@@ -120,6 +120,7 @@ public:
     Id input_position{};
     Id input_position{};
     std::array<Id, 32> input_generics{};
     std::array<Id, 32> input_generics{};
 
 
+    Id output_point_size{};
     Id output_position{};
     Id output_position{};
     std::array<Id, 32> output_generics{};
     std::array<Id, 32> output_generics{};
 
 

+ 2 - 0
src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp

@@ -37,6 +37,8 @@ Id OutputAttrPointer(EmitContext& ctx, IR::Attribute attr) {
         return ctx.OpAccessChain(ctx.output_f32, ctx.output_generics.at(index), element_id());
         return ctx.OpAccessChain(ctx.output_f32, ctx.output_generics.at(index), element_id());
     }
     }
     switch (attr) {
     switch (attr) {
+    case IR::Attribute::PointSize:
+        return ctx.output_point_size;
     case IR::Attribute::PositionX:
     case IR::Attribute::PositionX:
     case IR::Attribute::PositionY:
     case IR::Attribute::PositionY:
     case IR::Attribute::PositionZ:
     case IR::Attribute::PositionZ:

+ 3 - 0
src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp

@@ -58,6 +58,9 @@ void SetAttribute(Info& info, IR::Attribute attribute) {
         return;
         return;
     }
     }
     switch (attribute) {
     switch (attribute) {
+    case IR::Attribute::PointSize:
+        info.stores_point_size = true;
+        break;
     case IR::Attribute::PositionX:
     case IR::Attribute::PositionX:
     case IR::Attribute::PositionY:
     case IR::Attribute::PositionY:
     case IR::Attribute::PositionZ:
     case IR::Attribute::PositionZ:

+ 1 - 0
src/shader_recompiler/shader_info.h

@@ -79,6 +79,7 @@ struct Info {
     bool stores_frag_depth{};
     bool stores_frag_depth{};
     std::array<bool, 32> stores_generics{};
     std::array<bool, 32> stores_generics{};
     bool stores_position{};
     bool stores_position{};
+    bool stores_point_size{};
 
 
     bool uses_fp16{};
     bool uses_fp16{};
     bool uses_fp64{};
     bool uses_fp64{};