diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index 7574038788..55bb7f6ff3 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -268,9 +268,7 @@ Error RenderingDevice::_acceleration_structure_scratch_buffer_create(Acceleratio p_acceleration_structure->scratch_buffer = driver->buffer_create(scratch_size, RDD::BUFFER_USAGE_STORAGE_BIT | RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT, RDD::MEMORY_ALLOCATION_TYPE_GPU, frames_drawn); ERR_FAIL_COND_V(!p_acceleration_structure->scratch_buffer, ERR_CANT_CREATE); - _THREAD_SAFE_LOCK_ - buffer_memory += scratch_size; - _THREAD_SAFE_UNLOCK_ + buffer_memory.add(scratch_size); } return OK; @@ -511,9 +509,7 @@ Error RenderingDevice::tlas_build(RID p_tlas, Spanbuffer_create(p_buffer_size, RDD::BUFFER_USAGE_TRANSFER_TO_BIT | RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT | RDD::BUFFER_USAGE_SHADER_BINDING_TABLE_BIT, RDD::MEMORY_ALLOCATION_TYPE_GPU, frames_drawn); if (buffer) { - _THREAD_SAFE_LOCK_ - buffer_memory += p_buffer_size; - _THREAD_SAFE_UNLOCK_ + buffer_memory.add(p_buffer_size); } return buffer; @@ -1490,9 +1484,7 @@ RID RenderingDevice::storage_buffer_create(uint32_t p_size_bytes, Span _buffer_initialize(&buffer, p_data); } - _THREAD_SAFE_LOCK_ - buffer_memory += buffer.size; - _THREAD_SAFE_UNLOCK_ + buffer_memory.add(buffer.size); RID id = storage_buffer_owner.make_rid(buffer); #ifdef DEV_ENABLED @@ -1530,9 +1522,7 @@ RID RenderingDevice::texture_buffer_create(uint32_t p_size_elements, DataFormat _buffer_initialize(&texture_buffer, p_data); } - _THREAD_SAFE_LOCK_ - buffer_memory += size_bytes; - _THREAD_SAFE_UNLOCK_ + buffer_memory.add(size_bytes); RID id = texture_buffer_owner.make_rid(texture_buffer); #ifdef DEV_ENABLED @@ -1743,7 +1733,7 @@ RID RenderingDevice::texture_create(const TextureFormat &p_format, const Texture _texture_make_mutable(&texture, RID()); } - texture_memory += driver->texture_get_allocation_size(texture.driver_id); + texture_memory.add(driver->texture_get_allocation_size(texture.driver_id)); RID id = texture_owner.make_rid(texture); #ifdef DEV_ENABLED @@ -1817,7 +1807,7 @@ RID RenderingDevice::texture_create_shared(const TextureView &p_view, RID p_with texture.shared_fallback->texture = driver->texture_create(alias_format, tv); texture.shared_fallback->raw_reinterpretation = raw_reintepretation; - texture_memory += driver->texture_get_allocation_size(texture.shared_fallback->texture); + texture_memory.add(driver->texture_get_allocation_size(texture.shared_fallback->texture)); RDG::ResourceTracker *tracker = RDG::resource_tracker_create(); tracker->texture_driver_id = texture.shared_fallback->texture; @@ -1997,7 +1987,7 @@ RID RenderingDevice::texture_create_shared_from_slice(const TextureView &p_view, texture.shared_fallback->texture = driver->texture_create(slice_format, tv); texture.shared_fallback->raw_reinterpretation = raw_reintepretation; - texture_memory += driver->texture_get_allocation_size(texture.shared_fallback->texture); + texture_memory.add(driver->texture_get_allocation_size(texture.shared_fallback->texture)); RDG::ResourceTracker *tracker = RDG::resource_tracker_create(); tracker->texture_driver_id = texture.shared_fallback->texture; @@ -2430,12 +2420,12 @@ void RenderingDevice::_texture_free_shared_fallback(Texture *p_texture) { } if (p_texture->shared_fallback->texture.id != 0) { - texture_memory -= driver->texture_get_allocation_size(p_texture->shared_fallback->texture); + texture_memory.sub(driver->texture_get_allocation_size(p_texture->shared_fallback->texture)); driver->texture_free(p_texture->shared_fallback->texture); } if (p_texture->shared_fallback->buffer.id != 0) { - buffer_memory -= driver->buffer_get_allocation_size(p_texture->shared_fallback->buffer); + buffer_memory.sub(driver->buffer_get_allocation_size(p_texture->shared_fallback->buffer)); driver->buffer_free(p_texture->shared_fallback->buffer); } @@ -2570,7 +2560,7 @@ void RenderingDevice::_texture_create_reinterpret_buffer(Texture *p_texture) { uint32_t row_pitch = STEPIFY(p_texture->width * pixel_bytes, row_pitch_step); uint64_t buffer_size = STEPIFY(pixel_bytes * row_pitch * p_texture->height * p_texture->depth, transfer_alignment); p_texture->shared_fallback->buffer = driver->buffer_create(buffer_size, RDD::BUFFER_USAGE_TRANSFER_FROM_BIT | RDD::BUFFER_USAGE_TRANSFER_TO_BIT, RDD::MEMORY_ALLOCATION_TYPE_GPU, frames_drawn); - buffer_memory += driver->buffer_get_allocation_size(p_texture->shared_fallback->buffer); + buffer_memory.add(driver->buffer_get_allocation_size(p_texture->shared_fallback->buffer)); RDG::ResourceTracker *tracker = RDG::resource_tracker_create(); tracker->buffer_driver_id = p_texture->shared_fallback->buffer; @@ -3856,9 +3846,7 @@ RID RenderingDevice::vertex_buffer_create(uint32_t p_size_bytes, Span p _buffer_initialize(&buffer, p_data); } - _THREAD_SAFE_LOCK_ - buffer_memory += buffer.size; - _THREAD_SAFE_UNLOCK_ + buffer_memory.add(buffer.size); RID id = vertex_buffer_owner.make_rid(buffer); #ifdef DEV_ENABLED @@ -4073,9 +4061,7 @@ RID RenderingDevice::index_buffer_create(uint32_t p_index_count, IndexBufferForm _buffer_initialize(&index_buffer, p_data); } - _THREAD_SAFE_LOCK_ - buffer_memory += index_buffer.size; - _THREAD_SAFE_UNLOCK_ + buffer_memory.add(index_buffer.size); RID id = index_buffer_owner.make_rid(index_buffer); #ifdef DEV_ENABLED @@ -4327,9 +4313,7 @@ RID RenderingDevice::uniform_buffer_create(uint32_t p_size_bytes, Span _buffer_initialize(&buffer, p_data); } - _THREAD_SAFE_LOCK_ - buffer_memory += buffer.size; - _THREAD_SAFE_UNLOCK_ + buffer_memory.add(buffer.size); RID id = uniform_buffer_owner.make_rid(buffer); #ifdef DEV_ENABLED @@ -5132,9 +5116,7 @@ Error RenderingDevice::_raytracing_pipeline_create_sbt_buffer(RDD::RaytracingPip ERR_FAIL_V(err); } - _THREAD_SAFE_LOCK_ - buffer_memory += r_sbt_buffer.size; - _THREAD_SAFE_UNLOCK_ + buffer_memory.add(r_sbt_buffer.size); return OK; } @@ -7923,7 +7905,7 @@ void RenderingDevice::_free_pending_resources(int p_frame) { RaytracingPipeline *pipeline = &frames[p_frame].raytracing_pipelines_to_dispose_of.front()->get(); driver->buffer_free(pipeline->sbt_buffer.driver_id); - buffer_memory -= pipeline->sbt_buffer.size; + buffer_memory.sub(pipeline->sbt_buffer.size); driver->raytracing_pipeline_free(pipeline->driver_id); @@ -7937,11 +7919,7 @@ void RenderingDevice::_free_pending_resources(int p_frame) { driver->acceleration_structure_free(acceleration_structure.driver_id); if (acceleration_structure.scratch_buffer) { - size_t scratch_size = driver->buffer_get_allocation_size(acceleration_structure.scratch_buffer); - _THREAD_SAFE_LOCK_ - buffer_memory -= scratch_size; - _THREAD_SAFE_UNLOCK_ - + buffer_memory.sub(driver->buffer_get_allocation_size(acceleration_structure.scratch_buffer)); driver->buffer_free(acceleration_structure.scratch_buffer); } @@ -7952,9 +7930,7 @@ void RenderingDevice::_free_pending_resources(int p_frame) { driver->buffer_free(instance_buffer.driver_id); } - _THREAD_SAFE_LOCK_ - buffer_memory -= instance_buffer_size * acceleration_structure.instance_buffers.size(); - _THREAD_SAFE_UNLOCK_ + buffer_memory.sub(instance_buffer_size * acceleration_structure.instance_buffers.size()); } frames[p_frame].acceleration_structures_to_dispose_of.pop_front(); @@ -8003,7 +7979,7 @@ void RenderingDevice::_free_pending_resources(int p_frame) { _texture_free_shared_fallback(texture); - texture_memory -= driver->texture_get_allocation_size(texture->driver_id); + texture_memory.sub(driver->texture_get_allocation_size(texture->driver_id)); driver->texture_free(texture->driver_id); frames[p_frame].textures_to_dispose_of.pop_front(); @@ -8013,7 +7989,7 @@ void RenderingDevice::_free_pending_resources(int p_frame) { while (frames[p_frame].buffers_to_dispose_of.front()) { Buffer &buffer = frames[p_frame].buffers_to_dispose_of.front()->get(); driver->buffer_free(buffer.driver_id); - buffer_memory -= buffer.size; + buffer_memory.sub(buffer.size); frames[p_frame].buffers_to_dispose_of.pop_front(); } @@ -8030,10 +8006,10 @@ uint32_t RenderingDevice::get_frame_delay() const { uint64_t RenderingDevice::get_memory_usage(MemoryType p_type) const { switch (p_type) { case MEMORY_BUFFERS: { - return buffer_memory; + return buffer_memory.get(); } case MEMORY_TEXTURES: { - return texture_memory; + return texture_memory.get(); } case MEMORY_TOTAL: { return driver->get_total_memory_used(); diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index 38c4b14cdb..2227722368 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -1864,8 +1864,8 @@ public: private: void _free_pending_resources(int p_frame); - uint64_t texture_memory = 0; - uint64_t buffer_memory = 0; + SafeNumeric texture_memory; + SafeNumeric buffer_memory; protected: void execute_chained_cmds(bool p_present_swap_chain,