Module: Mesa Branch: main Commit: 1db86d93f270a3815d5f8d993b75d10573a1b9d0 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1db86d93f270a3815d5f8d993b75d10573a1b9d0
Author: Samuel Pitoiset <[email protected]> Date: Fri Dec 15 09:29:05 2023 +0100 radv: move buffer view related code to radv_buffer_view.c More code isolation. Signed-off-by: Samuel Pitoiset <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26713> --- src/amd/vulkan/meson.build | 1 + src/amd/vulkan/radv_buffer_view.c | 149 ++++++++++++++++++++++++++++++++++++++ src/amd/vulkan/radv_image.c | 123 +------------------------------ src/amd/vulkan/radv_private.h | 5 ++ 4 files changed, 157 insertions(+), 121 deletions(-) diff --git a/src/amd/vulkan/meson.build b/src/amd/vulkan/meson.build index 27f3277785f..b5febfd4423 100644 --- a/src/amd/vulkan/meson.build +++ b/src/amd/vulkan/meson.build @@ -97,6 +97,7 @@ libradv_files = files( 'radv_acceleration_structure.c', 'radv_android.c', 'radv_buffer.c', + 'radv_buffer_view.c', 'radv_cmd_buffer.c', 'radv_cp_reg_shadowing.c', 'radv_cs.h', diff --git a/src/amd/vulkan/radv_buffer_view.c b/src/amd/vulkan/radv_buffer_view.c new file mode 100644 index 00000000000..f1e09d49dfe --- /dev/null +++ b/src/amd/vulkan/radv_buffer_view.c @@ -0,0 +1,149 @@ +/* + * Copyright © 2016 Red Hat. + * Copyright © 2016 Bas Nieuwenhuizen + * + * based in part on anv driver which is: + * Copyright © 2015 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "gfx10_format_table.h" + +#include "radv_private.h" + +void +radv_make_texel_buffer_descriptor(struct radv_device *device, uint64_t va, VkFormat vk_format, unsigned offset, + unsigned range, uint32_t *state) +{ + const struct util_format_description *desc; + unsigned stride; + unsigned num_format, data_format; + int first_non_void; + enum pipe_swizzle swizzle[4]; + unsigned rsrc_word3; + + desc = vk_format_description(vk_format); + first_non_void = vk_format_get_first_non_void_channel(vk_format); + stride = desc->block.bits / 8; + + radv_compose_swizzle(desc, NULL, swizzle); + + va += offset; + + if (device->physical_device->rad_info.gfx_level != GFX8 && stride) { + range /= stride; + } + + rsrc_word3 = S_008F0C_DST_SEL_X(radv_map_swizzle(swizzle[0])) | S_008F0C_DST_SEL_Y(radv_map_swizzle(swizzle[1])) | + S_008F0C_DST_SEL_Z(radv_map_swizzle(swizzle[2])) | S_008F0C_DST_SEL_W(radv_map_swizzle(swizzle[3])); + + if (device->physical_device->rad_info.gfx_level >= GFX10) { + const struct gfx10_format *fmt = + &ac_get_gfx10_format_table(&device->physical_device->rad_info)[vk_format_to_pipe_format(vk_format)]; + + /* OOB_SELECT chooses the out-of-bounds check. + * + * GFX10: + * - 0: (index >= NUM_RECORDS) || (offset >= STRIDE) + * - 1: index >= NUM_RECORDS + * - 2: NUM_RECORDS == 0 + * - 3: if SWIZZLE_ENABLE: + * swizzle_address >= NUM_RECORDS + * else: + * offset >= NUM_RECORDS + * + * GFX11: + * - 0: (index >= NUM_RECORDS) || (offset+payload > STRIDE) + * - 1: index >= NUM_RECORDS + * - 2: NUM_RECORDS == 0 + * - 3: if SWIZZLE_ENABLE && STRIDE: + * (index >= NUM_RECORDS) || ( offset+payload > STRIDE) + * else: + * offset+payload > NUM_RECORDS + */ + rsrc_word3 |= S_008F0C_FORMAT(fmt->img_format) | S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_STRUCTURED_WITH_OFFSET) | + S_008F0C_RESOURCE_LEVEL(device->physical_device->rad_info.gfx_level < GFX11); + } else { + num_format = radv_translate_buffer_numformat(desc, first_non_void); + data_format = radv_translate_buffer_dataformat(desc, first_non_void); + + assert(data_format != V_008F0C_BUF_DATA_FORMAT_INVALID); + assert(num_format != ~0); + + rsrc_word3 |= S_008F0C_NUM_FORMAT(num_format) | S_008F0C_DATA_FORMAT(data_format); + } + + state[0] = va; + state[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) | S_008F04_STRIDE(stride); + state[2] = range; + state[3] = rsrc_word3; +} + +void +radv_buffer_view_init(struct radv_buffer_view *view, struct radv_device *device, + const VkBufferViewCreateInfo *pCreateInfo) +{ + RADV_FROM_HANDLE(radv_buffer, buffer, pCreateInfo->buffer); + uint64_t va = radv_buffer_get_va(buffer->bo) + buffer->offset; + + vk_buffer_view_init(&device->vk, &view->vk, pCreateInfo); + + view->bo = buffer->bo; + + radv_make_texel_buffer_descriptor(device, va, view->vk.format, view->vk.offset, view->vk.range, view->state); +} + +void +radv_buffer_view_finish(struct radv_buffer_view *view) +{ + vk_buffer_view_finish(&view->vk); +} + +VKAPI_ATTR VkResult VKAPI_CALL +radv_CreateBufferView(VkDevice _device, const VkBufferViewCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkBufferView *pView) +{ + RADV_FROM_HANDLE(radv_device, device, _device); + struct radv_buffer_view *view; + + view = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*view), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!view) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + radv_buffer_view_init(view, device, pCreateInfo); + + *pView = radv_buffer_view_to_handle(view); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +radv_DestroyBufferView(VkDevice _device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) +{ + RADV_FROM_HANDLE(radv_device, device, _device); + RADV_FROM_HANDLE(radv_buffer_view, view, bufferView); + + if (!view) + return; + + radv_buffer_view_finish(view); + vk_free2(&device->vk.alloc, pAllocator, view); +} diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index 675eabc90b4..917ede72d59 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -674,7 +674,7 @@ si_tile_mode_index(const struct radv_image_plane *plane, unsigned level, bool st return plane->surface.u.legacy.tiling_index[level]; } -static unsigned +unsigned radv_map_swizzle(unsigned swizzle) { switch (swizzle) { @@ -693,7 +693,7 @@ radv_map_swizzle(unsigned swizzle) } } -static void +void radv_compose_swizzle(const struct util_format_description *desc, const VkComponentMapping *mapping, enum pipe_swizzle swizzle[4]) { @@ -722,74 +722,6 @@ radv_compose_swizzle(const struct util_format_description *desc, const VkCompone } } -void -radv_make_texel_buffer_descriptor(struct radv_device *device, uint64_t va, VkFormat vk_format, unsigned offset, - unsigned range, uint32_t *state) -{ - const struct util_format_description *desc; - unsigned stride; - unsigned num_format, data_format; - int first_non_void; - enum pipe_swizzle swizzle[4]; - unsigned rsrc_word3; - - desc = vk_format_description(vk_format); - first_non_void = vk_format_get_first_non_void_channel(vk_format); - stride = desc->block.bits / 8; - - radv_compose_swizzle(desc, NULL, swizzle); - - va += offset; - - if (device->physical_device->rad_info.gfx_level != GFX8 && stride) { - range /= stride; - } - - rsrc_word3 = S_008F0C_DST_SEL_X(radv_map_swizzle(swizzle[0])) | S_008F0C_DST_SEL_Y(radv_map_swizzle(swizzle[1])) | - S_008F0C_DST_SEL_Z(radv_map_swizzle(swizzle[2])) | S_008F0C_DST_SEL_W(radv_map_swizzle(swizzle[3])); - - if (device->physical_device->rad_info.gfx_level >= GFX10) { - const struct gfx10_format *fmt = - &ac_get_gfx10_format_table(&device->physical_device->rad_info)[vk_format_to_pipe_format(vk_format)]; - - /* OOB_SELECT chooses the out-of-bounds check. - * - * GFX10: - * - 0: (index >= NUM_RECORDS) || (offset >= STRIDE) - * - 1: index >= NUM_RECORDS - * - 2: NUM_RECORDS == 0 - * - 3: if SWIZZLE_ENABLE: - * swizzle_address >= NUM_RECORDS - * else: - * offset >= NUM_RECORDS - * - * GFX11: - * - 0: (index >= NUM_RECORDS) || (offset+payload > STRIDE) - * - 1: index >= NUM_RECORDS - * - 2: NUM_RECORDS == 0 - * - 3: if SWIZZLE_ENABLE && STRIDE: - * (index >= NUM_RECORDS) || ( offset+payload > STRIDE) - * else: - * offset+payload > NUM_RECORDS - */ - rsrc_word3 |= S_008F0C_FORMAT(fmt->img_format) | S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_STRUCTURED_WITH_OFFSET) | - S_008F0C_RESOURCE_LEVEL(device->physical_device->rad_info.gfx_level < GFX11); - } else { - num_format = radv_translate_buffer_numformat(desc, first_non_void); - data_format = radv_translate_buffer_dataformat(desc, first_non_void); - - assert(data_format != V_008F0C_BUF_DATA_FORMAT_INVALID); - assert(num_format != ~0); - - rsrc_word3 |= S_008F0C_NUM_FORMAT(num_format) | S_008F0C_DATA_FORMAT(data_format); - } - - state[0] = va; - state[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) | S_008F04_STRIDE(stride); - state[2] = range; - state[3] = rsrc_word3; -} - static void si_set_mutable_tex_desc_fields(struct radv_device *device, struct radv_image *image, const struct legacy_surf_level *base_level_info, unsigned plane_id, unsigned base_level, @@ -2662,54 +2594,3 @@ radv_DestroyImageView(VkDevice _device, VkImageView _iview, const VkAllocationCa radv_image_view_finish(iview); vk_free2(&device->vk.alloc, pAllocator, iview); } - -void -radv_buffer_view_init(struct radv_buffer_view *view, struct radv_device *device, - const VkBufferViewCreateInfo *pCreateInfo) -{ - RADV_FROM_HANDLE(radv_buffer, buffer, pCreateInfo->buffer); - uint64_t va = radv_buffer_get_va(buffer->bo) + buffer->offset; - - vk_buffer_view_init(&device->vk, &view->vk, pCreateInfo); - - view->bo = buffer->bo; - - radv_make_texel_buffer_descriptor(device, va, view->vk.format, view->vk.offset, view->vk.range, view->state); -} - -void -radv_buffer_view_finish(struct radv_buffer_view *view) -{ - vk_buffer_view_finish(&view->vk); -} - -VKAPI_ATTR VkResult VKAPI_CALL -radv_CreateBufferView(VkDevice _device, const VkBufferViewCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkBufferView *pView) -{ - RADV_FROM_HANDLE(radv_device, device, _device); - struct radv_buffer_view *view; - - view = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*view), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (!view) - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - - radv_buffer_view_init(view, device, pCreateInfo); - - *pView = radv_buffer_view_to_handle(view); - - return VK_SUCCESS; -} - -VKAPI_ATTR void VKAPI_CALL -radv_DestroyBufferView(VkDevice _device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) -{ - RADV_FROM_HANDLE(radv_device, device, _device); - RADV_FROM_HANDLE(radv_buffer_view, view, bufferView); - - if (!view) - return; - - radv_buffer_view_finish(view); - vk_free2(&device->vk.alloc, pAllocator, view); -} diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index b5a6feba0a2..94e460f7ac2 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -2699,6 +2699,11 @@ void radv_image_view_finish(struct radv_image_view *iview); VkFormat radv_get_aspect_format(struct radv_image *image, VkImageAspectFlags mask); +void radv_compose_swizzle(const struct util_format_description *desc, const VkComponentMapping *mapping, + enum pipe_swizzle swizzle[4]); + +unsigned radv_map_swizzle(unsigned swizzle); + struct radv_buffer_view { struct vk_buffer_view vk; struct radeon_winsys_bo *bo;
