| 3160 | /***********************/ |
| 3161 | |
| 3162 | RID RenderingDevice::vertex_buffer_create(uint32_t p_size_bytes, Span<uint8_t> p_data, BitField<BufferCreationBits> p_creation_bits) { |
| 3163 | ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID()); |
| 3164 | |
| 3165 | Buffer buffer; |
| 3166 | buffer.size = p_size_bytes; |
| 3167 | buffer.usage = RDD::BUFFER_USAGE_TRANSFER_FROM_BIT | RDD::BUFFER_USAGE_TRANSFER_TO_BIT | RDD::BUFFER_USAGE_VERTEX_BIT; |
| 3168 | if (p_creation_bits.has_flag(BUFFER_CREATION_AS_STORAGE_BIT)) { |
| 3169 | buffer.usage.set_flag(RDD::BUFFER_USAGE_STORAGE_BIT); |
| 3170 | } |
| 3171 | if (p_creation_bits.has_flag(BUFFER_CREATION_DEVICE_ADDRESS_BIT)) { |
| 3172 | buffer.usage.set_flag(RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT); |
| 3173 | } |
| 3174 | buffer.driver_id = driver->buffer_create(buffer.size, buffer.usage, RDD::MEMORY_ALLOCATION_TYPE_GPU); |
| 3175 | ERR_FAIL_COND_V(!buffer.driver_id, RID()); |
| 3176 | |
| 3177 | // Vertex buffers are assumed to be immutable unless they don't have initial data or they've been marked for storage explicitly. |
| 3178 | if (p_data.is_empty() || p_creation_bits.has_flag(BUFFER_CREATION_AS_STORAGE_BIT)) { |
| 3179 | buffer.draw_tracker = RDG::resource_tracker_create(); |
| 3180 | buffer.draw_tracker->buffer_driver_id = buffer.driver_id; |
| 3181 | } |
| 3182 | |
| 3183 | if (p_data.size()) { |
| 3184 | _buffer_initialize(&buffer, p_data); |
| 3185 | } |
| 3186 | |
| 3187 | _THREAD_SAFE_LOCK_ |
| 3188 | buffer_memory += buffer.size; |
| 3189 | _THREAD_SAFE_UNLOCK_ |
| 3190 | |
| 3191 | RID id = vertex_buffer_owner.make_rid(buffer); |
| 3192 | #ifdef DEV_ENABLED |
| 3193 | set_resource_name(id, "RID:" + itos(id.get_id())); |
| 3194 | #endif |
| 3195 | return id; |
| 3196 | } |
| 3197 | |
| 3198 | // Internally reference counted, this ID is warranted to be unique for the same description, but needs to be freed as many times as it was allocated. |
| 3199 | RenderingDevice::VertexFormatID RenderingDevice::vertex_format_create(const Vector<VertexAttribute> &p_vertex_descriptions) { |
no test coverage detected