|
|
|
@ -98,6 +98,10 @@ void GetCbuf16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, const |
|
|
|
bit_offset); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
u32 TexCoordIndex(IR::Attribute attr) { |
|
|
|
return (static_cast<u32>(attr) - static_cast<u32>(IR::Attribute::FixedFncTexture0S)) / 4; |
|
|
|
} |
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
void EmitGetCbufU8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|
|
|
@ -178,6 +182,17 @@ void EmitGetAttribute(EmitContext& ctx, IR::Inst& inst, IR::Attribute attr, |
|
|
|
ctx.AddF32("{}=in_attr{}{}.{};", inst, index, InputVertexIndex(ctx, vertex), swizzle); |
|
|
|
return; |
|
|
|
} |
|
|
|
// GLSL only exposes 8 legacy texcoords
|
|
|
|
if (attr >= IR::Attribute::FixedFncTexture8S && attr <= IR::Attribute::FixedFncTexture9Q) { |
|
|
|
// LOG_WARNING(..., "GLSL does not allow access to gl_TexCoord[{}]", TexCoordIndex(attr));
|
|
|
|
ctx.AddF32("{}=0.f;", inst); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (attr >= IR::Attribute::FixedFncTexture0S && attr <= IR::Attribute::FixedFncTexture7Q) { |
|
|
|
const u32 index{TexCoordIndex(attr)}; |
|
|
|
ctx.AddF32("{}=gl_TexCoord[{}].{};", inst, index, swizzle); |
|
|
|
return; |
|
|
|
} |
|
|
|
switch (attr) { |
|
|
|
case IR::Attribute::PrimitiveId: |
|
|
|
ctx.AddF32("{}=itof(gl_PrimitiveID);", inst); |
|
|
|
@ -227,19 +242,29 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, std::string_view val |
|
|
|
[[maybe_unused]] std::string_view vertex) { |
|
|
|
if (IR::IsGeneric(attr)) { |
|
|
|
const u32 index{IR::GenericAttributeIndex(attr)}; |
|
|
|
const u32 element{IR::GenericAttributeElement(attr)}; |
|
|
|
const GenericElementInfo& info{ctx.output_generics.at(index).at(element)}; |
|
|
|
const u32 attr_element{IR::GenericAttributeElement(attr)}; |
|
|
|
const GenericElementInfo& info{ctx.output_generics.at(index).at(attr_element)}; |
|
|
|
const auto output_decorator{OutputVertexIndex(ctx)}; |
|
|
|
if (info.num_components == 1) { |
|
|
|
ctx.Add("{}{}={};", info.name, output_decorator, value); |
|
|
|
} else { |
|
|
|
const u32 index_element{element - info.first_element}; |
|
|
|
const u32 index_element{attr_element - info.first_element}; |
|
|
|
ctx.Add("{}{}.{}={};", info.name, output_decorator, "xyzw"[index_element], value); |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
const u32 element{static_cast<u32>(attr) % 4}; |
|
|
|
const char swizzle{"xyzw"[element]}; |
|
|
|
// GLSL only exposes 8 legacy texcoords
|
|
|
|
if (attr >= IR::Attribute::FixedFncTexture8S && attr <= IR::Attribute::FixedFncTexture9Q) { |
|
|
|
// LOG_WARNING(..., "GLSL does not allow access to gl_TexCoord[{}]", TexCoordIndex(attr));
|
|
|
|
return; |
|
|
|
} |
|
|
|
if (attr >= IR::Attribute::FixedFncTexture0S && attr <= IR::Attribute::FixedFncTexture7Q) { |
|
|
|
const u32 index{TexCoordIndex(attr)}; |
|
|
|
ctx.Add("gl_TexCoord[{}].{}={};", index, swizzle, value); |
|
|
|
return; |
|
|
|
} |
|
|
|
switch (attr) { |
|
|
|
case IR::Attribute::Layer: |
|
|
|
if (ctx.stage != Stage::Geometry && |
|
|
|
|