@@ -1136,72 +1136,92 @@ impl super::PrivateCapabilities {
11361136 downlevel
11371137 . flags
11381138 . set ( wgt:: DownlevelFlags :: ANISOTROPIC_FILTERING , true ) ;
1139+
11391140 let base = wgt:: Limits :: default ( ) ;
1140- crate :: Capabilities {
1141- limits : wgt:: Limits {
1142- max_texture_dimension_1d : self . max_texture_size as u32 ,
1143- max_texture_dimension_2d : self . max_texture_size as u32 ,
1144- max_texture_dimension_3d : self . max_texture_3d_size as u32 ,
1145- max_texture_array_layers : self . max_texture_layers as u32 ,
1146- max_bind_groups : 8 ,
1147- max_bindings_per_bind_group : 65535 ,
1148- max_dynamic_uniform_buffers_per_pipeline_layout : base
1149- . max_dynamic_uniform_buffers_per_pipeline_layout ,
1150- max_dynamic_storage_buffers_per_pipeline_layout : base
1151- . max_dynamic_storage_buffers_per_pipeline_layout ,
1152- max_sampled_textures_per_shader_stage : self . max_textures_per_stage ,
1153- max_samplers_per_shader_stage : self . max_samplers_per_stage ,
1154- max_storage_buffers_per_shader_stage : self . max_buffers_per_stage ,
1155- max_storage_textures_per_shader_stage : self . max_textures_per_stage ,
1156- max_uniform_buffers_per_shader_stage : self . max_buffers_per_stage ,
1157- max_binding_array_elements_per_shader_stage : self . max_binding_array_elements ,
1158- max_binding_array_sampler_elements_per_shader_stage : self
1159- . max_sampler_binding_array_elements ,
1160- max_uniform_buffer_binding_size : self . max_buffer_size . min ( !0u32 as u64 ) as u32 ,
1161- max_storage_buffer_binding_size : self . max_buffer_size . min ( !0u32 as u64 ) as u32 ,
1162- max_vertex_buffers : self . max_vertex_buffers ,
1163- max_vertex_attributes : 31 ,
1164- max_vertex_buffer_array_stride : base. max_vertex_buffer_array_stride ,
1165- max_immediate_size : 0x1000 ,
1166- min_uniform_buffer_offset_alignment : self . buffer_alignment as u32 ,
1167- min_storage_buffer_offset_alignment : self . buffer_alignment as u32 ,
1168- max_inter_stage_shader_components : self . max_varying_components ,
1169- max_color_attachments : ( self . max_color_render_targets as u32 )
1170- . min ( crate :: MAX_COLOR_ATTACHMENTS as u32 ) ,
1171- max_color_attachment_bytes_per_sample : self . max_color_attachment_bytes_per_sample
1172- as u32 ,
1173- max_compute_workgroup_storage_size : self . max_total_threadgroup_memory ,
1174- max_compute_invocations_per_workgroup : self . max_threads_per_group ,
1175- max_compute_workgroup_size_x : self . max_threads_per_group ,
1176- max_compute_workgroup_size_y : self . max_threads_per_group ,
1177- max_compute_workgroup_size_z : self . max_threads_per_group ,
1178- max_compute_workgroups_per_dimension : 0xFFFF ,
1179- max_buffer_size : self . max_buffer_size ,
1180- max_non_sampler_bindings : u32:: MAX ,
1181-
1182- // See https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf, Maximum threadgroups per mesh shader grid
1183- max_task_workgroup_total_count : 1024 ,
1184- max_task_workgroups_per_dimension : 1024 ,
1185- max_mesh_multiview_view_count : 0 ,
1186- max_mesh_output_layers : self . max_texture_layers as u32 ,
1187-
1188- max_blas_primitive_count : 0 , // When added: 2^28 from https://developer.apple.com/documentation/metal/mtlaccelerationstructureusage/extendedlimits
1189- max_blas_geometry_count : 0 , // When added: 2^24
1190- max_tlas_instance_count : 0 , // When added: 2^24
1191- // Unsure what this will be when added: acceleration structures count as a buffer so
1192- // it may be worth using argument buffers for this all acceleration structures, then
1193- // there will be no limit.
1194- // From 2.17.7 in https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf
1195- // > [Acceleration structures] are opaque objects that can be bound directly using
1196- // buffer binding points or via argument buffers
1197- max_acceleration_structures_per_shader_stage : 0 ,
1198-
1199- max_multiview_view_count : if self . supported_vertex_amplification_factor > 1 {
1200- self . supported_vertex_amplification_factor
1201- } else {
1202- 0
1203- } ,
1141+
1142+ // Be careful adjusting limits here. The `AdapterShared` stores the
1143+ // original `PrivateCapabilities`, so code could accidentally use
1144+ // the wrong value.
1145+
1146+ let limits = wgt:: Limits {
1147+ max_texture_dimension_1d : self . max_texture_size as u32 ,
1148+ max_texture_dimension_2d : self . max_texture_size as u32 ,
1149+ max_texture_dimension_3d : self . max_texture_3d_size as u32 ,
1150+ max_texture_array_layers : self . max_texture_layers as u32 ,
1151+ max_bind_groups : 8 ,
1152+ max_bindings_per_bind_group : 65535 ,
1153+ max_dynamic_uniform_buffers_per_pipeline_layout : base
1154+ . max_dynamic_uniform_buffers_per_pipeline_layout ,
1155+ max_dynamic_storage_buffers_per_pipeline_layout : base
1156+ . max_dynamic_storage_buffers_per_pipeline_layout ,
1157+ max_sampled_textures_per_shader_stage : self . max_textures_per_stage ,
1158+ max_samplers_per_shader_stage : self . max_samplers_per_stage ,
1159+ max_storage_buffers_per_shader_stage : self . max_buffers_per_stage ,
1160+ max_storage_textures_per_shader_stage : self . max_textures_per_stage ,
1161+ max_uniform_buffers_per_shader_stage : self . max_buffers_per_stage ,
1162+ max_binding_array_elements_per_shader_stage : self . max_binding_array_elements ,
1163+ max_binding_array_sampler_elements_per_shader_stage : self
1164+ . max_sampler_binding_array_elements ,
1165+ // Note: any adjustment here will not be reflected in the stored `PrivateCapabilities`.
1166+ max_uniform_buffer_binding_size : self . max_buffer_size . min ( !0u32 as u64 ) as u32 ,
1167+ max_storage_buffer_binding_size : self . max_buffer_size . min ( !0u32 as u64 ) as u32
1168+ & !( wgt:: STORAGE_BINDING_SIZE_ALIGNMENT - 1 ) ,
1169+ max_vertex_buffers : self . max_vertex_buffers ,
1170+ max_vertex_attributes : 31 ,
1171+ max_vertex_buffer_array_stride : base. max_vertex_buffer_array_stride ,
1172+ max_immediate_size : 0x1000 ,
1173+ min_uniform_buffer_offset_alignment : self . buffer_alignment as u32 ,
1174+ min_storage_buffer_offset_alignment : self . buffer_alignment as u32 ,
1175+ max_inter_stage_shader_components : self . max_varying_components ,
1176+ max_color_attachments : self . max_color_render_targets as u32 ,
1177+ max_color_attachment_bytes_per_sample : self . max_color_attachment_bytes_per_sample
1178+ as u32 ,
1179+ max_compute_workgroup_storage_size : self . max_total_threadgroup_memory ,
1180+ max_compute_invocations_per_workgroup : self . max_threads_per_group ,
1181+ max_compute_workgroup_size_x : self . max_threads_per_group ,
1182+ max_compute_workgroup_size_y : self . max_threads_per_group ,
1183+ max_compute_workgroup_size_z : self . max_threads_per_group ,
1184+ max_compute_workgroups_per_dimension : 0xFFFF ,
1185+ max_buffer_size : self . max_buffer_size ,
1186+ max_non_sampler_bindings : u32:: MAX ,
1187+
1188+ // See https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf, Maximum threadgroups per mesh shader grid
1189+ max_task_workgroup_total_count : 1024 ,
1190+ max_task_workgroups_per_dimension : 1024 ,
1191+ max_mesh_multiview_view_count : 0 ,
1192+ max_mesh_output_layers : self . max_texture_layers as u32 ,
1193+
1194+ max_blas_primitive_count : 0 , // When added: 2^28 from https://developer.apple.com/documentation/metal/mtlaccelerationstructureusage/extendedlimits
1195+ max_blas_geometry_count : 0 , // When added: 2^24
1196+ max_tlas_instance_count : 0 , // When added: 2^24
1197+ // Unsure what this will be when added: acceleration structures count as a buffer so
1198+ // it may be worth using argument buffers for this all acceleration structures, then
1199+ // there will be no limit.
1200+ // From 2.17.7 in https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf
1201+ // > [Acceleration structures] are opaque objects that can be bound directly using
1202+ // buffer binding points or via argument buffers
1203+ max_acceleration_structures_per_shader_stage : 0 ,
1204+
1205+ max_multiview_view_count : if self . supported_vertex_amplification_factor > 1 {
1206+ self . supported_vertex_amplification_factor
1207+ } else {
1208+ 0
12041209 } ,
1210+ } ;
1211+
1212+ // Since a bunch of the limits are duplicated between `Limits` and
1213+ // `PrivateCapabilities`, reducing the limits at this point could make
1214+ // things inconsistent and lead to confusion. Make sure that doesn't
1215+ // happen.
1216+ debug_assert ! (
1217+ crate :: auxil:: apply_hal_limits( limits. clone( ) ) == limits,
1218+ "Limits were modified by apply_hal_limits\n Original:\n {:#?}\n Modified:\n {:#?}" ,
1219+ limits,
1220+ crate :: auxil:: apply_hal_limits( limits. clone( ) )
1221+ ) ;
1222+
1223+ crate :: Capabilities {
1224+ limits,
12051225 alignments : crate :: Alignments {
12061226 buffer_copy_offset : wgt:: BufferSize :: new ( self . buffer_alignment ) . unwrap ( ) ,
12071227 buffer_copy_pitch : wgt:: BufferSize :: new ( 4 ) . unwrap ( ) ,
0 commit comments