ConvertIndexBufferShaderSource.comp 1.3 KB

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