pvr: Process secondary buffer queries in vkCmdExecuteCommands.

Signed-off-by: Rajnesh Kanwal <rajnesh.kanwal@imgtec.com>
Reviewed-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19371>
This commit is contained in:
Rajnesh Kanwal 2022-10-06 17:07:08 +05:00 committed by Marge Bot
parent 9df4be8cc4
commit 5c34be4340
2 changed files with 61 additions and 7 deletions

View file

@ -89,6 +89,7 @@ static void pvr_cmd_buffer_free_sub_cmd(struct pvr_cmd_buffer *cmd_buffer,
if (sub_cmd->owned) { if (sub_cmd->owned) {
switch (sub_cmd->type) { switch (sub_cmd->type) {
case PVR_SUB_CMD_TYPE_GRAPHICS: case PVR_SUB_CMD_TYPE_GRAPHICS:
util_dynarray_fini(&sub_cmd->gfx.sec_query_indices);
pvr_csb_finish(&sub_cmd->gfx.control_stream); pvr_csb_finish(&sub_cmd->gfx.control_stream);
pvr_bo_free(cmd_buffer->device, sub_cmd->gfx.depth_bias_bo); pvr_bo_free(cmd_buffer->device, sub_cmd->gfx.depth_bias_bo);
pvr_bo_free(cmd_buffer->device, sub_cmd->gfx.scissor_bo); pvr_bo_free(cmd_buffer->device, sub_cmd->gfx.scissor_bo);
@ -1671,6 +1672,8 @@ VkResult pvr_cmd_buffer_start_sub_cmd(struct pvr_cmd_buffer *cmd_buffer,
PVR_CMD_STREAM_TYPE_GRAPHICS, PVR_CMD_STREAM_TYPE_GRAPHICS,
&sub_cmd->gfx.control_stream); &sub_cmd->gfx.control_stream);
} }
util_dynarray_init(&sub_cmd->gfx.sec_query_indices, NULL);
break; break;
case PVR_SUB_CMD_TYPE_OCCLUSION_QUERY: case PVR_SUB_CMD_TYPE_OCCLUSION_QUERY:
@ -5703,7 +5706,7 @@ static VkResult pvr_execute_sub_cmd(struct pvr_cmd_buffer *cmd_buffer,
return VK_SUCCESS; return VK_SUCCESS;
} }
static void static VkResult
pvr_execute_graphics_cmd_buffer(struct pvr_cmd_buffer *cmd_buffer, pvr_execute_graphics_cmd_buffer(struct pvr_cmd_buffer *cmd_buffer,
const struct pvr_cmd_buffer *sec_cmd_buffer) const struct pvr_cmd_buffer *sec_cmd_buffer)
{ {
@ -5711,13 +5714,40 @@ pvr_execute_graphics_cmd_buffer(struct pvr_cmd_buffer *cmd_buffer,
&cmd_buffer->device->pdevice->dev_info; &cmd_buffer->device->pdevice->dev_info;
struct pvr_cmd_buffer_state *state = &cmd_buffer->state; struct pvr_cmd_buffer_state *state = &cmd_buffer->state;
struct pvr_sub_cmd *primary_sub_cmd = state->current_sub_cmd; struct pvr_sub_cmd *primary_sub_cmd = state->current_sub_cmd;
struct pvr_sub_cmd *first_sec_cmd;
VkResult result; VkResult result;
/* Inherited queries are not supported. */ /* Inherited queries are not supported. */
assert(!state->vis_test_enabled); assert(!state->vis_test_enabled);
if (list_is_empty(&sec_cmd_buffer->sub_cmds)) if (list_is_empty(&sec_cmd_buffer->sub_cmds))
return; return VK_SUCCESS;
first_sec_cmd =
list_first_entry(&sec_cmd_buffer->sub_cmds, struct pvr_sub_cmd, link);
/* Kick a render if we have a new base address. */
if (primary_sub_cmd->gfx.query_pool && first_sec_cmd->gfx.query_pool &&
primary_sub_cmd->gfx.query_pool != first_sec_cmd->gfx.query_pool) {
state->current_sub_cmd->gfx.barrier_store = true;
result = pvr_cmd_buffer_end_sub_cmd(cmd_buffer);
if (result != VK_SUCCESS)
return result;
result =
pvr_cmd_buffer_start_sub_cmd(cmd_buffer, PVR_SUB_CMD_TYPE_GRAPHICS);
if (result != VK_SUCCESS)
return result;
primary_sub_cmd = state->current_sub_cmd;
/* Use existing render setup, but load color attachments from HW
* Background object.
*/
primary_sub_cmd->gfx.barrier_load = true;
primary_sub_cmd->gfx.barrier_store = false;
}
list_for_each_entry (struct pvr_sub_cmd, list_for_each_entry (struct pvr_sub_cmd,
sec_sub_cmd, sec_sub_cmd,
@ -5729,6 +5759,25 @@ pvr_execute_graphics_cmd_buffer(struct pvr_cmd_buffer *cmd_buffer,
if (!sec_sub_cmd->gfx.empty_cmd) if (!sec_sub_cmd->gfx.empty_cmd)
primary_sub_cmd->gfx.empty_cmd = false; primary_sub_cmd->gfx.empty_cmd = false;
if (sec_sub_cmd->gfx.query_pool) {
void *buff;
primary_sub_cmd->gfx.query_pool = sec_sub_cmd->gfx.query_pool;
buff =
util_dynarray_grow_bytes(&state->query_indices,
1,
sec_sub_cmd->gfx.sec_query_indices.size);
if (!buff) {
state->status = vk_error(cmd_buffer, VK_ERROR_OUT_OF_HOST_MEMORY);
return state->status;
}
memcpy(buff,
sec_sub_cmd->gfx.sec_query_indices.data,
sec_sub_cmd->gfx.sec_query_indices.size);
}
if (pvr_cmd_uses_deferred_cs_cmds(sec_cmd_buffer)) { if (pvr_cmd_uses_deferred_cs_cmds(sec_cmd_buffer)) {
/* TODO: In case if secondary buffer is created with /* TODO: In case if secondary buffer is created with
* VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, then we patch the * VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, then we patch the
@ -5738,18 +5787,18 @@ pvr_execute_graphics_cmd_buffer(struct pvr_cmd_buffer *cmd_buffer,
*/ */
result = pvr_execute_deferred_cmd_buffer(cmd_buffer, sec_cmd_buffer); result = pvr_execute_deferred_cmd_buffer(cmd_buffer, sec_cmd_buffer);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return; return result;
result = pvr_csb_copy(&primary_sub_cmd->gfx.control_stream, result = pvr_csb_copy(&primary_sub_cmd->gfx.control_stream,
&sec_sub_cmd->gfx.control_stream); &sec_sub_cmd->gfx.control_stream);
if (result != VK_SUCCESS) { if (result != VK_SUCCESS) {
cmd_buffer->state.status = result; cmd_buffer->state.status = result;
return; return cmd_buffer->state.status;
} }
} else { } else {
result = pvr_execute_deferred_cmd_buffer(cmd_buffer, sec_cmd_buffer); result = pvr_execute_deferred_cmd_buffer(cmd_buffer, sec_cmd_buffer);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return; return result;
pvr_csb_emit_link( pvr_csb_emit_link(
&primary_sub_cmd->gfx.control_stream, &primary_sub_cmd->gfx.control_stream,
@ -5787,6 +5836,8 @@ pvr_execute_graphics_cmd_buffer(struct pvr_cmd_buffer *cmd_buffer,
if (!PVR_HAS_FEATURE(dev_info, gs_rta_support)) if (!PVR_HAS_FEATURE(dev_info, gs_rta_support))
pvr_finishme("Unimplemented path."); pvr_finishme("Unimplemented path.");
} }
return VK_SUCCESS;
} }
void pvr_CmdExecuteCommands(VkCommandBuffer commandBuffer, void pvr_CmdExecuteCommands(VkCommandBuffer commandBuffer,
@ -5796,6 +5847,7 @@ void pvr_CmdExecuteCommands(VkCommandBuffer commandBuffer,
PVR_FROM_HANDLE(pvr_cmd_buffer, cmd_buffer, commandBuffer); PVR_FROM_HANDLE(pvr_cmd_buffer, cmd_buffer, commandBuffer);
struct pvr_cmd_buffer_state *state = &cmd_buffer->state; struct pvr_cmd_buffer_state *state = &cmd_buffer->state;
struct pvr_cmd_buffer *last_cmd_buffer; struct pvr_cmd_buffer *last_cmd_buffer;
VkResult result;
PVR_CHECK_COMMAND_BUFFER_BUILDING_STATE(cmd_buffer); PVR_CHECK_COMMAND_BUFFER_BUILDING_STATE(cmd_buffer);
@ -5819,7 +5871,9 @@ void pvr_CmdExecuteCommands(VkCommandBuffer commandBuffer,
assert(sec_cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY); assert(sec_cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY);
pvr_execute_graphics_cmd_buffer(cmd_buffer, sec_cmd_buffer); result = pvr_execute_graphics_cmd_buffer(cmd_buffer, sec_cmd_buffer);
if (result != VK_SUCCESS)
return;
} }
last_cmd_buffer = last_cmd_buffer =
@ -5834,7 +5888,6 @@ void pvr_CmdExecuteCommands(VkCommandBuffer commandBuffer,
} else { } else {
for (uint32_t i = 0; i < commandBufferCount; i++) { for (uint32_t i = 0; i < commandBufferCount; i++) {
PVR_FROM_HANDLE(pvr_cmd_buffer, sec_cmd_buffer, pCommandBuffers[i]); PVR_FROM_HANDLE(pvr_cmd_buffer, sec_cmd_buffer, pCommandBuffers[i]);
VkResult result;
assert(sec_cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY); assert(sec_cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY);

View file

@ -711,6 +711,7 @@ struct pvr_sub_cmd_gfx {
bool barrier_load; bool barrier_load;
const struct pvr_query_pool *query_pool; const struct pvr_query_pool *query_pool;
struct util_dynarray sec_query_indices;
/* Control stream builder object */ /* Control stream builder object */
struct pvr_csb control_stream; struct pvr_csb control_stream;