diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index 828bb11adeb..46e9a4e7da2 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -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', diff --git a/src/panfrost/vulkan/panvk_buffer_view.h b/src/panfrost/vulkan/panvk_buffer_view.h new file mode 100644 index 00000000000..92e9bbdab65 --- /dev/null +++ b/src/panfrost/vulkan/panvk_buffer_view.h @@ -0,0 +1,30 @@ +/* + * Copyright © 2021 Collabora Ltd. + * SPDX-License-Identifier: MIT + */ + +#ifndef PANVK_BUFFER_VIEW_H +#define PANVK_BUFFER_VIEW_H + +#include + +#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 diff --git a/src/panfrost/vulkan/panvk_image.c b/src/panfrost/vulkan/panvk_image.c index 0b52f63d2fb..769bd055c90 100644 --- a/src/panfrost/vulkan/panvk_image.c +++ b/src/panfrost/vulkan/panvk_image.c @@ -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, diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h index fee8f86fbe5..67411f9a6ab 100644 --- a/src/panfrost/vulkan/panvk_private.h +++ b/src/panfrost/vulkan/panvk_private.h @@ -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, diff --git a/src/panfrost/vulkan/panvk_vX_buffer_view.c b/src/panfrost/vulkan/panvk_vX_buffer_view.c new file mode 100644 index 00000000000..1a418d946df --- /dev/null +++ b/src/panfrost/vulkan/panvk_vX_buffer_view.c @@ -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); +} diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c index 4f95ad51f0d..9e71d9cfc87 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c @@ -27,6 +27,7 @@ #include "genxml/gen_macros.h" +#include "panvk_buffer_view.h" #include "panvk_image.h" #include "panvk_private.h" diff --git a/src/panfrost/vulkan/panvk_vX_image.c b/src/panfrost/vulkan/panvk_vX_image.c index 822886dd1d9..ca7c0d6f851 100644 --- a/src/panfrost/vulkan/panvk_vX_image.c +++ b/src/panfrost/vulkan/panvk_vX_image.c @@ -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; -}