1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2017 Advanced Micro Devices, Inc. 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 5*61046927SAndroid Build Coastguard Worker */ 6*61046927SAndroid Build Coastguard Worker 7*61046927SAndroid Build Coastguard Worker #ifndef AC_SURFACE_H 8*61046927SAndroid Build Coastguard Worker #define AC_SURFACE_H 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker #include "amd_family.h" 11*61046927SAndroid Build Coastguard Worker #include "util/format/u_format.h" 12*61046927SAndroid Build Coastguard Worker 13*61046927SAndroid Build Coastguard Worker /* NIR is optional. Some components don't want to include NIR with ac_surface.h. */ 14*61046927SAndroid Build Coastguard Worker #ifdef AC_SURFACE_INCLUDE_NIR 15*61046927SAndroid Build Coastguard Worker #include "compiler/nir/nir_builder.h" 16*61046927SAndroid Build Coastguard Worker #endif 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard Worker #include <stdbool.h> 19*61046927SAndroid Build Coastguard Worker #include <stdint.h> 20*61046927SAndroid Build Coastguard Worker #include <stdio.h> 21*61046927SAndroid Build Coastguard Worker 22*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 23*61046927SAndroid Build Coastguard Worker extern "C" { 24*61046927SAndroid Build Coastguard Worker #endif 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Worker /* Forward declarations. */ 27*61046927SAndroid Build Coastguard Worker struct ac_addrlib; 28*61046927SAndroid Build Coastguard Worker 29*61046927SAndroid Build Coastguard Worker struct amdgpu_gpu_info; 30*61046927SAndroid Build Coastguard Worker struct radeon_info; 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_MAX_LEVELS 17 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Worker enum radeon_surf_mode 35*61046927SAndroid Build Coastguard Worker { 36*61046927SAndroid Build Coastguard Worker RADEON_SURF_MODE_LINEAR_ALIGNED = 1, 37*61046927SAndroid Build Coastguard Worker RADEON_SURF_MODE_1D = 2, 38*61046927SAndroid Build Coastguard Worker RADEON_SURF_MODE_2D = 3, 39*61046927SAndroid Build Coastguard Worker }; 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Worker /* This describes D/S/Z/R swizzle modes. 42*61046927SAndroid Build Coastguard Worker * Defined in the GB_TILE_MODEn.MICRO_TILE_MODE_NEW order. 43*61046927SAndroid Build Coastguard Worker */ 44*61046927SAndroid Build Coastguard Worker enum radeon_micro_mode 45*61046927SAndroid Build Coastguard Worker { 46*61046927SAndroid Build Coastguard Worker RADEON_MICRO_MODE_DISPLAY = 0, 47*61046927SAndroid Build Coastguard Worker RADEON_MICRO_MODE_STANDARD = 1, 48*61046927SAndroid Build Coastguard Worker RADEON_MICRO_MODE_DEPTH = 2, 49*61046927SAndroid Build Coastguard Worker RADEON_MICRO_MODE_RENDER = 3, /* gfx9 and older: rotated */ 50*61046927SAndroid Build Coastguard Worker }; 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker /* the first 16 bits are reserved for libdrm_radeon, don't use them */ 53*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_SCANOUT (1 << 16) 54*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_ZBUFFER (1 << 17) 55*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_SBUFFER (1 << 18) 56*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_Z_OR_SBUFFER (RADEON_SURF_ZBUFFER | RADEON_SURF_SBUFFER) 57*61046927SAndroid Build Coastguard Worker /* bits 19 and 20 are reserved for libdrm_radeon, don't use them */ 58*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_FMASK (1 << 21) 59*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_DISABLE_DCC (1ull << 22) 60*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_TC_COMPATIBLE_HTILE (1ull << 23) 61*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_IMPORTED (1ull << 24) 62*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_CONTIGUOUS_DCC_LAYERS (1ull << 25) 63*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_SHAREABLE (1ull << 26) 64*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_NO_RENDER_TARGET (1ull << 27) 65*61046927SAndroid Build Coastguard Worker /* Force a swizzle mode (gfx9+) or tile mode (gfx6-8). 66*61046927SAndroid Build Coastguard Worker * If this is not set, optimize for space. */ 67*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_FORCE_SWIZZLE_MODE (1ull << 28) 68*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_NO_FMASK (1ull << 29) 69*61046927SAndroid Build Coastguard Worker /* This disables HTILE on gfx6-11, and HiZ/HiS on gfx12, */ 70*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_NO_HTILE (1ull << 30) 71*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_FORCE_MICRO_TILE_MODE (1ull << 31) 72*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_PRT (1ull << 32) 73*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_VRS_RATE (1ull << 33) 74*61046927SAndroid Build Coastguard Worker /* Block compressed + linear format is not supported in addrlib. These surface can be 75*61046927SAndroid Build Coastguard Worker * used as transfer resource. This flag indicates not to set flags.texture flag for 76*61046927SAndroid Build Coastguard Worker * color surface in gfx9_compute_surface(). */ 77*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_NO_TEXTURE (1ull << 34) 78*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_NO_STENCIL_ADJUST (1ull << 35) 79*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_PREFER_4K_ALIGNMENT (1ull << 36) 80*61046927SAndroid Build Coastguard Worker #define RADEON_SURF_PREFER_64K_ALIGNMENT (1ull << 37) 81*61046927SAndroid Build Coastguard Worker 82*61046927SAndroid Build Coastguard Worker enum radeon_enc_hevc_surface_alignment 83*61046927SAndroid Build Coastguard Worker { 84*61046927SAndroid Build Coastguard Worker RADEON_ENC_HEVC_SURFACE_LOG2_WIDTH_ALIGNMENT = 6, 85*61046927SAndroid Build Coastguard Worker RADEON_ENC_HEVC_SURFACE_LOG2_HEIGHT_ALIGNMENT = 4, 86*61046927SAndroid Build Coastguard Worker }; 87*61046927SAndroid Build Coastguard Worker 88*61046927SAndroid Build Coastguard Worker struct legacy_surf_level { 89*61046927SAndroid Build Coastguard Worker uint32_t offset_256B; /* divided by 256, the hw can only do 40-bit addresses */ 90*61046927SAndroid Build Coastguard Worker uint32_t slice_size_dw; /* in dwords; max = 4GB / 4. */ 91*61046927SAndroid Build Coastguard Worker unsigned nblk_x : 15; 92*61046927SAndroid Build Coastguard Worker unsigned nblk_y : 15; 93*61046927SAndroid Build Coastguard Worker enum radeon_surf_mode mode : 2; 94*61046927SAndroid Build Coastguard Worker }; 95*61046927SAndroid Build Coastguard Worker 96*61046927SAndroid Build Coastguard Worker struct legacy_surf_dcc_level { 97*61046927SAndroid Build Coastguard Worker uint32_t dcc_offset; /* relative offset within DCC mip tree */ 98*61046927SAndroid Build Coastguard Worker uint32_t dcc_fast_clear_size; 99*61046927SAndroid Build Coastguard Worker uint32_t dcc_slice_fast_clear_size; 100*61046927SAndroid Build Coastguard Worker }; 101*61046927SAndroid Build Coastguard Worker 102*61046927SAndroid Build Coastguard Worker struct legacy_surf_fmask { 103*61046927SAndroid Build Coastguard Worker unsigned slice_tile_max; /* max 4M */ 104*61046927SAndroid Build Coastguard Worker uint8_t tiling_index; /* max 31 */ 105*61046927SAndroid Build Coastguard Worker uint8_t bankh; /* max 8 */ 106*61046927SAndroid Build Coastguard Worker uint16_t pitch_in_pixels; 107*61046927SAndroid Build Coastguard Worker }; 108*61046927SAndroid Build Coastguard Worker 109*61046927SAndroid Build Coastguard Worker struct legacy_surf_layout { 110*61046927SAndroid Build Coastguard Worker unsigned bankw : 4; /* max 8 */ 111*61046927SAndroid Build Coastguard Worker unsigned bankh : 4; /* max 8 */ 112*61046927SAndroid Build Coastguard Worker unsigned mtilea : 4; /* max 8 */ 113*61046927SAndroid Build Coastguard Worker unsigned tile_split : 13; /* max 4K */ 114*61046927SAndroid Build Coastguard Worker unsigned stencil_tile_split : 13; /* max 4K */ 115*61046927SAndroid Build Coastguard Worker unsigned pipe_config : 5; /* max 17 */ 116*61046927SAndroid Build Coastguard Worker unsigned num_banks : 5; /* max 16 */ 117*61046927SAndroid Build Coastguard Worker unsigned macro_tile_index : 4; /* max 15 */ 118*61046927SAndroid Build Coastguard Worker 119*61046927SAndroid Build Coastguard Worker /* Whether the depth miptree or stencil miptree as used by the DB are 120*61046927SAndroid Build Coastguard Worker * adjusted from their TC compatible form to ensure depth/stencil 121*61046927SAndroid Build Coastguard Worker * compatibility. If either is true, the corresponding plane cannot be 122*61046927SAndroid Build Coastguard Worker * sampled from. 123*61046927SAndroid Build Coastguard Worker */ 124*61046927SAndroid Build Coastguard Worker unsigned depth_adjusted : 1; 125*61046927SAndroid Build Coastguard Worker unsigned stencil_adjusted : 1; 126*61046927SAndroid Build Coastguard Worker 127*61046927SAndroid Build Coastguard Worker struct legacy_surf_level level[RADEON_SURF_MAX_LEVELS]; 128*61046927SAndroid Build Coastguard Worker uint8_t tiling_index[RADEON_SURF_MAX_LEVELS]; 129*61046927SAndroid Build Coastguard Worker 130*61046927SAndroid Build Coastguard Worker union { 131*61046927SAndroid Build Coastguard Worker /* Color layout */ 132*61046927SAndroid Build Coastguard Worker struct { 133*61046927SAndroid Build Coastguard Worker struct legacy_surf_dcc_level dcc_level[RADEON_SURF_MAX_LEVELS]; 134*61046927SAndroid Build Coastguard Worker struct legacy_surf_fmask fmask; 135*61046927SAndroid Build Coastguard Worker unsigned cmask_slice_tile_max; 136*61046927SAndroid Build Coastguard Worker } color; 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Worker /* Z/S layout */ 139*61046927SAndroid Build Coastguard Worker struct { 140*61046927SAndroid Build Coastguard Worker struct legacy_surf_level stencil_level[RADEON_SURF_MAX_LEVELS]; 141*61046927SAndroid Build Coastguard Worker uint8_t stencil_tiling_index[RADEON_SURF_MAX_LEVELS]; 142*61046927SAndroid Build Coastguard Worker } zs; 143*61046927SAndroid Build Coastguard Worker }; 144*61046927SAndroid Build Coastguard Worker }; 145*61046927SAndroid Build Coastguard Worker 146*61046927SAndroid Build Coastguard Worker /* Same as addrlib - AddrResourceType. */ 147*61046927SAndroid Build Coastguard Worker enum gfx9_resource_type 148*61046927SAndroid Build Coastguard Worker { 149*61046927SAndroid Build Coastguard Worker RADEON_RESOURCE_1D = 0, 150*61046927SAndroid Build Coastguard Worker RADEON_RESOURCE_2D, 151*61046927SAndroid Build Coastguard Worker RADEON_RESOURCE_3D, 152*61046927SAndroid Build Coastguard Worker }; 153*61046927SAndroid Build Coastguard Worker 154*61046927SAndroid Build Coastguard Worker struct gfx9_surf_meta_flags { 155*61046927SAndroid Build Coastguard Worker uint8_t rb_aligned : 1; /* optimal for RBs */ 156*61046927SAndroid Build Coastguard Worker uint8_t pipe_aligned : 1; /* optimal for L2 */ 157*61046927SAndroid Build Coastguard Worker uint8_t independent_64B_blocks : 1; 158*61046927SAndroid Build Coastguard Worker uint8_t independent_128B_blocks : 1; 159*61046927SAndroid Build Coastguard Worker uint8_t max_compressed_block_size : 2; 160*61046927SAndroid Build Coastguard Worker uint8_t display_equation_valid : 1; 161*61046927SAndroid Build Coastguard Worker }; 162*61046927SAndroid Build Coastguard Worker 163*61046927SAndroid Build Coastguard Worker struct gfx9_surf_meta_level { 164*61046927SAndroid Build Coastguard Worker unsigned offset; 165*61046927SAndroid Build Coastguard Worker unsigned size; /* the size of one level in one layer (the image is an array of layers 166*61046927SAndroid Build Coastguard Worker * where each layer has an array of levels) */ 167*61046927SAndroid Build Coastguard Worker }; 168*61046927SAndroid Build Coastguard Worker 169*61046927SAndroid Build Coastguard Worker /** 170*61046927SAndroid Build Coastguard Worker * Meta address equation. 171*61046927SAndroid Build Coastguard Worker * 172*61046927SAndroid Build Coastguard Worker * DCC/HTILE address equation for doing DCC/HTILE address computations in shaders. 173*61046927SAndroid Build Coastguard Worker * 174*61046927SAndroid Build Coastguard Worker * ac_surface_meta_address_test.c contains the reference implementation. 175*61046927SAndroid Build Coastguard Worker * ac_nir_{dcc,htile}_addr_from_coord is the NIR implementation. 176*61046927SAndroid Build Coastguard Worker * 177*61046927SAndroid Build Coastguard Worker * For DCC: 178*61046927SAndroid Build Coastguard Worker * The gfx9 equation doesn't support mipmapping. 179*61046927SAndroid Build Coastguard Worker * The gfx10 equation doesn't support mipmapping and MSAA. 180*61046927SAndroid Build Coastguard Worker * (those are also limitations of Addr2ComputeDccAddrFromCoord) 181*61046927SAndroid Build Coastguard Worker * 182*61046927SAndroid Build Coastguard Worker * For HTILE: 183*61046927SAndroid Build Coastguard Worker * The gfx9 equation isn't implemented. 184*61046927SAndroid Build Coastguard Worker * The gfx10 equation doesn't support mipmapping. 185*61046927SAndroid Build Coastguard Worker */ 186*61046927SAndroid Build Coastguard Worker struct gfx9_meta_equation { 187*61046927SAndroid Build Coastguard Worker uint16_t meta_block_width; 188*61046927SAndroid Build Coastguard Worker uint16_t meta_block_height; 189*61046927SAndroid Build Coastguard Worker uint16_t meta_block_depth; 190*61046927SAndroid Build Coastguard Worker 191*61046927SAndroid Build Coastguard Worker union { 192*61046927SAndroid Build Coastguard Worker /* The gfx9 DCC equation is chip-specific, and it varies with: 193*61046927SAndroid Build Coastguard Worker * - resource type 194*61046927SAndroid Build Coastguard Worker * - swizzle_mode 195*61046927SAndroid Build Coastguard Worker * - bpp 196*61046927SAndroid Build Coastguard Worker * - number of samples 197*61046927SAndroid Build Coastguard Worker * - number of fragments 198*61046927SAndroid Build Coastguard Worker * - pipe_aligned 199*61046927SAndroid Build Coastguard Worker * - rb_aligned 200*61046927SAndroid Build Coastguard Worker */ 201*61046927SAndroid Build Coastguard Worker struct { 202*61046927SAndroid Build Coastguard Worker uint8_t num_bits; 203*61046927SAndroid Build Coastguard Worker uint8_t num_pipe_bits; 204*61046927SAndroid Build Coastguard Worker 205*61046927SAndroid Build Coastguard Worker struct { 206*61046927SAndroid Build Coastguard Worker struct { 207*61046927SAndroid Build Coastguard Worker uint8_t dim:3; /* 0..4 */ 208*61046927SAndroid Build Coastguard Worker uint8_t ord:5; /* 0..31 */ 209*61046927SAndroid Build Coastguard Worker } coord[5]; /* 0..num_coords-1 */ 210*61046927SAndroid Build Coastguard Worker } bit[20]; /* 0..num_bits-1 */ 211*61046927SAndroid Build Coastguard Worker } gfx9; 212*61046927SAndroid Build Coastguard Worker 213*61046927SAndroid Build Coastguard Worker /* The gfx10 DCC equation is chip-specific, it requires 64KB_R_X, and it varies with: 214*61046927SAndroid Build Coastguard Worker * - bpp 215*61046927SAndroid Build Coastguard Worker * - number of samples 216*61046927SAndroid Build Coastguard Worker * - number of fragments 217*61046927SAndroid Build Coastguard Worker * - pipe_aligned 218*61046927SAndroid Build Coastguard Worker * 219*61046927SAndroid Build Coastguard Worker * The gfx10 HTILE equation is chip-specific, it requires 64KB_Z_X, and it varies with: 220*61046927SAndroid Build Coastguard Worker * - number of samples 221*61046927SAndroid Build Coastguard Worker */ 222*61046927SAndroid Build Coastguard Worker uint16_t gfx10_bits[64]; 223*61046927SAndroid Build Coastguard Worker } u; 224*61046927SAndroid Build Coastguard Worker }; 225*61046927SAndroid Build Coastguard Worker 226*61046927SAndroid Build Coastguard Worker struct gfx12_hiz_his_layout { 227*61046927SAndroid Build Coastguard Worker uint64_t offset; 228*61046927SAndroid Build Coastguard Worker uint32_t size; 229*61046927SAndroid Build Coastguard Worker uint16_t width_in_tiles; 230*61046927SAndroid Build Coastguard Worker uint16_t height_in_tiles; 231*61046927SAndroid Build Coastguard Worker uint8_t swizzle_mode; 232*61046927SAndroid Build Coastguard Worker uint8_t alignment_log2; 233*61046927SAndroid Build Coastguard Worker }; 234*61046927SAndroid Build Coastguard Worker 235*61046927SAndroid Build Coastguard Worker struct gfx9_surf_layout { 236*61046927SAndroid Build Coastguard Worker uint16_t epitch; /* gfx9 only, not on gfx10 */ 237*61046927SAndroid Build Coastguard Worker uint8_t swizzle_mode; /* color or depth */ 238*61046927SAndroid Build Coastguard Worker bool uses_custom_pitch; /* only used by gfx10.3+ */ 239*61046927SAndroid Build Coastguard Worker bool gfx12_enable_dcc; /* set AMDGPU_GEM_CREATE_GFX12_DCC if the placement is VRAM */ 240*61046927SAndroid Build Coastguard Worker 241*61046927SAndroid Build Coastguard Worker enum gfx9_resource_type resource_type:8; /* 1D, 2D or 3D */ 242*61046927SAndroid Build Coastguard Worker uint32_t surf_pitch; /* up to 64K (in blocks) */ 243*61046927SAndroid Build Coastguard Worker uint32_t surf_height; /* up to 64K */ 244*61046927SAndroid Build Coastguard Worker 245*61046927SAndroid Build Coastguard Worker uint64_t surf_offset; /* 0 unless imported with an offset */ 246*61046927SAndroid Build Coastguard Worker /* The size of the 2D plane containing all mipmap levels. */ 247*61046927SAndroid Build Coastguard Worker uint64_t surf_slice_size; 248*61046927SAndroid Build Coastguard Worker /* Mipmap level offset within the slice in bytes. Only valid for LINEAR. */ 249*61046927SAndroid Build Coastguard Worker uint64_t offset[RADEON_SURF_MAX_LEVELS]; /* up to 64K * 64K * 16 * ~1.33 */ 250*61046927SAndroid Build Coastguard Worker /* Mipmap level pitch in elements. Only valid for LINEAR. */ 251*61046927SAndroid Build Coastguard Worker uint32_t pitch[RADEON_SURF_MAX_LEVELS]; /* up to 64K */ 252*61046927SAndroid Build Coastguard Worker 253*61046927SAndroid Build Coastguard Worker uint32_t base_mip_width; /* up to 64K */ 254*61046927SAndroid Build Coastguard Worker uint32_t base_mip_height; /* up to 64K */ 255*61046927SAndroid Build Coastguard Worker 256*61046927SAndroid Build Coastguard Worker /* Pitch of level in blocks, only valid for prt images. */ 257*61046927SAndroid Build Coastguard Worker uint32_t prt_level_pitch[RADEON_SURF_MAX_LEVELS]; /* up to 64K */ 258*61046927SAndroid Build Coastguard Worker /* Offset within slice in bytes, only valid for prt images. */ 259*61046927SAndroid Build Coastguard Worker uint64_t prt_level_offset[RADEON_SURF_MAX_LEVELS]; /* up to 64K * 64K * 16 * ~1.33 */ 260*61046927SAndroid Build Coastguard Worker 261*61046927SAndroid Build Coastguard Worker /* DCC or HTILE level info */ 262*61046927SAndroid Build Coastguard Worker struct gfx9_surf_meta_level meta_levels[RADEON_SURF_MAX_LEVELS]; 263*61046927SAndroid Build Coastguard Worker 264*61046927SAndroid Build Coastguard Worker union { 265*61046927SAndroid Build Coastguard Worker /* Color */ 266*61046927SAndroid Build Coastguard Worker struct { 267*61046927SAndroid Build Coastguard Worker struct gfx9_surf_meta_flags dcc; /* metadata of color */ 268*61046927SAndroid Build Coastguard Worker uint8_t fmask_swizzle_mode; 269*61046927SAndroid Build Coastguard Worker uint16_t fmask_epitch; /* gfx9 only, not on gfx10 */ 270*61046927SAndroid Build Coastguard Worker 271*61046927SAndroid Build Coastguard Worker uint16_t dcc_pitch_max; 272*61046927SAndroid Build Coastguard Worker uint16_t dcc_height; 273*61046927SAndroid Build Coastguard Worker 274*61046927SAndroid Build Coastguard Worker uint8_t dcc_block_width; 275*61046927SAndroid Build Coastguard Worker uint8_t dcc_block_height; 276*61046927SAndroid Build Coastguard Worker uint8_t dcc_block_depth; 277*61046927SAndroid Build Coastguard Worker 278*61046927SAndroid Build Coastguard Worker /* Gfx12 DCC recompression settings used by kernel memory management. 279*61046927SAndroid Build Coastguard Worker * The driver sets these, not ac_compute_surface. 280*61046927SAndroid Build Coastguard Worker */ 281*61046927SAndroid Build Coastguard Worker uint8_t dcc_number_type; /* CB_COLOR0_INFO.NUMBER_TYPE */ 282*61046927SAndroid Build Coastguard Worker uint8_t dcc_data_format; /* [0:4]:CB_COLOR0_INFO.FORMAT, [5]:MM */ 283*61046927SAndroid Build Coastguard Worker 284*61046927SAndroid Build Coastguard Worker /* Displayable DCC. This is always rb_aligned=0 and pipe_aligned=0. 285*61046927SAndroid Build Coastguard Worker * The 3D engine doesn't support that layout except for chips with 1 RB. 286*61046927SAndroid Build Coastguard Worker * All other chips must set rb_aligned=1. 287*61046927SAndroid Build Coastguard Worker * A compute shader needs to convert from aligned DCC to unaligned. 288*61046927SAndroid Build Coastguard Worker */ 289*61046927SAndroid Build Coastguard Worker uint8_t display_dcc_alignment_log2; 290*61046927SAndroid Build Coastguard Worker uint32_t display_dcc_size; 291*61046927SAndroid Build Coastguard Worker uint16_t display_dcc_pitch_max; /* (mip chain pitch - 1) */ 292*61046927SAndroid Build Coastguard Worker uint16_t display_dcc_height; 293*61046927SAndroid Build Coastguard Worker bool dcc_retile_use_uint16; /* if all values fit into uint16_t */ 294*61046927SAndroid Build Coastguard Worker uint32_t dcc_retile_num_elements; 295*61046927SAndroid Build Coastguard Worker void *dcc_retile_map; 296*61046927SAndroid Build Coastguard Worker 297*61046927SAndroid Build Coastguard Worker /* CMASK level info (only level 0) */ 298*61046927SAndroid Build Coastguard Worker struct gfx9_surf_meta_level cmask_level0; 299*61046927SAndroid Build Coastguard Worker 300*61046927SAndroid Build Coastguard Worker /* For DCC retiling. */ 301*61046927SAndroid Build Coastguard Worker struct gfx9_meta_equation dcc_equation; /* 2D only */ 302*61046927SAndroid Build Coastguard Worker struct gfx9_meta_equation display_dcc_equation; 303*61046927SAndroid Build Coastguard Worker 304*61046927SAndroid Build Coastguard Worker /* For FCE compute. */ 305*61046927SAndroid Build Coastguard Worker struct gfx9_meta_equation cmask_equation; /* 2D only */ 306*61046927SAndroid Build Coastguard Worker } color; 307*61046927SAndroid Build Coastguard Worker 308*61046927SAndroid Build Coastguard Worker /* Z/S */ 309*61046927SAndroid Build Coastguard Worker struct { 310*61046927SAndroid Build Coastguard Worker uint64_t stencil_offset; /* separate stencil */ 311*61046927SAndroid Build Coastguard Worker uint16_t stencil_epitch; /* gfx9 only, not on gfx10 */ 312*61046927SAndroid Build Coastguard Worker uint8_t stencil_swizzle_mode; 313*61046927SAndroid Build Coastguard Worker 314*61046927SAndroid Build Coastguard Worker struct gfx12_hiz_his_layout hiz, his; 315*61046927SAndroid Build Coastguard Worker 316*61046927SAndroid Build Coastguard Worker /* For HTILE VRS. (only Gfx103-Gfx11) */ 317*61046927SAndroid Build Coastguard Worker struct gfx9_meta_equation htile_equation; 318*61046927SAndroid Build Coastguard Worker } zs; 319*61046927SAndroid Build Coastguard Worker }; 320*61046927SAndroid Build Coastguard Worker }; 321*61046927SAndroid Build Coastguard Worker 322*61046927SAndroid Build Coastguard Worker struct radeon_surf { 323*61046927SAndroid Build Coastguard Worker /* Format properties. */ 324*61046927SAndroid Build Coastguard Worker uint8_t blk_w : 4; 325*61046927SAndroid Build Coastguard Worker uint8_t blk_h : 4; 326*61046927SAndroid Build Coastguard Worker uint8_t bpe : 5; 327*61046927SAndroid Build Coastguard Worker /* Display, standard(thin), depth, render(rotated). AKA D,S,Z,R swizzle modes. */ 328*61046927SAndroid Build Coastguard Worker uint8_t micro_tile_mode : 3; 329*61046927SAndroid Build Coastguard Worker /* Number of mipmap levels where DCC or HTILE is enabled starting from level 0. 330*61046927SAndroid Build Coastguard Worker * Non-zero levels may be disabled due to alignment constraints, but not 331*61046927SAndroid Build Coastguard Worker * the first level. 332*61046927SAndroid Build Coastguard Worker */ 333*61046927SAndroid Build Coastguard Worker uint8_t num_meta_levels : 4; 334*61046927SAndroid Build Coastguard Worker uint8_t is_linear : 1; 335*61046927SAndroid Build Coastguard Worker uint8_t has_stencil : 1; 336*61046927SAndroid Build Coastguard Worker /* This might be true even if micro_tile_mode isn't displayable or rotated. */ 337*61046927SAndroid Build Coastguard Worker uint8_t is_displayable : 1; 338*61046927SAndroid Build Coastguard Worker /* Thick tiling means 3D tiles. Use 3D compute workgroups for blits. (4x4x4 works well) */ 339*61046927SAndroid Build Coastguard Worker uint8_t thick_tiling : 1; 340*61046927SAndroid Build Coastguard Worker uint8_t first_mip_tail_level : 4; 341*61046927SAndroid Build Coastguard Worker 342*61046927SAndroid Build Coastguard Worker /* These are return values. Some of them can be set by the caller, but 343*61046927SAndroid Build Coastguard Worker * they will be treated as hints (e.g. bankw, bankh) and might be 344*61046927SAndroid Build Coastguard Worker * changed by the calculator. 345*61046927SAndroid Build Coastguard Worker */ 346*61046927SAndroid Build Coastguard Worker 347*61046927SAndroid Build Coastguard Worker /* Not supported yet for depth + stencil. */ 348*61046927SAndroid Build Coastguard Worker uint16_t prt_tile_width; /* up to 256 roughly (for 64KB tiles) */ 349*61046927SAndroid Build Coastguard Worker uint16_t prt_tile_height; /* up to 256 roughly (for 64KB tiles) */ 350*61046927SAndroid Build Coastguard Worker uint16_t prt_tile_depth; /* up to 32 roughly (for 64KB thick tiles) */ 351*61046927SAndroid Build Coastguard Worker 352*61046927SAndroid Build Coastguard Worker /* Tile swizzle can be OR'd with low bits of the BASE_256B address. 353*61046927SAndroid Build Coastguard Worker * The value is the same for all mipmap levels. Supported tile modes: 354*61046927SAndroid Build Coastguard Worker * - GFX6: Only macro tiling. 355*61046927SAndroid Build Coastguard Worker * - GFX9: Only *_X and *_T swizzle modes. Level 0 must not be in the mip 356*61046927SAndroid Build Coastguard Worker * tail. 357*61046927SAndroid Build Coastguard Worker * 358*61046927SAndroid Build Coastguard Worker * Only these surfaces are allowed to set it: 359*61046927SAndroid Build Coastguard Worker * - color (if it doesn't have to be displayable) 360*61046927SAndroid Build Coastguard Worker * - DCC (same tile swizzle as color) 361*61046927SAndroid Build Coastguard Worker * - FMASK 362*61046927SAndroid Build Coastguard Worker * - CMASK if it's TC-compatible or if the gen is GFX9 363*61046927SAndroid Build Coastguard Worker * - depth/stencil if HTILE is not TC-compatible and if the gen is not GFX9 364*61046927SAndroid Build Coastguard Worker */ 365*61046927SAndroid Build Coastguard Worker uint16_t tile_swizzle; /* it has 16 bits because gfx11 shifts it by 2 bits */ 366*61046927SAndroid Build Coastguard Worker uint8_t fmask_tile_swizzle; 367*61046927SAndroid Build Coastguard Worker 368*61046927SAndroid Build Coastguard Worker /* Use (1 << log2) to compute the alignment. */ 369*61046927SAndroid Build Coastguard Worker uint8_t surf_alignment_log2; 370*61046927SAndroid Build Coastguard Worker uint8_t fmask_alignment_log2; 371*61046927SAndroid Build Coastguard Worker uint8_t meta_alignment_log2; /* DCC or HTILE */ 372*61046927SAndroid Build Coastguard Worker uint8_t cmask_alignment_log2; 373*61046927SAndroid Build Coastguard Worker uint8_t alignment_log2; 374*61046927SAndroid Build Coastguard Worker 375*61046927SAndroid Build Coastguard Worker /* DRM format modifier. Set to DRM_FORMAT_MOD_INVALID to have addrlib 376*61046927SAndroid Build Coastguard Worker * select tiling parameters instead. 377*61046927SAndroid Build Coastguard Worker */ 378*61046927SAndroid Build Coastguard Worker uint64_t modifier; 379*61046927SAndroid Build Coastguard Worker uint64_t flags; 380*61046927SAndroid Build Coastguard Worker 381*61046927SAndroid Build Coastguard Worker uint64_t surf_size; 382*61046927SAndroid Build Coastguard Worker uint64_t fmask_size; 383*61046927SAndroid Build Coastguard Worker uint32_t fmask_slice_size; /* max 2^31 (16K * 16K * 8) */ 384*61046927SAndroid Build Coastguard Worker 385*61046927SAndroid Build Coastguard Worker /* DCC and HTILE (they are very small) */ 386*61046927SAndroid Build Coastguard Worker uint32_t meta_size; 387*61046927SAndroid Build Coastguard Worker uint32_t meta_slice_size; 388*61046927SAndroid Build Coastguard Worker uint32_t meta_pitch; 389*61046927SAndroid Build Coastguard Worker 390*61046927SAndroid Build Coastguard Worker uint32_t cmask_size; 391*61046927SAndroid Build Coastguard Worker uint32_t cmask_slice_size; 392*61046927SAndroid Build Coastguard Worker uint16_t cmask_pitch; /* GFX9+ */ 393*61046927SAndroid Build Coastguard Worker uint16_t cmask_height; /* GFX9+ */ 394*61046927SAndroid Build Coastguard Worker 395*61046927SAndroid Build Coastguard Worker /* All buffers combined. */ 396*61046927SAndroid Build Coastguard Worker uint64_t meta_offset; /* DCC (Gfx8-Gfx11) or HTILE (Gfx6-Gfx11) */ 397*61046927SAndroid Build Coastguard Worker uint64_t fmask_offset; /* Gfx6-Gfx10 */ 398*61046927SAndroid Build Coastguard Worker uint64_t cmask_offset; /* Gfx6-Gfx10 */ 399*61046927SAndroid Build Coastguard Worker uint64_t display_dcc_offset; /* Gfx9-Gfx11 */ 400*61046927SAndroid Build Coastguard Worker uint64_t total_size; 401*61046927SAndroid Build Coastguard Worker 402*61046927SAndroid Build Coastguard Worker union { 403*61046927SAndroid Build Coastguard Worker /* Gfx3-8 surface info. 404*61046927SAndroid Build Coastguard Worker * 405*61046927SAndroid Build Coastguard Worker * Some of them can be set by the caller if certain parameters are 406*61046927SAndroid Build Coastguard Worker * desirable. The allocator will try to obey them. 407*61046927SAndroid Build Coastguard Worker */ 408*61046927SAndroid Build Coastguard Worker struct legacy_surf_layout legacy; 409*61046927SAndroid Build Coastguard Worker 410*61046927SAndroid Build Coastguard Worker /* Gfx9+ surface info. */ 411*61046927SAndroid Build Coastguard Worker struct gfx9_surf_layout gfx9; 412*61046927SAndroid Build Coastguard Worker } u; 413*61046927SAndroid Build Coastguard Worker }; 414*61046927SAndroid Build Coastguard Worker 415*61046927SAndroid Build Coastguard Worker struct ac_surf_info { 416*61046927SAndroid Build Coastguard Worker uint32_t width; /* up to 64K */ 417*61046927SAndroid Build Coastguard Worker uint32_t height; /* up to 64K */ 418*61046927SAndroid Build Coastguard Worker uint32_t depth; /* up to 16K */ 419*61046927SAndroid Build Coastguard Worker uint8_t samples; /* For Z/S: samples; For color: FMASK coverage samples */ 420*61046927SAndroid Build Coastguard Worker uint8_t storage_samples; /* For color: allocated samples */ 421*61046927SAndroid Build Coastguard Worker uint8_t levels; 422*61046927SAndroid Build Coastguard Worker uint8_t num_channels; /* heuristic for displayability */ 423*61046927SAndroid Build Coastguard Worker uint16_t array_size; 424*61046927SAndroid Build Coastguard Worker uint32_t *surf_index; /* Set a monotonic counter for tile swizzling. */ 425*61046927SAndroid Build Coastguard Worker uint32_t *fmask_surf_index; 426*61046927SAndroid Build Coastguard Worker }; 427*61046927SAndroid Build Coastguard Worker 428*61046927SAndroid Build Coastguard Worker struct ac_surf_config { 429*61046927SAndroid Build Coastguard Worker struct ac_surf_info info; 430*61046927SAndroid Build Coastguard Worker unsigned is_1d : 1; 431*61046927SAndroid Build Coastguard Worker unsigned is_3d : 1; 432*61046927SAndroid Build Coastguard Worker unsigned is_cube : 1; 433*61046927SAndroid Build Coastguard Worker unsigned is_array : 1; 434*61046927SAndroid Build Coastguard Worker }; 435*61046927SAndroid Build Coastguard Worker 436*61046927SAndroid Build Coastguard Worker /* Output parameters for ac_surface_compute_nbc_view */ 437*61046927SAndroid Build Coastguard Worker struct ac_surf_nbc_view { 438*61046927SAndroid Build Coastguard Worker bool valid; 439*61046927SAndroid Build Coastguard Worker uint32_t width; /* up to 64K */ 440*61046927SAndroid Build Coastguard Worker uint32_t height; /* up to 64K */ 441*61046927SAndroid Build Coastguard Worker uint32_t level; 442*61046927SAndroid Build Coastguard Worker uint32_t num_levels; /* Used for max_mip in the resource descriptor */ 443*61046927SAndroid Build Coastguard Worker uint8_t tile_swizzle; 444*61046927SAndroid Build Coastguard Worker uint64_t base_address_offset; 445*61046927SAndroid Build Coastguard Worker }; 446*61046927SAndroid Build Coastguard Worker 447*61046927SAndroid Build Coastguard Worker struct ac_addrlib *ac_addrlib_create(const struct radeon_info *info, uint64_t *max_alignment); 448*61046927SAndroid Build Coastguard Worker void ac_addrlib_destroy(struct ac_addrlib *addrlib); 449*61046927SAndroid Build Coastguard Worker void *ac_addrlib_get_handle(struct ac_addrlib *addrlib); 450*61046927SAndroid Build Coastguard Worker 451*61046927SAndroid Build Coastguard Worker int ac_compute_surface(struct ac_addrlib *addrlib, const struct radeon_info *info, 452*61046927SAndroid Build Coastguard Worker const struct ac_surf_config *config, enum radeon_surf_mode mode, 453*61046927SAndroid Build Coastguard Worker struct radeon_surf *surf); 454*61046927SAndroid Build Coastguard Worker void ac_surface_zero_dcc_fields(struct radeon_surf *surf); 455*61046927SAndroid Build Coastguard Worker unsigned ac_pipe_config_to_num_pipes(unsigned pipe_config); 456*61046927SAndroid Build Coastguard Worker 457*61046927SAndroid Build Coastguard Worker void ac_surface_apply_bo_metadata(const struct radeon_info *info, struct radeon_surf *surf, 458*61046927SAndroid Build Coastguard Worker uint64_t tiling_flags, enum radeon_surf_mode *mode); 459*61046927SAndroid Build Coastguard Worker void ac_surface_compute_bo_metadata(const struct radeon_info *info, struct radeon_surf *surf, 460*61046927SAndroid Build Coastguard Worker uint64_t *tiling_flags); 461*61046927SAndroid Build Coastguard Worker 462*61046927SAndroid Build Coastguard Worker bool ac_surface_apply_umd_metadata(const struct radeon_info *info, struct radeon_surf *surf, 463*61046927SAndroid Build Coastguard Worker unsigned num_storage_samples, unsigned num_mipmap_levels, 464*61046927SAndroid Build Coastguard Worker unsigned size_metadata, const uint32_t metadata[64]); 465*61046927SAndroid Build Coastguard Worker void ac_surface_compute_umd_metadata(const struct radeon_info *info, struct radeon_surf *surf, 466*61046927SAndroid Build Coastguard Worker unsigned num_mipmap_levels, uint32_t desc[8], 467*61046927SAndroid Build Coastguard Worker unsigned *size_metadata, uint32_t metadata[64], 468*61046927SAndroid Build Coastguard Worker bool include_tool_md); 469*61046927SAndroid Build Coastguard Worker 470*61046927SAndroid Build Coastguard Worker bool ac_surface_override_offset_stride(const struct radeon_info *info, struct radeon_surf *surf, 471*61046927SAndroid Build Coastguard Worker unsigned num_layers, unsigned num_mipmap_levels, 472*61046927SAndroid Build Coastguard Worker uint64_t offset, unsigned pitch); 473*61046927SAndroid Build Coastguard Worker 474*61046927SAndroid Build Coastguard Worker struct ac_modifier_options { 475*61046927SAndroid Build Coastguard Worker bool dcc; /* Whether to allow DCC. */ 476*61046927SAndroid Build Coastguard Worker bool dcc_retile; /* Whether to allow use of a DCC retile map. */ 477*61046927SAndroid Build Coastguard Worker }; 478*61046927SAndroid Build Coastguard Worker 479*61046927SAndroid Build Coastguard Worker bool ac_is_modifier_supported(const struct radeon_info *info, 480*61046927SAndroid Build Coastguard Worker const struct ac_modifier_options *options, 481*61046927SAndroid Build Coastguard Worker enum pipe_format format, 482*61046927SAndroid Build Coastguard Worker uint64_t modifier); 483*61046927SAndroid Build Coastguard Worker bool ac_get_supported_modifiers(const struct radeon_info *info, 484*61046927SAndroid Build Coastguard Worker const struct ac_modifier_options *options, 485*61046927SAndroid Build Coastguard Worker enum pipe_format format, 486*61046927SAndroid Build Coastguard Worker unsigned *mod_count, 487*61046927SAndroid Build Coastguard Worker uint64_t *mods); 488*61046927SAndroid Build Coastguard Worker bool ac_modifier_has_dcc(uint64_t modifier); 489*61046927SAndroid Build Coastguard Worker bool ac_modifier_has_dcc_retile(uint64_t modifier); 490*61046927SAndroid Build Coastguard Worker bool ac_modifier_supports_dcc_image_stores(enum amd_gfx_level gfx_level, uint64_t modifier); 491*61046927SAndroid Build Coastguard Worker void ac_modifier_max_extent(const struct radeon_info *info, 492*61046927SAndroid Build Coastguard Worker uint64_t modifier, uint32_t *width, uint32_t *height); 493*61046927SAndroid Build Coastguard Worker 494*61046927SAndroid Build Coastguard Worker unsigned ac_surface_get_nplanes(const struct radeon_surf *surf); 495*61046927SAndroid Build Coastguard Worker uint64_t ac_surface_get_plane_offset(enum amd_gfx_level gfx_level, 496*61046927SAndroid Build Coastguard Worker const struct radeon_surf *surf, 497*61046927SAndroid Build Coastguard Worker unsigned plane, unsigned layer); 498*61046927SAndroid Build Coastguard Worker uint64_t ac_surface_get_plane_stride(enum amd_gfx_level gfx_level, 499*61046927SAndroid Build Coastguard Worker const struct radeon_surf *surf, 500*61046927SAndroid Build Coastguard Worker unsigned plane, unsigned level); 501*61046927SAndroid Build Coastguard Worker /* Of the whole miplevel, not an individual layer */ 502*61046927SAndroid Build Coastguard Worker uint64_t ac_surface_get_plane_size(const struct radeon_surf *surf, 503*61046927SAndroid Build Coastguard Worker unsigned plane); 504*61046927SAndroid Build Coastguard Worker 505*61046927SAndroid Build Coastguard Worker uint64_t ac_surface_addr_from_coord(struct ac_addrlib *addrlib, const struct radeon_info *info, 506*61046927SAndroid Build Coastguard Worker const struct radeon_surf *surf, 507*61046927SAndroid Build Coastguard Worker const struct ac_surf_info *surf_info, unsigned level, 508*61046927SAndroid Build Coastguard Worker unsigned x, unsigned y, unsigned layer, bool is_3d); 509*61046927SAndroid Build Coastguard Worker void ac_surface_compute_nbc_view(struct ac_addrlib *addrlib, const struct radeon_info *info, 510*61046927SAndroid Build Coastguard Worker const struct radeon_surf *surf, 511*61046927SAndroid Build Coastguard Worker const struct ac_surf_info *surf_info, unsigned level, 512*61046927SAndroid Build Coastguard Worker unsigned layer, struct ac_surf_nbc_view *out); 513*61046927SAndroid Build Coastguard Worker 514*61046927SAndroid Build Coastguard Worker void ac_surface_print_info(FILE *out, const struct radeon_info *info, 515*61046927SAndroid Build Coastguard Worker const struct radeon_surf *surf); 516*61046927SAndroid Build Coastguard Worker 517*61046927SAndroid Build Coastguard Worker bool ac_surface_supports_dcc_image_stores(enum amd_gfx_level gfx_level, 518*61046927SAndroid Build Coastguard Worker const struct radeon_surf *surf); 519*61046927SAndroid Build Coastguard Worker 520*61046927SAndroid Build Coastguard Worker #ifdef AC_SURFACE_INCLUDE_NIR 521*61046927SAndroid Build Coastguard Worker nir_def *ac_nir_dcc_addr_from_coord(nir_builder *b, const struct radeon_info *info, 522*61046927SAndroid Build Coastguard Worker unsigned bpe, const struct gfx9_meta_equation *equation, 523*61046927SAndroid Build Coastguard Worker nir_def *dcc_pitch, nir_def *dcc_height, 524*61046927SAndroid Build Coastguard Worker nir_def *dcc_slice_size, 525*61046927SAndroid Build Coastguard Worker nir_def *x, nir_def *y, nir_def *z, 526*61046927SAndroid Build Coastguard Worker nir_def *sample, nir_def *pipe_xor); 527*61046927SAndroid Build Coastguard Worker 528*61046927SAndroid Build Coastguard Worker nir_def *ac_nir_cmask_addr_from_coord(nir_builder *b, const struct radeon_info *info, 529*61046927SAndroid Build Coastguard Worker const struct gfx9_meta_equation *equation, 530*61046927SAndroid Build Coastguard Worker nir_def *cmask_pitch, nir_def *cmask_height, 531*61046927SAndroid Build Coastguard Worker nir_def *cmask_slice_size, 532*61046927SAndroid Build Coastguard Worker nir_def *x, nir_def *y, nir_def *z, 533*61046927SAndroid Build Coastguard Worker nir_def *pipe_xor, 534*61046927SAndroid Build Coastguard Worker nir_def **bit_position); 535*61046927SAndroid Build Coastguard Worker 536*61046927SAndroid Build Coastguard Worker nir_def *ac_nir_htile_addr_from_coord(nir_builder *b, const struct radeon_info *info, 537*61046927SAndroid Build Coastguard Worker const struct gfx9_meta_equation *equation, 538*61046927SAndroid Build Coastguard Worker nir_def *htile_pitch, 539*61046927SAndroid Build Coastguard Worker nir_def *htile_slice_size, 540*61046927SAndroid Build Coastguard Worker nir_def *x, nir_def *y, nir_def *z, 541*61046927SAndroid Build Coastguard Worker nir_def *pipe_xor); 542*61046927SAndroid Build Coastguard Worker #endif 543*61046927SAndroid Build Coastguard Worker 544*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 545*61046927SAndroid Build Coastguard Worker } 546*61046927SAndroid Build Coastguard Worker #endif 547*61046927SAndroid Build Coastguard Worker 548*61046927SAndroid Build Coastguard Worker #endif /* AC_SURFACE_H */ 549