shader: Implement front face
This commit is contained in:
		| @@ -302,6 +302,9 @@ void EmitContext::DefineInputs(const Info& info) { | ||||
|             base_vertex = DefineInput(*this, U32[1], spv::BuiltIn::BaseVertex); | ||||
|         } | ||||
|     } | ||||
|     if (info.loads_front_face) { | ||||
|         front_face = DefineInput(*this, U1, spv::BuiltIn::FrontFacing); | ||||
|     } | ||||
|     for (size_t index = 0; index < info.loads_generics.size(); ++index) { | ||||
|         if (!info.loads_generics[index]) { | ||||
|             continue; | ||||
|   | ||||
| @@ -94,6 +94,7 @@ public: | ||||
|     Id vertex_id{}; | ||||
|     Id vertex_index{}; | ||||
|     Id base_vertex{}; | ||||
|     Id front_face{}; | ||||
|  | ||||
|     Id input_position{}; | ||||
|     std::array<Id, 32> input_generics{}; | ||||
|   | ||||
| @@ -156,6 +156,10 @@ Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr) { | ||||
|             return ctx.OpISub(ctx.U32[1], ctx.OpLoad(ctx.U32[1], ctx.vertex_index), | ||||
|                               ctx.OpLoad(ctx.U32[1], ctx.base_vertex)); | ||||
|         } | ||||
|     case IR::Attribute::FrontFace: | ||||
|         return ctx.OpSelect(ctx.U32[1], ctx.OpLoad(ctx.U1, ctx.front_face), | ||||
|                             ctx.Constant(ctx.U32[1], std::numeric_limits<u32>::max()), | ||||
|                             ctx.u32_zero_value); | ||||
|     default: | ||||
|         throw NotImplementedException("Read attribute {}", attr); | ||||
|     } | ||||
|   | ||||
| @@ -44,6 +44,9 @@ void GetAttribute(Info& info, IR::Attribute attribute) { | ||||
|     case IR::Attribute::VertexId: | ||||
|         info.loads_vertex_id = true; | ||||
|         break; | ||||
|     case IR::Attribute::FrontFace: | ||||
|         info.loads_front_face = true; | ||||
|         break; | ||||
|     default: | ||||
|         throw NotImplementedException("Get attribute {}", attribute); | ||||
|     } | ||||
|   | ||||
| @@ -62,6 +62,7 @@ struct Info { | ||||
|     bool loads_position{}; | ||||
|     bool loads_instance_id{}; | ||||
|     bool loads_vertex_id{}; | ||||
|     bool loads_front_face{}; | ||||
|  | ||||
|     std::array<bool, 8> stores_frag_color{}; | ||||
|     bool stores_frag_depth{}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user