diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index bebb57ef46e..a183153573d 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -11605,7 +11605,7 @@ write_event(struct radv_cmd_buffer *cmd_buffer, struct radv_event *event, VkPipe struct radeon_cmdbuf *cs = cmd_buffer->cs; 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; 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 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; for (unsigned i = 0; i < eventCount; ++i) { diff --git a/src/amd/vulkan/radv_cmd_buffer.h b/src/amd/vulkan/radv_cmd_buffer.h index 91bf7855e24..62d94cce7db 100644 --- a/src/amd/vulkan/radv_cmd_buffer.h +++ b/src/amd/vulkan/radv_cmd_buffer.h @@ -537,6 +537,7 @@ struct radv_cmd_buffer { struct radv_video_session_params *params; struct rvcn_sq_var sq; struct rvcn_decode_buffer_s *decode_buffer; + uint64_t feedback_query_va; } video; struct { diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c index 55386ff5892..d4446bb4448 100644 --- a/src/amd/vulkan/radv_query.c +++ b/src/amd/vulkan/radv_query.c @@ -1280,6 +1280,9 @@ radv_create_query_pool(struct radv_device *device, const VkQueryPoolCreateInfo * pool->stride = 16; } break; + case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR: + pool->stride = 48; + break; default: unreachable("creating unhandled query type"); } @@ -1650,6 +1653,43 @@ radv_GetQueryPoolResults(VkDevice _device, VkQueryPool queryPool, uint32_t first } 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: 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: values += 1; break; + case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR: + values += 1; + break; default: 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 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 * pending active queries. Otherwise the GPU might write queries data * after the reset operation. @@ -2272,6 +2319,9 @@ emit_begin_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *poo } break; } + case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR: + cmd_buffer->video.feedback_query_va = va; + break; default: unreachable("beginning unhandled query type"); } @@ -2489,6 +2539,9 @@ emit_end_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *pool, } break; } + case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR: + cmd_buffer->video.feedback_query_va = 0; + break; default: unreachable("ending unhandled query type"); }