zink: add a stage param for buffer resource barriers
it's useful to be able to set this more granularly when doing resource barriers Reviewed-by: Hoe Hao Cheng <haochengho12907@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8669>
This commit is contained in:
committed by
Marge Bot
parent
37cd4070e8
commit
1077bd0c64
@@ -1116,14 +1116,23 @@ zink_resource_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res,
|
||||
static VkPipelineStageFlags
|
||||
pipeline_access_stage(VkAccessFlags flags)
|
||||
{
|
||||
switch (flags) {
|
||||
default:
|
||||
return VK_PIPELINE_STAGE_TRANSFER_BIT;
|
||||
}
|
||||
if (flags & (VK_ACCESS_UNIFORM_READ_BIT |
|
||||
VK_ACCESS_SHADER_READ_BIT |
|
||||
VK_ACCESS_SHADER_WRITE_BIT))
|
||||
return VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV |
|
||||
VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV |
|
||||
VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR |
|
||||
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
|
||||
VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
|
||||
VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
|
||||
VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
|
||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
|
||||
return VK_PIPELINE_STAGE_TRANSFER_BIT;
|
||||
}
|
||||
|
||||
void
|
||||
zink_resource_buffer_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res, VkAccessFlags flags)
|
||||
zink_resource_buffer_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res, VkAccessFlags flags, VkPipelineStageFlags pipeline)
|
||||
{
|
||||
/* TODO: maybe make this more flexible using flags? */
|
||||
VkBufferMemoryBarrier bmb = {
|
||||
@@ -1140,14 +1149,15 @@ zink_resource_buffer_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res,
|
||||
|
||||
vkCmdPipelineBarrier(
|
||||
cmdbuf,
|
||||
pipeline_access_stage(res->access),
|
||||
pipeline_access_stage(flags),
|
||||
res->access_stage ? res->access_stage : pipeline_access_stage(res->access),
|
||||
pipeline ? pipeline : pipeline_access_stage(flags),
|
||||
0,
|
||||
0, NULL,
|
||||
1, &bmb,
|
||||
0, NULL
|
||||
);
|
||||
res->access = flags;
|
||||
res->access_stage = pipeline ? pipeline : pipeline_access_stage(flags);
|
||||
}
|
||||
|
||||
VkShaderStageFlagBits
|
||||
|
||||
@@ -193,7 +193,7 @@ void
|
||||
zink_wait_on_batch(struct zink_context *ctx, int batch_id);
|
||||
|
||||
void
|
||||
zink_resource_buffer_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res, VkAccessFlags flags);
|
||||
zink_resource_buffer_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res, VkAccessFlags flags, VkPipelineStageFlags pipeline);
|
||||
|
||||
void
|
||||
zink_resource_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res,
|
||||
|
||||
@@ -40,6 +40,7 @@ struct zink_resource {
|
||||
|
||||
enum pipe_format internal_format:16;
|
||||
|
||||
VkPipelineStageFlagBits access_stage;
|
||||
union {
|
||||
struct {
|
||||
VkAccessFlags access;
|
||||
|
||||
Reference in New Issue
Block a user