Skip to content

Commit 8c4180a

Browse files
committed
Add GENERAL resource usage to the render graph. Fixes texture initialization in D3D12.
1 parent fcd1cf8 commit 8c4180a

File tree

4 files changed

+19
-9
lines changed

4 files changed

+19
-9
lines changed

servers/rendering/rendering_device.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,13 +1065,14 @@ RID RenderingDevice::texture_create(const TextureFormat &p_format, const Texture
10651065
#endif
10661066

10671067
if (data.size()) {
1068+
const bool use_general_in_copy_queues = driver->api_trait_get(RDD::API_TRAIT_USE_GENERAL_IN_COPY_QUEUES);
1069+
const RDD::TextureLayout dst_layout = use_general_in_copy_queues ? RDD::TEXTURE_LAYOUT_GENERAL : RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL;
10681070
for (uint32_t i = 0; i < format.array_layers; i++) {
1069-
_texture_initialize(id, i, data[i], immediate_flush);
1071+
_texture_initialize(id, i, data[i], dst_layout, immediate_flush);
10701072
}
10711073

10721074
if (texture.draw_tracker != nullptr) {
1073-
// Draw tracker can assume the texture will be in copy destination.
1074-
texture.draw_tracker->usage = RDG::RESOURCE_USAGE_COPY_TO;
1075+
texture.draw_tracker->usage = use_general_in_copy_queues ? RDG::RESOURCE_USAGE_GENERAL : RDG::RESOURCE_USAGE_COPY_TO;
10751076
}
10761077
}
10771078

@@ -1420,7 +1421,7 @@ uint32_t RenderingDevice::_texture_alignment(Texture *p_texture) const {
14201421
return least_common_multiple(alignment, driver->api_trait_get(RDD::API_TRAIT_TEXTURE_TRANSFER_ALIGNMENT));
14211422
}
14221423

1423-
Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, const Vector<uint8_t> &p_data, bool p_immediate_flush) {
1424+
Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, const Vector<uint8_t> &p_data, RDD::TextureLayout p_dst_layout, bool p_immediate_flush) {
14241425
Texture *texture = texture_owner.get_or_null(p_texture);
14251426
ERR_FAIL_NULL_V(texture, ERR_INVALID_PARAMETER);
14261427

@@ -1454,7 +1455,6 @@ Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, cons
14541455
TransferWorker *transfer_worker = nullptr;
14551456
const uint8_t *read_ptr = p_data.ptr();
14561457
uint8_t *write_ptr = nullptr;
1457-
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;
14581458
for (uint32_t pass = 0; pass < 2; pass++) {
14591459
const bool copy_pass = (pass == 1);
14601460
if (copy_pass) {
@@ -1477,7 +1477,7 @@ Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, cons
14771477
tb.texture = texture->driver_id;
14781478
tb.dst_access = RDD::BARRIER_ACCESS_COPY_WRITE_BIT;
14791479
tb.prev_layout = RDD::TEXTURE_LAYOUT_UNDEFINED;
1480-
tb.next_layout = copy_dst_layout;
1480+
tb.next_layout = p_dst_layout;
14811481
tb.subresources.aspect = texture->barrier_aspect_flags;
14821482
tb.subresources.mipmap_count = texture->mipmaps;
14831483
tb.subresources.base_layer = p_layer;
@@ -1524,7 +1524,7 @@ Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, cons
15241524
copy_region.texture_subresources.layer_count = 1;
15251525
copy_region.texture_offset = Vector3i(0, 0, z);
15261526
copy_region.texture_region_size = Vector3i(logic_width, logic_height, 1);
1527-
driver->command_copy_buffer_to_texture(transfer_worker->command_buffer, transfer_worker->staging_buffer, texture->driver_id, copy_dst_layout, copy_region);
1527+
driver->command_copy_buffer_to_texture(transfer_worker->command_buffer, transfer_worker->staging_buffer, texture->driver_id, p_dst_layout, copy_region);
15281528
}
15291529

15301530
staging_local_offset += to_allocate;
@@ -1543,7 +1543,7 @@ Error RenderingDevice::_texture_initialize(RID p_texture, uint32_t p_layer, cons
15431543
RDD::TextureBarrier tb;
15441544
tb.texture = texture->driver_id;
15451545
tb.src_access = RDD::BARRIER_ACCESS_COPY_WRITE_BIT;
1546-
tb.prev_layout = copy_dst_layout;
1546+
tb.prev_layout = p_dst_layout;
15471547
tb.next_layout = RDD::TEXTURE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
15481548
tb.subresources.aspect = texture->barrier_aspect_flags;
15491549
tb.subresources.mipmap_count = texture->mipmaps;
@@ -8407,4 +8407,5 @@ static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_STORAGE_IMAGE_READ,
84078407
static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_STORAGE_IMAGE_READ_WRITE, RDG::RESOURCE_USAGE_STORAGE_IMAGE_READ_WRITE));
84088408
static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_ATTACHMENT_COLOR_READ_WRITE, RDG::RESOURCE_USAGE_ATTACHMENT_COLOR_READ_WRITE));
84098409
static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE, RDG::RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE));
8410+
static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_GENERAL, RDG::RESOURCE_USAGE_GENERAL));
84108411
static_assert(ENUM_MEMBERS_EQUAL(RD::CALLBACK_RESOURCE_USAGE_MAX, RDG::RESOURCE_USAGE_MAX));

servers/rendering/rendering_device.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ class RenderingDevice : public RenderingDeviceCommons {
244244
CALLBACK_RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE,
245245
CALLBACK_RESOURCE_USAGE_ATTACHMENT_FRAGMENT_SHADING_RATE_READ,
246246
CALLBACK_RESOURCE_USAGE_ATTACHMENT_FRAGMENT_DENSITY_MAP_READ,
247+
CALLBACK_RESOURCE_USAGE_GENERAL,
247248
CALLBACK_RESOURCE_USAGE_MAX
248249
};
249250

@@ -349,7 +350,7 @@ class RenderingDevice : public RenderingDeviceCommons {
349350
Vector<uint8_t> _texture_get_data(Texture *tex, uint32_t p_layer, bool p_2d = false);
350351
uint32_t _texture_layer_count(Texture *p_texture) const;
351352
uint32_t _texture_alignment(Texture *p_texture) const;
352-
Error _texture_initialize(RID p_texture, uint32_t p_layer, const Vector<uint8_t> &p_data, bool p_immediate_flush = false);
353+
Error _texture_initialize(RID p_texture, uint32_t p_layer, const Vector<uint8_t> &p_data, RDD::TextureLayout p_dst_layout, bool p_immediate_flush);
353354
void _texture_check_shared_fallback(Texture *p_texture);
354355
void _texture_update_shared_fallback(RID p_texture_rid, Texture *p_texture, bool p_for_writing);
355356
void _texture_free_shared_fallback(Texture *p_texture);

servers/rendering/rendering_device_graph.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ String RenderingDeviceGraph::_usage_to_string(ResourceUsage p_usage) {
8181
return "Attachment Color Read Write";
8282
case RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE:
8383
return "Attachment Depth Stencil Read Write";
84+
case RESOURCE_USAGE_GENERAL:
85+
return "General";
8486
default:
8587
ERR_FAIL_V_MSG("Invalid", vformat("Invalid resource usage %d.", p_usage));
8688
}
@@ -108,6 +110,7 @@ bool RenderingDeviceGraph::_is_write_usage(ResourceUsage p_usage) {
108110
case RESOURCE_USAGE_STORAGE_IMAGE_READ_WRITE:
109111
case RESOURCE_USAGE_ATTACHMENT_COLOR_READ_WRITE:
110112
case RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE:
113+
case RESOURCE_USAGE_GENERAL:
111114
return true;
112115
default:
113116
DEV_ASSERT(false && "Invalid resource tracker usage.");
@@ -138,6 +141,8 @@ RDD::TextureLayout RenderingDeviceGraph::_usage_to_image_layout(ResourceUsage p_
138141
return RDD::TEXTURE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL;
139142
case RESOURCE_USAGE_ATTACHMENT_FRAGMENT_DENSITY_MAP_READ:
140143
return RDD::TEXTURE_LAYOUT_FRAGMENT_DENSITY_MAP_ATTACHMENT_OPTIMAL;
144+
case RESOURCE_USAGE_GENERAL:
145+
return RDD::TEXTURE_LAYOUT_GENERAL;
141146
case RESOURCE_USAGE_NONE:
142147
return RDD::TEXTURE_LAYOUT_UNDEFINED;
143148
default:
@@ -186,6 +191,8 @@ RDD::BarrierAccessBits RenderingDeviceGraph::_usage_to_access_bits(ResourceUsage
186191
return RDD::BARRIER_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT;
187192
case RESOURCE_USAGE_ATTACHMENT_FRAGMENT_DENSITY_MAP_READ:
188193
return RDD::BARRIER_ACCESS_FRAGMENT_DENSITY_MAP_ATTACHMENT_READ_BIT;
194+
case RESOURCE_USAGE_GENERAL:
195+
return RDD::BarrierAccessBits(RDD::BARRIER_ACCESS_MEMORY_READ_BIT | RDD::BARRIER_ACCESS_MEMORY_WRITE_BIT);
189196
default:
190197
DEV_ASSERT(false && "Invalid usage.");
191198
return RDD::BarrierAccessBits(0);

servers/rendering/rendering_device_graph.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ class RenderingDeviceGraph {
150150
RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE,
151151
RESOURCE_USAGE_ATTACHMENT_FRAGMENT_SHADING_RATE_READ,
152152
RESOURCE_USAGE_ATTACHMENT_FRAGMENT_DENSITY_MAP_READ,
153+
RESOURCE_USAGE_GENERAL,
153154
RESOURCE_USAGE_MAX
154155
};
155156

0 commit comments

Comments
 (0)