diff --git a/src/intel/vulkan_hasvk/anv_device.c b/src/intel/vulkan_hasvk/anv_device.c index 0bd3fbf..ed3ca5a 100644 --- a/src/intel/vulkan_hasvk/anv_device.c +++ b/src/intel/vulkan_hasvk/anv_device.c @@ -1482,11 +1482,12 @@ anv_physical_device_free_disk_cache(struct anv_physical_device *device) } static void -anv_override_engine_counts(int *gc_count, int *g_count, int *c_count) +anv_override_engine_counts(int *gc_count, int *g_count, int *c_count, int *v_count) { int gc_override = -1; int g_override = -1; int c_override = -1; + int v_override = -1; const char *env_ = os_get_option("HASVK_QUEUE_OVERRIDE"); if (env_ == NULL) @@ -1502,6 +1503,8 @@ anv_override_engine_counts(int *gc_count, int *g_count, int *c_count) g_override = strtol(next + 2, NULL, 0); } else if (strncmp(next, "c=", 2) == 0) { c_override = strtol(next + 2, NULL, 0); + } else if (strncmp(next, "v=", 2) == 0) { + v_override = strtol(next + 2, NULL, 0); } else { mesa_logw("Ignoring unsupported ANV_QUEUE_OVERRIDE token: %s", next); } @@ -1517,6 +1520,8 @@ anv_override_engine_counts(int *gc_count, int *g_count, int *c_count) "Vulkan specification"); if (c_override >= 0) *c_count = c_override; + if (v_override >= 0) + *v_count = v_override; } static void @@ -1528,10 +1533,13 @@ anv_physical_device_init_queue_families(struct anv_physical_device *pdevice) int gc_count = intel_engines_count(pdevice->engine_info, INTEL_ENGINE_CLASS_RENDER); + int v_count = + intel_engines_count(pdevice->engine_info, + I915_ENGINE_CLASS_VIDEO); int g_count = 0; int c_count = 0; - anv_override_engine_counts(&gc_count, &g_count, &c_count); + anv_override_engine_counts(&gc_count, &g_count, &c_count, &v_count); if (gc_count > 0) { pdevice->queue.families[family_count++] = (struct anv_queue_family) { @@ -1558,6 +1566,13 @@ anv_physical_device_init_queue_families(struct anv_physical_device *pdevice) .engine_class = INTEL_ENGINE_CLASS_RENDER, }; } + if (v_count > 0) { + pdevice->queue.families[family_count++] = (struct anv_queue_family) { + .queueFlags = VK_QUEUE_VIDEO_DECODE_BIT_KHR, + .queueCount = v_count, + .engine_class = I915_ENGINE_CLASS_VIDEO, + }; + } /* Increase count below when other families are added as a reminder to * increase the ANV_MAX_QUEUE_FAMILIES value. */ diff --git a/src/intel/vulkan_hasvk/genX_cmd_buffer.c b/src/intel/vulkan_hasvk/genX_cmd_buffer.c index 3683705..385e371 100644 --- a/src/intel/vulkan_hasvk/genX_cmd_buffer.c +++ b/src/intel/vulkan_hasvk/genX_cmd_buffer.c @@ -86,6 +86,13 @@ is_render_queue_cmd_buffer(const struct anv_cmd_buffer *cmd_buffer) return (queue_family->queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0; } +static bool +is_video_queue_cmd_buffer(const struct anv_cmd_buffer *cmd_buffer) +{ + struct anv_queue_family *queue_family = cmd_buffer->queue_family; + return (queue_family->queueFlags & VK_QUEUE_VIDEO_DECODE_BIT_KHR) != 0; +} + void genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer) { @@ -1342,6 +1349,9 @@ genX(BeginCommandBuffer)( if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) cmd_buffer->usage_flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT; + if (is_video_queue_cmd_buffer(cmd_buffer)) + return VK_SUCCESS; + trace_intel_begin_cmd_buffer(&cmd_buffer->trace); genX(cmd_buffer_emit_state_base_address)(cmd_buffer); @@ -1502,6 +1512,11 @@ genX(EndCommandBuffer)( if (anv_batch_has_error(&cmd_buffer->batch)) return cmd_buffer->batch.status; + if (is_video_queue_cmd_buffer(cmd_buffer)) { + anv_cmd_buffer_end_batch_buffer(cmd_buffer); + return VK_SUCCESS; + } + anv_measure_endcommandbuffer(cmd_buffer); /* We want every command buffer to start with the PMA fix in a known state, @@ -1962,6 +1977,9 @@ cmd_buffer_barrier(struct anv_cmd_buffer *cmd_buffer, VkAccessFlags2 src_flags = 0; VkAccessFlags2 dst_flags = 0; + if (is_video_queue_cmd_buffer(cmd_buffer)) + return; + for (uint32_t i = 0; i < dep_info->memoryBarrierCount; i++) { src_flags |= dep_info->pMemoryBarriers[i].srcAccessMask; dst_flags |= dep_info->pMemoryBarriers[i].dstAccessMask; @@ -5888,6 +5906,18 @@ void genX(CmdSetEvent2)( ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); ANV_FROM_HANDLE(anv_event, event, _event); + if (is_video_queue_cmd_buffer(cmd_buffer)) { + anv_batch_emit(&cmd_buffer->batch, GENX(MI_FLUSH_DW), flush) { + flush.PostSyncOperation = WriteImmediateData; + flush.Address = (struct anv_address) { + cmd_buffer->device->dynamic_state_pool.block_pool.bo, + event->state.offset + }; + flush.ImmediateData = VK_EVENT_SET; + } + return; + } + VkPipelineStageFlags2 src_stages = vk_collect_dependency_info_src_stages(pDependencyInfo); @@ -5919,6 +5949,18 @@ void genX(CmdResetEvent2)( ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); ANV_FROM_HANDLE(anv_event, event, _event); + if (is_video_queue_cmd_buffer(cmd_buffer)) { + anv_batch_emit(&cmd_buffer->batch, GENX(MI_FLUSH_DW), flush) { + flush.PostSyncOperation = WriteImmediateData; + flush.Address = (struct anv_address) { + cmd_buffer->device->dynamic_state_pool.block_pool.bo, + event->state.offset + }; + flush.ImmediateData = VK_EVENT_RESET; + } + return; + } + cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_POST_SYNC_BIT; genX(cmd_buffer_apply_pipe_flushes)(cmd_buffer); diff --git a/src/intel/vulkan_hasvk/genX_state.c b/src/intel/vulkan_hasvk/genX_state.c index 1712393..6cb5572 100644 --- a/src/intel/vulkan_hasvk/genX_state.c +++ b/src/intel/vulkan_hasvk/genX_state.c @@ -123,6 +123,9 @@ genX(init_device_state)(struct anv_device *device) case INTEL_ENGINE_CLASS_RENDER: res = init_render_queue_state(queue); break; + case INTEL_ENGINE_CLASS_VIDEO: + res = VK_SUCCESS; + break; default: res = vk_error(device, VK_ERROR_INITIALIZATION_FAILED); break;