mirror of
https://github.com/elwrcl/intel-hard-graphics.git
synced 2026-10-31 19:08:03 +03:00
hasvk: add video engine support in various places
[dancingmirrors: A few forward port fixes.]
This commit is contained in:
1 parent
203bf6b58d
commit
d9147c64f6
3 files changed
+62
-2
No files matched your search
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user