|
|
@@ -731,8 +731,10 @@ private:
|
|
|
if (!IsGenericAttribute(index)) {
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
const u32 location = GetGenericAttributeLocation(index);
|
|
|
+ if (!IsAttributeEnabled(location)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
const auto type_descriptor = GetAttributeType(location);
|
|
|
Id type;
|
|
|
if (IsInputAttributeArray()) {
|
|
|
@@ -976,6 +978,10 @@ private:
|
|
|
return stage == ShaderType::TesselationControl;
|
|
|
}
|
|
|
|
|
|
+ bool IsAttributeEnabled(u32 location) const {
|
|
|
+ return stage != ShaderType::Vertex || specialization.enabled_attributes[location];
|
|
|
+ }
|
|
|
+
|
|
|
u32 GetNumInputVertices() const {
|
|
|
switch (stage) {
|
|
|
case ShaderType::Geometry:
|
|
|
@@ -1192,16 +1198,20 @@ private:
|
|
|
UNIMPLEMENTED_MSG("Unmanaged FrontFacing element={}", element);
|
|
|
return {v_float_zero, Type::Float};
|
|
|
default:
|
|
|
- if (IsGenericAttribute(attribute)) {
|
|
|
- const u32 location = GetGenericAttributeLocation(attribute);
|
|
|
- const auto type_descriptor = GetAttributeType(location);
|
|
|
- const Type type = type_descriptor.type;
|
|
|
- const Id attribute_id = input_attributes.at(attribute);
|
|
|
- const std::vector elements = {element};
|
|
|
- const Id pointer = ArrayPass(type_descriptor.scalar, attribute_id, elements);
|
|
|
- return {OpLoad(GetTypeDefinition(type), pointer), type};
|
|
|
+ if (!IsGenericAttribute(attribute)) {
|
|
|
+ break;
|
|
|
}
|
|
|
- break;
|
|
|
+ const u32 location = GetGenericAttributeLocation(attribute);
|
|
|
+ if (!IsAttributeEnabled(location)) {
|
|
|
+ // Disabled attributes (also known as constant attributes) always return zero.
|
|
|
+ return {v_float_zero, Type::Float};
|
|
|
+ }
|
|
|
+ const auto type_descriptor = GetAttributeType(location);
|
|
|
+ const Type type = type_descriptor.type;
|
|
|
+ const Id attribute_id = input_attributes.at(attribute);
|
|
|
+ const std::vector elements = {element};
|
|
|
+ const Id pointer = ArrayPass(type_descriptor.scalar, attribute_id, elements);
|
|
|
+ return {OpLoad(GetTypeDefinition(type), pointer), type};
|
|
|
}
|
|
|
UNIMPLEMENTED_MSG("Unhandled input attribute: {}", static_cast<u32>(attribute));
|
|
|
return {v_float_zero, Type::Float};
|