shader: Implement front face
This commit is contained in:
parent
a806b29cb9
commit
f0031babeb
|
@ -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