From 8c4180adf40ce177042bd8271fad6bcec4736773 Mon Sep 17 00:00:00 2001 From: Dario Date: Tue, 2 Sep 2025 15:12:37 -0300 Subject: [PATCH] Add GENERAL resource usage to the render graph. Fixes texture initialization in D3D12. --- servers/rendering/rendering_device.cpp | 17 +++++++++-------- servers/rendering/rendering_device.h | 3 ++- servers/rendering/rendering_device_graph.cpp | 7 +++++++ servers/rendering/rendering_device_graph.h | 1 + 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index 3e4252bc00..eb7d27e4a6 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -1065,13 +1065,14 @@ RID RenderingDevice::texture_create(const TextureFormat &p_format, const Texture #endif if (data.size()) { + const bool use_general_in_copy_queues = driver->api_trait_get(RDD::API_TRAIT_USE_GENERAL_IN_COPY_QUEUES); + const RDD::TextureLayout dst_layout = use_general_in_copy_queues ? RDD::TEXTURE_LAYOUT_GENERAL : RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL; for (uint32_t i = 0; i < format.array_layers; i++) { - _texture_initialize(id, i, data[i], immediate_flush); + _texture_initialize(id, i, data[i], dst_layout, immediate_flush); } if (texture.draw_tracker != nullptr) { - // Draw tracker can assume the texture will be in copy destination. - texture.draw_tracker->usage = RDG::RESOURCE_USAGE_COPY_TO; + texture.draw_tracker->usage = use_general_in_copy_queues ? RDG::RESOURCE_USAGE_GENERAL : RDG::RESOURCE_USAGE_COPY_TO; } } @@ -1420,7 +1421,7 @@ uint32_t RenderingDevice::_texture_alignment(Texture *p_texture) const { return least_common_multiple(alignment, driver->api_trait_get(RDD::API_TRAIT_TEXTURE_TRANSFER_ALIGNMENT)); } -Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, const Vector &p_data, bool p_immediate_flush) { +Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, const Vector &p_data, RDD::TextureLayout p_dst_layout, bool p_immediate_flush) { Texture *texture = texture_owner.get_or_null(p_texture); ERR_FAIL_NULL_V(texture, ERR_INVALID_PARAMETER); @@ -1454,7 +1455,6 @@ Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, cons TransferWorker *transfer_worker = nullptr; const uint8_t *read_ptr = p_data.ptr(); uint8_t *write_ptr = nullptr; - const RDD::TextureLayout copy_dst_layout = driver->api_trait_get(RDD::API_TRAIT_USE_GENERAL_IN_COPY_QUEUES) ? RDD::TEXTURE_LAYOUT_GENERAL : RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL; for (uint32_t pass = 0; pass < 2; pass++) { const bool copy_pass = (pass == 1); if (copy_pass) { @@ -1477,7 +1477,7 @@ Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, cons tb.texture = texture->driver_id; tb.dst_access = RDD::BARRIER_ACCESS_COPY_WRITE_BIT; tb.prev_layout = RDD::TEXTURE_LAYOUT_UNDEFINED; - tb.next_layout = copy_dst_layout; + tb.next_layout = p_dst_layout; tb.subresources.aspect = texture->barrier_aspect_flags; tb.subresources.mipmap_count = texture->mipmaps; tb.subresources.base_layer = p_layer; @@ -1524,7 +1524,7 @@ Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, cons copy_region.texture_subresources.layer_count = 1; copy_region.texture_offset = Vector3i(0, 0, z); copy_region.texture_region_size = Vector3i(logic_width, logic_height, 1); - driver->command_copy_buffer_to_texture(transfer_worker->command_buffer, transfer_worker->staging_buffer, texture->driver_id, copy_dst_layout, copy_region); + driver->command_copy_buffer_to_texture(transfer_worker->command_buffer, transfer_worker->staging_buffer, texture->driver_id, p_dst_layout, copy_region); } staging_local_offset += to_allocate; @@ -1543,7 +1543,7 @@ Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, cons RDD::TextureBarrier tb; tb.texture = texture->driver_id; tb.src_access = RDD::BARRIER_ACCESS_COPY_WRITE_BIT; - tb.prev_layout = copy_dst_layout; + tb.prev_layout = p_dst_layout; tb.next_layout = RDD::TEXTURE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; tb.subresources.aspect = texture->barrier_aspect_flags; tb.subresources.mipmap_count = texture->mipmaps; @@ -8407,4 +8407,5 @@ static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_STORAGE_IMAGE_READ, static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_STORAGE_IMAGE_READ_WRITE, RDG::RESOURCE_USAGE_STORAGE_IMAGE_READ_WRITE)); static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_ATTACHMENT_COLOR_READ_WRITE, RDG::RESOURCE_USAGE_ATTACHMENT_COLOR_READ_WRITE)); static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE, RDG::RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE)); +static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_GENERAL, RDG::RESOURCE_USAGE_GENERAL)); static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_MAX, RDG::RESOURCE_USAGE_MAX)); diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index 499e3a29a5..b6e589e714 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -244,6 +244,7 @@ public: CALLBACK_RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE, CALLBACK_RESOURCE_USAGE_ATTACHMENT_FRAGMENT_SHADING_RATE_READ, CALLBACK_RESOURCE_USAGE_ATTACHMENT_FRAGMENT_DENSITY_MAP_READ, + CALLBACK_RESOURCE_USAGE_GENERAL, CALLBACK_RESOURCE_USAGE_MAX }; @@ -349,7 +350,7 @@ public: Vector _texture_get_data(Texture *tex, uint32_t p_layer, bool p_2d = false); uint32_t _texture_layer_count(Texture *p_texture) const; uint32_t _texture_alignment(Texture *p_texture) const; - Error _texture_initialize(RID p_texture, uint32_t p_layer, const Vector &p_data, bool p_immediate_flush = false); + Error _texture_initialize(RID p_texture, uint32_t p_layer, const Vector &p_data, RDD::TextureLayout p_dst_layout, bool p_immediate_flush); void _texture_check_shared_fallback(Texture *p_texture); void _texture_update_shared_fallback(RID p_texture_rid, Texture *p_texture, bool p_for_writing); void _texture_free_shared_fallback(Texture *p_texture); diff --git a/servers/rendering/rendering_device_graph.cpp b/servers/rendering/rendering_device_graph.cpp index 3b52a1afdf..d9f320b326 100644 --- a/servers/rendering/rendering_device_graph.cpp +++ b/servers/rendering/rendering_device_graph.cpp @@ -81,6 +81,8 @@ String RenderingDeviceGraph::_usage_to_string(ResourceUsage p_usage) { return "Attachment Color Read Write"; case RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE: return "Attachment Depth Stencil Read Write"; + case RESOURCE_USAGE_GENERAL: + return "General"; default: ERR_FAIL_V_MSG("Invalid", vformat("Invalid resource usage %d.", p_usage)); } @@ -108,6 +110,7 @@ bool RenderingDeviceGraph::_is_write_usage(ResourceUsage p_usage) { case RESOURCE_USAGE_STORAGE_IMAGE_READ_WRITE: case RESOURCE_USAGE_ATTACHMENT_COLOR_READ_WRITE: case RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE: + case RESOURCE_USAGE_GENERAL: return true; default: DEV_ASSERT(false && "Invalid resource tracker usage."); @@ -138,6 +141,8 @@ RDD::TextureLayout RenderingDeviceGraph::_usage_to_image_layout(ResourceUsage p_ return RDD::TEXTURE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL; case RESOURCE_USAGE_ATTACHMENT_FRAGMENT_DENSITY_MAP_READ: return RDD::TEXTURE_LAYOUT_FRAGMENT_DENSITY_MAP_ATTACHMENT_OPTIMAL; + case RESOURCE_USAGE_GENERAL: + return RDD::TEXTURE_LAYOUT_GENERAL; case RESOURCE_USAGE_NONE: return RDD::TEXTURE_LAYOUT_UNDEFINED; default: @@ -186,6 +191,8 @@ RDD::BarrierAccessBits RenderingDeviceGraph::_usage_to_access_bits(ResourceUsage return RDD::BARRIER_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT; case RESOURCE_USAGE_ATTACHMENT_FRAGMENT_DENSITY_MAP_READ: return RDD::BARRIER_ACCESS_FRAGMENT_DENSITY_MAP_ATTACHMENT_READ_BIT; + case RESOURCE_USAGE_GENERAL: + return RDD::BarrierAccessBits(RDD::BARRIER_ACCESS_MEMORY_READ_BIT | RDD::BARRIER_ACCESS_MEMORY_WRITE_BIT); default: DEV_ASSERT(false && "Invalid usage."); return RDD::BarrierAccessBits(0); diff --git a/servers/rendering/rendering_device_graph.h b/servers/rendering/rendering_device_graph.h index 4a6395f659..18c267088e 100644 --- a/servers/rendering/rendering_device_graph.h +++ b/servers/rendering/rendering_device_graph.h @@ -150,6 +150,7 @@ public: RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE, RESOURCE_USAGE_ATTACHMENT_FRAGMENT_SHADING_RATE_READ, RESOURCE_USAGE_ATTACHMENT_FRAGMENT_DENSITY_MAP_READ, + RESOURCE_USAGE_GENERAL, RESOURCE_USAGE_MAX };