xref: /aosp_15_r20/external/mesa3d/src/amd/vulkan/radv_buffer_view.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2016 Red Hat.
3  * Copyright © 2016 Bas Nieuwenhuizen
4  *
5  * based in part on anv driver which is:
6  * Copyright © 2015 Intel Corporation
7  *
8  * SPDX-License-Identifier: MIT
9  */
10 
11 #include "ac_descriptors.h"
12 #include "gfx10_format_table.h"
13 
14 #include "radv_buffer.h"
15 #include "radv_buffer_view.h"
16 #include "radv_entrypoints.h"
17 #include "radv_formats.h"
18 #include "radv_image.h"
19 
20 #include "vk_log.h"
21 
22 void
radv_make_texel_buffer_descriptor(struct radv_device * device,uint64_t va,VkFormat vk_format,unsigned offset,unsigned range,uint32_t * state)23 radv_make_texel_buffer_descriptor(struct radv_device *device, uint64_t va, VkFormat vk_format, unsigned offset,
24                                   unsigned range, uint32_t *state)
25 {
26    const struct radv_physical_device *pdev = radv_device_physical(device);
27    const struct util_format_description *desc;
28    unsigned stride;
29    enum pipe_swizzle swizzle[4];
30 
31    desc = vk_format_description(vk_format);
32    stride = desc->block.bits / 8;
33 
34    radv_compose_swizzle(desc, NULL, swizzle);
35 
36    va += offset;
37 
38    if (pdev->info.gfx_level != GFX8 && stride) {
39       range /= stride;
40    }
41 
42    const struct ac_buffer_state ac_state = {
43       .va = va,
44       .size = range,
45       .format = vk_format_to_pipe_format(vk_format),
46       .swizzle =
47          {
48             swizzle[0],
49             swizzle[1],
50             swizzle[2],
51             swizzle[3],
52          },
53       .stride = stride,
54       .gfx10_oob_select = V_008F0C_OOB_SELECT_STRUCTURED_WITH_OFFSET,
55    };
56 
57    ac_build_buffer_descriptor(pdev->info.gfx_level, &ac_state, state);
58 }
59 
60 void
radv_buffer_view_init(struct radv_buffer_view * view,struct radv_device * device,const VkBufferViewCreateInfo * pCreateInfo)61 radv_buffer_view_init(struct radv_buffer_view *view, struct radv_device *device,
62                       const VkBufferViewCreateInfo *pCreateInfo)
63 {
64    VK_FROM_HANDLE(radv_buffer, buffer, pCreateInfo->buffer);
65    uint64_t va = radv_buffer_get_va(buffer->bo) + buffer->offset;
66 
67    vk_buffer_view_init(&device->vk, &view->vk, pCreateInfo);
68 
69    view->bo = buffer->bo;
70 
71    radv_make_texel_buffer_descriptor(device, va, view->vk.format, view->vk.offset, view->vk.range, view->state);
72 }
73 
74 void
radv_buffer_view_finish(struct radv_buffer_view * view)75 radv_buffer_view_finish(struct radv_buffer_view *view)
76 {
77    vk_buffer_view_finish(&view->vk);
78 }
79 
80 VKAPI_ATTR VkResult VKAPI_CALL
radv_CreateBufferView(VkDevice _device,const VkBufferViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBufferView * pView)81 radv_CreateBufferView(VkDevice _device, const VkBufferViewCreateInfo *pCreateInfo,
82                       const VkAllocationCallbacks *pAllocator, VkBufferView *pView)
83 {
84    VK_FROM_HANDLE(radv_device, device, _device);
85    struct radv_buffer_view *view;
86 
87    view = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*view), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
88    if (!view)
89       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
90 
91    radv_buffer_view_init(view, device, pCreateInfo);
92 
93    *pView = radv_buffer_view_to_handle(view);
94 
95    return VK_SUCCESS;
96 }
97 
98 VKAPI_ATTR void VKAPI_CALL
radv_DestroyBufferView(VkDevice _device,VkBufferView bufferView,const VkAllocationCallbacks * pAllocator)99 radv_DestroyBufferView(VkDevice _device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator)
100 {
101    VK_FROM_HANDLE(radv_device, device, _device);
102    VK_FROM_HANDLE(radv_buffer_view, view, bufferView);
103 
104    if (!view)
105       return;
106 
107    radv_buffer_view_finish(view);
108    vk_free2(&device->vk.alloc, pAllocator, view);
109 }
110