1 /*
2 * Copyright © 2022 Collabora Ltd. and Red Hat Inc.
3 * SPDX-License-Identifier: MIT
4 */
5 #include "nvk_buffer_view.h"
6
7 #include "nil_format.h"
8 #include "nil_image.h"
9 #include "nvk_buffer.h"
10 #include "nvk_entrypoints.h"
11 #include "nvk_device.h"
12 #include "nvk_format.h"
13 #include "nvk_physical_device.h"
14
15 #include "vk_format.h"
16
17 VkFormatFeatureFlags2
nvk_get_buffer_format_features(struct nvk_physical_device * pdev,VkFormat vk_format)18 nvk_get_buffer_format_features(struct nvk_physical_device *pdev,
19 VkFormat vk_format)
20 {
21 VkFormatFeatureFlags2 features = 0;
22
23 if (nvk_get_va_format(pdev, vk_format))
24 features |= VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT;
25
26 enum pipe_format p_format = vk_format_to_pipe_format(vk_format);
27 if (nil_format_supports_buffer(&pdev->info, p_format)) {
28 features |= VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT;
29
30 if (nil_format_supports_storage(&pdev->info, p_format)) {
31 features |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT |
32 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT;
33 }
34
35 if (p_format == PIPE_FORMAT_R32_UINT || p_format == PIPE_FORMAT_R32_SINT)
36 features |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
37 }
38
39 return features;
40 }
41
42 VKAPI_ATTR VkResult VKAPI_CALL
nvk_CreateBufferView(VkDevice _device,const VkBufferViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBufferView * pBufferView)43 nvk_CreateBufferView(VkDevice _device,
44 const VkBufferViewCreateInfo *pCreateInfo,
45 const VkAllocationCallbacks *pAllocator,
46 VkBufferView *pBufferView)
47 {
48 VK_FROM_HANDLE(nvk_device, device, _device);
49 VK_FROM_HANDLE(nvk_buffer, buffer, pCreateInfo->buffer);
50 struct nvk_buffer_view *view;
51 VkResult result;
52
53 view = vk_buffer_view_create(&device->vk, pCreateInfo,
54 pAllocator, sizeof(*view));
55 if (!view)
56 return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
57
58 uint32_t desc[8];
59 nil_buffer_fill_tic(&nvk_device_physical(device)->info,
60 nvk_buffer_address(buffer, view->vk.offset),
61 vk_format_to_pipe_format(view->vk.format),
62 view->vk.elements, desc);
63
64 result = nvk_descriptor_table_add(device, &device->images,
65 desc, sizeof(desc), &view->desc_index);
66 if (result != VK_SUCCESS) {
67 vk_buffer_view_destroy(&device->vk, pAllocator, &view->vk);
68 return result;
69 }
70
71 *pBufferView = nvk_buffer_view_to_handle(view);
72
73 return VK_SUCCESS;
74 }
75
76 VKAPI_ATTR void VKAPI_CALL
nvk_DestroyBufferView(VkDevice _device,VkBufferView bufferView,const VkAllocationCallbacks * pAllocator)77 nvk_DestroyBufferView(VkDevice _device,
78 VkBufferView bufferView,
79 const VkAllocationCallbacks *pAllocator)
80 {
81 VK_FROM_HANDLE(nvk_device, device, _device);
82 VK_FROM_HANDLE(nvk_buffer_view, view, bufferView);
83
84 if (!view)
85 return;
86
87 nvk_descriptor_table_remove(device, &device->images, view->desc_index);
88
89 vk_buffer_view_destroy(&device->vk, pAllocator, &view->vk);
90 }
91