| /* Copyright © 2024 Intel Corporation |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #include "anv_private.h" |
| |
| 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) |
| { |
| anv_fill_buffer_surface_state(device, |
| state->state_data.data, |
| format, swizzle, usage, |
| address, range, stride); |
| |
| if (state->state.map) |
| memcpy(state->state.map, state->state_data.data, ANV_SURFACE_STATE_SIZE); |
| } |
| |
| VkResult |
| anv_CreateBufferView(VkDevice _device, |
| const VkBufferViewCreateInfo *pCreateInfo, |
| const VkAllocationCallbacks *pAllocator, |
| VkBufferView *pView) |
| { |
| ANV_FROM_HANDLE(anv_device, device, _device); |
| ANV_FROM_HANDLE(anv_buffer, buffer, pCreateInfo->buffer); |
| struct anv_buffer_view *view; |
| |
| view = vk_buffer_view_create(&device->vk, pCreateInfo, |
| pAllocator, sizeof(*view)); |
| if (!view) |
| return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); |
| |
| const VkBufferUsageFlags2CreateInfoKHR *view_usage_info = |
| vk_find_struct_const(pCreateInfo->pNext, BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR); |
| const VkBufferUsageFlags buffer_usage = |
| view_usage_info != NULL ? view_usage_info->usage : buffer->vk.usage; |
| |
| struct anv_format_plane format; |
| format = anv_get_format_plane(device->info, pCreateInfo->format, |
| 0, VK_IMAGE_TILING_LINEAR); |
| |
| const uint32_t format_bs = isl_format_get_layout(format.isl_format)->bpb / 8; |
| const uint32_t align_range = |
| align_down_npot_u32(view->vk.range, format_bs); |
| |
| view->address = anv_address_add(buffer->address, pCreateInfo->offset); |
| |
| if (buffer_usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) { |
| view->general.state = anv_device_maybe_alloc_surface_state(device, NULL); |
| |
| anv_fill_buffer_view_surface_state(device, |
| &view->general, |
| format.isl_format, |
| format.swizzle, |
| ISL_SURF_USAGE_TEXTURE_BIT, |
| view->address, align_range, format_bs); |
| } else { |
| view->general.state = ANV_STATE_NULL; |
| } |
| |
| if (buffer_usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) { |
| view->storage.state = anv_device_maybe_alloc_surface_state(device, NULL); |
| |
| anv_fill_buffer_view_surface_state(device, |
| &view->storage, |
| format.isl_format, format.swizzle, |
| ISL_SURF_USAGE_STORAGE_BIT, |
| view->address, align_range, format_bs); |
| } else { |
| view->storage.state = ANV_STATE_NULL; |
| } |
| |
| *pView = anv_buffer_view_to_handle(view); |
| |
| return VK_SUCCESS; |
| } |
| |
| void |
| anv_DestroyBufferView(VkDevice _device, VkBufferView bufferView, |
| const VkAllocationCallbacks *pAllocator) |
| { |
| ANV_FROM_HANDLE(anv_device, device, _device); |
| ANV_FROM_HANDLE(anv_buffer_view, view, bufferView); |
| |
| if (!view) |
| return; |
| |
| if (view->general.state.alloc_size > 0) { |
| anv_state_pool_free(&device->bindless_surface_state_pool, |
| view->general.state); |
| } |
| |
| if (view->storage.state.alloc_size > 0) { |
| anv_state_pool_free(&device->bindless_surface_state_pool, |
| view->storage.state); |
| } |
| |
| vk_buffer_view_destroy(&device->vk, pAllocator, &view->vk); |
| } |