xref: /aosp_15_r20/external/mesa3d/src/asahi/lib/agx_helpers.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2023 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #pragma once
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
9*61046927SAndroid Build Coastguard Worker #include "asahi/compiler/agx_compile.h"
10*61046927SAndroid Build Coastguard Worker #include "asahi/layout/layout.h"
11*61046927SAndroid Build Coastguard Worker #include "shaders/compression.h"
12*61046927SAndroid Build Coastguard Worker #include "agx_device.h"
13*61046927SAndroid Build Coastguard Worker #include "agx_pack.h"
14*61046927SAndroid Build Coastguard Worker #include "agx_ppp.h"
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker #define AGX_MAX_OCCLUSION_QUERIES (65536)
17*61046927SAndroid Build Coastguard Worker #define AGX_MAX_VIEWPORTS         (16)
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker #define agx_push(ptr, T, cfg)                                                  \
20*61046927SAndroid Build Coastguard Worker    for (unsigned _loop = 0; _loop < 1; ++_loop, ptr += AGX_##T##_LENGTH)       \
21*61046927SAndroid Build Coastguard Worker       agx_pack(ptr, T, cfg)
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker #define agx_push_packed(ptr, src, T)                                           \
24*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(sizeof(src) == AGX_##T##_LENGTH);                             \
25*61046927SAndroid Build Coastguard Worker    memcpy(ptr, &src, sizeof(src));                                             \
26*61046927SAndroid Build Coastguard Worker    ptr += sizeof(src);
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker static inline enum agx_sampler_states
agx_translate_sampler_state_count(unsigned count,bool extended)29*61046927SAndroid Build Coastguard Worker agx_translate_sampler_state_count(unsigned count, bool extended)
30*61046927SAndroid Build Coastguard Worker {
31*61046927SAndroid Build Coastguard Worker    assert(count <= 17 && "max 17 sampler state registers supported");
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker    if (count == 0) {
34*61046927SAndroid Build Coastguard Worker       return AGX_SAMPLER_STATES_0;
35*61046927SAndroid Build Coastguard Worker    } else if (extended) {
36*61046927SAndroid Build Coastguard Worker       if (count <= 8)
37*61046927SAndroid Build Coastguard Worker          return AGX_SAMPLER_STATES_8_EXTENDED;
38*61046927SAndroid Build Coastguard Worker       else
39*61046927SAndroid Build Coastguard Worker          return AGX_SAMPLER_STATES_16_EXTENDED;
40*61046927SAndroid Build Coastguard Worker    } else {
41*61046927SAndroid Build Coastguard Worker       if (count <= 4)
42*61046927SAndroid Build Coastguard Worker          return AGX_SAMPLER_STATES_4_COMPACT;
43*61046927SAndroid Build Coastguard Worker       else if (count <= 8)
44*61046927SAndroid Build Coastguard Worker          return AGX_SAMPLER_STATES_8_COMPACT;
45*61046927SAndroid Build Coastguard Worker       else if (count <= 12)
46*61046927SAndroid Build Coastguard Worker          return AGX_SAMPLER_STATES_12_COMPACT;
47*61046927SAndroid Build Coastguard Worker       else
48*61046927SAndroid Build Coastguard Worker          return AGX_SAMPLER_STATES_16_COMPACT;
49*61046927SAndroid Build Coastguard Worker    }
50*61046927SAndroid Build Coastguard Worker }
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker static void
agx_pack_txf_sampler(struct agx_sampler_packed * out)53*61046927SAndroid Build Coastguard Worker agx_pack_txf_sampler(struct agx_sampler_packed *out)
54*61046927SAndroid Build Coastguard Worker {
55*61046927SAndroid Build Coastguard Worker    agx_pack(out, SAMPLER, cfg) {
56*61046927SAndroid Build Coastguard Worker       /* Allow mipmapping. This is respected by txf, weirdly. */
57*61046927SAndroid Build Coastguard Worker       cfg.mip_filter = AGX_MIP_FILTER_NEAREST;
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker       /* Out-of-bounds reads must return 0 */
60*61046927SAndroid Build Coastguard Worker       cfg.wrap_s = AGX_WRAP_CLAMP_TO_BORDER;
61*61046927SAndroid Build Coastguard Worker       cfg.wrap_t = AGX_WRAP_CLAMP_TO_BORDER;
62*61046927SAndroid Build Coastguard Worker       cfg.wrap_r = AGX_WRAP_CLAMP_TO_BORDER;
63*61046927SAndroid Build Coastguard Worker       cfg.border_colour = AGX_BORDER_COLOUR_TRANSPARENT_BLACK;
64*61046927SAndroid Build Coastguard Worker    }
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker /* Channels agree for RGBA but are weird for force 0/1 */
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker static inline enum agx_channel
agx_channel_from_pipe(enum pipe_swizzle in)70*61046927SAndroid Build Coastguard Worker agx_channel_from_pipe(enum pipe_swizzle in)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT((enum agx_channel)PIPE_SWIZZLE_X == AGX_CHANNEL_R);
73*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT((enum agx_channel)PIPE_SWIZZLE_Y == AGX_CHANNEL_G);
74*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT((enum agx_channel)PIPE_SWIZZLE_Z == AGX_CHANNEL_B);
75*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT((enum agx_channel)PIPE_SWIZZLE_W == AGX_CHANNEL_A);
76*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT((enum agx_channel)PIPE_SWIZZLE_0 & 0x4);
77*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT((enum agx_channel)PIPE_SWIZZLE_1 & 0x4);
78*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT((enum agx_channel)PIPE_SWIZZLE_NONE & 0x4);
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    if ((in & 0x4) == 0)
81*61046927SAndroid Build Coastguard Worker       return (enum agx_channel)in;
82*61046927SAndroid Build Coastguard Worker    else if (in == PIPE_SWIZZLE_1)
83*61046927SAndroid Build Coastguard Worker       return AGX_CHANNEL_1;
84*61046927SAndroid Build Coastguard Worker    else
85*61046927SAndroid Build Coastguard Worker       return AGX_CHANNEL_0;
86*61046927SAndroid Build Coastguard Worker }
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker static inline enum agx_layout
agx_translate_layout(enum ail_tiling tiling)89*61046927SAndroid Build Coastguard Worker agx_translate_layout(enum ail_tiling tiling)
90*61046927SAndroid Build Coastguard Worker {
91*61046927SAndroid Build Coastguard Worker    switch (tiling) {
92*61046927SAndroid Build Coastguard Worker    case AIL_TILING_TWIDDLED:
93*61046927SAndroid Build Coastguard Worker    case AIL_TILING_TWIDDLED_COMPRESSED:
94*61046927SAndroid Build Coastguard Worker       return AGX_LAYOUT_TWIDDLED;
95*61046927SAndroid Build Coastguard Worker    case AIL_TILING_LINEAR:
96*61046927SAndroid Build Coastguard Worker       return AGX_LAYOUT_LINEAR;
97*61046927SAndroid Build Coastguard Worker    }
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    unreachable("Invalid tiling");
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker static enum agx_sample_count
agx_translate_sample_count(unsigned samples)103*61046927SAndroid Build Coastguard Worker agx_translate_sample_count(unsigned samples)
104*61046927SAndroid Build Coastguard Worker {
105*61046927SAndroid Build Coastguard Worker    switch (samples) {
106*61046927SAndroid Build Coastguard Worker    case 2:
107*61046927SAndroid Build Coastguard Worker       return AGX_SAMPLE_COUNT_2;
108*61046927SAndroid Build Coastguard Worker    case 4:
109*61046927SAndroid Build Coastguard Worker       return AGX_SAMPLE_COUNT_4;
110*61046927SAndroid Build Coastguard Worker    default:
111*61046927SAndroid Build Coastguard Worker       unreachable("Invalid sample count");
112*61046927SAndroid Build Coastguard Worker    }
113*61046927SAndroid Build Coastguard Worker }
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker static inline enum agx_index_size
agx_translate_index_size(uint8_t size_B)116*61046927SAndroid Build Coastguard Worker agx_translate_index_size(uint8_t size_B)
117*61046927SAndroid Build Coastguard Worker {
118*61046927SAndroid Build Coastguard Worker    /* Index sizes are encoded logarithmically */
119*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(__builtin_ctz(1) == AGX_INDEX_SIZE_U8);
120*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(__builtin_ctz(2) == AGX_INDEX_SIZE_U16);
121*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(__builtin_ctz(4) == AGX_INDEX_SIZE_U32);
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker    assert((size_B == 1) || (size_B == 2) || (size_B == 4));
124*61046927SAndroid Build Coastguard Worker    return __builtin_ctz(size_B);
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker static inline uint8_t
agx_index_size_to_B(enum agx_index_size size)128*61046927SAndroid Build Coastguard Worker agx_index_size_to_B(enum agx_index_size size)
129*61046927SAndroid Build Coastguard Worker {
130*61046927SAndroid Build Coastguard Worker    return 1 << size;
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker static enum agx_conservative_depth
agx_translate_depth_layout(enum gl_frag_depth_layout layout)134*61046927SAndroid Build Coastguard Worker agx_translate_depth_layout(enum gl_frag_depth_layout layout)
135*61046927SAndroid Build Coastguard Worker {
136*61046927SAndroid Build Coastguard Worker    switch (layout) {
137*61046927SAndroid Build Coastguard Worker    case FRAG_DEPTH_LAYOUT_ANY:
138*61046927SAndroid Build Coastguard Worker       return AGX_CONSERVATIVE_DEPTH_ANY;
139*61046927SAndroid Build Coastguard Worker    case FRAG_DEPTH_LAYOUT_LESS:
140*61046927SAndroid Build Coastguard Worker       return AGX_CONSERVATIVE_DEPTH_LESS;
141*61046927SAndroid Build Coastguard Worker    case FRAG_DEPTH_LAYOUT_GREATER:
142*61046927SAndroid Build Coastguard Worker       return AGX_CONSERVATIVE_DEPTH_GREATER;
143*61046927SAndroid Build Coastguard Worker    case FRAG_DEPTH_LAYOUT_UNCHANGED:
144*61046927SAndroid Build Coastguard Worker       return AGX_CONSERVATIVE_DEPTH_UNCHANGED;
145*61046927SAndroid Build Coastguard Worker    default:
146*61046927SAndroid Build Coastguard Worker       unreachable("depth layout should have been canonicalized");
147*61046927SAndroid Build Coastguard Worker    }
148*61046927SAndroid Build Coastguard Worker }
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker static void
agx_ppp_fragment_face_2(struct agx_ppp_update * ppp,enum agx_object_type object_type,struct agx_shader_info * info)151*61046927SAndroid Build Coastguard Worker agx_ppp_fragment_face_2(struct agx_ppp_update *ppp,
152*61046927SAndroid Build Coastguard Worker                         enum agx_object_type object_type,
153*61046927SAndroid Build Coastguard Worker                         struct agx_shader_info *info)
154*61046927SAndroid Build Coastguard Worker {
155*61046927SAndroid Build Coastguard Worker    agx_ppp_push(ppp, FRAGMENT_FACE_2, cfg) {
156*61046927SAndroid Build Coastguard Worker       cfg.object_type = object_type;
157*61046927SAndroid Build Coastguard Worker       cfg.conservative_depth =
158*61046927SAndroid Build Coastguard Worker          info ? agx_translate_depth_layout(info->depth_layout)
159*61046927SAndroid Build Coastguard Worker               : AGX_CONSERVATIVE_DEPTH_UNCHANGED;
160*61046927SAndroid Build Coastguard Worker    }
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker static inline uint32_t
agx_pack_line_width(float line_width)164*61046927SAndroid Build Coastguard Worker agx_pack_line_width(float line_width)
165*61046927SAndroid Build Coastguard Worker {
166*61046927SAndroid Build Coastguard Worker    /* Line width is packed in a 4:4 fixed point format */
167*61046927SAndroid Build Coastguard Worker    unsigned line_width_fixed = ((unsigned)(line_width * 16.0f)) - 1;
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker    /* Clamp to maximum line width */
170*61046927SAndroid Build Coastguard Worker    return MIN2(line_width_fixed, 0xFF);
171*61046927SAndroid Build Coastguard Worker }
172*61046927SAndroid Build Coastguard Worker 
173*61046927SAndroid Build Coastguard Worker /*
174*61046927SAndroid Build Coastguard Worker  * Despite having both a layout *and* a flag that I only see Metal use with null
175*61046927SAndroid Build Coastguard Worker  * textures, AGX doesn't seem to have "real" null textures. Instead we need to
176*61046927SAndroid Build Coastguard Worker  * bind an arbitrary address and throw away the results to read all 0's.
177*61046927SAndroid Build Coastguard Worker  * Accordingly, the caller must pass some address that lives at least as long as
178*61046927SAndroid Build Coastguard Worker  * the texture descriptor itself.
179*61046927SAndroid Build Coastguard Worker  */
180*61046927SAndroid Build Coastguard Worker static void
agx_set_null_texture(struct agx_texture_packed * tex,uint64_t valid_address)181*61046927SAndroid Build Coastguard Worker agx_set_null_texture(struct agx_texture_packed *tex, uint64_t valid_address)
182*61046927SAndroid Build Coastguard Worker {
183*61046927SAndroid Build Coastguard Worker    agx_pack(tex, TEXTURE, cfg) {
184*61046927SAndroid Build Coastguard Worker       cfg.layout = AGX_LAYOUT_NULL;
185*61046927SAndroid Build Coastguard Worker       cfg.channels = AGX_CHANNELS_R8;
186*61046927SAndroid Build Coastguard Worker       cfg.type = AGX_TEXTURE_TYPE_UNORM /* don't care */;
187*61046927SAndroid Build Coastguard Worker       cfg.swizzle_r = AGX_CHANNEL_0;
188*61046927SAndroid Build Coastguard Worker       cfg.swizzle_g = AGX_CHANNEL_0;
189*61046927SAndroid Build Coastguard Worker       cfg.swizzle_b = AGX_CHANNEL_0;
190*61046927SAndroid Build Coastguard Worker       cfg.swizzle_a = AGX_CHANNEL_0;
191*61046927SAndroid Build Coastguard Worker       cfg.address = valid_address;
192*61046927SAndroid Build Coastguard Worker       cfg.null = true;
193*61046927SAndroid Build Coastguard Worker    }
194*61046927SAndroid Build Coastguard Worker }
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker static void
agx_set_null_pbe(struct agx_pbe_packed * pbe,uint64_t sink)197*61046927SAndroid Build Coastguard Worker agx_set_null_pbe(struct agx_pbe_packed *pbe, uint64_t sink)
198*61046927SAndroid Build Coastguard Worker {
199*61046927SAndroid Build Coastguard Worker    agx_pack(pbe, PBE, cfg) {
200*61046927SAndroid Build Coastguard Worker       cfg.width = 1;
201*61046927SAndroid Build Coastguard Worker       cfg.height = 1;
202*61046927SAndroid Build Coastguard Worker       cfg.levels = 1;
203*61046927SAndroid Build Coastguard Worker       cfg.layout = AGX_LAYOUT_NULL;
204*61046927SAndroid Build Coastguard Worker       cfg.channels = AGX_CHANNELS_R8;
205*61046927SAndroid Build Coastguard Worker       cfg.type = AGX_TEXTURE_TYPE_UNORM /* don't care */;
206*61046927SAndroid Build Coastguard Worker       cfg.swizzle_r = AGX_CHANNEL_R;
207*61046927SAndroid Build Coastguard Worker       cfg.swizzle_g = AGX_CHANNEL_R;
208*61046927SAndroid Build Coastguard Worker       cfg.swizzle_b = AGX_CHANNEL_R;
209*61046927SAndroid Build Coastguard Worker       cfg.swizzle_a = AGX_CHANNEL_R;
210*61046927SAndroid Build Coastguard Worker       cfg.buffer = sink;
211*61046927SAndroid Build Coastguard Worker    }
212*61046927SAndroid Build Coastguard Worker }
213*61046927SAndroid Build Coastguard Worker 
214*61046927SAndroid Build Coastguard Worker /*
215*61046927SAndroid Build Coastguard Worker  * Determine the maximum vertex/divided instance index.  For robustness,
216*61046927SAndroid Build Coastguard Worker  * the index will be clamped to this before reading (if soft fault is
217*61046927SAndroid Build Coastguard Worker  * disabled).
218*61046927SAndroid Build Coastguard Worker  *
219*61046927SAndroid Build Coastguard Worker  * Index i accesses up to (exclusive) offset:
220*61046927SAndroid Build Coastguard Worker  *
221*61046927SAndroid Build Coastguard Worker  *    src_offset + (i * stride) + elsize_B
222*61046927SAndroid Build Coastguard Worker  *
223*61046927SAndroid Build Coastguard Worker  * so we require
224*61046927SAndroid Build Coastguard Worker  *
225*61046927SAndroid Build Coastguard Worker  *    src_offset + (i * stride) + elsize_B <= size
226*61046927SAndroid Build Coastguard Worker  *
227*61046927SAndroid Build Coastguard Worker  * <==>
228*61046927SAndroid Build Coastguard Worker  *
229*61046927SAndroid Build Coastguard Worker  *    i <= floor((size - src_offset - elsize_B) / stride)
230*61046927SAndroid Build Coastguard Worker  */
231*61046927SAndroid Build Coastguard Worker static inline uint32_t
agx_calculate_vbo_clamp(uint64_t vbuf,uint64_t sink,enum pipe_format format,uint32_t size_B,uint32_t stride_B,uint32_t offset_B,uint64_t * vbuf_out)232*61046927SAndroid Build Coastguard Worker agx_calculate_vbo_clamp(uint64_t vbuf, uint64_t sink, enum pipe_format format,
233*61046927SAndroid Build Coastguard Worker                         uint32_t size_B, uint32_t stride_B, uint32_t offset_B,
234*61046927SAndroid Build Coastguard Worker                         uint64_t *vbuf_out)
235*61046927SAndroid Build Coastguard Worker {
236*61046927SAndroid Build Coastguard Worker    unsigned elsize_B = util_format_get_blocksize(format);
237*61046927SAndroid Build Coastguard Worker    unsigned subtracted_B = offset_B + elsize_B;
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker    /* If at least one index is valid, determine the max. Otherwise, direct reads
240*61046927SAndroid Build Coastguard Worker     * to zero.
241*61046927SAndroid Build Coastguard Worker     */
242*61046927SAndroid Build Coastguard Worker    if (size_B >= subtracted_B) {
243*61046927SAndroid Build Coastguard Worker       *vbuf_out = vbuf + offset_B;
244*61046927SAndroid Build Coastguard Worker 
245*61046927SAndroid Build Coastguard Worker       /* If stride is zero, do not clamp, everything is valid. */
246*61046927SAndroid Build Coastguard Worker       if (stride_B)
247*61046927SAndroid Build Coastguard Worker          return ((size_B - subtracted_B) / stride_B);
248*61046927SAndroid Build Coastguard Worker       else
249*61046927SAndroid Build Coastguard Worker          return UINT32_MAX;
250*61046927SAndroid Build Coastguard Worker    } else {
251*61046927SAndroid Build Coastguard Worker       *vbuf_out = sink;
252*61046927SAndroid Build Coastguard Worker       return 0;
253*61046927SAndroid Build Coastguard Worker    }
254*61046927SAndroid Build Coastguard Worker }
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker static struct agx_device_key
agx_gather_device_key(struct agx_device * dev)257*61046927SAndroid Build Coastguard Worker agx_gather_device_key(struct agx_device *dev)
258*61046927SAndroid Build Coastguard Worker {
259*61046927SAndroid Build Coastguard Worker    return (struct agx_device_key){
260*61046927SAndroid Build Coastguard Worker       .needs_g13x_coherency = (dev->params.gpu_generation == 13 &&
261*61046927SAndroid Build Coastguard Worker                                dev->params.num_clusters_total > 1) ||
262*61046927SAndroid Build Coastguard Worker                               dev->params.num_dies > 1,
263*61046927SAndroid Build Coastguard Worker       .soft_fault = agx_has_soft_fault(dev),
264*61046927SAndroid Build Coastguard Worker    };
265*61046927SAndroid Build Coastguard Worker }
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker static void
agx_fill_decompress_push(struct libagx_decompress_push * push,struct ail_layout * layout,unsigned layer,unsigned level,uint64_t ptr)268*61046927SAndroid Build Coastguard Worker agx_fill_decompress_push(struct libagx_decompress_push *push,
269*61046927SAndroid Build Coastguard Worker                          struct ail_layout *layout, unsigned layer,
270*61046927SAndroid Build Coastguard Worker                          unsigned level, uint64_t ptr)
271*61046927SAndroid Build Coastguard Worker {
272*61046927SAndroid Build Coastguard Worker    *push = (struct libagx_decompress_push){
273*61046927SAndroid Build Coastguard Worker       .tile_uncompressed = ail_tile_mode_uncompressed(layout->format),
274*61046927SAndroid Build Coastguard Worker       .metadata = ptr + layout->metadata_offset_B +
275*61046927SAndroid Build Coastguard Worker                   layout->level_offsets_compressed_B[level] +
276*61046927SAndroid Build Coastguard Worker                   (layer * layout->compression_layer_stride_B),
277*61046927SAndroid Build Coastguard Worker       .metadata_layer_stride_tl = layout->compression_layer_stride_B / 8,
278*61046927SAndroid Build Coastguard Worker       .metadata_width_tl = ail_metadata_width_tl(layout, level),
279*61046927SAndroid Build Coastguard Worker       .metadata_height_tl = ail_metadata_height_tl(layout, level),
280*61046927SAndroid Build Coastguard Worker    };
281*61046927SAndroid Build Coastguard Worker }
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker struct agx_border_packed;
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker void agx_pack_border(struct agx_border_packed *out, const uint32_t in[4],
286*61046927SAndroid Build Coastguard Worker                      enum pipe_format format);
287