panvk: Move the VkBufferView logic to its own file

Note that we make DestroyBufferView() a per-arch function even if
it's not strictly needed, but given the size of the function, not
sure it's worth having a extra panvk_buffer_view.c file.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com>
Reviewed-by: Rebecca Mckeever <rebecca.mckeever@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28170>
This commit is contained in:
Boris Brezillon 2023-12-13 09:59:16 +01:00 committed by Marge Bot
parent 822478ec20
commit 09d3411ad8
7 changed files with 134 additions and 96 deletions

View file

@ -59,6 +59,7 @@ foreach arch : ['6', '7']
'panvk_v@0@'.format(arch),
[
panvk_entrypoints[0],
'panvk_vX_buffer_view.c',
'panvk_vX_cmd_buffer.c',
'panvk_vX_cs.c',
'panvk_vX_descriptor_set.c',

View file

@ -0,0 +1,30 @@
/*
* Copyright © 2021 Collabora Ltd.
* SPDX-License-Identifier: MIT
*/
#ifndef PANVK_BUFFER_VIEW_H
#define PANVK_BUFFER_VIEW_H
#include <stdint.h>
#include "vk_buffer_view.h"
struct panvk_priv_bo;
#define TEXTURE_DESC_WORDS 8
#define ATTRIB_BUF_DESC_WORDS 4
struct panvk_buffer_view {
struct vk_buffer_view vk;
struct panvk_priv_bo *bo;
struct {
uint32_t tex[TEXTURE_DESC_WORDS];
uint32_t img_attrib_buf[ATTRIB_BUF_DESC_WORDS * 2];
} descs;
};
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_buffer_view, vk.base, VkBufferView,
VK_OBJECT_TYPE_BUFFER_VIEW)
#endif

View file

@ -339,20 +339,6 @@ panvk_BindImageMemory2(VkDevice device, uint32_t bindInfoCount,
return VK_SUCCESS;
}
VKAPI_ATTR void VKAPI_CALL
panvk_DestroyBufferView(VkDevice _device, VkBufferView bufferView,
const VkAllocationCallbacks *pAllocator)
{
VK_FROM_HANDLE(panvk_device, device, _device);
VK_FROM_HANDLE(panvk_buffer_view, view, bufferView);
if (!view)
return;
panvk_priv_bo_destroy(view->bo, pAllocator);
vk_buffer_view_destroy(&device->vk, pAllocator, &view->vk);
}
VKAPI_ATTR VkResult VKAPI_CALL
panvk_GetImageDrmFormatModifierPropertiesEXT(
VkDevice device, VkImage _image,

View file

@ -915,15 +915,6 @@ struct panvk_sampler {
uint32_t desc[SAMPLER_DESC_WORDS];
};
struct panvk_buffer_view {
struct vk_buffer_view vk;
struct panvk_priv_bo *bo;
struct {
uint32_t tex[TEXTURE_DESC_WORDS];
uint32_t img_attrib_buf[ATTRIB_BUF_DESC_WORDS * 2];
} descs;
};
VK_DEFINE_HANDLE_CASTS(panvk_cmd_buffer, vk.base, VkCommandBuffer,
VK_OBJECT_TYPE_COMMAND_BUFFER)
VK_DEFINE_HANDLE_CASTS(panvk_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
@ -935,8 +926,6 @@ VK_DEFINE_HANDLE_CASTS(panvk_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_cmd_pool, vk.base, VkCommandPool,
VK_OBJECT_TYPE_COMMAND_POOL)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_buffer_view, vk.base, VkBufferView,
VK_OBJECT_TYPE_BUFFER_VIEW)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_pool, base, VkDescriptorPool,
VK_OBJECT_TYPE_DESCRIPTOR_POOL)
VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_set, base, VkDescriptorSet,

View file

@ -0,0 +1,102 @@
/*
* Copyright © 2021 Collabora Ltd.
*
* Derived from tu_image.c which is:
* Copyright © 2016 Red Hat.
* Copyright © 2016 Bas Nieuwenhuizen
* Copyright © 2015 Intel Corporation
*
* SPDX-License-Identifier: MIT
*/
#include "genxml/gen_macros.h"
#include "panvk_buffer.h"
#include "panvk_buffer_view.h"
#include "panvk_private.h"
#include "vk_format.h"
VKAPI_ATTR VkResult VKAPI_CALL
panvk_per_arch(CreateBufferView)(VkDevice _device,
const VkBufferViewCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator,
VkBufferView *pView)
{
VK_FROM_HANDLE(panvk_device, device, _device);
VK_FROM_HANDLE(panvk_buffer, buffer, pCreateInfo->buffer);
struct panvk_buffer_view *view = vk_object_zalloc(
&device->vk, pAllocator, sizeof(*view), VK_OBJECT_TYPE_BUFFER_VIEW);
if (!view)
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
vk_buffer_view_init(&device->vk, &view->vk, pCreateInfo);
enum pipe_format pfmt = vk_format_to_pipe_format(view->vk.format);
mali_ptr address = panvk_buffer_gpu_ptr(buffer, pCreateInfo->offset);
unsigned blksz = vk_format_get_blocksize(pCreateInfo->format);
assert(!(address & 63));
if (buffer->vk.usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
unsigned bo_size = pan_size(SURFACE_WITH_STRIDE);
view->bo = panvk_priv_bo_create(device, bo_size, 0, pAllocator,
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
pan_pack(view->bo->addr.host, SURFACE_WITH_STRIDE, cfg) {
cfg.pointer = address;
}
pan_pack(view->descs.tex, TEXTURE, cfg) {
cfg.dimension = MALI_TEXTURE_DIMENSION_1D;
cfg.format = GENX(panfrost_format_from_pipe_format)(pfmt)->hw;
cfg.width = view->vk.elements;
cfg.depth = cfg.height = 1;
cfg.swizzle = PAN_V6_SWIZZLE(R, G, B, A);
cfg.texel_ordering = MALI_TEXTURE_LAYOUT_LINEAR;
cfg.levels = 1;
cfg.array_size = 1;
cfg.surfaces = view->bo->addr.dev;
cfg.maximum_lod = cfg.minimum_lod = 0;
}
}
if (buffer->vk.usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
uint8_t *attrib_buf = (uint8_t *)view->descs.img_attrib_buf;
pan_pack(attrib_buf, ATTRIBUTE_BUFFER, cfg) {
cfg.type = MALI_ATTRIBUTE_TYPE_3D_LINEAR;
cfg.pointer = address;
cfg.stride = blksz;
cfg.size = view->vk.elements * blksz;
}
attrib_buf += pan_size(ATTRIBUTE_BUFFER);
pan_pack(attrib_buf, ATTRIBUTE_BUFFER_CONTINUATION_3D, cfg) {
cfg.s_dimension = view->vk.elements;
cfg.t_dimension = 1;
cfg.r_dimension = 1;
cfg.row_stride = view->vk.elements * blksz;
}
}
*pView = panvk_buffer_view_to_handle(view);
return VK_SUCCESS;
}
VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(DestroyBufferView)(VkDevice _device, VkBufferView bufferView,
const VkAllocationCallbacks *pAllocator)
{
VK_FROM_HANDLE(panvk_device, device, _device);
VK_FROM_HANDLE(panvk_buffer_view, view, bufferView);
if (!view)
return;
panvk_priv_bo_destroy(view->bo, pAllocator);
vk_buffer_view_destroy(&device->vk, pAllocator, &view->vk);
}

View file

@ -27,6 +27,7 @@
#include "genxml/gen_macros.h"
#include "panvk_buffer_view.h"
#include "panvk_image.h"
#include "panvk_private.h"

View file

@ -28,7 +28,6 @@
#include "genxml/gen_macros.h"
#include "panvk_buffer.h"
#include "panvk_image.h"
#include "panvk_private.h"
@ -173,73 +172,3 @@ panvk_per_arch(CreateImageView)(VkDevice _device,
*pView = panvk_image_view_to_handle(view);
return VK_SUCCESS;
}
VKAPI_ATTR VkResult VKAPI_CALL
panvk_per_arch(CreateBufferView)(VkDevice _device,
const VkBufferViewCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator,
VkBufferView *pView)
{
VK_FROM_HANDLE(panvk_device, device, _device);
VK_FROM_HANDLE(panvk_buffer, buffer, pCreateInfo->buffer);
struct panvk_buffer_view *view = vk_object_zalloc(
&device->vk, pAllocator, sizeof(*view), VK_OBJECT_TYPE_BUFFER_VIEW);
if (!view)
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
vk_buffer_view_init(&device->vk, &view->vk, pCreateInfo);
enum pipe_format pfmt = vk_format_to_pipe_format(view->vk.format);
mali_ptr address = panvk_buffer_gpu_ptr(buffer, pCreateInfo->offset);
unsigned blksz = vk_format_get_blocksize(pCreateInfo->format);
assert(!(address & 63));
if (buffer->vk.usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
unsigned bo_size = pan_size(SURFACE_WITH_STRIDE);
view->bo = panvk_priv_bo_create(device, bo_size, 0, pAllocator,
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
pan_pack(view->bo->addr.host, SURFACE_WITH_STRIDE, cfg) {
cfg.pointer = address;
}
pan_pack(view->descs.tex, TEXTURE, cfg) {
cfg.dimension = MALI_TEXTURE_DIMENSION_1D;
cfg.format = GENX(panfrost_format_from_pipe_format)(pfmt)->hw;
cfg.width = view->vk.elements;
cfg.depth = cfg.height = 1;
cfg.swizzle = PAN_V6_SWIZZLE(R, G, B, A);
cfg.texel_ordering = MALI_TEXTURE_LAYOUT_LINEAR;
cfg.levels = 1;
cfg.array_size = 1;
cfg.surfaces = view->bo->addr.dev;
cfg.maximum_lod = cfg.minimum_lod = 0;
}
}
if (buffer->vk.usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
uint8_t *attrib_buf = (uint8_t *)view->descs.img_attrib_buf;
pan_pack(attrib_buf, ATTRIBUTE_BUFFER, cfg) {
cfg.type = MALI_ATTRIBUTE_TYPE_3D_LINEAR;
cfg.pointer = address;
cfg.stride = blksz;
cfg.size = view->vk.elements * blksz;
}
attrib_buf += pan_size(ATTRIBUTE_BUFFER);
pan_pack(attrib_buf, ATTRIBUTE_BUFFER_CONTINUATION_3D, cfg) {
cfg.s_dimension = view->vk.elements;
cfg.t_dimension = 1;
cfg.r_dimension = 1;
cfg.row_stride = view->vk.elements * blksz;
}
}
*pView = panvk_buffer_view_to_handle(view);
return VK_SUCCESS;
}