ConvertIndexBufferShaderSource.comp
1 #version 450 core 2 3 #extension GL_EXT_scalar_block_layout : require 4 #extension GL_EXT_shader_8bit_storage : require 5 6 layout (local_size_x = 16, local_size_y = 1, local_size_z = 1) in; 7 8 layout (std430, set = 0, binding = 0) uniform index_buffer_pattern 9 { 10 int ibp_pattern[8]; 11 int ibp_primitive_vertices; 12 int ibp_primitive_vertices_out; 13 int ibp_index_size; 14 int ibp_index_size_out; 15 int ibp_base_index; 16 int ibp_index_stride; 17 int src_offset; 18 int total_primitives; 19 }; 20 21 layout (std430, set = 1, binding = 1) buffer in_s 22 { 23 uint8_t[] in_data; 24 }; 25 26 layout (std430, set = 1, binding = 2) buffer out_s 27 { 28 uint8_t[] out_data; 29 }; 30 31 void main() 32 { 33 int primitiveIndex = int(gl_GlobalInvocationID.x); 34 if (primitiveIndex >= total_primitives) 35 { 36 return; 37 } 38 39 int inOffset = primitiveIndex * ibp_index_stride; 40 int outOffset = primitiveIndex * ibp_primitive_vertices_out; 41 42 for (int i = 0; i < ibp_primitive_vertices_out; i++) 43 { 44 int j; 45 int io = max(0, inOffset + ibp_base_index + ibp_pattern[i]) * ibp_index_size; 46 int oo = (outOffset + i) * ibp_index_size_out; 47 48 for (j = 0; j < ibp_index_size; j++) 49 { 50 out_data[oo + j] = in_data[src_offset + io + j]; 51 } 52 53 for (; j < ibp_index_size_out; j++) 54 { 55 out_data[oo + j] = uint8_t(0); 56 } 57 } 58 }