zink: use shader-read-only-optimal for samplers
Using the general layout for samplers can have terrible performance, so let's use shader-read-only-optimal instead. This is fairly straight-forward if we use conservative bounds for the barriers, and assume they are being used in all stages. Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7655>
This commit is contained in:
parent
1a4c4cd110
commit
134df0069f
|
@ -806,7 +806,7 @@ access_src_flags(VkImageLayout layout)
|
|||
return 0;
|
||||
|
||||
case VK_IMAGE_LAYOUT_GENERAL:
|
||||
return VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
return VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
|
||||
case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
|
||||
return VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
|
||||
|
@ -838,13 +838,16 @@ access_dst_flags(VkImageLayout layout)
|
|||
return 0;
|
||||
|
||||
case VK_IMAGE_LAYOUT_GENERAL:
|
||||
return VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
return VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
|
||||
case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
|
||||
return VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
|
||||
return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
|
||||
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
|
||||
return VK_ACCESS_SHADER_READ_BIT;
|
||||
|
||||
case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
|
||||
return VK_ACCESS_TRANSFER_READ_BIT;
|
||||
|
||||
|
@ -873,6 +876,9 @@ pipeline_dst_stage(VkImageLayout layout)
|
|||
case VK_IMAGE_LAYOUT_GENERAL:
|
||||
return VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
|
||||
|
||||
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
|
||||
return VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
|
||||
|
||||
default:
|
||||
return VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
||||
}
|
||||
|
@ -895,6 +901,9 @@ pipeline_src_stage(VkImageLayout layout)
|
|||
case VK_IMAGE_LAYOUT_GENERAL:
|
||||
return VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
|
||||
|
||||
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
|
||||
return VK_PIPELINE_STAGE_VERTEX_SHADER_BIT;
|
||||
|
||||
default:
|
||||
return VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
|
||||
}
|
||||
|
|
|
@ -354,13 +354,9 @@ zink_draw_vbo(struct pipe_context *pctx,
|
|||
} else if (res->base.target == PIPE_BUFFER)
|
||||
wds[num_wds].pTexelBufferView = &sampler_view->buffer_view;
|
||||
else {
|
||||
VkImageLayout layout = res->layout;
|
||||
if (layout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL &&
|
||||
layout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
|
||||
if (res->layout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
|
||||
transitions[num_transitions++] = res;
|
||||
layout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
}
|
||||
image_infos[num_image_info].imageLayout = layout;
|
||||
image_infos[num_image_info].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||
image_infos[num_image_info].imageView = sampler_view->image_view;
|
||||
image_infos[num_image_info].sampler = ctx->samplers[i][index];
|
||||
wds[num_wds].pImageInfo = image_infos + num_image_info;
|
||||
|
@ -385,7 +381,7 @@ zink_draw_vbo(struct pipe_context *pctx,
|
|||
for (int i = 0; i < num_transitions; ++i)
|
||||
zink_resource_barrier(batch->cmdbuf, transitions[i],
|
||||
transitions[i]->aspect,
|
||||
VK_IMAGE_LAYOUT_GENERAL);
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||
}
|
||||
|
||||
if (ctx->xfb_barrier)
|
||||
|
|
Loading…
Reference in New Issue