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