blob: 6022cfbb2757917a75a43127e42670cb509a8985 [file] [log] [blame]
/*
* 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