1
0
mirror of https://github.com/godotengine/godot.git synced 2025-12-01 16:38:31 +00:00

Persistently map staging buffers.

This commit is contained in:
Skyth
2025-11-20 14:32:55 +03:00
parent 7716a4cba0
commit f5bbd71dfc
2 changed files with 11 additions and 20 deletions

View File

@@ -274,6 +274,12 @@ Error RenderingDevice::_insert_staging_block(StagingBuffers &p_staging_buffers)
block.frame_used = 0; block.frame_used = 0;
block.fill_amount = 0; block.fill_amount = 0;
block.data_ptr = driver->buffer_map(block.driver_id);
if (block.data_ptr == nullptr) {
driver->buffer_free(block.driver_id);
return ERR_CANT_CREATE;
}
p_staging_buffers.blocks.insert(p_staging_buffers.current, block); p_staging_buffers.blocks.insert(p_staging_buffers.current, block);
return OK; return OK;
@@ -513,15 +519,8 @@ Error RenderingDevice::buffer_update(RID p_buffer, uint32_t p_offset, uint32_t p
_staging_buffer_execute_required_action(upload_staging_buffers, required_action); _staging_buffer_execute_required_action(upload_staging_buffers, required_action);
// Map staging buffer (It's CPU and coherent).
uint8_t *data_ptr = driver->buffer_map(upload_staging_buffers.blocks[upload_staging_buffers.current].driver_id);
ERR_FAIL_NULL_V(data_ptr, ERR_CANT_CREATE);
// Copy to staging buffer. // Copy to staging buffer.
memcpy(data_ptr + block_write_offset, src_data + submit_from, block_write_amount); memcpy(upload_staging_buffers.blocks[upload_staging_buffers.current].data_ptr + block_write_offset, src_data + submit_from, block_write_amount);
// Unmap.
driver->buffer_unmap(upload_staging_buffers.blocks[upload_staging_buffers.current].driver_id);
// Insert a command to copy this. // Insert a command to copy this.
RDD::BufferCopyRegion region; RDD::BufferCopyRegion region;
@@ -1700,24 +1699,13 @@ Error RenderingDevice::texture_update(RID p_texture, uint32_t p_layer, const Vec
_staging_buffer_execute_required_action(upload_staging_buffers, required_action); _staging_buffer_execute_required_action(upload_staging_buffers, required_action);
uint8_t *write_ptr; uint8_t *write_ptr = upload_staging_buffers.blocks[upload_staging_buffers.current].data_ptr + alloc_offset;
{ // Map.
uint8_t *data_ptr = driver->buffer_map(upload_staging_buffers.blocks[upload_staging_buffers.current].driver_id);
ERR_FAIL_NULL_V(data_ptr, ERR_CANT_CREATE);
write_ptr = data_ptr;
write_ptr += alloc_offset;
}
ERR_FAIL_COND_V(region_w % block_w, ERR_BUG); ERR_FAIL_COND_V(region_w % block_w, ERR_BUG);
ERR_FAIL_COND_V(region_h % block_h, ERR_BUG); ERR_FAIL_COND_V(region_h % block_h, ERR_BUG);
_copy_region_block_or_regular(read_ptr_mipmap_layer, write_ptr, x, y, width, region_w, region_h, block_w, block_h, region_pitch, pixel_size, block_size); _copy_region_block_or_regular(read_ptr_mipmap_layer, write_ptr, x, y, width, region_w, region_h, block_w, block_h, region_pitch, pixel_size, block_size);
{ // Unmap.
driver->buffer_unmap(upload_staging_buffers.blocks[upload_staging_buffers.current].driver_id);
}
RDD::BufferTextureCopyRegion copy_region; RDD::BufferTextureCopyRegion copy_region;
copy_region.buffer_offset = alloc_offset; copy_region.buffer_offset = alloc_offset;
copy_region.texture_subresources.aspect = texture->read_aspect_flags; copy_region.texture_subresources.aspect = texture->read_aspect_flags;
@@ -7425,10 +7413,12 @@ void RenderingDevice::finalize() {
frames.clear(); frames.clear();
for (int i = 0; i < upload_staging_buffers.blocks.size(); i++) { for (int i = 0; i < upload_staging_buffers.blocks.size(); i++) {
driver->buffer_unmap(upload_staging_buffers.blocks[i].driver_id);
driver->buffer_free(upload_staging_buffers.blocks[i].driver_id); driver->buffer_free(upload_staging_buffers.blocks[i].driver_id);
} }
for (int i = 0; i < download_staging_buffers.blocks.size(); i++) { for (int i = 0; i < download_staging_buffers.blocks.size(); i++) {
driver->buffer_unmap(download_staging_buffers.blocks[i].driver_id);
driver->buffer_free(download_staging_buffers.blocks[i].driver_id); driver->buffer_free(download_staging_buffers.blocks[i].driver_id);
} }

View File

@@ -151,6 +151,7 @@ private:
RDD::BufferID driver_id; RDD::BufferID driver_id;
uint64_t frame_used = 0; uint64_t frame_used = 0;
uint32_t fill_amount = 0; uint32_t fill_amount = 0;
uint8_t *data_ptr = nullptr;
}; };
struct StagingBuffers { struct StagingBuffers {