summaryrefslogtreecommitdiffstats
path: root/drivers/d3d12/rendering_device_driver_d3d12.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/d3d12/rendering_device_driver_d3d12.cpp')
-rw-r--r--drivers/d3d12/rendering_device_driver_d3d12.cpp58
1 files changed, 42 insertions, 16 deletions
diff --git a/drivers/d3d12/rendering_device_driver_d3d12.cpp b/drivers/d3d12/rendering_device_driver_d3d12.cpp
index a33fc977c6..38caff648e 100644
--- a/drivers/d3d12/rendering_device_driver_d3d12.cpp
+++ b/drivers/d3d12/rendering_device_driver_d3d12.cpp
@@ -2143,33 +2143,59 @@ void RenderingDeviceDriverD3D12::command_pipeline_barrier(CommandBufferID p_cmd_
for (uint32_t i = 0; i < p_texture_barriers.size(); i++) {
const TextureBarrier &texture_barrier_rd = p_texture_barriers[i];
const TextureInfo *texture_info = (const TextureInfo *)(texture_barrier_rd.texture.id);
+ if (texture_info->main_texture) {
+ texture_info = texture_info->main_texture;
+ }
_rd_stages_and_access_to_d3d12(p_src_stages, texture_barrier_rd.prev_layout, texture_barrier_rd.src_access, texture_barrier_d3d12.SyncBefore, texture_barrier_d3d12.AccessBefore);
_rd_stages_and_access_to_d3d12(p_dst_stages, texture_barrier_rd.next_layout, texture_barrier_rd.dst_access, texture_barrier_d3d12.SyncAfter, texture_barrier_d3d12.AccessAfter);
texture_barrier_d3d12.LayoutBefore = _rd_texture_layout_to_d3d12_barrier_layout(texture_barrier_rd.prev_layout);
texture_barrier_d3d12.LayoutAfter = _rd_texture_layout_to_d3d12_barrier_layout(texture_barrier_rd.next_layout);
texture_barrier_d3d12.pResource = texture_info->resource;
- texture_barrier_d3d12.Subresources.IndexOrFirstMipLevel = texture_barrier_rd.subresources.base_mipmap;
- texture_barrier_d3d12.Subresources.NumMipLevels = texture_barrier_rd.subresources.mipmap_count;
- texture_barrier_d3d12.Subresources.FirstArraySlice = texture_barrier_rd.subresources.base_layer;
- texture_barrier_d3d12.Subresources.NumArraySlices = texture_barrier_rd.subresources.layer_count;
- texture_barrier_d3d12.Subresources.FirstPlane = _compute_plane_slice(texture_info->format, texture_barrier_rd.subresources.aspect);
- texture_barrier_d3d12.Subresources.NumPlanes = format_get_plane_count(texture_info->format);
+ if (texture_barrier_rd.subresources.mipmap_count == texture_info->mipmaps && texture_barrier_rd.subresources.layer_count == texture_info->layers) {
+ // So, all resources. Then, let's be explicit about it so D3D12 doesn't think
+ // we are dealing with a subset of subresources.
+ texture_barrier_d3d12.Subresources.IndexOrFirstMipLevel = 0xffffffff;
+ texture_barrier_d3d12.Subresources.NumMipLevels = 0;
+ // Because NumMipLevels == 0, all the other fields are ignored by D3D12.
+ } else {
+ texture_barrier_d3d12.Subresources.IndexOrFirstMipLevel = texture_barrier_rd.subresources.base_mipmap;
+ texture_barrier_d3d12.Subresources.NumMipLevels = texture_barrier_rd.subresources.mipmap_count;
+ texture_barrier_d3d12.Subresources.FirstArraySlice = texture_barrier_rd.subresources.base_layer;
+ texture_barrier_d3d12.Subresources.NumArraySlices = texture_barrier_rd.subresources.layer_count;
+ texture_barrier_d3d12.Subresources.FirstPlane = _compute_plane_slice(texture_info->format, texture_barrier_rd.subresources.aspect);
+ texture_barrier_d3d12.Subresources.NumPlanes = format_get_plane_count(texture_info->format);
+ }
texture_barrier_d3d12.Flags = (texture_barrier_rd.prev_layout == RDD::TEXTURE_LAYOUT_UNDEFINED) ? D3D12_TEXTURE_BARRIER_FLAG_DISCARD : D3D12_TEXTURE_BARRIER_FLAG_NONE;
texture_barriers.push_back(texture_barrier_d3d12);
}
// Define the barrier groups and execute.
+
D3D12_BARRIER_GROUP barrier_groups[3] = {};
- barrier_groups[0].Type = D3D12_BARRIER_TYPE_GLOBAL;
- barrier_groups[1].Type = D3D12_BARRIER_TYPE_BUFFER;
- barrier_groups[2].Type = D3D12_BARRIER_TYPE_TEXTURE;
- barrier_groups[0].NumBarriers = global_barriers.size();
- barrier_groups[1].NumBarriers = buffer_barriers.size();
- barrier_groups[2].NumBarriers = texture_barriers.size();
- barrier_groups[0].pGlobalBarriers = global_barriers.ptr();
- barrier_groups[1].pBufferBarriers = buffer_barriers.ptr();
- barrier_groups[2].pTextureBarriers = texture_barriers.ptr();
- cmd_list_7->Barrier(ARRAY_SIZE(barrier_groups), barrier_groups);
+ uint32_t barrier_groups_count = 0;
+
+ if (!global_barriers.is_empty()) {
+ D3D12_BARRIER_GROUP &barrier_group = barrier_groups[barrier_groups_count++];
+ barrier_group.Type = D3D12_BARRIER_TYPE_GLOBAL;
+ barrier_group.NumBarriers = global_barriers.size();
+ barrier_group.pGlobalBarriers = global_barriers.ptr();
+ }
+
+ if (!buffer_barriers.is_empty()) {
+ D3D12_BARRIER_GROUP &barrier_group = barrier_groups[barrier_groups_count++];
+ barrier_group.Type = D3D12_BARRIER_TYPE_BUFFER;
+ barrier_group.NumBarriers = buffer_barriers.size();
+ barrier_group.pBufferBarriers = buffer_barriers.ptr();
+ }
+
+ if (!texture_barriers.is_empty()) {
+ D3D12_BARRIER_GROUP &barrier_group = barrier_groups[barrier_groups_count++];
+ barrier_group.Type = D3D12_BARRIER_TYPE_TEXTURE;
+ barrier_group.NumBarriers = texture_barriers.size();
+ barrier_group.pTextureBarriers = texture_barriers.ptr();
+ }
+
+ cmd_list_7->Barrier(barrier_groups_count, barrier_groups);
}
/****************/