• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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