xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/anv_buffer_view.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /* Copyright © 2024 Intel Corporation
2  * SPDX-License-Identifier: MIT
3  */
4 
5 #include "anv_private.h"
6 
7 static void
anv_fill_buffer_view_surface_state(struct anv_device * device,struct anv_buffer_state * state,enum isl_format format,struct isl_swizzle swizzle,isl_surf_usage_flags_t usage,struct anv_address address,uint32_t range,uint32_t stride)8 anv_fill_buffer_view_surface_state(struct anv_device *device,
9                                    struct anv_buffer_state *state,
10                                    enum isl_format format,
11                                    struct isl_swizzle swizzle,
12                                    isl_surf_usage_flags_t usage,
13                                    struct anv_address address,
14                                    uint32_t range, uint32_t stride)
15 {
16    anv_fill_buffer_surface_state(device,
17                                  state->state_data.data,
18                                  format, swizzle, usage,
19                                  address, range, stride);
20 
21    if (state->state.map)
22       memcpy(state->state.map, state->state_data.data, ANV_SURFACE_STATE_SIZE);
23 }
24 
25 VkResult
anv_CreateBufferView(VkDevice _device,const VkBufferViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBufferView * pView)26 anv_CreateBufferView(VkDevice _device,
27                      const VkBufferViewCreateInfo *pCreateInfo,
28                      const VkAllocationCallbacks *pAllocator,
29                      VkBufferView *pView)
30 {
31    ANV_FROM_HANDLE(anv_device, device, _device);
32    ANV_FROM_HANDLE(anv_buffer, buffer, pCreateInfo->buffer);
33    struct anv_buffer_view *view;
34 
35    view = vk_buffer_view_create(&device->vk, pCreateInfo,
36                                 pAllocator, sizeof(*view));
37    if (!view)
38       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
39 
40    const VkBufferUsageFlags2CreateInfoKHR *view_usage_info =
41       vk_find_struct_const(pCreateInfo->pNext, BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR);
42    const VkBufferUsageFlags buffer_usage =
43       view_usage_info != NULL ? view_usage_info->usage : buffer->vk.usage;
44 
45    struct anv_format_plane format;
46    format = anv_get_format_plane(device->info, pCreateInfo->format,
47                                  0, VK_IMAGE_TILING_LINEAR);
48 
49    const uint32_t format_bs = isl_format_get_layout(format.isl_format)->bpb / 8;
50    const uint32_t align_range =
51       align_down_npot_u32(view->vk.range, format_bs);
52 
53    view->address = anv_address_add(buffer->address, pCreateInfo->offset);
54 
55    if (buffer_usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
56       view->general.state = anv_device_maybe_alloc_surface_state(device, NULL);
57 
58       anv_fill_buffer_view_surface_state(device,
59                                          &view->general,
60                                          format.isl_format,
61                                          format.swizzle,
62                                          ISL_SURF_USAGE_TEXTURE_BIT,
63                                          view->address, align_range, format_bs);
64    } else {
65       view->general.state = ANV_STATE_NULL;
66    }
67 
68    if (buffer_usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
69       view->storage.state = anv_device_maybe_alloc_surface_state(device, NULL);
70 
71       anv_fill_buffer_view_surface_state(device,
72                                          &view->storage,
73                                          format.isl_format, format.swizzle,
74                                          ISL_SURF_USAGE_STORAGE_BIT,
75                                          view->address, align_range, format_bs);
76    } else {
77       view->storage.state = ANV_STATE_NULL;
78    }
79 
80    *pView = anv_buffer_view_to_handle(view);
81 
82    return VK_SUCCESS;
83 }
84 
85 void
anv_DestroyBufferView(VkDevice _device,VkBufferView bufferView,const VkAllocationCallbacks * pAllocator)86 anv_DestroyBufferView(VkDevice _device, VkBufferView bufferView,
87                       const VkAllocationCallbacks *pAllocator)
88 {
89    ANV_FROM_HANDLE(anv_device, device, _device);
90    ANV_FROM_HANDLE(anv_buffer_view, view, bufferView);
91 
92    if (!view)
93       return;
94 
95    if (view->general.state.alloc_size > 0) {
96       anv_state_pool_free(&device->bindless_surface_state_pool,
97                           view->general.state);
98    }
99 
100    if (view->storage.state.alloc_size > 0) {
101       anv_state_pool_free(&device->bindless_surface_state_pool,
102                           view->storage.state);
103    }
104 
105    vk_buffer_view_destroy(&device->vk, pAllocator, &view->vk);
106 }
107