xref: /aosp_15_r20/external/mesa3d/src/amd/common/ac_surface.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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