@@ -1031,7 +1031,7 @@ bitflags::bitflags! {
1031
1031
#[ repr( transparent) ]
1032
1032
// NOTE: Apparently quadro drivers support up to 64x MSAA.
1033
1033
/// MSAA uses the highest 3 bits for the MSAA log2(sample count) to support up to 128x MSAA.
1034
- pub struct MeshPipelineKey : u32 {
1034
+ pub struct MeshPipelineKey : u64 {
1035
1035
// Nothing
1036
1036
const NONE = 0 ;
1037
1037
@@ -1058,13 +1058,13 @@ bitflags::bitflags! {
1058
1058
const LAST_FLAG = Self :: IRRADIANCE_VOLUME . bits( ) ;
1059
1059
1060
1060
// Bitfields
1061
- const BLEND_RESERVED_BITS = Self :: BLEND_MASK_BITS << Self :: BLEND_SHIFT_BITS ; // ← Bitmask reserving bits for the blend state
1062
- const BLEND_OPAQUE = 0 << Self :: BLEND_SHIFT_BITS ; // ← Values are just sequential within the mask, and can range from 0 to 3
1063
- const BLEND_PREMULTIPLIED_ALPHA = 1 << Self :: BLEND_SHIFT_BITS ; //
1064
- const BLEND_MULTIPLY = 2 << Self :: BLEND_SHIFT_BITS ; // ← We still have room for one more value without adding more bits
1065
- const BLEND_ALPHA = 3 << Self :: BLEND_SHIFT_BITS ;
1066
- const BLEND_ALPHA_TO_COVERAGE = 4 << Self :: BLEND_SHIFT_BITS ;
1067
1061
const MSAA_RESERVED_BITS = Self :: MSAA_MASK_BITS << Self :: MSAA_SHIFT_BITS ;
1062
+ const BLEND_RESERVED_BITS = Self :: BLEND_MASK_BITS << Self :: BLEND_SHIFT_BITS ; // ← Bitmask reserving bits for the blend state
1063
+ const BLEND_OPAQUE = 0 << Self :: BLEND_SHIFT_BITS ; // ← Values are just sequential within the mask
1064
+ const BLEND_PREMULTIPLIED_ALPHA = 1 << Self :: BLEND_SHIFT_BITS ; // ← As blend states is on 3 bits, it can range from 0 to 7
1065
+ const BLEND_MULTIPLY = 2 << Self :: BLEND_SHIFT_BITS ; // ← See `BLEND_MASK_BITS` for the number of bits available
1066
+ const BLEND_ALPHA = 3 << Self :: BLEND_SHIFT_BITS ; //
1067
+ const BLEND_ALPHA_TO_COVERAGE = 4 << Self :: BLEND_SHIFT_BITS ; // ← We still have room for three more values without adding more bits
1068
1068
const TONEMAP_METHOD_RESERVED_BITS = Self :: TONEMAP_METHOD_MASK_BITS << Self :: TONEMAP_METHOD_SHIFT_BITS ;
1069
1069
const TONEMAP_METHOD_NONE = 0 << Self :: TONEMAP_METHOD_SHIFT_BITS ;
1070
1070
const TONEMAP_METHOD_REINHARD = 1 << Self :: TONEMAP_METHOD_SHIFT_BITS ;
@@ -1099,31 +1099,32 @@ bitflags::bitflags! {
1099
1099
}
1100
1100
1101
1101
impl MeshPipelineKey {
1102
- const MSAA_MASK_BITS : u32 = 0b111 ;
1103
- const MSAA_SHIFT_BITS : u32 = Self :: LAST_FLAG . bits ( ) . trailing_zeros ( ) + 1 ;
1102
+ const MSAA_MASK_BITS : u64 = 0b111 ;
1103
+ const MSAA_SHIFT_BITS : u64 = Self :: LAST_FLAG . bits ( ) . trailing_zeros ( ) as u64 + 1 ;
1104
1104
1105
- const BLEND_MASK_BITS : u32 = 0b111 ;
1106
- const BLEND_SHIFT_BITS : u32 = Self :: MSAA_MASK_BITS . count_ones ( ) + Self :: MSAA_SHIFT_BITS ;
1105
+ const BLEND_MASK_BITS : u64 = 0b111 ;
1106
+ const BLEND_SHIFT_BITS : u64 = Self :: MSAA_MASK_BITS . count_ones ( ) as u64 + Self :: MSAA_SHIFT_BITS ;
1107
1107
1108
- const TONEMAP_METHOD_MASK_BITS : u32 = 0b111 ;
1109
- const TONEMAP_METHOD_SHIFT_BITS : u32 =
1110
- Self :: BLEND_MASK_BITS . count_ones ( ) + Self :: BLEND_SHIFT_BITS ;
1108
+ const TONEMAP_METHOD_MASK_BITS : u64 = 0b111 ;
1109
+ const TONEMAP_METHOD_SHIFT_BITS : u64 =
1110
+ Self :: BLEND_MASK_BITS . count_ones ( ) as u64 + Self :: BLEND_SHIFT_BITS ;
1111
1111
1112
- const SHADOW_FILTER_METHOD_MASK_BITS : u32 = 0b11 ;
1113
- const SHADOW_FILTER_METHOD_SHIFT_BITS : u32 =
1114
- Self :: TONEMAP_METHOD_MASK_BITS . count_ones ( ) + Self :: TONEMAP_METHOD_SHIFT_BITS ;
1112
+ const SHADOW_FILTER_METHOD_MASK_BITS : u64 = 0b11 ;
1113
+ const SHADOW_FILTER_METHOD_SHIFT_BITS : u64 =
1114
+ Self :: TONEMAP_METHOD_MASK_BITS . count_ones ( ) as u64 + Self :: TONEMAP_METHOD_SHIFT_BITS ;
1115
1115
1116
- const VIEW_PROJECTION_MASK_BITS : u32 = 0b11 ;
1117
- const VIEW_PROJECTION_SHIFT_BITS : u32 =
1118
- Self :: SHADOW_FILTER_METHOD_MASK_BITS . count_ones ( ) + Self :: SHADOW_FILTER_METHOD_SHIFT_BITS ;
1116
+ const VIEW_PROJECTION_MASK_BITS : u64 = 0b11 ;
1117
+ const VIEW_PROJECTION_SHIFT_BITS : u64 = Self :: SHADOW_FILTER_METHOD_MASK_BITS . count_ones ( )
1118
+ as u64
1119
+ + Self :: SHADOW_FILTER_METHOD_SHIFT_BITS ;
1119
1120
1120
- const SCREEN_SPACE_SPECULAR_TRANSMISSION_MASK_BITS : u32 = 0b11 ;
1121
- const SCREEN_SPACE_SPECULAR_TRANSMISSION_SHIFT_BITS : u32 =
1122
- Self :: VIEW_PROJECTION_MASK_BITS . count_ones ( ) + Self :: VIEW_PROJECTION_SHIFT_BITS ;
1121
+ const SCREEN_SPACE_SPECULAR_TRANSMISSION_MASK_BITS : u64 = 0b11 ;
1122
+ const SCREEN_SPACE_SPECULAR_TRANSMISSION_SHIFT_BITS : u64 =
1123
+ Self :: VIEW_PROJECTION_MASK_BITS . count_ones ( ) as u64 + Self :: VIEW_PROJECTION_SHIFT_BITS ;
1123
1124
1124
1125
pub fn from_msaa_samples ( msaa_samples : u32 ) -> Self {
1125
1126
let msaa_bits =
1126
- ( msaa_samples. trailing_zeros ( ) & Self :: MSAA_MASK_BITS ) << Self :: MSAA_SHIFT_BITS ;
1127
+ ( msaa_samples. trailing_zeros ( ) as u64 & Self :: MSAA_MASK_BITS ) << Self :: MSAA_SHIFT_BITS ;
1127
1128
Self :: from_bits_retain ( msaa_bits)
1128
1129
}
1129
1130
@@ -1140,7 +1141,7 @@ impl MeshPipelineKey {
1140
1141
}
1141
1142
1142
1143
pub fn from_primitive_topology ( primitive_topology : PrimitiveTopology ) -> Self {
1143
- let primitive_topology_bits = ( ( primitive_topology as u32 )
1144
+ let primitive_topology_bits = ( ( primitive_topology as u64 )
1144
1145
& BaseMeshPipelineKey :: PRIMITIVE_TOPOLOGY_MASK_BITS )
1145
1146
<< BaseMeshPipelineKey :: PRIMITIVE_TOPOLOGY_SHIFT_BITS ;
1146
1147
Self :: from_bits_retain ( primitive_topology_bits)
@@ -1151,11 +1152,11 @@ impl MeshPipelineKey {
1151
1152
>> BaseMeshPipelineKey :: PRIMITIVE_TOPOLOGY_SHIFT_BITS )
1152
1153
& BaseMeshPipelineKey :: PRIMITIVE_TOPOLOGY_MASK_BITS ;
1153
1154
match primitive_topology_bits {
1154
- x if x == PrimitiveTopology :: PointList as u32 => PrimitiveTopology :: PointList ,
1155
- x if x == PrimitiveTopology :: LineList as u32 => PrimitiveTopology :: LineList ,
1156
- x if x == PrimitiveTopology :: LineStrip as u32 => PrimitiveTopology :: LineStrip ,
1157
- x if x == PrimitiveTopology :: TriangleList as u32 => PrimitiveTopology :: TriangleList ,
1158
- x if x == PrimitiveTopology :: TriangleStrip as u32 => PrimitiveTopology :: TriangleStrip ,
1155
+ x if x == PrimitiveTopology :: PointList as u64 => PrimitiveTopology :: PointList ,
1156
+ x if x == PrimitiveTopology :: LineList as u64 => PrimitiveTopology :: LineList ,
1157
+ x if x == PrimitiveTopology :: LineStrip as u64 => PrimitiveTopology :: LineStrip ,
1158
+ x if x == PrimitiveTopology :: TriangleList as u64 => PrimitiveTopology :: TriangleList ,
1159
+ x if x == PrimitiveTopology :: TriangleStrip as u64 => PrimitiveTopology :: TriangleStrip ,
1159
1160
_ => PrimitiveTopology :: default ( ) ,
1160
1161
}
1161
1162
}
@@ -1168,6 +1169,14 @@ const_assert_eq!(
1168
1169
0
1169
1170
) ;
1170
1171
1172
+ // Ensure that the reserved bits don't overlap with the topology bits
1173
+ const_assert_eq ! (
1174
+ ( BaseMeshPipelineKey :: PRIMITIVE_TOPOLOGY_MASK_BITS
1175
+ << BaseMeshPipelineKey :: PRIMITIVE_TOPOLOGY_SHIFT_BITS )
1176
+ & MeshPipelineKey :: ALL_RESERVED_BITS . bits( ) ,
1177
+ 0
1178
+ ) ;
1179
+
1171
1180
fn is_skinned ( layout : & MeshVertexBufferLayoutRef ) -> bool {
1172
1181
layout. 0 . contains ( Mesh :: ATTRIBUTE_JOINT_INDEX )
1173
1182
&& layout. 0 . contains ( Mesh :: ATTRIBUTE_JOINT_WEIGHT )
0 commit comments