@ -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 } ;