From 9f2b23dd8528e91a8a384aa83dd38befd8996b6f Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Tue, 12 Mar 2024 19:15:23 +0100 Subject: [PATCH] panvk: Get rid of fields we already have in vk_xxx objects There's no point adding our own pointer when the base vk_xxx object already provides a way to get back to the parent. Replace those fields by _get_xxx() helpers. Signed-off-by: Boris Brezillon Reviewed-by: Erik Faye-Lund Part-of: --- src/panfrost/vulkan/panvk_cmd_buffer.c | 6 ++- src/panfrost/vulkan/panvk_device.c | 24 +++++------ src/panfrost/vulkan/panvk_image.c | 18 +++++--- src/panfrost/vulkan/panvk_private.h | 27 ++++++++---- src/panfrost/vulkan/panvk_vX_cmd_buffer.c | 52 ++++++++++++----------- src/panfrost/vulkan/panvk_vX_device.c | 18 +++++--- src/panfrost/vulkan/panvk_vX_image.c | 2 +- src/panfrost/vulkan/panvk_vX_meta_blit.c | 14 +++--- src/panfrost/vulkan/panvk_vX_meta_clear.c | 19 ++++++--- src/panfrost/vulkan/panvk_vX_meta_copy.c | 50 +++++++++++++++------- src/panfrost/vulkan/panvk_vX_pipeline.c | 4 +- src/panfrost/vulkan/panvk_vX_shader.c | 9 ++-- src/panfrost/vulkan/panvk_wsi.c | 22 ++++++---- 13 files changed, 164 insertions(+), 101 deletions(-) diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.c b/src/panfrost/vulkan/panvk_cmd_buffer.c index 0ac260f650c..84c6e82783f 100644 --- a/src/panfrost/vulkan/panvk_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_cmd_buffer.c @@ -481,14 +481,16 @@ panvk_cmd_fb_info_set_subpass(struct panvk_cmd_buffer *cmdbuf) void panvk_cmd_fb_info_init(struct panvk_cmd_buffer *cmdbuf) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_fb_info *fbinfo = &cmdbuf->state.fb.info; const struct vk_framebuffer *fb = cmdbuf->state.framebuffer; memset(cmdbuf->state.fb.crc_valid, 0, sizeof(cmdbuf->state.fb.crc_valid)); *fbinfo = (struct pan_fb_info){ - .tile_buf_budget = panfrost_query_optimal_tib_size( - cmdbuf->device->physical_device->model), + .tile_buf_budget = panfrost_query_optimal_tib_size(phys_dev->model), .width = fb->width, .height = fb->height, .extent.maxx = fb->width - 1, diff --git a/src/panfrost/vulkan/panvk_device.c b/src/panfrost/vulkan/panvk_device.c index 9de6eaeb0af..ff30568ea5d 100644 --- a/src/panfrost/vulkan/panvk_device.c +++ b/src/panfrost/vulkan/panvk_device.c @@ -450,8 +450,6 @@ panvk_physical_device_init(struct panvk_physical_device *device, goto fail; } - device->instance = instance; - if (instance->vk.enabled_extensions.KHR_display) { master_fd = open(drm_device->nodes[DRM_NODE_PRIMARY], O_RDWR | O_CLOEXEC); if (master_fd >= 0) { @@ -929,10 +927,12 @@ static VkResult panvk_queue_init(struct panvk_device *device, struct panvk_queue *queue, int idx, const VkDeviceQueueCreateInfo *create_info) { + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(device->vk.physical); + VkResult result = vk_queue_init(&queue->vk, &device->vk, create_info, idx); if (result != VK_SUCCESS) return result; - queue->device = device; struct drm_syncobj_create create = { .flags = DRM_SYNCOBJ_CREATE_SIGNALED, @@ -944,7 +944,7 @@ panvk_queue_init(struct panvk_device *device, struct panvk_queue *queue, return VK_ERROR_OUT_OF_HOST_MEMORY; } - unsigned arch = pan_arch(device->physical_device->kmod.props.gpu_prod_id); + unsigned arch = pan_arch(phys_dev->kmod.props.gpu_prod_id); switch (arch) { case 6: @@ -1077,12 +1077,13 @@ panvk_CreateDevice(VkPhysicalDevice physicalDevice, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) { VK_FROM_HANDLE(panvk_physical_device, physical_device, physicalDevice); - struct panvk_instance *instance = physical_device->instance; + struct panvk_instance *instance = + to_panvk_instance(physical_device->vk.instance); VkResult result; struct panvk_device *device; - device = vk_zalloc2(&physical_device->instance->vk.alloc, pAllocator, - sizeof(*device), 8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); + device = vk_zalloc2(&instance->vk.alloc, pAllocator, sizeof(*device), 8, + VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); if (!device) return vk_error(physical_device, VK_ERROR_OUT_OF_HOST_MEMORY); @@ -1139,9 +1140,6 @@ panvk_CreateDevice(VkPhysicalDevice physicalDevice, device->vk.command_dispatch_table = &device->cmd_dispatch; device->vk.command_buffer_ops = cmd_buffer_ops; - device->instance = physical_device->instance; - device->physical_device = physical_device; - device->kmod.allocator = (struct pan_kmod_allocator){ .zalloc = panvk_kmod_zalloc, .free = panvk_kmod_free, @@ -1232,7 +1230,8 @@ VKAPI_ATTR void VKAPI_CALL panvk_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator) { VK_FROM_HANDLE(panvk_device, device, _device); - struct panvk_physical_device *physical_device = device->physical_device; + struct panvk_physical_device *physical_device = + to_panvk_physical_device(device->vk.physical); if (!device) return; @@ -1269,8 +1268,9 @@ VKAPI_ATTR VkResult VKAPI_CALL panvk_QueueWaitIdle(VkQueue _queue) { VK_FROM_HANDLE(panvk_queue, queue, _queue); + struct panvk_device *dev = to_panvk_device(queue->vk.base.device); - if (vk_device_is_lost(&queue->device->vk)) + if (vk_device_is_lost(&dev->vk)) return VK_ERROR_DEVICE_LOST; struct drm_syncobj_wait wait = { diff --git a/src/panfrost/vulkan/panvk_image.c b/src/panfrost/vulkan/panvk_image.c index ff3fb13b9dc..a95da1589f9 100644 --- a/src/panfrost/vulkan/panvk_image.c +++ b/src/panfrost/vulkan/panvk_image.c @@ -65,6 +65,8 @@ panvk_image_create(VkDevice _device, const VkImageCreateInfo *pCreateInfo, uint64_t modifier, const VkSubresourceLayout *plane_layouts) { VK_FROM_HANDLE(panvk_device, device, _device); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(device->vk.physical); struct panvk_image *image = NULL; image = vk_image_create(&device->vk, pCreateInfo, alloc, sizeof(*image)); @@ -83,7 +85,7 @@ panvk_image_create(VkDevice _device, const VkImageCreateInfo *pCreateInfo, .nr_slices = image->vk.mip_levels, }; - unsigned arch = pan_arch(device->physical_device->kmod.props.gpu_prod_id); + unsigned arch = pan_arch(phys_dev->kmod.props.gpu_prod_id); pan_image_layout_init(arch, &image->pimage.layout, NULL); *pImage = panvk_image_to_handle(image); @@ -95,11 +97,13 @@ panvk_image_select_mod(VkDevice _device, const VkImageCreateInfo *pCreateInfo, const VkSubresourceLayout **plane_layouts) { VK_FROM_HANDLE(panvk_device, device, _device); + struct panvk_instance *instance = + to_panvk_instance(device->vk.physical->instance); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(device->vk.physical); enum pipe_format fmt = vk_format_to_pipe_format(pCreateInfo->format); - bool noafbc = - !(device->physical_device->instance->debug_flags & PANVK_DEBUG_AFBC); - bool linear = - device->physical_device->instance->debug_flags & PANVK_DEBUG_LINEAR; + bool noafbc = !(instance->debug_flags & PANVK_DEBUG_AFBC); + bool linear = instance->debug_flags & PANVK_DEBUG_LINEAR; *plane_layouts = NULL; @@ -156,11 +160,11 @@ panvk_image_select_mod(VkDevice _device, const VkImageCreateInfo *pCreateInfo, if (pCreateInfo->samples > 1) return DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED; - if (!panfrost_query_afbc(&device->physical_device->kmod.props)) + if (!panfrost_query_afbc(&phys_dev->kmod.props)) return DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED; /* Only a small selection of formats are AFBC'able */ - unsigned arch = pan_arch(device->physical_device->kmod.props.gpu_prod_id); + unsigned arch = pan_arch(phys_dev->kmod.props.gpu_prod_id); if (!panfrost_format_supports_afbc(arch, fmt)) return DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED; diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h index 7954a661d90..55aee3cb2ca 100644 --- a/src/panfrost/vulkan/panvk_private.h +++ b/src/panfrost/vulkan/panvk_private.h @@ -210,8 +210,6 @@ struct panvk_physical_device { const struct panfrost_format *all; } formats; - struct panvk_instance *instance; - char name[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE]; uint8_t driver_uuid[VK_UUID_SIZE]; uint8_t device_uuid[VK_UUID_SIZE]; @@ -225,6 +223,12 @@ struct panvk_physical_device { int master_fd; }; +static inline struct panvk_physical_device * +to_panvk_physical_device(struct vk_physical_device *phys_dev) +{ + return container_of(phys_dev, struct panvk_physical_device, vk); +} + enum panvk_debug_flags { PANVK_DEBUG_STARTUP = 1 << 0, PANVK_DEBUG_NIR = 1 << 1, @@ -248,6 +252,12 @@ struct panvk_instance { } kmod; }; +static inline struct panvk_instance * +to_panvk_instance(struct vk_instance *instance) +{ + return container_of(instance, struct panvk_instance, vk); +} + VkResult panvk_wsi_init(struct panvk_physical_device *physical_device); void panvk_wsi_finish(struct panvk_physical_device *physical_device); @@ -261,7 +271,6 @@ panvk_physical_device_extension_supported(struct panvk_physical_device *dev, struct panvk_queue { struct vk_queue vk; - struct panvk_device *device; uint32_t sync; }; @@ -281,18 +290,20 @@ struct panvk_device { struct vk_device_dispatch_table cmd_dispatch; - struct panvk_instance *instance; - struct panvk_queue *queues[PANVK_MAX_QUEUE_FAMILIES]; int queue_count[PANVK_MAX_QUEUE_FAMILIES]; - struct panvk_physical_device *physical_device; - struct { struct pandecode_context *decode_ctx; } debug; }; +static inline struct panvk_device * +to_panvk_device(struct vk_device *dev) +{ + return container_of(dev, struct panvk_device, vk); +} + #define TILER_DESC_WORDS 56 struct panvk_batch { @@ -777,8 +788,6 @@ struct panvk_cmd_bind_point_state { struct panvk_cmd_buffer { struct vk_command_buffer vk; - struct panvk_device *device; - struct panvk_pool desc_pool; struct panvk_pool varying_pool; struct panvk_pool tls_pool; diff --git a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c index 72ac54f31a7..68b348c645d 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c @@ -45,9 +45,10 @@ static uint32_t panvk_debug_adjust_bo_flags(const struct panvk_device *device, uint32_t bo_flags) { - uint32_t debug_flags = device->physical_device->instance->debug_flags; + struct panvk_instance *instance = + to_panvk_instance(device->vk.physical->instance); - if (debug_flags & PANVK_DEBUG_DUMP) + if (instance->debug_flags & PANVK_DEBUG_DUMP) bo_flags &= ~PAN_KMOD_BO_FLAG_NO_MMAP; return bo_flags; @@ -102,7 +103,9 @@ panvk_per_arch(cmd_close_batch)(struct panvk_cmd_buffer *cmdbuf) return; } - struct panvk_device *dev = cmdbuf->device; + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); list_addtail(&batch->node, &cmdbuf->batches); @@ -118,11 +121,10 @@ panvk_per_arch(cmd_close_batch)(struct panvk_cmd_buffer *cmdbuf) if (batch->tlsinfo.tls.size) { unsigned thread_tls_alloc = - panfrost_query_thread_tls_alloc(&dev->physical_device->kmod.props); + panfrost_query_thread_tls_alloc(&phys_dev->kmod.props); unsigned core_id_range; - panfrost_query_core_count(&dev->physical_device->kmod.props, - &core_id_range); + panfrost_query_core_count(&phys_dev->kmod.props, &core_id_range); unsigned size = panfrost_get_total_stack_size( batch->tlsinfo.tls.size, thread_tls_alloc, core_id_range); @@ -142,7 +144,7 @@ panvk_per_arch(cmd_close_batch)(struct panvk_cmd_buffer *cmdbuf) GENX(pan_emit_tls)(&batch->tlsinfo, batch->tls.cpu); if (batch->fb.desc.cpu) { - fbinfo->sample_positions = cmdbuf->device->sample_positions->addr.dev + + fbinfo->sample_positions = dev->sample_positions->addr.dev + panfrost_sample_positions_offset( pan_sample_pattern(fbinfo->nr_samples)); @@ -376,6 +378,7 @@ static void panvk_draw_prepare_fs_rsd(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); const struct panvk_pipeline *pipeline = panvk_cmd_get_pipeline(cmdbuf, GRAPHICS); @@ -408,9 +411,8 @@ panvk_draw_prepare_fs_rsd(struct panvk_cmd_buffer *cmdbuf, STATIC_ASSERT(sizeof(pipeline->blend.bd_template[0]) >= sizeof(*bd_templ)); - panvk_per_arch(emit_blend_constant)(cmdbuf->device, pipeline, i, - cmdbuf->state.blend.constants, - &bd_dyn); + panvk_per_arch(emit_blend_constant)( + dev, pipeline, i, cmdbuf->state.blend.constants, &bd_dyn); pan_merge(bd_dyn, (*bd_templ), BLEND); memcpy(bd, &bd_dyn, sizeof(bd_dyn)); } @@ -427,6 +429,7 @@ void panvk_per_arch(cmd_get_tiler_context)(struct panvk_cmd_buffer *cmdbuf, unsigned width, unsigned height) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); struct panvk_batch *batch = cmdbuf->state.batch; if (batch->tiler.descs.cpu) @@ -442,7 +445,7 @@ panvk_per_arch(cmd_get_tiler_context)(struct panvk_cmd_buffer *cmdbuf, .cpu = batch->tiler.templ, }; - panvk_per_arch(emit_tiler_context)(cmdbuf->device, width, height, &desc); + panvk_per_arch(emit_tiler_context)(dev, width, height, &desc); memcpy(batch->tiler.descs.cpu, batch->tiler.templ, pan_size(TILER_CONTEXT) + pan_size(TILER_HEAP)); batch->tiler.ctx.bifrost = batch->tiler.descs.gpu; @@ -470,6 +473,7 @@ static void panvk_draw_prepare_varyings(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); const struct panvk_pipeline *pipeline = panvk_cmd_get_pipeline(cmdbuf, GRAPHICS); struct panvk_varyings_info *varyings = &cmdbuf->state.varyings; @@ -515,7 +519,7 @@ panvk_draw_prepare_varyings(struct panvk_cmd_buffer *cmdbuf, struct panfrost_ptr attribs = pan_pool_alloc_desc_array( &cmdbuf->desc_pool.base, varyings->stage[s].count, ATTRIBUTE); - panvk_per_arch(emit_varyings)(cmdbuf->device, varyings, s, attribs.cpu); + panvk_per_arch(emit_varyings)(dev, varyings, s, attribs.cpu); draw->stages[s].varyings = attribs.gpu; } } @@ -580,6 +584,7 @@ static void panvk_draw_prepare_vs_attribs(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); struct panvk_cmd_bind_point_state *bind_point_state = panvk_cmd_get_bind_point_state(cmdbuf, GRAPHICS); struct panvk_descriptor_state *desc_state = &bind_point_state->desc_state; @@ -608,7 +613,7 @@ panvk_draw_prepare_vs_attribs(struct panvk_cmd_buffer *cmdbuf, panvk_per_arch(emit_attrib_bufs)(&pipeline->attribs, cmdbuf->state.vb.bufs, cmdbuf->state.vb.count, draw, bufs.cpu); - panvk_per_arch(emit_attribs)(cmdbuf->device, draw, &pipeline->attribs, + panvk_per_arch(emit_attribs)(dev, draw, &pipeline->attribs, cmdbuf->state.vb.bufs, cmdbuf->state.vb.count, attribs.cpu); @@ -809,16 +814,16 @@ panvk_index_minmax_search(struct panvk_cmd_buffer *cmdbuf, uint32_t start, uint32_t count, bool restart, uint32_t *min, uint32_t *max) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + struct panvk_instance *instance = + to_panvk_instance(dev->vk.physical->instance); void *ptr = cmdbuf->state.ib.buffer->host_ptr + cmdbuf->state.ib.offset; assert(cmdbuf->state.ib.buffer); assert(cmdbuf->state.ib.buffer->bo); assert(cmdbuf->state.ib.buffer->host_ptr); - uint32_t debug_flags = - cmdbuf->device->physical_device->instance->debug_flags; - - if (!(debug_flags & PANVK_DEBUG_NO_KNOWN_WARN)) { + if (!(instance->debug_flags & PANVK_DEBUG_NO_KNOWN_WARN)) { fprintf( stderr, "WARNING: Crawling index buffers from the CPU isn't valid in Vulkan\n"); @@ -1078,7 +1083,7 @@ panvk_destroy_cmdbuf(struct vk_command_buffer *vk_cmdbuf) { struct panvk_cmd_buffer *cmdbuf = container_of(vk_cmdbuf, struct panvk_cmd_buffer, vk); - struct panvk_device *device = cmdbuf->device; + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); list_for_each_entry_safe(struct panvk_batch, batch, &cmdbuf->batches, node) { list_del(&batch->node); @@ -1092,7 +1097,7 @@ panvk_destroy_cmdbuf(struct vk_command_buffer *vk_cmdbuf) panvk_pool_cleanup(&cmdbuf->tls_pool); panvk_pool_cleanup(&cmdbuf->varying_pool); vk_command_buffer_finish(&cmdbuf->vk); - vk_free(&device->vk.alloc, cmdbuf); + vk_free(&dev->vk.alloc, cmdbuf); } static VkResult @@ -1117,8 +1122,6 @@ panvk_create_cmdbuf(struct vk_command_pool *vk_pool, return result; } - cmdbuf->device = device; - panvk_pool_init(&cmdbuf->desc_pool, device, &pool->desc_bo_pool, 0, 64 * 1024, "Command buffer descriptor pool", true); panvk_pool_init( @@ -1174,13 +1177,15 @@ panvk_per_arch(CmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) { VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct panvk_dispatch_info dispatch = { .wg_count = {x, y, z}, }; panvk_per_arch(cmd_close_batch)(cmdbuf); struct panvk_batch *batch = panvk_cmd_open_batch(cmdbuf); - struct panvk_device *dev = cmdbuf->device; struct panvk_cmd_bind_point_state *bind_point_state = panvk_cmd_get_bind_point_state(cmdbuf, COMPUTE); @@ -1223,8 +1228,7 @@ panvk_per_arch(CmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x, if (batch->tlsinfo.wls.size) { unsigned core_id_range; - panfrost_query_core_count(&dev->physical_device->kmod.props, - &core_id_range); + panfrost_query_core_count(&phys_dev->kmod.props, &core_id_range); batch->wls_total_size = pan_wls_adjust_size(batch->tlsinfo.wls.size) * pan_wls_instances(&dispatch.wg_count) * core_id_range; diff --git a/src/panfrost/vulkan/panvk_vX_device.c b/src/panfrost/vulkan/panvk_vX_device.c index de932fcff7e..bfd2c0fc462 100644 --- a/src/panfrost/vulkan/panvk_vX_device.c +++ b/src/panfrost/vulkan/panvk_vX_device.c @@ -41,8 +41,12 @@ panvk_queue_submit_batch(struct panvk_queue *queue, struct panvk_batch *batch, uint32_t *bos, unsigned nr_bos, uint32_t *in_fences, unsigned nr_in_fences) { - const struct panvk_device *dev = queue->device; - unsigned debug = dev->physical_device->instance->debug_flags; + struct panvk_device *dev = to_panvk_device(queue->vk.base.device); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); + struct panvk_instance *instance = + to_panvk_instance(dev->vk.physical->instance); + unsigned debug = instance->debug_flags; int ret; /* Reset the batch if it's already been issued */ @@ -78,7 +82,7 @@ panvk_queue_submit_batch(struct panvk_queue *queue, struct panvk_batch *batch, if (debug & PANVK_DEBUG_TRACE) { pandecode_jc(dev->debug.decode_ctx, batch->jc.first_job, - dev->physical_device->kmod.props.gpu_prod_id); + phys_dev->kmod.props.gpu_prod_id); } if (debug & PANVK_DEBUG_DUMP) @@ -112,7 +116,7 @@ panvk_queue_submit_batch(struct panvk_queue *queue, struct panvk_batch *batch, if (debug & PANVK_DEBUG_TRACE) pandecode_jc(dev->debug.decode_ctx, batch->fragment_job, - dev->physical_device->kmod.props.gpu_prod_id); + phys_dev->kmod.props.gpu_prod_id); if (debug & PANVK_DEBUG_DUMP) pandecode_dump_mappings(dev->debug.decode_ctx); @@ -127,7 +131,7 @@ panvk_queue_submit_batch(struct panvk_queue *queue, struct panvk_batch *batch, static void panvk_queue_transfer_sync(struct panvk_queue *queue, uint32_t syncobj) { - struct panvk_device *dev = queue->device; + struct panvk_device *dev = to_panvk_device(queue->vk.base.device); int ret; struct drm_syncobj_handle handle = { @@ -172,7 +176,7 @@ static void panvk_signal_event_syncobjs(struct panvk_queue *queue, struct panvk_batch *batch) { - struct panvk_device *dev = queue->device; + struct panvk_device *dev = to_panvk_device(queue->vk.base.device); util_dynarray_foreach(&batch->event_ops, struct panvk_cmd_event_op, op) { switch (op->type) { @@ -205,7 +209,7 @@ panvk_per_arch(queue_submit)(struct vk_queue *vk_queue, struct vk_queue_submit *submit) { struct panvk_queue *queue = container_of(vk_queue, struct panvk_queue, vk); - struct panvk_device *dev = queue->device; + struct panvk_device *dev = to_panvk_device(queue->vk.base.device); unsigned nr_semaphores = submit->wait_count + 1; uint32_t semaphores[nr_semaphores]; diff --git a/src/panfrost/vulkan/panvk_vX_image.c b/src/panfrost/vulkan/panvk_vX_image.c index 0d83c6dd482..68f1b84a83d 100644 --- a/src/panfrost/vulkan/panvk_vX_image.c +++ b/src/panfrost/vulkan/panvk_vX_image.c @@ -184,7 +184,7 @@ panvk_per_arch(CreateBufferView)(VkDevice _device, &device->vk, pAllocator, sizeof(*view), VK_OBJECT_TYPE_BUFFER_VIEW); if (!view) - return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); vk_buffer_view_init(&device->vk, &view->vk, pCreateInfo); diff --git a/src/panfrost/vulkan/panvk_vX_meta_blit.c b/src/panfrost/vulkan/panvk_vX_meta_blit.c index 34c775393ac..63ea5f2b30c 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_blit.c +++ b/src/panfrost/vulkan/panvk_vX_meta_blit.c @@ -34,7 +34,9 @@ panvk_meta_blit(struct panvk_cmd_buffer *cmdbuf, const struct panvk_image *src_img, const struct panvk_image *dst_img) { - struct panvk_device *dev = cmdbuf->device; + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_fb_info *fbinfo = &cmdbuf->state.fb.info; struct pan_blit_context ctx; struct pan_image_view views[2] = { @@ -56,8 +58,7 @@ panvk_meta_blit(struct panvk_cmd_buffer *cmdbuf, }; *fbinfo = (struct pan_fb_info){ - .tile_buf_budget = panfrost_query_optimal_tib_size( - cmdbuf->device->physical_device->model), + .tile_buf_budget = panfrost_query_optimal_tib_size(phys_dev->model), .width = u_minify(blitinfo->dst.planes[0].image->layout.width, blitinfo->dst.level), .height = u_minify(blitinfo->dst.planes[0].image->layout.height, @@ -227,15 +228,18 @@ panvk_per_arch(CmdResolveImage2)(VkCommandBuffer commandBuffer, void panvk_per_arch(meta_blit_init)(struct panvk_device *dev) { + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); + panvk_pool_init(&dev->meta.blitter.bin_pool, dev, NULL, PAN_KMOD_BO_FLAG_EXECUTABLE, 16 * 1024, "panvk_meta blitter binary pool", false); panvk_pool_init(&dev->meta.blitter.desc_pool, dev, NULL, 0, 16 * 1024, "panvk_meta blitter descriptor pool", false); pan_blend_shader_cache_init(&dev->meta.blend_shader_cache, - dev->physical_device->kmod.props.gpu_prod_id); + phys_dev->kmod.props.gpu_prod_id); GENX(pan_blitter_cache_init) - (&dev->meta.blitter.cache, dev->physical_device->kmod.props.gpu_prod_id, + (&dev->meta.blitter.cache, phys_dev->kmod.props.gpu_prod_id, &dev->meta.blend_shader_cache, &dev->meta.blitter.bin_pool.base, &dev->meta.blitter.desc_pool.base); } diff --git a/src/panfrost/vulkan/panvk_vX_meta_clear.c b/src/panfrost/vulkan/panvk_vX_meta_clear.c index a8238402c62..544483e6ad5 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_clear.c +++ b/src/panfrost/vulkan/panvk_vX_meta_clear.c @@ -37,6 +37,8 @@ panvk_meta_clear_color_attachment_shader(struct panvk_device *dev, enum glsl_base_type base_type, struct pan_shader_info *shader_info) { + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_pool *bin_pool = &dev->meta.bin_pool.base; nir_builder b = nir_builder_init_simple_shader( @@ -53,7 +55,7 @@ panvk_meta_clear_color_attachment_shader(struct panvk_device *dev, nir_store_var(&b, out, clear_values, 0xff); struct panfrost_compile_inputs inputs = { - .gpu_id = dev->physical_device->kmod.props.gpu_prod_id, + .gpu_id = phys_dev->kmod.props.gpu_prod_id, .is_blit = true, .no_ubo_to_push = true, }; @@ -255,7 +257,8 @@ panvk_meta_clear_attachment(struct panvk_cmd_buffer *cmdbuf, const VkClearValue *clear_value, const VkClearRect *clear_rect) { - struct panvk_meta *meta = &cmdbuf->device->meta; + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + struct panvk_meta *meta = &dev->meta; struct panvk_batch *batch = cmdbuf->state.batch; const struct panvk_render_pass *pass = cmdbuf->state.pass; const struct panvk_render_pass_attachment *att = @@ -318,6 +321,9 @@ panvk_meta_clear_color_img(struct panvk_cmd_buffer *cmdbuf, const VkClearColorValue *color, const VkImageSubresourceRange *range) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_fb_info *fbinfo = &cmdbuf->state.fb.info; struct pan_image_view view = { .format = img->pimage.layout.format, @@ -330,8 +336,7 @@ panvk_meta_clear_color_img(struct panvk_cmd_buffer *cmdbuf, cmdbuf->state.fb.crc_valid[0] = false; *fbinfo = (struct pan_fb_info){ - .tile_buf_budget = panfrost_query_optimal_tib_size( - cmdbuf->device->physical_device->model), + .tile_buf_budget = panfrost_query_optimal_tib_size(phys_dev->model), .nr_samples = img->pimage.layout.nr_samples, .rt_count = 1, .rts[0].view = &view, @@ -389,6 +394,9 @@ panvk_meta_clear_zs_img(struct panvk_cmd_buffer *cmdbuf, const VkClearDepthStencilValue *value, const VkImageSubresourceRange *range) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_fb_info *fbinfo = &cmdbuf->state.fb.info; struct pan_image_view view = { .format = img->pimage.layout.format, @@ -401,8 +409,7 @@ panvk_meta_clear_zs_img(struct panvk_cmd_buffer *cmdbuf, cmdbuf->state.fb.crc_valid[0] = false; *fbinfo = (struct pan_fb_info){ - .tile_buf_budget = panfrost_query_optimal_tib_size( - cmdbuf->device->physical_device->model), + .tile_buf_budget = panfrost_query_optimal_tib_size(phys_dev->model), .nr_samples = img->pimage.layout.nr_samples, .rt_count = 1, .zs.clear_value.depth = value->depth, diff --git a/src/panfrost/vulkan/panvk_vX_meta_copy.c b/src/panfrost/vulkan/panvk_vX_meta_copy.c index 2be600f343e..42494da0d23 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_copy.c +++ b/src/panfrost/vulkan/panvk_vX_meta_copy.c @@ -289,6 +289,8 @@ panvk_meta_copy_img2img_shader(struct panvk_device *dev, bool texisarray, bool is_ms, struct pan_shader_info *shader_info) { + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_pool *bin_pool = &dev->meta.bin_pool.base; nir_builder b = nir_builder_init_simple_shader( @@ -416,7 +418,7 @@ panvk_meta_copy_img2img_shader(struct panvk_device *dev, nir_store_var(&b, out, texel, 0xff); struct panfrost_compile_inputs inputs = { - .gpu_id = dev->physical_device->kmod.props.gpu_prod_id, + .gpu_id = phys_dev->kmod.props.gpu_prod_id, .is_blit = true, .no_ubo_to_push = true, }; @@ -554,6 +556,9 @@ panvk_meta_copy_img2img(struct panvk_cmd_buffer *cmdbuf, const struct panvk_image *dst, const VkImageCopy2 *region) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_fb_info *fbinfo = &cmdbuf->state.fb.info; struct panvk_meta_copy_img2img_format_info key = { .srcfmt = panvk_meta_copy_img_format(src->pimage.layout.format), @@ -569,7 +574,7 @@ panvk_meta_copy_img2img(struct panvk_cmd_buffer *cmdbuf, unsigned fmtidx = panvk_meta_copy_img2img_format_idx(key); unsigned ms = dst->pimage.layout.nr_samples > 1 ? 1 : 0; - mali_ptr rsd = cmdbuf->device->meta.copy.img2img[ms][texdimidx][fmtidx].rsd; + mali_ptr rsd = dev->meta.copy.img2img[ms][texdimidx][fmtidx].rsd; struct pan_image_view srcview = { .format = key.srcfmt, @@ -622,8 +627,7 @@ panvk_meta_copy_img2img(struct panvk_cmd_buffer *cmdbuf, u_minify(dst->pimage.layout.height, region->dstSubresource.mipLevel); cmdbuf->state.fb.crc_valid[0] = false; *fbinfo = (struct pan_fb_info){ - .tile_buf_budget = panfrost_query_optimal_tib_size( - cmdbuf->device->physical_device->model), + .tile_buf_budget = panfrost_query_optimal_tib_size(phys_dev->model), .width = width, .height = height, .extent.minx = minx & ~31, @@ -851,6 +855,8 @@ panvk_meta_copy_buf2img_shader(struct panvk_device *dev, struct panvk_meta_copy_format_info key, struct pan_shader_info *shader_info) { + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_pool *bin_pool = &dev->meta.bin_pool.base; nir_builder b = nir_builder_init_simple_shader( @@ -955,7 +961,7 @@ panvk_meta_copy_buf2img_shader(struct panvk_device *dev, nir_store_var(&b, out, texel, 0xff); struct panfrost_compile_inputs inputs = { - .gpu_id = dev->physical_device->kmod.props.gpu_prod_id, + .gpu_id = phys_dev->kmod.props.gpu_prod_id, .is_blit = true, .no_ubo_to_push = true, }; @@ -998,6 +1004,9 @@ panvk_meta_copy_buf2img(struct panvk_cmd_buffer *cmdbuf, const struct panvk_image *img, const VkBufferImageCopy2 *region) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_fb_info *fbinfo = &cmdbuf->state.fb.info; unsigned minx = MAX2(region->imageOffset.x, 0); unsigned miny = MAX2(region->imageOffset.y, 0); @@ -1024,7 +1033,7 @@ panvk_meta_copy_buf2img(struct panvk_cmd_buffer *cmdbuf, unsigned fmtidx = panvk_meta_copy_buf2img_format_idx(key); - mali_ptr rsd = cmdbuf->device->meta.copy.buf2img[fmtidx].rsd; + mali_ptr rsd = dev->meta.copy.buf2img[fmtidx].rsd; const struct vk_image_buffer_layout buflayout = vk_image_buffer_copy_layout(&img->vk, region); @@ -1051,8 +1060,7 @@ panvk_meta_copy_buf2img(struct panvk_cmd_buffer *cmdbuf, /* TODO: don't force preloads of dst resources if unneeded */ cmdbuf->state.fb.crc_valid[0] = false; *fbinfo = (struct pan_fb_info){ - .tile_buf_budget = panfrost_query_optimal_tib_size( - cmdbuf->device->physical_device->model), + .tile_buf_budget = panfrost_query_optimal_tib_size(phys_dev->model), .width = u_minify(img->pimage.layout.width, region->imageSubresource.mipLevel), .height = @@ -1239,6 +1247,8 @@ panvk_meta_copy_img2buf_shader(struct panvk_device *dev, unsigned texdim, unsigned texisarray, struct pan_shader_info *shader_info) { + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); unsigned imgtexelsz = util_format_get_blocksize(key.imgfmt); unsigned buftexelsz = panvk_meta_copy_buf_texelsize(key.imgfmt, key.mask); struct pan_pool *bin_pool = &dev->meta.bin_pool.base; @@ -1413,7 +1423,7 @@ panvk_meta_copy_img2buf_shader(struct panvk_device *dev, nir_pop_if(&b, NULL); struct panfrost_compile_inputs inputs = { - .gpu_id = dev->physical_device->kmod.props.gpu_prod_id, + .gpu_id = phys_dev->kmod.props.gpu_prod_id, .is_blit = true, .no_ubo_to_push = true, }; @@ -1453,6 +1463,7 @@ panvk_meta_copy_img2buf(struct panvk_cmd_buffer *cmdbuf, const struct panvk_image *img, const VkBufferImageCopy2 *region) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); struct panvk_meta_copy_format_info key = { .imgfmt = panvk_meta_copy_img2buf_format(img->pimage.layout.format), .mask = panvk_meta_copy_img_mask(img->pimage.layout.format, @@ -1463,7 +1474,7 @@ panvk_meta_copy_img2buf(struct panvk_cmd_buffer *cmdbuf, img->pimage.layout.dim, img->pimage.layout.array_size > 1); unsigned fmtidx = panvk_meta_copy_img2buf_format_idx(key); - mali_ptr rsd = cmdbuf->device->meta.copy.img2buf[texdimidx][fmtidx].rsd; + mali_ptr rsd = dev->meta.copy.img2buf[texdimidx][fmtidx].rsd; struct panvk_meta_copy_img2buf_info info = { .buf.ptr = panvk_buffer_gpu_ptr(buf, region->bufferOffset), @@ -1614,6 +1625,8 @@ static mali_ptr panvk_meta_copy_buf2buf_shader(struct panvk_device *dev, unsigned blksz, struct pan_shader_info *shader_info) { + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_pool *bin_pool = &dev->meta.bin_pool.base; /* FIXME: Won't work on compute queues, but we can't do that with @@ -1639,7 +1652,7 @@ panvk_meta_copy_buf2buf_shader(struct panvk_device *dev, unsigned blksz, (1 << ncomps) - 1); struct panfrost_compile_inputs inputs = { - .gpu_id = dev->physical_device->kmod.props.gpu_prod_id, + .gpu_id = phys_dev->kmod.props.gpu_prod_id, .is_blit = true, .no_ubo_to_push = true, }; @@ -1680,6 +1693,7 @@ panvk_meta_copy_buf2buf(struct panvk_cmd_buffer *cmdbuf, const struct panvk_buffer *dst, const VkBufferCopy2 *region) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); struct panvk_meta_copy_buf2buf_info info = { .src = panvk_buffer_gpu_ptr(src, region->srcOffset), .dst = panvk_buffer_gpu_ptr(dst, region->dstOffset), @@ -1688,8 +1702,8 @@ panvk_meta_copy_buf2buf(struct panvk_cmd_buffer *cmdbuf, unsigned alignment = ffs((info.src | info.dst | region->size) & 15); unsigned log2blksz = alignment ? alignment - 1 : 4; - assert(log2blksz < ARRAY_SIZE(cmdbuf->device->meta.copy.buf2buf)); - mali_ptr rsd = cmdbuf->device->meta.copy.buf2buf[log2blksz].rsd; + assert(log2blksz < ARRAY_SIZE(dev->meta.copy.buf2buf)); + mali_ptr rsd = dev->meta.copy.buf2buf[log2blksz].rsd; mali_ptr pushconsts = pan_pool_upload_aligned(&cmdbuf->desc_pool.base, &info, sizeof(info), 16); @@ -1744,6 +1758,8 @@ static mali_ptr panvk_meta_fill_buf_shader(struct panvk_device *dev, struct pan_shader_info *shader_info) { + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); struct pan_pool *bin_pool = &dev->meta.bin_pool.base; /* FIXME: Won't work on compute queues, but we can't do that with @@ -1764,7 +1780,7 @@ panvk_meta_fill_buf_shader(struct panvk_device *dev, nir_store_global(&b, ptr, sizeof(uint32_t), val, 1); struct panfrost_compile_inputs inputs = { - .gpu_id = dev->physical_device->kmod.props.gpu_prod_id, + .gpu_id = phys_dev->kmod.props.gpu_prod_id, .is_blit = true, .no_ubo_to_push = true, }; @@ -1816,6 +1832,7 @@ panvk_meta_fill_buf(struct panvk_cmd_buffer *cmdbuf, const struct panvk_buffer *dst, VkDeviceSize size, VkDeviceSize offset, uint32_t val) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); struct panvk_meta_fill_buf_info info = { .start = panvk_buffer_gpu_ptr(dst, offset), .val = val, @@ -1835,7 +1852,7 @@ panvk_meta_fill_buf(struct panvk_cmd_buffer *cmdbuf, assert(!(offset & 3) && !(size & 3)); unsigned nwords = size / sizeof(uint32_t); - mali_ptr rsd = cmdbuf->device->meta.copy.fillbuf.rsd; + mali_ptr rsd = dev->meta.copy.fillbuf.rsd; mali_ptr pushconsts = pan_pool_upload_aligned(&cmdbuf->desc_pool.base, &info, sizeof(info), 16); @@ -1876,6 +1893,7 @@ panvk_meta_update_buf(struct panvk_cmd_buffer *cmdbuf, const struct panvk_buffer *dst, VkDeviceSize offset, VkDeviceSize size, const void *data) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); struct panvk_meta_copy_buf2buf_info info = { .src = pan_pool_upload_aligned(&cmdbuf->desc_pool.base, data, size, 4), .dst = panvk_buffer_gpu_ptr(dst, offset), @@ -1883,7 +1901,7 @@ panvk_meta_update_buf(struct panvk_cmd_buffer *cmdbuf, unsigned log2blksz = ffs(sizeof(uint32_t)) - 1; - mali_ptr rsd = cmdbuf->device->meta.copy.buf2buf[log2blksz].rsd; + mali_ptr rsd = dev->meta.copy.buf2buf[log2blksz].rsd; mali_ptr pushconsts = pan_pool_upload_aligned(&cmdbuf->desc_pool.base, &info, sizeof(info), 16); diff --git a/src/panfrost/vulkan/panvk_vX_pipeline.c b/src/panfrost/vulkan/panvk_vX_pipeline.c index c3320c11d5d..a416c0d48d2 100644 --- a/src/panfrost/vulkan/panvk_vX_pipeline.c +++ b/src/panfrost/vulkan/panvk_vX_pipeline.c @@ -414,7 +414,9 @@ panvk_per_arch(blend_needs_lowering)(const struct panvk_device *dev, if (!pan_blend_is_homogenous_constant(constant_mask, state->constants)) return true; - unsigned arch = pan_arch(dev->physical_device->kmod.props.gpu_prod_id); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); + unsigned arch = pan_arch(phys_dev->kmod.props.gpu_prod_id); bool supports_2src = pan_blend_supports_2src(arch); return !pan_blend_can_fixed_function(state->rts[rt].equation, supports_2src); } diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index 907badfde62..958e66df6a4 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -218,6 +218,10 @@ panvk_per_arch(shader_create)(struct panvk_device *dev, gl_shader_stage stage, const VkAllocationCallbacks *alloc) { VK_FROM_HANDLE(vk_shader_module, module, stage_info->module); + struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); + struct panvk_instance *instance = + to_panvk_instance(dev->vk.physical->instance); struct panvk_shader *shader; shader = vk_zalloc2(&dev->vk.alloc, alloc, sizeof(*shader), 8, @@ -253,7 +257,7 @@ panvk_per_arch(shader_create)(struct panvk_device *dev, gl_shader_stage stage, true, true); struct panfrost_compile_inputs inputs = { - .gpu_id = dev->physical_device->kmod.props.gpu_prod_id, + .gpu_id = phys_dev->kmod.props.gpu_prod_id, .no_ubo_to_push = true, .no_idvs = true, /* TODO */ }; @@ -337,8 +341,7 @@ panvk_per_arch(shader_create)(struct panvk_device *dev, gl_shader_stage stage, NIR_PASS_V(nir, nir_lower_global_vars_to_local); nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir)); - if (unlikely(dev->physical_device->instance->debug_flags & - PANVK_DEBUG_NIR)) { + if (unlikely(instance->debug_flags & PANVK_DEBUG_NIR)) { fprintf(stderr, "translated nir:\n"); nir_print_shader(nir, stderr); } diff --git a/src/panfrost/vulkan/panvk_wsi.c b/src/panfrost/vulkan/panvk_wsi.c index fd98b225226..bcf020f64a9 100644 --- a/src/panfrost/vulkan/panvk_wsi.c +++ b/src/panfrost/vulkan/panvk_wsi.c @@ -34,19 +34,23 @@ static VKAPI_PTR PFN_vkVoidFunction panvk_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName) { VK_FROM_HANDLE(panvk_physical_device, pdevice, physicalDevice); - return vk_instance_get_proc_addr_unchecked(&pdevice->instance->vk, pName); + struct panvk_instance *instance = to_panvk_instance(pdevice->vk.instance); + + return vk_instance_get_proc_addr_unchecked(&instance->vk, pName); } VkResult panvk_wsi_init(struct panvk_physical_device *physical_device) { + struct panvk_instance *instance = + to_panvk_instance(physical_device->vk.instance); VkResult result; - result = wsi_device_init( - &physical_device->wsi_device, - panvk_physical_device_to_handle(physical_device), panvk_wsi_proc_addr, - &physical_device->instance->vk.alloc, physical_device->master_fd, NULL, - &(struct wsi_device_options){.sw_device = false}); + result = wsi_device_init(&physical_device->wsi_device, + panvk_physical_device_to_handle(physical_device), + panvk_wsi_proc_addr, &instance->vk.alloc, + physical_device->master_fd, NULL, + &(struct wsi_device_options){.sw_device = false}); if (result != VK_SUCCESS) return result; @@ -60,7 +64,9 @@ panvk_wsi_init(struct panvk_physical_device *physical_device) void panvk_wsi_finish(struct panvk_physical_device *physical_device) { + struct panvk_instance *instance = + to_panvk_instance(physical_device->vk.instance); + physical_device->vk.wsi_device = NULL; - wsi_device_finish(&physical_device->wsi_device, - &physical_device->instance->vk.alloc); + wsi_device_finish(&physical_device->wsi_device, &instance->vk.alloc); }