| 3568 | /******************/ |
| 3569 | |
| 3570 | RID RenderingDevice::uniform_buffer_create(uint32_t p_size_bytes, Span<uint8_t> p_data, BitField<BufferCreationBits> p_creation_bits) { |
| 3571 | ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID()); |
| 3572 | |
| 3573 | Buffer buffer; |
| 3574 | buffer.size = p_size_bytes; |
| 3575 | buffer.usage = (RDD::BUFFER_USAGE_TRANSFER_TO_BIT | RDD::BUFFER_USAGE_UNIFORM_BIT); |
| 3576 | if (p_creation_bits.has_flag(BUFFER_CREATION_DEVICE_ADDRESS_BIT)) { |
| 3577 | buffer.usage.set_flag(RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT); |
| 3578 | } |
| 3579 | buffer.driver_id = driver->buffer_create(buffer.size, buffer.usage, RDD::MEMORY_ALLOCATION_TYPE_GPU); |
| 3580 | ERR_FAIL_COND_V(!buffer.driver_id, RID()); |
| 3581 | |
| 3582 | // Uniform buffers are assumed to be immutable unless they don't have initial data. |
| 3583 | if (p_data.is_empty()) { |
| 3584 | buffer.draw_tracker = RDG::resource_tracker_create(); |
| 3585 | buffer.draw_tracker->buffer_driver_id = buffer.driver_id; |
| 3586 | } |
| 3587 | |
| 3588 | if (p_data.size()) { |
| 3589 | _buffer_initialize(&buffer, p_data); |
| 3590 | } |
| 3591 | |
| 3592 | _THREAD_SAFE_LOCK_ |
| 3593 | buffer_memory += buffer.size; |
| 3594 | _THREAD_SAFE_UNLOCK_ |
| 3595 | |
| 3596 | RID id = uniform_buffer_owner.make_rid(buffer); |
| 3597 | #ifdef DEV_ENABLED |
| 3598 | set_resource_name(id, "RID:" + itos(id.get_id())); |
| 3599 | #endif |
| 3600 | return id; |
| 3601 | } |
| 3602 | |
| 3603 | void RenderingDevice::_uniform_set_update_shared(UniformSet *p_uniform_set) { |
| 3604 | for (UniformSet::SharedTexture shared : p_uniform_set->shared_textures_to_update) { |
no test coverage detected