From fedff04fbda0224452be6f6a04e4bd5a2f5ac3e2 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:11:50 -0600 Subject: [PATCH] nvk: Implement buffer views Part-of: --- src/nouveau/vulkan/nvk_buffer_view.c | 41 ++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/nouveau/vulkan/nvk_buffer_view.c b/src/nouveau/vulkan/nvk_buffer_view.c index 132587b4a87..57a5268fdbe 100644 --- a/src/nouveau/vulkan/nvk_buffer_view.c +++ b/src/nouveau/vulkan/nvk_buffer_view.c @@ -1,12 +1,32 @@ #include "nvk_buffer_view.h" +#include "nil_image.h" +#include "nil_format.h" +#include "nvk_buffer.h" #include "nvk_device.h" +#include "nvk_format.h" +#include "nvk_physical_device.h" +#include "vulkan/util/vk_format.h" VkFormatFeatureFlags2 nvk_get_buffer_format_features(struct nvk_physical_device *pdevice, - VkFormat format) + VkFormat vk_format) { - return 0; + VkFormatFeatureFlags2 features = 0; + + enum pipe_format p_format = vk_format_to_pipe_format(vk_format); + if (p_format == PIPE_FORMAT_NONE) + return 0; + + if (!util_format_is_compressed(p_format) && + !util_format_is_depth_or_stencil(p_format) && + nil_tic_format_for_pipe(p_format) != NULL) + features |= VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT; + + if (nvk_is_storage_image_format(vk_format)) + features |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT; + + return features; } VKAPI_ATTR VkResult VKAPI_CALL @@ -16,6 +36,7 @@ nvk_CreateBufferView(VkDevice _device, VkBufferView *pBufferView) { VK_FROM_HANDLE(nvk_device, device, _device); + VK_FROM_HANDLE(nvk_buffer, buffer, pCreateInfo->buffer); struct nvk_buffer_view *view; view = vk_buffer_view_create(&device->vk, pCreateInfo, @@ -23,6 +44,20 @@ nvk_CreateBufferView(VkDevice _device, if (!view) return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + uint32_t *desc_map = nvk_descriptor_table_alloc(device, &device->images, + &view->desc_index); + if (desc_map == NULL) { + vk_buffer_view_destroy(&device->vk, pAllocator, &view->vk); + return vk_errorf(device, VK_ERROR_OUT_OF_DEVICE_MEMORY, + "Failed to allocate image descriptor"); + } + + nil_buffer_fill_tic(nvk_device_physical(device)->dev, + nvk_buffer_address(buffer, view->vk.offset), + vk_format_to_pipe_format(view->vk.format), + view->vk.elements, + desc_map); + *pBufferView = nvk_buffer_view_to_handle(view); return VK_SUCCESS; @@ -39,5 +74,7 @@ nvk_DestroyBufferView(VkDevice _device, if (!view) return; + nvk_descriptor_table_free(device, &device->images, view->desc_index); + vk_buffer_view_destroy(&device->vk, pAllocator, &view->vk); }