mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 18:40:13 +01:00
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Acked-by: Ivan Briano <ivan.briano@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30285>
106 lines
3.9 KiB
C
106 lines
3.9 KiB
C
/* 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);
|
|
}
|