shader: Add PointCoord attribute
This commit is contained in:
		| @@ -425,6 +425,9 @@ void EmitContext::DefineInputs(const Info& info) { | |||||||
|     if (info.loads_front_face) { |     if (info.loads_front_face) { | ||||||
|         front_face = DefineInput(*this, U1, spv::BuiltIn::FrontFacing); |         front_face = DefineInput(*this, U1, spv::BuiltIn::FrontFacing); | ||||||
|     } |     } | ||||||
|  |     if (info.loads_point_coord) { | ||||||
|  |         point_coord = DefineInput(*this, F32[2], spv::BuiltIn::PointCoord); | ||||||
|  |     } | ||||||
|     for (size_t index = 0; index < info.input_generics.size(); ++index) { |     for (size_t index = 0; index < info.input_generics.size(); ++index) { | ||||||
|         const InputVarying generic{info.input_generics[index]}; |         const InputVarying generic{info.input_generics[index]}; | ||||||
|         if (!generic.used) { |         if (!generic.used) { | ||||||
|   | |||||||
| @@ -103,6 +103,8 @@ public: | |||||||
|     Id vertex_index{}; |     Id vertex_index{}; | ||||||
|     Id base_vertex{}; |     Id base_vertex{}; | ||||||
|     Id front_face{}; |     Id front_face{}; | ||||||
|  |     Id point_coord{}; | ||||||
|  |  | ||||||
|     Id fswzadd_lut_a{}; |     Id fswzadd_lut_a{}; | ||||||
|     Id fswzadd_lut_b{}; |     Id fswzadd_lut_b{}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -179,6 +179,12 @@ Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr) { | |||||||
|         return ctx.OpSelect(ctx.U32[1], ctx.OpLoad(ctx.U1, ctx.front_face), |         return ctx.OpSelect(ctx.U32[1], ctx.OpLoad(ctx.U1, ctx.front_face), | ||||||
|                             ctx.Constant(ctx.U32[1], std::numeric_limits<u32>::max()), |                             ctx.Constant(ctx.U32[1], std::numeric_limits<u32>::max()), | ||||||
|                             ctx.u32_zero_value); |                             ctx.u32_zero_value); | ||||||
|  |     case IR::Attribute::PointSpriteS: | ||||||
|  |         return ctx.OpLoad(ctx.F32[1], ctx.OpAccessChain(ctx.input_f32, ctx.point_coord, | ||||||
|  |                                                         ctx.Constant(ctx.U32[1], 0U))); | ||||||
|  |     case IR::Attribute::PointSpriteT: | ||||||
|  |         return ctx.OpLoad(ctx.F32[1], ctx.OpAccessChain(ctx.input_f32, ctx.point_coord, | ||||||
|  |                                                         ctx.Constant(ctx.U32[1], 1U))); | ||||||
|     default: |     default: | ||||||
|         throw NotImplementedException("Read attribute {}", attr); |         throw NotImplementedException("Read attribute {}", attr); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -47,6 +47,10 @@ void GetAttribute(Info& info, IR::Attribute attribute) { | |||||||
|     case IR::Attribute::FrontFace: |     case IR::Attribute::FrontFace: | ||||||
|         info.loads_front_face = true; |         info.loads_front_face = true; | ||||||
|         break; |         break; | ||||||
|  |     case IR::Attribute::PointSpriteS: | ||||||
|  |     case IR::Attribute::PointSpriteT: | ||||||
|  |         info.loads_point_coord = true; | ||||||
|  |         break; | ||||||
|     default: |     default: | ||||||
|         throw NotImplementedException("Get attribute {}", attribute); |         throw NotImplementedException("Get attribute {}", attribute); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -74,6 +74,7 @@ struct Info { | |||||||
|     bool loads_instance_id{}; |     bool loads_instance_id{}; | ||||||
|     bool loads_vertex_id{}; |     bool loads_vertex_id{}; | ||||||
|     bool loads_front_face{}; |     bool loads_front_face{}; | ||||||
|  |     bool loads_point_coord{}; | ||||||
|  |  | ||||||
|     std::array<bool, 8> stores_frag_color{}; |     std::array<bool, 8> stores_frag_color{}; | ||||||
|     bool stores_frag_depth{}; |     bool stores_frag_depth{}; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user