dzn: Store valid BARRIER_ACCESS flag masks for a few objects

A subset of total access flags are valid based on command list
type and resource flags, so store that set during object creation.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20324>
This commit is contained in:
Jesse Natalie
2022-12-14 12:22:14 -08:00
committed by Marge Bot
parent 184339ba6f
commit b9df7f0a27
4 changed files with 79 additions and 4 deletions

View File

@@ -396,6 +396,43 @@ static const struct vk_command_buffer_ops cmd_buffer_ops = {
.reset = dzn_cmd_buffer_reset,
};
static const D3D12_BARRIER_SYNC cmd_buffer_valid_sync[] = {
[D3D12_COMMAND_LIST_TYPE_DIRECT] = ~(D3D12_BARRIER_SYNC_VIDEO_DECODE |
D3D12_BARRIER_SYNC_VIDEO_PROCESS |
D3D12_BARRIER_SYNC_VIDEO_ENCODE),
[D3D12_COMMAND_LIST_TYPE_COMPUTE] = (D3D12_BARRIER_SYNC_ALL |
D3D12_BARRIER_SYNC_COMPUTE_SHADING |
D3D12_BARRIER_SYNC_RAYTRACING |
D3D12_BARRIER_SYNC_COPY |
D3D12_BARRIER_SYNC_EXECUTE_INDIRECT |
D3D12_BARRIER_SYNC_PREDICATION |
D3D12_BARRIER_SYNC_ALL_SHADING |
D3D12_BARRIER_SYNC_NON_PIXEL_SHADING |
D3D12_BARRIER_SYNC_EMIT_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO |
D3D12_BARRIER_SYNC_CLEAR_UNORDERED_ACCESS_VIEW |
D3D12_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE |
D3D12_BARRIER_SYNC_COPY_RAYTRACING_ACCELERATION_STRUCTURE),
[D3D12_COMMAND_LIST_TYPE_COPY] = D3D12_BARRIER_SYNC_ALL | D3D12_BARRIER_SYNC_COPY
};
static const D3D12_BARRIER_ACCESS cmd_buffer_valid_access[] = {
[D3D12_COMMAND_LIST_TYPE_DIRECT] = ~(D3D12_BARRIER_ACCESS_VIDEO_DECODE_READ |
D3D12_BARRIER_ACCESS_VIDEO_DECODE_WRITE |
D3D12_BARRIER_ACCESS_VIDEO_PROCESS_READ |
D3D12_BARRIER_ACCESS_VIDEO_PROCESS_WRITE |
D3D12_BARRIER_ACCESS_VIDEO_ENCODE_READ |
D3D12_BARRIER_ACCESS_VIDEO_ENCODE_WRITE),
[D3D12_COMMAND_LIST_TYPE_COMPUTE] = (D3D12_BARRIER_ACCESS_CONSTANT_BUFFER |
D3D12_BARRIER_ACCESS_UNORDERED_ACCESS |
D3D12_BARRIER_ACCESS_SHADER_RESOURCE |
D3D12_BARRIER_ACCESS_INDIRECT_ARGUMENT |
D3D12_BARRIER_ACCESS_PREDICATION |
D3D12_BARRIER_ACCESS_COPY_DEST |
D3D12_BARRIER_ACCESS_COPY_SOURCE |
D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ |
D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE),
[D3D12_COMMAND_LIST_TYPE_COPY] = D3D12_BARRIER_ACCESS_COPY_SOURCE | D3D12_BARRIER_ACCESS_COPY_DEST,
};
static VkResult
dzn_cmd_buffer_create(const VkCommandBufferAllocateInfo *info,
VkCommandBuffer *out)
@@ -481,6 +518,8 @@ dzn_cmd_buffer_create(const VkCommandBufferAllocateInfo *info,
(void)ID3D12GraphicsCommandList_QueryInterface(cmdbuf->cmdlist, &IID_ID3D12GraphicsCommandList8, (void **)&cmdbuf->cmdlist8);
cmdbuf->type = type;
cmdbuf->valid_sync = cmd_buffer_valid_sync[type];
cmdbuf->valid_access = cmd_buffer_valid_access[type];
out:
if (result != VK_SUCCESS)
dzn_cmd_buffer_destroy(&cmdbuf->vk);

View File

@@ -2637,11 +2637,25 @@ dzn_buffer_create(struct dzn_device *device,
buf->desc.SampleDesc.Quality = 0;
buf->desc.Flags = D3D12_RESOURCE_FLAG_NONE;
buf->desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
buf->valid_access =
D3D12_BARRIER_ACCESS_VERTEX_BUFFER |
D3D12_BARRIER_ACCESS_CONSTANT_BUFFER |
D3D12_BARRIER_ACCESS_INDEX_BUFFER |
D3D12_BARRIER_ACCESS_SHADER_RESOURCE |
D3D12_BARRIER_ACCESS_STREAM_OUTPUT |
D3D12_BARRIER_ACCESS_INDIRECT_ARGUMENT |
D3D12_BARRIER_ACCESS_PREDICATION |
D3D12_BARRIER_ACCESS_COPY_DEST |
D3D12_BARRIER_ACCESS_COPY_SOURCE |
D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ |
D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE;
if (buf->usage &
(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT))
VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) {
buf->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
buf->valid_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
}
*out = dzn_buffer_to_handle(buf);
return VK_SUCCESS;

View File

@@ -127,6 +127,8 @@ dzn_image_create(struct dzn_device *device,
vk_image_init(&device->vk, &image->vk, pCreateInfo);
enum pipe_format pfmt = vk_format_to_pipe_format(image->vk.format);
image->valid_access = D3D12_BARRIER_ACCESS_COPY_SOURCE | D3D12_BARRIER_ACCESS_COPY_DEST;
if (image->vk.tiling == VK_IMAGE_TILING_LINEAR) {
/* Treat linear images as buffers: they should only be used as copy
* src/dest, and CopyTextureResource() can manipulate buffers.
@@ -194,6 +196,9 @@ dzn_image_create(struct dzn_device *device,
image->desc.MipLevels = pCreateInfo->mipLevels;
image->desc.SampleDesc.Count = pCreateInfo->samples;
image->desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
image->valid_access |= D3D12_BARRIER_ACCESS_RESOLVE_DEST |
D3D12_BARRIER_ACCESS_SHADER_RESOURCE |
(pCreateInfo->samples > 1 ? D3D12_BARRIER_ACCESS_RESOLVE_SOURCE : 0);
}
if ((image->vk.create_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) &&
@@ -209,19 +214,27 @@ dzn_image_create(struct dzn_device *device,
image->desc.Flags = D3D12_RESOURCE_FLAG_NONE;
if (image->vk.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
if (image->vk.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
image->valid_access |= D3D12_BARRIER_ACCESS_RENDER_TARGET;
}
if (image->vk.usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
image->valid_access |= D3D12_BARRIER_ACCESS_DEPTH_STENCIL_READ |
D3D12_BARRIER_ACCESS_DEPTH_STENCIL_WRITE;
if (!(image->vk.usage & (VK_IMAGE_USAGE_SAMPLED_BIT |
VK_IMAGE_USAGE_STORAGE_BIT |
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
VK_IMAGE_USAGE_TRANSFER_SRC_BIT)))
VK_IMAGE_USAGE_TRANSFER_SRC_BIT))) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE;
} else if (image->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT)
image->valid_access &= ~D3D12_BARRIER_ACCESS_SHADER_RESOURCE;
}
} else if (image->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
image->valid_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
}
/* Images with TRANSFER_DST can be cleared or passed as a blit/resolve
* destination. Both operations require the RT or DS cap flags.
@@ -233,10 +246,13 @@ dzn_image_create(struct dzn_device *device,
dzn_physical_device_get_format_support(pdev, pCreateInfo->format);
if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_RENDER_TARGET) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
image->valid_access |= D3D12_BARRIER_ACCESS_RENDER_TARGET;
} else if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_DEPTH_STENCIL) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
image->valid_access |= D3D12_BARRIER_ACCESS_DEPTH_STENCIL_WRITE;
} else if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW) {
image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
image->valid_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
}
}

View File

@@ -595,6 +595,8 @@ struct dzn_cmd_buffer {
ID3D12GraphicsCommandList8 *cmdlist8;
D3D12_COMMAND_LIST_TYPE type;
D3D12_BARRIER_SYNC valid_sync;
D3D12_BARRIER_ACCESS valid_access;
};
struct dzn_descriptor_pool {
@@ -891,6 +893,8 @@ struct dzn_image {
VkDeviceSize mem_offset;
uint32_t castable_format_count;
DXGI_FORMAT *castable_formats;
D3D12_BARRIER_ACCESS valid_access;
};
bool
@@ -972,6 +976,8 @@ struct dzn_buffer {
VkBufferCreateFlags create_flags;
VkBufferUsageFlags usage;
D3D12_BARRIER_ACCESS valid_access;
};
DXGI_FORMAT