pvr: Handle PVR_SUB_COMMAND_FLAG_TRANSFER_SERIALIZE_WITH_FRAG.

The flag was previously named PVR_SUB_COMMAND_FLAG_WAIT_ON_PREVIOUS_FRAG.
Since the next fragment job is also made to wait for the transfer
job to complete, the previous name might have been a bit misleading.

Signed-off-by: Karmjit Mahil <Karmjit.Mahil@imgtec.com>
Reviewed-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19957>
This commit is contained in:
Karmjit Mahil
2022-11-16 16:38:18 +00:00
committed by Marge Bot
parent 4276ec9f2a
commit 904a3c4dd7
3 changed files with 52 additions and 6 deletions

View File

@@ -5604,7 +5604,7 @@ pvr_resolve_unemitted_resolve_attachments(struct pvr_cmd_buffer *cmd_buffer,
dst_view->vk.image->format = dst_format; dst_view->vk.image->format = dst_format;
state->current_sub_cmd->flags |= state->current_sub_cmd->flags |=
PVR_SUB_COMMAND_FLAG_WAIT_ON_PREVIOUS_FRAG; PVR_SUB_COMMAND_FLAG_TRANSFER_SERIALIZE_WITH_FRAG;
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return result; return result;

View File

@@ -118,7 +118,7 @@ enum pvr_event_type {
}; };
enum pvr_sub_command_flags { enum pvr_sub_command_flags {
PVR_SUB_COMMAND_FLAG_WAIT_ON_PREVIOUS_FRAG = BITFIELD_BIT(0), PVR_SUB_COMMAND_FLAG_TRANSFER_SERIALIZE_WITH_FRAG = BITFIELD_BIT(0),
PVR_SUB_COMMAND_FLAG_OCCLUSION_QUERY = BITFIELD_BIT(1), PVR_SUB_COMMAND_FLAG_OCCLUSION_QUERY = BITFIELD_BIT(1),
}; };

View File

@@ -429,6 +429,8 @@ static VkResult pvr_process_event_cmd_barrier(
uint32_t src_syncobj_count = 0; uint32_t src_syncobj_count = 0;
VkResult result; VkResult result;
assert(sub_cmd->type == PVR_EVENT_TYPE_BARRIER);
assert(!(src_mask & ~PVR_PIPELINE_STAGE_ALL_BITS)); assert(!(src_mask & ~PVR_PIPELINE_STAGE_ALL_BITS));
assert(!(dst_mask & ~PVR_PIPELINE_STAGE_ALL_BITS)); assert(!(dst_mask & ~PVR_PIPELINE_STAGE_ALL_BITS));
@@ -726,9 +728,7 @@ static VkResult pvr_process_cmd_buffer(
sub_cmd, sub_cmd,
&cmd_buffer->sub_cmds, &cmd_buffer->sub_cmds,
link) { link) {
/* TODO: Process PVR_SUB_COMMAND_FLAG_WAIT_ON_PREVIOUS_FRAG and /* TODO: Process PVR_SUB_COMMAND_FLAG_OCCLUSION_QUERY flag. */
* PVR_SUB_COMMAND_FLAG_OCCLUSION_QUERY flags.
*/
switch (sub_cmd->type) { switch (sub_cmd->type) {
case PVR_SUB_CMD_TYPE_GRAPHICS: case PVR_SUB_CMD_TYPE_GRAPHICS:
@@ -755,7 +755,30 @@ static VkResult pvr_process_cmd_buffer(
per_cmd_buffer_syncobjs); per_cmd_buffer_syncobjs);
break; break;
case PVR_SUB_CMD_TYPE_TRANSFER: case PVR_SUB_CMD_TYPE_TRANSFER: {
const bool serialize_with_frag =
sub_cmd->flags & PVR_SUB_COMMAND_FLAG_TRANSFER_SERIALIZE_WITH_FRAG;
if (serialize_with_frag) {
struct pvr_sub_cmd_event frag_to_transfer_barrier = {
.type = PVR_EVENT_TYPE_BARRIER,
.barrier = {
.wait_for_stage_mask = PVR_PIPELINE_STAGE_FRAG_BIT,
.wait_at_stage_mask = PVR_PIPELINE_STAGE_TRANSFER_BIT,
},
};
result = pvr_process_event_cmd_barrier(device,
&frag_to_transfer_barrier,
barriers,
per_cmd_buffer_syncobjs,
per_submit_syncobjs,
queue_syncobjs,
previous_queue_syncobjs);
if (result != VK_SUCCESS)
break;
}
result = pvr_process_transfer_cmds(device, result = pvr_process_transfer_cmds(device,
queue, queue,
&sub_cmd->transfer, &sub_cmd->transfer,
@@ -764,8 +787,31 @@ static VkResult pvr_process_cmd_buffer(
wait_count, wait_count,
stage_flags, stage_flags,
per_cmd_buffer_syncobjs); per_cmd_buffer_syncobjs);
if (serialize_with_frag) {
struct pvr_sub_cmd_event transfer_to_frag_barrier = {
.type = PVR_EVENT_TYPE_BARRIER,
.barrier = {
.wait_for_stage_mask = PVR_PIPELINE_STAGE_TRANSFER_BIT,
.wait_at_stage_mask = PVR_PIPELINE_STAGE_FRAG_BIT,
},
};
if (result != VK_SUCCESS)
break; break;
result = pvr_process_event_cmd_barrier(device,
&transfer_to_frag_barrier,
barriers,
per_cmd_buffer_syncobjs,
per_submit_syncobjs,
queue_syncobjs,
previous_queue_syncobjs);
}
break;
}
case PVR_SUB_CMD_TYPE_OCCLUSION_QUERY: case PVR_SUB_CMD_TYPE_OCCLUSION_QUERY:
result = pvr_process_occlusion_query_cmd( result = pvr_process_occlusion_query_cmd(
device, device,