From 2b36c79f7be9cc1cb23347a4054dd56de36eaca9 Mon Sep 17 00:00:00 2001 From: Lukas Tenbrink Date: Tue, 17 Jun 2025 17:33:00 +0200 Subject: [PATCH] Use `Span` in `RenderingDevice` allocation APIs to avoid intermediary arrays on calls. --- core/templates/span.h | 5 +++ drivers/gles3/rasterizer_canvas_gles3.cpp | 8 ++-- modules/betsy/image_compress_betsy.cpp | 6 +-- modules/lightmapper_rd/lightmapper_rd.cpp | 33 ++++------------ .../renderer_rd/renderer_canvas_render_rd.cpp | 6 +-- .../renderer_rd/storage_rd/mesh_storage.cpp | 2 +- .../storage_rd/texture_storage.cpp | 17 ++------- servers/rendering/rendering_device.compat.inc | 8 ++-- servers/rendering/rendering_device.cpp | 38 +++++++++---------- servers/rendering/rendering_device.h | 29 +++++++++++--- 10 files changed, 71 insertions(+), 81 deletions(-) diff --git a/core/templates/span.h b/core/templates/span.h index d6d63641d15..d909e4264b5 100644 --- a/core/templates/span.h +++ b/core/templates/span.h @@ -91,6 +91,11 @@ public: _FORCE_INLINE_ constexpr const T *begin() const { return _ptr; } _FORCE_INLINE_ constexpr const T *end() const { return _ptr + _len; } + template + _FORCE_INLINE_ constexpr Span reinterpret() const { + return Span(reinterpret_cast(_ptr), _len * sizeof(T) / sizeof(T1)); + } + // Algorithms. constexpr int64_t find(const T &p_val, uint64_t p_from = 0) const; constexpr int64_t rfind(const T &p_val, uint64_t p_from) const; diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index f8c0a1d5858..53e760d1118 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -2132,21 +2132,21 @@ void RasterizerCanvasGLES3::occluder_polygon_set_shape(RID p_occluder, const Vec glGenBuffers(1, &oc->sdf_vertex_buffer); glBindBuffer(GL_ARRAY_BUFFER, oc->sdf_vertex_buffer); - GLES3::Utilities::get_singleton()->buffer_allocate_data(GL_ARRAY_BUFFER, oc->sdf_vertex_buffer, oc->sdf_point_count * 2 * sizeof(float), p_points.to_byte_array().ptr(), GL_STATIC_DRAW, "Occluder polygon SDF vertex buffer"); + GLES3::Utilities::get_singleton()->buffer_allocate_data(GL_ARRAY_BUFFER, oc->sdf_vertex_buffer, oc->sdf_point_count * 2 * sizeof(float), p_points.ptr(), GL_STATIC_DRAW, "Occluder polygon SDF vertex buffer"); glEnableVertexAttribArray(RS::ARRAY_VERTEX); glVertexAttribPointer(RS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), nullptr); glGenBuffers(1, &oc->sdf_index_buffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oc->sdf_index_buffer); - GLES3::Utilities::get_singleton()->buffer_allocate_data(GL_ELEMENT_ARRAY_BUFFER, oc->sdf_index_buffer, oc->sdf_index_count * sizeof(uint32_t), sdf_indices.to_byte_array().ptr(), GL_STATIC_DRAW, "Occluder polygon SDF index buffer"); + GLES3::Utilities::get_singleton()->buffer_allocate_data(GL_ELEMENT_ARRAY_BUFFER, oc->sdf_index_buffer, oc->sdf_index_count * sizeof(uint32_t), sdf_indices.ptr(), GL_STATIC_DRAW, "Occluder polygon SDF index buffer"); glBindVertexArray(0); } else { glBindBuffer(GL_ARRAY_BUFFER, oc->sdf_vertex_buffer); - glBufferData(GL_ARRAY_BUFFER, p_points.size() * 2 * sizeof(float), p_points.to_byte_array().ptr(), GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, p_points.size() * 2 * sizeof(float), p_points.ptr(), GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oc->sdf_index_buffer); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sdf_indices.size() * sizeof(uint32_t), sdf_indices.to_byte_array().ptr(), GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sdf_indices.size() * sizeof(uint32_t), sdf_indices.ptr(), GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } diff --git a/modules/betsy/image_compress_betsy.cpp b/modules/betsy/image_compress_betsy.cpp index c5782f501bd..6a81a9f1a22 100644 --- a/modules/betsy/image_compress_betsy.cpp +++ b/modules/betsy/image_compress_betsy.cpp @@ -437,11 +437,7 @@ Error BetsyCompressor::_compress(BetsyFormat p_format, Image *r_img) { // Encoding table setup. if ((dest_format == Image::FORMAT_DXT1 || dest_format == Image::FORMAT_DXT5) && dxt1_encoding_table_buffer.is_null()) { - Vector data; - data.resize(1024 * 4); - memcpy(data.ptrw(), dxt1_encoding_table, 1024 * 4); - - dxt1_encoding_table_buffer = compress_rd->storage_buffer_create(1024 * 4, data); + dxt1_encoding_table_buffer = compress_rd->storage_buffer_create(1024 * 4, Span(dxt1_encoding_table).reinterpret()); } const int mip_count = r_img->get_mipmap_count() + 1; diff --git a/modules/lightmapper_rd/lightmapper_rd.cpp b/modules/lightmapper_rd/lightmapper_rd.cpp index 8f81fe7c0a5..5c45a104179 100644 --- a/modules/lightmapper_rd/lightmapper_rd.cpp +++ b/modules/lightmapper_rd/lightmapper_rd.cpp @@ -642,38 +642,21 @@ void LightmapperRD::_create_acceleration_structures(RenderingDevice *rd, Size2i } { //buffers - Vector vb = vertex_array.to_byte_array(); - vertex_buffer = rd->storage_buffer_create(vb.size(), vb); + vertex_buffer = rd->storage_buffer_create(vertex_array.size(), vertex_array.span().reinterpret()); - Vector tb = triangles.to_byte_array(); - triangle_buffer = rd->storage_buffer_create(tb.size(), tb); + triangle_buffer = rd->storage_buffer_create(triangles.size(), triangles.span().reinterpret()); - Vector tib = triangle_indices.to_byte_array(); - r_triangle_indices_buffer = rd->storage_buffer_create(tib.size(), tib); + r_triangle_indices_buffer = rd->storage_buffer_create(triangle_indices.size(), triangle_indices.span().reinterpret()); - Vector cib = cluster_indices.to_byte_array(); - r_cluster_indices_buffer = rd->storage_buffer_create(cib.size(), cib); + r_cluster_indices_buffer = rd->storage_buffer_create(cluster_indices.size(), cluster_indices.span().reinterpret()); - Vector cab = cluster_aabbs.to_byte_array(); - r_cluster_aabbs_buffer = rd->storage_buffer_create(cab.size(), cab); + r_cluster_aabbs_buffer = rd->storage_buffer_create(cluster_aabbs.size(), cluster_aabbs.span().reinterpret()); - Vector lb = lights.to_byte_array(); - if (lb.is_empty()) { - lb.resize(sizeof(Light)); //even if no lights, the buffer must exist - } - lights_buffer = rd->storage_buffer_create(lb.size(), lb); + lights_buffer = rd->storage_buffer_create(lights.size() * sizeof(Light), lights.span().reinterpret()); - Vector sb = seam_buffer_vec.to_byte_array(); - if (sb.is_empty()) { - sb.resize(sizeof(Vector2i) * 2); //even if no seams, the buffer must exist - } - seams_buffer = rd->storage_buffer_create(sb.size(), sb); + seams_buffer = rd->storage_buffer_create(seam_buffer_vec.size() * sizeof(Vector2i) * 2, seam_buffer_vec.span().reinterpret()); - Vector pb = p_probe_positions.to_byte_array(); - if (pb.is_empty()) { - pb.resize(sizeof(Probe)); - } - probe_positions_buffer = rd->storage_buffer_create(pb.size(), pb); + probe_positions_buffer = rd->storage_buffer_create(p_probe_positions.size() * sizeof(Probe), p_probe_positions.span().reinterpret()); } { //grid diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index e0c8cee7b76..1095f567ff3 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -1434,11 +1434,11 @@ void RendererCanvasRenderRD::occluder_polygon_set_shape(RID p_occluder, const Ve float_points_ptr[i * 2] = p_points[i].x; float_points_ptr[i * 2 + 1] = p_points[i].y; } - oc->sdf_vertex_buffer = RD::get_singleton()->vertex_buffer_create(p_points.size() * 2 * sizeof(float), float_points.to_byte_array()); + oc->sdf_vertex_buffer = RD::get_singleton()->vertex_buffer_create(p_points.size() * 2 * sizeof(float), float_points.span().reinterpret()); #else - oc->sdf_vertex_buffer = RD::get_singleton()->vertex_buffer_create(p_points.size() * 2 * sizeof(float), p_points.to_byte_array()); + oc->sdf_vertex_buffer = RD::get_singleton()->vertex_buffer_create(p_points.size() * 2 * sizeof(float), p_points.span().reinterpret()); #endif - oc->sdf_index_buffer = RD::get_singleton()->index_buffer_create(sdf_indices.size(), RD::INDEX_BUFFER_FORMAT_UINT32, sdf_indices.to_byte_array()); + oc->sdf_index_buffer = RD::get_singleton()->index_buffer_create(sdf_indices.size(), RD::INDEX_BUFFER_FORMAT_UINT32, sdf_indices.span().reinterpret()); oc->sdf_index_array = RD::get_singleton()->index_array_create(oc->sdf_index_buffer, 0, sdf_indices.size()); Vector buffer; diff --git a/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp b/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp index 9dd71d62cb6..a3c118f1e09 100644 --- a/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp @@ -1043,7 +1043,7 @@ void MeshStorage::_mesh_instance_add_surface(MeshInstance *mi, Mesh *mesh, uint3 for (float &weight : mi->blend_weights) { weight = 0; } - mi->blend_weights_buffer = RD::get_singleton()->storage_buffer_create(sizeof(float) * mi->blend_weights.size(), mi->blend_weights.to_byte_array()); + mi->blend_weights_buffer = RD::get_singleton()->storage_buffer_create(sizeof(float) * mi->blend_weights.size(), mi->blend_weights.span().reinterpret()); mi->weights_dirty = true; } diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp index 5570b0cb065..a8e1f323c88 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp @@ -182,22 +182,11 @@ TextureStorage::TextureStorage() { RD::get_singleton()->texture_update(default_rd_textures[DEFAULT_RD_TEXTURE_DEPTH], 0, sv); } - for (int i = 0; i < 16; i++) { - pv.set(i * 4 + 0, 0); - pv.set(i * 4 + 1, 0); - pv.set(i * 4 + 2, 0); - pv.set(i * 4 + 3, 0); - } - + memset(pv.ptrw(), 0, 16 * 4); default_rd_textures[DEFAULT_RD_TEXTURE_MULTIMESH_BUFFER] = RD::get_singleton()->texture_buffer_create(16, RD::DATA_FORMAT_R8G8B8A8_UNORM, pv); - for (int i = 0; i < 16; i++) { - pv.set(i * 4 + 0, 0); - pv.set(i * 4 + 1, 0); - pv.set(i * 4 + 2, 0); - pv.set(i * 4 + 3, 0); - } - + // Can be skipped, is still 0 from the previous call. + //memset(pv.ptrw(), 0, 16 * 4); { tformat.format = RD::DATA_FORMAT_R8G8B8A8_UINT; Vector> vpv; diff --git a/servers/rendering/rendering_device.compat.inc b/servers/rendering/rendering_device.compat.inc index 027d328e009..024a88a4c1d 100644 --- a/servers/rendering/rendering_device.compat.inc +++ b/servers/rendering/rendering_device.compat.inc @@ -144,19 +144,19 @@ RenderingDevice::FramebufferFormatID RenderingDevice::_screen_get_framebuffer_fo } RID RenderingDevice::_uniform_buffer_create_bind_compat_101561(uint32_t p_size_bytes, const Vector &p_data) { - return uniform_buffer_create(p_size_bytes, p_data, 0); + return _uniform_buffer_create(p_size_bytes, p_data, 0); } RID RenderingDevice::_storage_buffer_create_bind_compat_101561(uint32_t p_size, const Vector &p_data, BitField p_usage) { - return storage_buffer_create(p_size, p_data, p_usage, 0); + return _storage_buffer_create(p_size, p_data, p_usage, 0); } RID RenderingDevice::_vertex_buffer_create_bind_compat_101561(uint32_t p_size_bytes, const Vector &p_data, bool p_use_as_storage) { - return vertex_buffer_create(p_size_bytes, p_data, p_use_as_storage ? RD::BUFFER_CREATION_AS_STORAGE_BIT : 0); + return _vertex_buffer_create(p_size_bytes, p_data, p_use_as_storage ? RD::BUFFER_CREATION_AS_STORAGE_BIT : 0); } RID RenderingDevice::_index_buffer_create_bind_compat_101561(uint32_t p_size_indices, IndexBufferFormat p_format, const Vector &p_data, bool p_use_restart_indices) { - return index_buffer_create(p_size_indices, p_format, p_data, p_use_restart_indices, 0); + return _index_buffer_create(p_size_indices, p_format, p_data, p_use_restart_indices, 0); } RID RenderingDevice::_texture_create_from_extension_compat_105570(TextureType p_type, DataFormat p_format, TextureSamples p_samples, BitField p_usage, uint64_t p_image, uint64_t p_width, uint64_t p_height, uint64_t p_depth, uint64_t p_layers) { diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index fab28ceeea0..ddf6f91d258 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -233,9 +233,9 @@ RenderingDevice::Buffer *RenderingDevice::_get_buffer_from_owner(RID p_buffer) { return buffer; } -Error RenderingDevice::_buffer_initialize(Buffer *p_buffer, const uint8_t *p_data, size_t p_data_size, uint32_t p_required_align) { +Error RenderingDevice::_buffer_initialize(Buffer *p_buffer, Span p_data, uint32_t p_required_align) { uint32_t transfer_worker_offset; - TransferWorker *transfer_worker = _acquire_transfer_worker(p_data_size, p_required_align, transfer_worker_offset); + TransferWorker *transfer_worker = _acquire_transfer_worker(p_data.size(), p_required_align, transfer_worker_offset); p_buffer->transfer_worker_index = transfer_worker->index; { @@ -247,14 +247,14 @@ Error RenderingDevice::_buffer_initialize(Buffer *p_buffer, const uint8_t *p_dat uint8_t *data_ptr = driver->buffer_map(transfer_worker->staging_buffer); ERR_FAIL_NULL_V(data_ptr, ERR_CANT_CREATE); - memcpy(data_ptr + transfer_worker_offset, p_data, p_data_size); + memcpy(data_ptr + transfer_worker_offset, p_data.ptr(), p_data.size()); driver->buffer_unmap(transfer_worker->staging_buffer); // Copy from the staging buffer to the real buffer. RDD::BufferCopyRegion region; region.src_offset = transfer_worker_offset; region.dst_offset = 0; - region.size = p_data_size; + region.size = p_data.size(); driver->command_copy_buffer(transfer_worker->command_buffer, transfer_worker->staging_buffer, p_buffer->driver_id, region); _release_transfer_worker(transfer_worker); @@ -782,7 +782,7 @@ uint64_t RenderingDevice::buffer_get_device_address(RID p_buffer) { return driver->buffer_get_device_address(buffer->driver_id); } -RID RenderingDevice::storage_buffer_create(uint32_t p_size_bytes, const Vector &p_data, BitField p_usage, BitField p_creation_bits) { +RID RenderingDevice::storage_buffer_create(uint32_t p_size_bytes, Span p_data, BitField p_usage, BitField p_creation_bits) { ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID()); Buffer buffer; @@ -807,7 +807,7 @@ RID RenderingDevice::storage_buffer_create(uint32_t p_size_bytes, const Vectorbuffer_driver_id = buffer.driver_id; if (p_data.size()) { - _buffer_initialize(&buffer, p_data.ptr(), p_data.size()); + _buffer_initialize(&buffer, p_data); } _THREAD_SAFE_LOCK_ @@ -821,7 +821,7 @@ RID RenderingDevice::storage_buffer_create(uint32_t p_size_bytes, const Vector &p_data) { +RID RenderingDevice::texture_buffer_create(uint32_t p_size_elements, DataFormat p_format, Span p_data) { uint32_t element_size = get_format_vertex_size(p_format); ERR_FAIL_COND_V_MSG(element_size == 0, RID(), "Format requested is not supported for texture buffers"); uint64_t size_bytes = uint64_t(element_size) * p_size_elements; @@ -847,7 +847,7 @@ RID RenderingDevice::texture_buffer_create(uint32_t p_size_elements, DataFormat } if (p_data.size()) { - _buffer_initialize(&texture_buffer, p_data.ptr(), p_data.size()); + _buffer_initialize(&texture_buffer, p_data); } _THREAD_SAFE_LOCK_ @@ -3084,7 +3084,7 @@ bool RenderingDevice::sampler_is_format_supported_for_filter(DataFormat p_format /**** VERTEX BUFFER ****/ /***********************/ -RID RenderingDevice::vertex_buffer_create(uint32_t p_size_bytes, const Vector &p_data, BitField p_creation_bits) { +RID RenderingDevice::vertex_buffer_create(uint32_t p_size_bytes, Span p_data, BitField p_creation_bits) { ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID()); Buffer buffer; @@ -3106,7 +3106,7 @@ RID RenderingDevice::vertex_buffer_create(uint32_t p_size_bytes, const Vector &p_data, bool p_use_restart_indices, BitField p_creation_bits) { +RID RenderingDevice::index_buffer_create(uint32_t p_index_count, IndexBufferFormat p_format, Span p_data, bool p_use_restart_indices, BitField p_creation_bits) { ERR_FAIL_COND_V(p_index_count == 0, RID()); IndexBuffer index_buffer; @@ -3278,7 +3278,7 @@ RID RenderingDevice::index_buffer_create(uint32_t p_index_count, IndexBufferForm } if (p_data.size()) { - _buffer_initialize(&index_buffer, p_data.ptr(), p_data.size()); + _buffer_initialize(&index_buffer, p_data); } _THREAD_SAFE_LOCK_ @@ -3492,7 +3492,7 @@ uint64_t RenderingDevice::shader_get_vertex_input_attribute_mask(RID p_shader) { /**** UNIFORMS ****/ /******************/ -RID RenderingDevice::uniform_buffer_create(uint32_t p_size_bytes, const Vector &p_data, BitField p_creation_bits) { +RID RenderingDevice::uniform_buffer_create(uint32_t p_size_bytes, Span p_data, BitField p_creation_bits) { ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID()); Buffer buffer; @@ -3511,7 +3511,7 @@ RID RenderingDevice::uniform_buffer_create(uint32_t p_size_bytes, const Vector()), DEFVAL(0)); + ClassDB::bind_method(D_METHOD("vertex_buffer_create", "size_bytes", "data", "creation_bits"), &RenderingDevice::_vertex_buffer_create, DEFVAL(Vector()), DEFVAL(0)); ClassDB::bind_method(D_METHOD("vertex_format_create", "vertex_descriptions"), &RenderingDevice::_vertex_format_create); ClassDB::bind_method(D_METHOD("vertex_array_create", "vertex_count", "vertex_format", "src_buffers", "offsets"), &RenderingDevice::_vertex_array_create, DEFVAL(Vector())); - ClassDB::bind_method(D_METHOD("index_buffer_create", "size_indices", "format", "data", "use_restart_indices", "creation_bits"), &RenderingDevice::index_buffer_create, DEFVAL(Vector()), DEFVAL(false), DEFVAL(0)); + ClassDB::bind_method(D_METHOD("index_buffer_create", "size_indices", "format", "data", "use_restart_indices", "creation_bits"), &RenderingDevice::_index_buffer_create, DEFVAL(Vector()), DEFVAL(false), DEFVAL(0)); ClassDB::bind_method(D_METHOD("index_array_create", "index_buffer", "index_offset", "index_count"), &RenderingDevice::index_array_create); ClassDB::bind_method(D_METHOD("shader_compile_spirv_from_source", "shader_source", "allow_cache"), &RenderingDevice::_shader_compile_spirv_from_source, DEFVAL(true)); @@ -7371,9 +7371,9 @@ void RenderingDevice::_bind_methods() { ClassDB::bind_method(D_METHOD("shader_get_vertex_input_attribute_mask", "shader"), &RenderingDevice::shader_get_vertex_input_attribute_mask); - ClassDB::bind_method(D_METHOD("uniform_buffer_create", "size_bytes", "data", "creation_bits"), &RenderingDevice::uniform_buffer_create, DEFVAL(Vector()), DEFVAL(0)); - ClassDB::bind_method(D_METHOD("storage_buffer_create", "size_bytes", "data", "usage", "creation_bits"), &RenderingDevice::storage_buffer_create, DEFVAL(Vector()), DEFVAL(0), DEFVAL(0)); - ClassDB::bind_method(D_METHOD("texture_buffer_create", "size_bytes", "format", "data"), &RenderingDevice::texture_buffer_create, DEFVAL(Vector())); + ClassDB::bind_method(D_METHOD("uniform_buffer_create", "size_bytes", "data", "creation_bits"), &RenderingDevice::_uniform_buffer_create, DEFVAL(Vector()), DEFVAL(0)); + ClassDB::bind_method(D_METHOD("storage_buffer_create", "size_bytes", "data", "usage", "creation_bits"), &RenderingDevice::_storage_buffer_create, DEFVAL(Vector()), DEFVAL(0), DEFVAL(0)); + ClassDB::bind_method(D_METHOD("texture_buffer_create", "size_bytes", "format", "data"), &RenderingDevice::_texture_buffer_create, DEFVAL(Vector())); ClassDB::bind_method(D_METHOD("uniform_set_create", "uniforms", "shader", "shader_set"), &RenderingDevice::_uniform_set_create); ClassDB::bind_method(D_METHOD("uniform_set_is_valid", "uniform_set"), &RenderingDevice::uniform_set_is_valid); diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index 7a642dd8915..499e3a29a5a 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -179,7 +179,7 @@ private: }; Buffer *_get_buffer_from_owner(RID p_buffer); - Error _buffer_initialize(Buffer *p_buffer, const uint8_t *p_data, size_t p_data_size, uint32_t p_required_align = 32); + Error _buffer_initialize(Buffer *p_buffer, Span p_data, uint32_t p_required_align = 32); void update_perf_report(); // Flag for batching descriptor sets. @@ -794,13 +794,20 @@ public: STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT = (1 << 0), }; - RID vertex_buffer_create(uint32_t p_size_bytes, const Vector &p_data = Vector(), BitField p_creation_bits = 0); + RID vertex_buffer_create(uint32_t p_size_bytes, Span p_data = {}, BitField p_creation_bits = 0); + RID _vertex_buffer_create(uint32_t p_size_bytes, const Vector &p_data, BitField p_creation_bits = 0) { + return vertex_buffer_create(p_size_bytes, p_data, p_creation_bits); + } // This ID is warranted to be unique for the same formats, does not need to be freed VertexFormatID vertex_format_create(const Vector &p_vertex_descriptions); RID vertex_array_create(uint32_t p_vertex_count, VertexFormatID p_vertex_format, const Vector &p_src_buffers, const Vector &p_offsets = Vector()); - RID index_buffer_create(uint32_t p_size_indices, IndexBufferFormat p_format, const Vector &p_data = Vector(), bool p_use_restart_indices = false, BitField p_creation_bits = 0); + RID index_buffer_create(uint32_t p_index_count, IndexBufferFormat p_format, Span p_data = {}, bool p_use_restart_indices = false, BitField p_creation_bits = 0); + RID _index_buffer_create(uint32_t p_index_count, IndexBufferFormat p_format, const Vector &p_data, bool p_use_restart_indices = false, BitField p_creation_bits = 0) { + return index_buffer_create(p_index_count, p_format, p_data, p_use_restart_indices, p_creation_bits); + } + RID index_array_create(RID p_index_buffer, uint32_t p_index_offset, uint32_t p_index_count); /****************/ @@ -968,10 +975,20 @@ public: /**** BUFFERS ****/ /*****************/ - RID uniform_buffer_create(uint32_t p_size_bytes, const Vector &p_data = Vector(), BitField p_creation_bits = 0); - RID storage_buffer_create(uint32_t p_size, const Vector &p_data = Vector(), BitField p_usage = 0, BitField p_creation_bits = 0); + RID uniform_buffer_create(uint32_t p_size_bytes, Span p_data = {}, BitField p_creation_bits = 0); + RID _uniform_buffer_create(uint32_t p_size_bytes, const Vector &p_data, BitField p_creation_bits = 0) { + return uniform_buffer_create(p_size_bytes, p_data, p_creation_bits); + } - RID texture_buffer_create(uint32_t p_size_elements, DataFormat p_format, const Vector &p_data = Vector()); + RID storage_buffer_create(uint32_t p_size_bytes, Span p_data = {}, BitField p_usage = 0, BitField p_creation_bits = 0); + RID _storage_buffer_create(uint32_t p_size_bytes, const Vector &p_data, BitField p_usage = 0, BitField p_creation_bits = 0) { + return storage_buffer_create(p_size_bytes, p_data, p_usage, p_creation_bits); + } + + RID texture_buffer_create(uint32_t p_size_elements, DataFormat p_format, Span p_data = {}); + RID _texture_buffer_create(uint32_t p_size_elements, DataFormat p_format, const Vector &p_data) { + return texture_buffer_create(p_size_elements, p_format, p_data); + } struct Uniform { UniformType uniform_type = UNIFORM_TYPE_IMAGE;