radv: add encoder queue support pieces and encoder queries.
This is just checks for events and avoiding an assert in the winsys, and adds support for the encoder queries. Acked-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25900>
This commit is contained in:
@@ -11605,7 +11605,7 @@ write_event(struct radv_cmd_buffer *cmd_buffer, struct radv_event *event, VkPipe
|
|||||||
struct radeon_cmdbuf *cs = cmd_buffer->cs;
|
struct radeon_cmdbuf *cs = cmd_buffer->cs;
|
||||||
uint64_t va = radv_buffer_get_va(event->bo);
|
uint64_t va = radv_buffer_get_va(event->bo);
|
||||||
|
|
||||||
if (cmd_buffer->qf == RADV_QUEUE_VIDEO_DEC)
|
if (cmd_buffer->qf == RADV_QUEUE_VIDEO_DEC || cmd_buffer->qf == RADV_QUEUE_VIDEO_ENC)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
radv_emit_cache_flush(cmd_buffer);
|
radv_emit_cache_flush(cmd_buffer);
|
||||||
@@ -11702,7 +11702,7 @@ radv_CmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const Vk
|
|||||||
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
|
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
|
||||||
struct radeon_cmdbuf *cs = cmd_buffer->cs;
|
struct radeon_cmdbuf *cs = cmd_buffer->cs;
|
||||||
|
|
||||||
if (cmd_buffer->qf == RADV_QUEUE_VIDEO_DEC)
|
if (cmd_buffer->qf == RADV_QUEUE_VIDEO_DEC || cmd_buffer->qf == RADV_QUEUE_VIDEO_ENC)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (unsigned i = 0; i < eventCount; ++i) {
|
for (unsigned i = 0; i < eventCount; ++i) {
|
||||||
|
@@ -537,6 +537,7 @@ struct radv_cmd_buffer {
|
|||||||
struct radv_video_session_params *params;
|
struct radv_video_session_params *params;
|
||||||
struct rvcn_sq_var sq;
|
struct rvcn_sq_var sq;
|
||||||
struct rvcn_decode_buffer_s *decode_buffer;
|
struct rvcn_decode_buffer_s *decode_buffer;
|
||||||
|
uint64_t feedback_query_va;
|
||||||
} video;
|
} video;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
@@ -1280,6 +1280,9 @@ radv_create_query_pool(struct radv_device *device, const VkQueryPoolCreateInfo *
|
|||||||
pool->stride = 16;
|
pool->stride = 16;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR:
|
||||||
|
pool->stride = 48;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
unreachable("creating unhandled query type");
|
unreachable("creating unhandled query type");
|
||||||
}
|
}
|
||||||
@@ -1650,6 +1653,43 @@ radv_GetQueryPoolResults(VkDevice _device, VkQueryPool queryPool, uint32_t first
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR: {
|
||||||
|
uint32_t *src32 = (uint32_t *)src;
|
||||||
|
uint32_t value;
|
||||||
|
do {
|
||||||
|
value = p_atomic_read(&src32[1]);
|
||||||
|
} while (value != 1 && (flags & VK_QUERY_RESULT_WAIT_BIT));
|
||||||
|
|
||||||
|
available = value != 0;
|
||||||
|
|
||||||
|
if (!available && !(flags & VK_QUERY_RESULT_PARTIAL_BIT))
|
||||||
|
result = VK_NOT_READY;
|
||||||
|
|
||||||
|
if (flags & VK_QUERY_RESULT_64_BIT) {
|
||||||
|
uint64_t *dest64 = (uint64_t *)dest;
|
||||||
|
if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT)) {
|
||||||
|
dest64[0] = src32[5];
|
||||||
|
dest64[1] = src32[6];
|
||||||
|
}
|
||||||
|
dest += 16;
|
||||||
|
if (flags & VK_QUERY_RESULT_WITH_STATUS_BIT_KHR) {
|
||||||
|
dest64[2] = 1;
|
||||||
|
dest += 8;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uint32_t *dest32 = (uint32_t *)dest;
|
||||||
|
if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT)) {
|
||||||
|
dest32[0] = src32[5];
|
||||||
|
dest32[1] = src32[6];
|
||||||
|
}
|
||||||
|
dest += 8;
|
||||||
|
if (flags & VK_QUERY_RESULT_WITH_STATUS_BIT_KHR) {
|
||||||
|
dest32[2] = 1;
|
||||||
|
dest += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
unreachable("trying to get results of unhandled query type");
|
unreachable("trying to get results of unhandled query type");
|
||||||
}
|
}
|
||||||
@@ -1707,6 +1747,9 @@ radv_query_result_size(const struct radv_query_pool *pool, VkQueryResultFlags fl
|
|||||||
case VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT:
|
case VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT:
|
||||||
values += 1;
|
values += 1;
|
||||||
break;
|
break;
|
||||||
|
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR:
|
||||||
|
values += 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
unreachable("trying to get size of unhandled query type");
|
unreachable("trying to get size of unhandled query type");
|
||||||
}
|
}
|
||||||
@@ -1926,6 +1969,10 @@ radv_CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uin
|
|||||||
uint32_t value = query_clear_value(pool->vk.query_type);
|
uint32_t value = query_clear_value(pool->vk.query_type);
|
||||||
uint32_t flush_bits = 0;
|
uint32_t flush_bits = 0;
|
||||||
|
|
||||||
|
if (cmd_buffer->qf == RADV_QUEUE_VIDEO_DEC || cmd_buffer->qf == RADV_QUEUE_VIDEO_ENC)
|
||||||
|
/* video queries don't work like this */
|
||||||
|
return;
|
||||||
|
|
||||||
/* Make sure to sync all previous work if the given command buffer has
|
/* Make sure to sync all previous work if the given command buffer has
|
||||||
* pending active queries. Otherwise the GPU might write queries data
|
* pending active queries. Otherwise the GPU might write queries data
|
||||||
* after the reset operation.
|
* after the reset operation.
|
||||||
@@ -2272,6 +2319,9 @@ emit_begin_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *poo
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR:
|
||||||
|
cmd_buffer->video.feedback_query_va = va;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
unreachable("beginning unhandled query type");
|
unreachable("beginning unhandled query type");
|
||||||
}
|
}
|
||||||
@@ -2489,6 +2539,9 @@ emit_end_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *pool,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR:
|
||||||
|
cmd_buffer->video.feedback_query_va = 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
unreachable("ending unhandled query type");
|
unreachable("ending unhandled query type");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user