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 <boris.brezillon@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28104>
This commit is contained in:
Boris Brezillon
2024-03-12 19:15:23 +01:00
parent d5ed77800e
commit 9f2b23dd85
13 changed files with 164 additions and 101 deletions
+4 -2
View File
@@ -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,
+12 -12
View File
@@ -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 = {
+11 -7
View File
@@ -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;
+18 -9
View File
@@ -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;
+28 -24
View File
@@ -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;
+11 -7
View File
@@ -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];
+1 -1
View File
@@ -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);
+9 -5
View File
@@ -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);
}
+13 -6
View File
@@ -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,
+34 -16
View File
@@ -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);
+3 -1
View File
@@ -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);
}
+6 -3
View File
@@ -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);
}
+14 -8
View File
@@ -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);
}