| /* |
| * Copyright © 2021 Collabora Ltd. |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #ifndef PANVK_META_H |
| #define PANVK_META_H |
| |
| #include "panvk_image.h" |
| #include "panvk_mempool.h" |
| |
| #include "vk_format.h" |
| #include "vk_meta.h" |
| |
| enum panvk_meta_object_key_type { |
| PANVK_META_OBJECT_KEY_BLEND_SHADER = VK_META_OBJECT_KEY_DRIVER_OFFSET, |
| PANVK_META_OBJECT_KEY_COPY_DESC_SHADER, |
| PANVK_META_OBJECT_KEY_FB_PRELOAD_SHADER, |
| PANVK_META_OBJECT_KEY_CLEAR_QUERY_POOL_PIPELINE, |
| PANVK_META_OBJECT_KEY_COPY_QUERY_POOL_RESULTS_OQ_PIPELINE, |
| }; |
| |
| static inline VkFormat |
| panvk_meta_get_uint_format_for_blk_size(unsigned blk_sz) |
| { |
| switch (blk_sz) { |
| case 1: |
| return VK_FORMAT_R8_UINT; |
| case 2: |
| return VK_FORMAT_R16_UINT; |
| case 3: |
| return VK_FORMAT_R8G8B8_UINT; |
| case 4: |
| return VK_FORMAT_R32_UINT; |
| case 6: |
| return VK_FORMAT_R16G16B16_UINT; |
| case 8: |
| return VK_FORMAT_R32G32_UINT; |
| case 12: |
| return VK_FORMAT_R32G32B32_UINT; |
| case 16: |
| return VK_FORMAT_R32G32B32A32_UINT; |
| default: |
| return VK_FORMAT_UNDEFINED; |
| } |
| } |
| |
| static inline struct vk_meta_copy_image_properties |
| panvk_meta_copy_get_image_properties(struct panvk_image *img) |
| { |
| uint64_t mod = img->vk.drm_format_mod; |
| enum pipe_format pfmt = vk_format_to_pipe_format(img->vk.format); |
| unsigned blk_sz = util_format_get_blocksize(pfmt); |
| struct vk_meta_copy_image_properties props; |
| memset(&props, 0, sizeof(props)); |
| |
| if (drm_is_afbc(mod)) { |
| if (!vk_format_is_depth_or_stencil(img->vk.format)) { |
| props.color.view_format = img->vk.format; |
| } else { |
| switch (img->vk.format) { |
| case VK_FORMAT_D24_UNORM_S8_UINT: |
| props.depth.view_format = VK_FORMAT_R8G8B8A8_UNORM; |
| props.depth.component_mask = BITFIELD_MASK(3); |
| props.stencil.view_format = VK_FORMAT_R8G8B8A8_UNORM; |
| props.stencil.component_mask = BITFIELD_BIT(3); |
| break; |
| case VK_FORMAT_X8_D24_UNORM_PACK32: |
| props.depth.view_format = VK_FORMAT_R8G8B8A8_UNORM; |
| props.depth.component_mask = BITFIELD_MASK(3); |
| break; |
| case VK_FORMAT_D16_UNORM: |
| props.depth.view_format = VK_FORMAT_R8G8_UNORM; |
| props.depth.component_mask = BITFIELD_MASK(2); |
| break; |
| default: |
| assert(!"Invalid ZS format"); |
| break; |
| } |
| } |
| } else if (vk_format_is_depth_or_stencil(img->vk.format)) { |
| switch (img->vk.format) { |
| case VK_FORMAT_S8_UINT: |
| props.stencil.view_format = VK_FORMAT_R8_UINT; |
| props.stencil.component_mask = BITFIELD_MASK(1); |
| break; |
| case VK_FORMAT_D24_UNORM_S8_UINT: |
| props.depth.view_format = VK_FORMAT_R8G8B8A8_UINT; |
| props.depth.component_mask = BITFIELD_MASK(3); |
| props.stencil.view_format = VK_FORMAT_R8G8B8A8_UINT; |
| props.stencil.component_mask = BITFIELD_BIT(3); |
| break; |
| case VK_FORMAT_X8_D24_UNORM_PACK32: |
| props.depth.view_format = VK_FORMAT_R8G8B8A8_UINT; |
| props.depth.component_mask = BITFIELD_MASK(3); |
| break; |
| case VK_FORMAT_D32_SFLOAT_S8_UINT: |
| props.depth.view_format = VK_FORMAT_R32_UINT; |
| props.depth.component_mask = BITFIELD_BIT(0); |
| props.stencil.view_format = VK_FORMAT_R8_UINT; |
| props.stencil.component_mask = BITFIELD_BIT(0); |
| break; |
| case VK_FORMAT_D16_UNORM: |
| props.depth.view_format = VK_FORMAT_R16_UINT; |
| props.depth.component_mask = BITFIELD_BIT(0); |
| break; |
| case VK_FORMAT_D32_SFLOAT: |
| props.depth.view_format = VK_FORMAT_R32_UINT; |
| props.depth.component_mask = BITFIELD_BIT(0); |
| break; |
| default: |
| assert(!"Invalid ZS format"); |
| break; |
| } |
| } else { |
| props.color.view_format = panvk_meta_get_uint_format_for_blk_size(blk_sz); |
| } |
| |
| if (mod == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED || |
| drm_is_afbc(mod)) { |
| props.tile_size.width = 16; |
| props.tile_size.height = 16; |
| props.tile_size.depth = 1; |
| } else { |
| /* When linear, pretend we have a 1D-tile so we end up with a <64,1,1> |
| * workgroup. */ |
| props.tile_size.width = 64; |
| props.tile_size.height = 1; |
| props.tile_size.depth = 1; |
| } |
| |
| return props; |
| } |
| |
| #if defined(PAN_ARCH) && PAN_ARCH <= 7 |
| struct panvk_cmd_buffer; |
| struct panvk_descriptor_state; |
| struct panvk_device; |
| struct panvk_shader; |
| struct panvk_shader_desc_state; |
| |
| VkResult panvk_per_arch(meta_get_copy_desc_job)( |
| struct panvk_cmd_buffer *cmdbuf, const struct panvk_shader *shader, |
| const struct panvk_descriptor_state *desc_state, |
| const struct panvk_shader_desc_state *shader_desc_state, |
| uint32_t attrib_buf_idx_offset, struct panfrost_ptr *job_desc); |
| #endif |
| |
| #endif |