1 /* 2 * Copyright © 2021 Collabora Ltd. 3 * SPDX-License-Identifier: MIT 4 */ 5 6 #ifndef PANVK_META_H 7 #define PANVK_META_H 8 9 #include "panvk_image.h" 10 #include "panvk_mempool.h" 11 12 #include "vk_format.h" 13 #include "vk_meta.h" 14 15 static inline bool panvk_meta_copy_to_image_use_gfx_pipeline(struct panvk_image * dst_img)16panvk_meta_copy_to_image_use_gfx_pipeline(struct panvk_image *dst_img) 17 { 18 /* Writes to AFBC images must go through the graphics pipeline. */ 19 if (drm_is_afbc(dst_img->pimage.layout.modifier)) 20 return true; 21 22 return false; 23 } 24 25 static inline VkFormat panvk_meta_get_uint_format_for_blk_size(unsigned blk_sz)26panvk_meta_get_uint_format_for_blk_size(unsigned blk_sz) 27 { 28 switch (blk_sz) { 29 case 1: 30 return VK_FORMAT_R8_UINT; 31 case 2: 32 return VK_FORMAT_R16_UINT; 33 case 3: 34 return VK_FORMAT_R8G8B8_UINT; 35 case 4: 36 return VK_FORMAT_R32_UINT; 37 case 6: 38 return VK_FORMAT_R16G16B16_UINT; 39 case 8: 40 return VK_FORMAT_R32G32_UINT; 41 case 12: 42 return VK_FORMAT_R32G32B32_UINT; 43 case 16: 44 return VK_FORMAT_R32G32B32A32_UINT; 45 default: 46 return VK_FORMAT_UNDEFINED; 47 } 48 } 49 50 static inline struct vk_meta_copy_image_properties panvk_meta_copy_get_image_properties(struct panvk_image * img)51panvk_meta_copy_get_image_properties(struct panvk_image *img) 52 { 53 uint64_t mod = img->pimage.layout.modifier; 54 enum pipe_format pfmt = vk_format_to_pipe_format(img->vk.format); 55 unsigned blk_sz = util_format_get_blocksize(pfmt); 56 struct vk_meta_copy_image_properties props = {0}; 57 58 if (drm_is_afbc(mod)) { 59 if (!vk_format_is_depth_or_stencil(img->vk.format)) { 60 props.color.view_format = img->vk.format; 61 } else { 62 switch (img->vk.format) { 63 case VK_FORMAT_D24_UNORM_S8_UINT: 64 props.depth.view_format = VK_FORMAT_R8G8B8A8_UNORM; 65 props.depth.component_mask = BITFIELD_MASK(3); 66 props.stencil.view_format = VK_FORMAT_R8G8B8A8_UNORM; 67 props.stencil.component_mask = BITFIELD_BIT(3); 68 break; 69 case VK_FORMAT_X8_D24_UNORM_PACK32: 70 props.depth.view_format = VK_FORMAT_R8G8B8A8_UNORM; 71 props.depth.component_mask = BITFIELD_MASK(3); 72 break; 73 case VK_FORMAT_D16_UNORM: 74 props.depth.view_format = VK_FORMAT_R8G8_UNORM; 75 props.depth.component_mask = BITFIELD_MASK(2); 76 break; 77 default: 78 assert(!"Invalid ZS format"); 79 break; 80 } 81 } 82 } else if (vk_format_is_depth_or_stencil(img->vk.format)) { 83 switch (img->vk.format) { 84 case VK_FORMAT_S8_UINT: 85 props.stencil.view_format = VK_FORMAT_R8_UINT; 86 props.stencil.component_mask = BITFIELD_MASK(1); 87 break; 88 case VK_FORMAT_D24_UNORM_S8_UINT: 89 props.depth.view_format = VK_FORMAT_R8G8B8A8_UINT; 90 props.depth.component_mask = BITFIELD_MASK(3); 91 props.stencil.view_format = VK_FORMAT_R8G8B8A8_UINT; 92 props.stencil.component_mask = BITFIELD_BIT(3); 93 break; 94 case VK_FORMAT_X8_D24_UNORM_PACK32: 95 props.depth.view_format = VK_FORMAT_R8G8B8A8_UINT; 96 props.depth.component_mask = BITFIELD_MASK(3); 97 break; 98 case VK_FORMAT_D32_SFLOAT_S8_UINT: 99 props.depth.view_format = VK_FORMAT_R32G32_UINT; 100 props.depth.component_mask = BITFIELD_BIT(0); 101 props.stencil.view_format = VK_FORMAT_R32G32_UINT; 102 props.stencil.component_mask = BITFIELD_BIT(1); 103 break; 104 case VK_FORMAT_D16_UNORM: 105 props.depth.view_format = VK_FORMAT_R16_UINT; 106 props.depth.component_mask = BITFIELD_BIT(0); 107 break; 108 case VK_FORMAT_D32_SFLOAT: 109 props.depth.view_format = VK_FORMAT_R32_UINT; 110 props.depth.component_mask = BITFIELD_BIT(0); 111 break; 112 default: 113 assert(!"Invalid ZS format"); 114 break; 115 } 116 } else { 117 props.color.view_format = panvk_meta_get_uint_format_for_blk_size(blk_sz); 118 } 119 120 if (mod == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED || 121 drm_is_afbc(mod)) { 122 props.tile_size.width = 16; 123 props.tile_size.height = 16; 124 props.tile_size.depth = 1; 125 } else { 126 /* When linear, pretend we have a 1D-tile so we end up with a <64,1,1> 127 * workgroup. */ 128 props.tile_size.width = 64; 129 props.tile_size.height = 1; 130 props.tile_size.depth = 1; 131 } 132 133 return props; 134 } 135 136 #if defined(PAN_ARCH) && PAN_ARCH <= 7 137 void panvk_per_arch(meta_desc_copy_init)(struct panvk_device *dev); 138 139 void panvk_per_arch(meta_desc_copy_cleanup)(struct panvk_device *dev); 140 141 struct panvk_cmd_buffer; 142 struct panvk_descriptor_state; 143 struct panvk_device; 144 struct panvk_shader; 145 struct panvk_shader_desc_state; 146 147 VkResult panvk_per_arch(meta_get_copy_desc_job)( 148 struct panvk_cmd_buffer *cmdbuf, const struct panvk_shader *shader, 149 const struct panvk_descriptor_state *desc_state, 150 const struct panvk_shader_desc_state *shader_desc_state, 151 uint32_t attrib_buf_idx_offset, struct panfrost_ptr *job_desc); 152 #endif 153 154 #endif 155