1override supports_indirect_first_instance: bool; 2override write_d3d12_special_constants: bool; 12 vertex_or_index_limit: u32, 20var<immediate> metadata_range: MetadataRange; 23var<storage, read> metadata: array<MetadataEntry>; 25var<storage, read> src: array<u32>; 27var<storage, read_write> dst: array<u32>; 29fn is_bit_set(data: u32, index: u32) -> bool { 30 return ((data >> index) & 1u) == 1u; 33@compute @workgroup_size(64) 34fn main(@builtin(global_invocation_id) global_invocation_id: vec3u) { 35 if global_invocation_id.x >= metadata_range.count { return; } 37 let metadata = metadata[metadata_range.start + global_invocation_id.x]; 40 let is_indexed = is_bit_set(metadata.src_offset, 31); 41 let src_base_offset = ((metadata.src_offset << 2) >> 2); 42 let dst_base_offset = ((metadata.dst_offset << 2) >> 2); 44 let first_vertex_or_index = src[src_base_offset + 2]; 45 let vertex_or_index_count = src[src_base_offset + 0]; 48 let can_overflow = is_bit_set(metadata.dst_offset, 30); 49 let sub_overflows = metadata.vertex_or_index_limit < first_vertex_or_index; 50 failed |= sub_overflows && !can_overflow; 51 let vertex_or_index_limit = metadata.vertex_or_index_limit - first_vertex_or_index; 52 failed |= vertex_or_index_limit < vertex_or_index_count; 55 let first_instance = src[src_base_offset + 3 + u32(is_indexed)]; 56 let instance_count = src[src_base_offset + 1]; 59 let can_overflow = is_bit_set(metadata.dst_offset, 31); 60 let sub_overflows = metadata.instance_limit < first_instance; 61 failed |= sub_overflows && !can_overflow; 62 let instance_limit = metadata.instance_limit - first_instance; 63 failed |= instance_limit < instance_count; 66 if !supports_indirect_first_instance { 67 failed |= first_instance != 0u; 70 let dst_offset = select(0u, 3u, write_d3d12_special_constants); 72 if write_d3d12_special_constants { 73 dst[dst_base_offset + 0] = 0u; 74 dst[dst_base_offset + 1] = 0u; 75 dst[dst_base_offset + 2] = 0u; 77 dst[dst_base_offset + dst_offset + 0] = 0u; 78 dst[dst_base_offset + dst_offset + 1] = 0u; 79 dst[dst_base_offset + dst_offset + 2] = 0u; 80 dst[dst_base_offset + dst_offset + 3] = 0u; 82 dst[dst_base_offset + dst_offset + 4] = 0u; 85 if write_d3d12_special_constants { 86 dst[dst_base_offset + 0] = src[src_base_offset + 2 + u32(is_indexed)]; 87 dst[dst_base_offset + 1] = src[src_base_offset + 3 + u32(is_indexed)]; 88 dst[dst_base_offset + 2] = 0u; 90 dst[dst_base_offset + dst_offset + 0] = src[src_base_offset + 0]; 91 dst[dst_base_offset + dst_offset + 1] = src[src_base_offset + 1]; 92 dst[dst_base_offset + dst_offset + 2] = src[src_base_offset + 2]; 93 dst[dst_base_offset + dst_offset + 3] = src[src_base_offset + 3]; 95 dst[dst_base_offset + dst_offset + 4] = src[src_base_offset + 4];