glasm: Properly declare attributes on geometry programs
This commit is contained in:
		| @@ -47,24 +47,31 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile | ||||
|     case Stage::VertexA: | ||||
|     case Stage::VertexB: | ||||
|         stage_name = "vertex"; | ||||
|         attrib_name = "vertex"; | ||||
|         break; | ||||
|     case Stage::TessellationControl: | ||||
|     case Stage::TessellationEval: | ||||
|         stage_name = "primitive"; | ||||
|         attrib_name = "primitive"; | ||||
|         break; | ||||
|     case Stage::Geometry: | ||||
|         stage_name = "primitive"; | ||||
|         attrib_name = "vertex"; | ||||
|         break; | ||||
|     case Stage::Fragment: | ||||
|         stage_name = "fragment"; | ||||
|         attrib_name = "fragment"; | ||||
|         break; | ||||
|     case Stage::Compute: | ||||
|         stage_name = "invocation"; | ||||
|         break; | ||||
|     } | ||||
|     const std::string_view attr_stage{stage == Stage::Fragment ? "fragment" : "vertex"}; | ||||
|     for (size_t index = 0; index < program.info.input_generics.size(); ++index) { | ||||
|         const auto& generic{program.info.input_generics[index]}; | ||||
|         if (generic.used) { | ||||
|             Add("{}ATTRIB in_attr{}[]={{{}.attrib[{}..{}]}};", | ||||
|                 InterpDecorator(generic.interpolation), index, stage_name, index, index); | ||||
|                 InterpDecorator(generic.interpolation), index, attr_stage, index, index); | ||||
|         } | ||||
|     } | ||||
|     for (size_t index = 0; index < program.info.stores_frag_color.size(); ++index) { | ||||
|   | ||||
| @@ -66,6 +66,7 @@ public: | ||||
|  | ||||
|     Stage stage{}; | ||||
|     std::string_view stage_name = "invalid"; | ||||
|     std::string_view attrib_name = "invalid"; | ||||
| }; | ||||
|  | ||||
| } // namespace Shader::Backend::GLASM | ||||
|   | ||||
| @@ -64,20 +64,20 @@ void EmitGetAttribute(EmitContext& ctx, IR::Inst& inst, IR::Attribute attr, | ||||
|     case IR::Attribute::PositionY: | ||||
|     case IR::Attribute::PositionZ: | ||||
|     case IR::Attribute::PositionW: | ||||
|         ctx.Add("MOV.F {}.x,{}.position.{};", inst, ctx.stage_name, swizzle); | ||||
|         ctx.Add("MOV.F {}.x,{}.position.{};", inst, ctx.attrib_name, swizzle); | ||||
|         break; | ||||
|     case IR::Attribute::PointSpriteS: | ||||
|     case IR::Attribute::PointSpriteT: | ||||
|         ctx.Add("MOV.F {}.x,{}.pointcoord.{};", inst, ctx.stage_name, swizzle); | ||||
|         ctx.Add("MOV.F {}.x,{}.pointcoord.{};", inst, ctx.attrib_name, swizzle); | ||||
|         break; | ||||
|     case IR::Attribute::InstanceId: | ||||
|         ctx.Add("MOV.S {}.x,{}.instance;", inst, ctx.stage_name); | ||||
|         ctx.Add("MOV.S {}.x,{}.instance;", inst, ctx.attrib_name); | ||||
|         break; | ||||
|     case IR::Attribute::VertexId: | ||||
|         ctx.Add("MOV.S {}.x,{}.id;", inst, ctx.stage_name); | ||||
|         ctx.Add("MOV.S {}.x,{}.id;", inst, ctx.attrib_name); | ||||
|         break; | ||||
|     case IR::Attribute::FrontFace: | ||||
|         ctx.Add("CMP.S {}.x,{}.facing.x,0,-1;", inst, ctx.stage_name); | ||||
|         ctx.Add("CMP.S {}.x,{}.facing.x,0,-1;", inst, ctx.attrib_name); | ||||
|         break; | ||||
|     default: | ||||
|         throw NotImplementedException("Get attribute {}", attr); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user