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:
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user