@@ -642,21 +642,30 @@ void LightmapperRD::_create_acceleration_structures(RenderingDevice *rd, Size2i
642642 }
643643
644644 { // buffers
645- vertex_buffer = rd->storage_buffer_create (vertex_array.size (), vertex_array.span ().reinterpret <uint8_t >());
645+ vertex_buffer = rd->storage_buffer_create (vertex_array.size () * sizeof (Vertex) , vertex_array.span ().reinterpret <uint8_t >());
646646
647- triangle_buffer = rd->storage_buffer_create (triangles.size (), triangles.span ().reinterpret <uint8_t >());
647+ triangle_buffer = rd->storage_buffer_create (triangles.size () * sizeof (Triangle) , triangles.span ().reinterpret <uint8_t >());
648648
649- r_triangle_indices_buffer = rd->storage_buffer_create (triangle_indices.size (), triangle_indices.span ().reinterpret <uint8_t >());
649+ r_triangle_indices_buffer = rd->storage_buffer_create (triangle_indices.size () * sizeof ( uint32_t ) , triangle_indices.span ().reinterpret <uint8_t >());
650650
651- r_cluster_indices_buffer = rd->storage_buffer_create (cluster_indices.size (), cluster_indices.span ().reinterpret <uint8_t >());
651+ r_cluster_indices_buffer = rd->storage_buffer_create (cluster_indices.size () * sizeof ( uint32_t ) , cluster_indices.span ().reinterpret <uint8_t >());
652652
653- r_cluster_aabbs_buffer = rd->storage_buffer_create (cluster_aabbs.size (), cluster_aabbs.span ().reinterpret <uint8_t >());
653+ r_cluster_aabbs_buffer = rd->storage_buffer_create (cluster_aabbs.size () * sizeof (ClusterAABB) , cluster_aabbs.span ().reinterpret <uint8_t >());
654654
655- lights_buffer = rd->storage_buffer_create (lights.size () * sizeof (Light), lights.span ().reinterpret <uint8_t >());
655+ // Even when there are no lights, the buffer must exist.
656+ static const Light empty_lights[1 ];
657+ Span<uint8_t > lb = (lights.is_empty () ? Span (empty_lights) : lights.span ()).reinterpret <uint8_t >();
658+ lights_buffer = rd->storage_buffer_create (lb.size (), lb);
656659
657- seams_buffer = rd->storage_buffer_create (seam_buffer_vec.size () * sizeof (Vector2i) * 2 , seam_buffer_vec.span ().reinterpret <uint8_t >());
660+ // Even when there are no seams, the buffer must exist.
661+ static const Vector2i empty_seams[2 ];
662+ Span<uint8_t > sb = (seam_buffer_vec.is_empty () ? Span (empty_seams) : seam_buffer_vec.span ()).reinterpret <uint8_t >();
663+ seams_buffer = rd->storage_buffer_create (sb.size (), sb);
658664
659- probe_positions_buffer = rd->storage_buffer_create (p_probe_positions.size () * sizeof (Probe), p_probe_positions.span ().reinterpret <uint8_t >());
665+ // Even when there are no probes, the buffer must exist.
666+ static const Probe empty_probes[1 ];
667+ Span<uint8_t > pb = (p_probe_positions.is_empty () ? Span (empty_probes) : p_probe_positions.span ()).reinterpret <uint8_t >();
668+ probe_positions_buffer = rd->storage_buffer_create (pb.size (), pb);
660669 }
661670
662671 { // grid
0 commit comments