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