|
|
|
@ -96,6 +96,7 @@ Node ShaderIR::GetPredicate(bool immediate) { |
|
|
|
} |
|
|
|
|
|
|
|
Node ShaderIR::GetInputAttribute(Attribute::Index index, u64 element, Node buffer) { |
|
|
|
MarkAttributeUsage(index, element); |
|
|
|
used_input_attributes.emplace(index); |
|
|
|
return MakeNode<AbufNode>(index, static_cast<u32>(element), std::move(buffer)); |
|
|
|
} |
|
|
|
@ -106,40 +107,7 @@ Node ShaderIR::GetPhysicalInputAttribute(Tegra::Shader::Register physical_addres |
|
|
|
} |
|
|
|
|
|
|
|
Node ShaderIR::GetOutputAttribute(Attribute::Index index, u64 element, Node buffer) { |
|
|
|
switch (index) { |
|
|
|
case Attribute::Index::LayerViewportPointSize: |
|
|
|
switch (element) { |
|
|
|
case 0: |
|
|
|
UNIMPLEMENTED(); |
|
|
|
break; |
|
|
|
case 1: |
|
|
|
uses_layer = true; |
|
|
|
break; |
|
|
|
case 2: |
|
|
|
uses_viewport_index = true; |
|
|
|
break; |
|
|
|
case 3: |
|
|
|
uses_point_size = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
break; |
|
|
|
case Attribute::Index::TessCoordInstanceIDVertexID: |
|
|
|
switch (element) { |
|
|
|
case 2: |
|
|
|
uses_instance_id = true; |
|
|
|
break; |
|
|
|
case 3: |
|
|
|
uses_vertex_id = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
break; |
|
|
|
case Attribute::Index::ClipDistances0123: |
|
|
|
case Attribute::Index::ClipDistances4567: { |
|
|
|
const u64 clip_index = (index == Attribute::Index::ClipDistances4567 ? 4 : 0) + element; |
|
|
|
used_clip_distances.at(clip_index) = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
MarkAttributeUsage(index, element); |
|
|
|
used_output_attributes.insert(index); |
|
|
|
return MakeNode<AbufNode>(index, static_cast<u32>(element), std::move(buffer)); |
|
|
|
} |
|
|
|
@ -451,6 +419,54 @@ Node ShaderIR::BitfieldInsert(Node base, Node insert, u32 offset, u32 bits) { |
|
|
|
Immediate(bits)); |
|
|
|
} |
|
|
|
|
|
|
|
void ShaderIR::MarkAttributeUsage(Attribute::Index index, u64 element) { |
|
|
|
switch (index) { |
|
|
|
case Attribute::Index::LayerViewportPointSize: |
|
|
|
switch (element) { |
|
|
|
case 0: |
|
|
|
UNIMPLEMENTED(); |
|
|
|
break; |
|
|
|
case 1: |
|
|
|
uses_layer = true; |
|
|
|
break; |
|
|
|
case 2: |
|
|
|
uses_viewport_index = true; |
|
|
|
break; |
|
|
|
case 3: |
|
|
|
uses_point_size = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
break; |
|
|
|
case Attribute::Index::TessCoordInstanceIDVertexID: |
|
|
|
switch (element) { |
|
|
|
case 2: |
|
|
|
uses_instance_id = true; |
|
|
|
break; |
|
|
|
case 3: |
|
|
|
uses_vertex_id = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
break; |
|
|
|
case Attribute::Index::ClipDistances0123: |
|
|
|
case Attribute::Index::ClipDistances4567: { |
|
|
|
const u64 clip_index = (index == Attribute::Index::ClipDistances4567 ? 4 : 0) + element; |
|
|
|
used_clip_distances.at(clip_index) = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
case Attribute::Index::FrontColor: |
|
|
|
case Attribute::Index::FrontSecondaryColor: |
|
|
|
case Attribute::Index::BackColor: |
|
|
|
case Attribute::Index::BackSecondaryColor: |
|
|
|
uses_legacy_varyings = true; |
|
|
|
break; |
|
|
|
default: |
|
|
|
if (index >= Attribute::Index::TexCoord_0 && index <= Attribute::Index::TexCoord_7) { |
|
|
|
uses_legacy_varyings = true; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
std::size_t ShaderIR::DeclareAmend(Node new_amend) { |
|
|
|
const std::size_t id = amend_code.size(); |
|
|
|
amend_code.push_back(new_amend); |
|
|
|
|