|
|
@ -206,26 +206,12 @@ void EmitGetAttribute(EmitContext& ctx, IR::Inst& inst, IR::Attribute attr,
|
|
|
|
case IR::Attribute::PositionX:
|
|
|
|
case IR::Attribute::PositionX:
|
|
|
|
case IR::Attribute::PositionY:
|
|
|
|
case IR::Attribute::PositionY:
|
|
|
|
case IR::Attribute::PositionZ:
|
|
|
|
case IR::Attribute::PositionZ:
|
|
|
|
case IR::Attribute::PositionW:
|
|
|
|
case IR::Attribute::PositionW: {
|
|
|
|
switch (ctx.stage) {
|
|
|
|
const bool is_array{IsInputArray(ctx.stage)};
|
|
|
|
case Stage::VertexA:
|
|
|
|
const auto input_decorator{is_array ? fmt::format("gl_in[{}].", vertex) : ""};
|
|
|
|
case Stage::VertexB:
|
|
|
|
ctx.AddF32("{}={}{}.{};", inst, input_decorator, ctx.position_name, swizzle);
|
|
|
|
ctx.AddF32("{}=gl_Position.{};", inst, swizzle);
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case Stage::TessellationEval:
|
|
|
|
|
|
|
|
ctx.AddF32("{}=gl_TessCoord.{};", inst, swizzle);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Stage::TessellationControl:
|
|
|
|
|
|
|
|
case Stage::Geometry:
|
|
|
|
|
|
|
|
ctx.AddF32("{}=gl_in[{}].gl_Position.{};", inst, vertex, swizzle);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Stage::Fragment:
|
|
|
|
|
|
|
|
ctx.AddF32("{}=gl_FragCoord.{};", inst, swizzle);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
throw NotImplementedException("Get Position for stage {}", ctx.stage);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IR::Attribute::PointSpriteS:
|
|
|
|
case IR::Attribute::PointSpriteS:
|
|
|
|
case IR::Attribute::PointSpriteT:
|
|
|
|
case IR::Attribute::PointSpriteT:
|
|
|
|
ctx.AddF32("{}=gl_PointCoord.{};", inst, swizzle);
|
|
|
|
ctx.AddF32("{}=gl_PointCoord.{};", inst, swizzle);
|
|
|
@ -311,6 +297,20 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, std::string_view val
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void EmitGetAttributeIndexed(EmitContext& ctx, IR::Inst& inst, std::string_view offset,
|
|
|
|
|
|
|
|
std::string_view vertex) {
|
|
|
|
|
|
|
|
const bool is_array{ctx.stage == Stage::Geometry};
|
|
|
|
|
|
|
|
const auto vertex_arg{is_array ? fmt::format(",{}", vertex) : ""};
|
|
|
|
|
|
|
|
ctx.AddF32("{}=IndexedAttrLoad(int({}){});", inst, offset, vertex_arg);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void EmitSetAttributeIndexed([[maybe_unused]] EmitContext& ctx,
|
|
|
|
|
|
|
|
[[maybe_unused]] std::string_view offset,
|
|
|
|
|
|
|
|
[[maybe_unused]] std::string_view value,
|
|
|
|
|
|
|
|
[[maybe_unused]] std::string_view vertex) {
|
|
|
|
|
|
|
|
NotImplemented();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EmitGetPatch(EmitContext& ctx, IR::Inst& inst, IR::Patch patch) {
|
|
|
|
void EmitGetPatch(EmitContext& ctx, IR::Inst& inst, IR::Patch patch) {
|
|
|
|
if (!IR::IsGeneric(patch)) {
|
|
|
|
if (!IR::IsGeneric(patch)) {
|
|
|
|
throw NotImplementedException("Non-generic patch load");
|
|
|
|
throw NotImplementedException("Non-generic patch load");
|
|
|
|