diff --git a/src/panfrost/vulkan/bifrost/panvk_vX_meta_desc_copy.c b/src/panfrost/vulkan/bifrost/panvk_vX_meta_desc_copy.c index a155e4e1f93..5a389a08788 100644 --- a/src/panfrost/vulkan/bifrost/panvk_vX_meta_desc_copy.c +++ b/src/panfrost/vulkan/bifrost/panvk_vX_meta_desc_copy.c @@ -321,7 +321,7 @@ panvk_meta_desc_copy_rsd(struct panvk_device *dev) DIV_ROUND_UP(sizeof(struct pan_nir_desc_copy_info), 4); shader->rsd = panvk_pool_alloc_desc(&dev->mempools.rw, RENDERER_STATE); - if (!panvk_priv_mem_host_addr(shader->rsd)) { + if (!panvk_priv_mem_check_alloc(shader->rsd)) { vk_shader_destroy(&dev->vk, &shader->vk, NULL); return 0; } diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c index e4fa70384d1..e1be606f699 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c @@ -128,7 +128,7 @@ cmd_dispatch(struct panvk_cmd_buffer *cmdbuf, struct panvk_dispatch_info *info) VkResult result; /* If there's no compute shader, we can skip the dispatch. */ - if (!panvk_priv_mem_dev_addr(cs->spd)) + if (!panvk_priv_mem_check_alloc(cs->spd)) return; struct panvk_physical_device *phys_dev = diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index f5179693538..f44a54d1f6e 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -2359,7 +2359,7 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) VkResult result; /* If there's no vertex shader, we can skip the draw. */ - if (!panvk_priv_mem_dev_addr(vs->spd)) + if (!panvk_priv_mem_check_alloc(vs->spd)) return; /* Needs to be done before get_fs() is called because it depends on @@ -2523,7 +2523,7 @@ panvk_cmd_draw_indirect(struct panvk_cmd_buffer *cmdbuf, VkResult result; /* If there's no vertex shader, we can skip the draw. */ - if (!panvk_priv_mem_dev_addr(vs->spd)) + if (!panvk_priv_mem_check_alloc(vs->spd)) return; /* Needs to be done before get_fs() is called because it depends on diff --git a/src/panfrost/vulkan/csf/panvk_vX_event.c b/src/panfrost/vulkan/csf/panvk_vX_event.c index 16ce622c3d1..ae9127214c9 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_event.c +++ b/src/panfrost/vulkan/csf/panvk_vX_event.c @@ -29,7 +29,7 @@ panvk_per_arch(CreateEvent)(VkDevice _device, }; event->syncobjs = panvk_pool_alloc_mem(&device->mempools.rw_nc, info); - if (!panvk_priv_mem_host_addr(event->syncobjs)) { + if (!panvk_priv_mem_check_alloc(event->syncobjs)) { vk_object_free(&device->vk, pAllocator, event); return panvk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); } diff --git a/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c b/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c index bd2bdb82cbc..72ed569e6b5 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c +++ b/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c @@ -164,13 +164,12 @@ init_render_desc_ringbuf(struct panvk_gpu_queue *queue) }; ringbuf->syncobj = panvk_pool_alloc_mem(&dev->mempools.rw, alloc_info); - - struct panvk_cs_sync32 *syncobj = panvk_priv_mem_host_addr(ringbuf->syncobj); - - if (!syncobj) + if (!panvk_priv_mem_check_alloc(ringbuf->syncobj)) return panvk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, "Failed to create the render desc ringbuf context"); + struct panvk_cs_sync32 *syncobj = panvk_priv_mem_host_addr(ringbuf->syncobj); + *syncobj = (struct panvk_cs_sync32){ .seqno = RENDER_DESC_RINGBUF_SIZE, }; @@ -363,7 +362,7 @@ init_subqueue(struct panvk_gpu_queue *queue, enum panvk_subqueue_id subqueue) alloc_info.size = dev->dump_region_size[subqueue]; alloc_info.alignment = sizeof(uint32_t); subq->regs_save = panvk_pool_alloc_mem(&dev->mempools.rw, alloc_info); - if (!panvk_priv_mem_host_addr(subq->regs_save)) { + if (!panvk_priv_mem_check_alloc(subq->regs_save)) { return panvk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, "Failed to allocate register save area"); } @@ -377,7 +376,7 @@ init_subqueue(struct panvk_gpu_queue *queue, enum panvk_subqueue_id subqueue) alloc_info.size = sizeof(uint64_t); alloc_info.alignment = 64; subq->req_resource.buf = panvk_pool_alloc_mem(mempool, alloc_info); - if (!panvk_priv_mem_host_addr(subq->req_resource.buf)) + if (!panvk_priv_mem_check_alloc(subq->req_resource.buf)) return panvk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, "Failed to create a req_resource buffer"); @@ -407,7 +406,7 @@ init_subqueue(struct panvk_gpu_queue *queue, enum panvk_subqueue_id subqueue) alloc_info.alignment = 64; subq->context = panvk_pool_alloc_mem(mempool, alloc_info); - if (!panvk_priv_mem_host_addr(subq->context)) + if (!panvk_priv_mem_check_alloc(subq->context)) return panvk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, "Failed to create a queue context"); @@ -566,7 +565,7 @@ init_queue(struct panvk_gpu_queue *queue) }; queue->syncobjs = panvk_pool_alloc_mem(&dev->mempools.rw, alloc_info); - if (!panvk_priv_mem_host_addr(queue->syncobjs)) + if (!panvk_priv_mem_check_alloc(queue->syncobjs)) return panvk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, "Failed to allocate subqueue sync objects"); @@ -672,7 +671,7 @@ init_tiler(struct panvk_gpu_queue *queue) }; tiler_heap->desc = panvk_pool_alloc_mem(&dev->mempools.rw, alloc_info); - if (!panvk_priv_mem_host_addr(tiler_heap->desc)) { + if (!panvk_priv_mem_check_alloc(tiler_heap->desc)) { result = panvk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, "Failed to create a tiler heap context"); goto err_free_desc; diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c index f8aa9614cbf..50e09514f58 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c @@ -68,7 +68,7 @@ cmd_dispatch(struct panvk_cmd_buffer *cmdbuf, struct panvk_dispatch_info *info) VkResult result; /* If there's no compute shader, we can skip the dispatch. */ - if (!panvk_priv_mem_dev_addr(cs->rsd)) + if (!panvk_priv_mem_check_alloc(cs->rsd)) return; panvk_per_arch(cmd_close_batch)(cmdbuf); diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index 9b8ccb0c431..e381fd614a8 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -1420,7 +1420,7 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_data *draw) VkResult result; /* If there's no vertex shader, we can skip the draw. */ - if (!panvk_priv_mem_dev_addr(vs->rsd)) + if (!panvk_priv_mem_check_alloc(vs->rsd)) return; /* Needs to be done before get_fs() is called because it depends on @@ -1528,7 +1528,7 @@ panvk_cmd_draw_indirect(struct panvk_cmd_buffer *cmdbuf, VkResult result; /* If there's no vertex shader, we can skip the draw. */ - if (!panvk_priv_mem_dev_addr(vs->rsd)) + if (!panvk_priv_mem_check_alloc(vs->rsd)) return; /* Needs to be done before get_fs() is called because it depends on diff --git a/src/panfrost/vulkan/panvk_mempool.h b/src/panfrost/vulkan/panvk_mempool.h index b2caaeffe4f..2b9f1652c27 100644 --- a/src/panfrost/vulkan/panvk_mempool.h +++ b/src/panfrost/vulkan/panvk_mempool.h @@ -148,6 +148,12 @@ panvk_priv_mem_flags(struct panvk_priv_mem mem) return mem.bo & PANVK_PRIV_MEM_FLAGS_MASK; } +static inline bool +panvk_priv_mem_check_alloc(struct panvk_priv_mem mem) +{ + return panvk_priv_mem_bo(mem) != NULL; +} + static inline uint64_t panvk_priv_mem_dev_addr(struct panvk_priv_mem mem) { diff --git a/src/panfrost/vulkan/panvk_vX_buffer_view.c b/src/panfrost/vulkan/panvk_vX_buffer_view.c index cebc2234f4e..f1b6a244d56 100644 --- a/src/panfrost/vulkan/panvk_vX_buffer_view.c +++ b/src/panfrost/vulkan/panvk_vX_buffer_view.c @@ -67,6 +67,9 @@ panvk_per_arch(CreateBufferView)(VkDevice _device, #else view->mem = panvk_pool_alloc_desc(&device->mempools.rw, SURFACE_WITH_STRIDE); + if (!panvk_priv_mem_check_alloc(view->mem)) + return panvk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY); + struct pan_ptr ptr = { .gpu = panvk_priv_mem_dev_addr(view->mem), .cpu = panvk_priv_mem_host_addr(view->mem), diff --git a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c index a2d55265ef6..d0ba120ab27 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c @@ -168,7 +168,7 @@ get_preload_shader(struct panvk_device *dev, #if PAN_ARCH >= 9 shader->spd = panvk_pool_alloc_desc(&dev->mempools.rw, SHADER_PROGRAM); - if (!panvk_priv_mem_host_addr(shader->spd)) { + if (!panvk_priv_mem_check_alloc(shader->spd)) { vk_shader_destroy(&dev->vk, &shader->vk, NULL); return panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); } diff --git a/src/panfrost/vulkan/panvk_vX_image_view.c b/src/panfrost/vulkan/panvk_vX_image_view.c index d40c937919c..7ec9a38bee9 100644 --- a/src/panfrost/vulkan/panvk_vX_image_view.c +++ b/src/panfrost/vulkan/panvk_vX_image_view.c @@ -150,7 +150,7 @@ prepare_tex_descs(struct panvk_image_view *view) #endif view->mem = panvk_pool_alloc_mem(&dev->mempools.rw, alloc_info); - if (!panvk_priv_mem_host_addr(view->mem)) + if (!panvk_priv_mem_check_alloc(view->mem)) return panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); struct pan_ptr ptr = { diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index c583ec00aa0..f2a0e889044 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -1082,7 +1082,7 @@ panvk_shader_upload(struct panvk_device *dev, shader->code_mem = panvk_pool_upload_aligned( &dev->mempools.exec, shader->bin_ptr, shader->bin_size, 128); - if (!panvk_priv_mem_dev_addr(shader->code_mem)) + if (!panvk_priv_mem_check_alloc(shader->code_mem)) return panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); #if PAN_ARCH < 9 @@ -1090,7 +1090,7 @@ panvk_shader_upload(struct panvk_device *dev, return VK_SUCCESS; shader->rsd = panvk_pool_alloc_desc(&dev->mempools.rw, RENDERER_STATE); - if (!panvk_priv_mem_dev_addr(shader->rsd)) + if (!panvk_priv_mem_check_alloc(shader->rsd)) return panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); pan_cast_and_pack(panvk_priv_mem_host_addr(shader->rsd), RENDERER_STATE, @@ -1101,7 +1101,7 @@ panvk_shader_upload(struct panvk_device *dev, #else if (shader->info.stage != MESA_SHADER_VERTEX) { shader->spd = panvk_pool_alloc_desc(&dev->mempools.rw, SHADER_PROGRAM); - if (!panvk_priv_mem_dev_addr(shader->spd)) + if (!panvk_priv_mem_check_alloc(shader->spd)) return panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); pan_cast_and_pack(panvk_priv_mem_host_addr(shader->spd), SHADER_PROGRAM, @@ -1128,7 +1128,7 @@ panvk_shader_upload(struct panvk_device *dev, #if PAN_ARCH >= 12 shader->spds.all_points = panvk_pool_alloc_desc(&dev->mempools.rw, SHADER_PROGRAM); - if (!panvk_priv_mem_dev_addr(shader->spds.all_points)) + if (!panvk_priv_mem_check_alloc(shader->spds.all_points)) return panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); pan_cast_and_pack(panvk_priv_mem_host_addr(shader->spds.all_points), @@ -1143,7 +1143,7 @@ panvk_shader_upload(struct panvk_device *dev, shader->spds.all_triangles = panvk_pool_alloc_desc(&dev->mempools.rw, SHADER_PROGRAM); - if (!panvk_priv_mem_dev_addr(shader->spds.all_triangles)) + if (!panvk_priv_mem_check_alloc(shader->spds.all_triangles)) return panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); pan_cast_and_pack(panvk_priv_mem_host_addr(shader->spds.all_triangles), @@ -1159,7 +1159,7 @@ panvk_shader_upload(struct panvk_device *dev, #else shader->spds.pos_points = panvk_pool_alloc_desc(&dev->mempools.rw, SHADER_PROGRAM); - if (!panvk_priv_mem_dev_addr(shader->spds.pos_points)) + if (!panvk_priv_mem_check_alloc(shader->spds.pos_points)) return panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); pan_cast_and_pack(panvk_priv_mem_host_addr(shader->spds.pos_points), @@ -1175,7 +1175,7 @@ panvk_shader_upload(struct panvk_device *dev, shader->spds.pos_triangles = panvk_pool_alloc_desc(&dev->mempools.rw, SHADER_PROGRAM); - if (!panvk_priv_mem_dev_addr(shader->spds.pos_triangles)) + if (!panvk_priv_mem_check_alloc(shader->spds.pos_triangles)) return panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); pan_cast_and_pack(panvk_priv_mem_host_addr(shader->spds.pos_triangles), @@ -1193,7 +1193,7 @@ panvk_shader_upload(struct panvk_device *dev, if (shader->info.vs.secondary_enable) { shader->spds.var = panvk_pool_alloc_desc(&dev->mempools.rw, SHADER_PROGRAM); - if (!panvk_priv_mem_dev_addr(shader->spds.var)) + if (!panvk_priv_mem_check_alloc(shader->spds.var)) return panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); pan_cast_and_pack(panvk_priv_mem_host_addr(shader->spds.var), @@ -2082,7 +2082,7 @@ emit_varying_attrs(struct panvk_pool *desc_pool, { *mem = panvk_pool_alloc_desc_array(desc_pool, varying_count, ATTRIBUTE); - if (varying_count && !panvk_priv_mem_dev_addr(*mem)) + if (varying_count && !panvk_priv_mem_check_alloc(*mem)) return VK_ERROR_OUT_OF_DEVICE_MEMORY; struct mali_attribute_packed *attrs = panvk_priv_mem_host_addr(*mem); @@ -2320,7 +2320,7 @@ panvk_per_arch(create_internal_shader)( if (bin_size) { shader->code_mem = panvk_pool_upload_aligned(&dev->mempools.exec, binary.data, bin_size, 128); - if (!panvk_priv_mem_dev_addr(shader->code_mem)) { + if (!panvk_priv_mem_check_alloc(shader->code_mem)) { result = panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); goto err_free_shader; }