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 #ifndef LIBAGX_H
7*61046927SAndroid Build Coastguard Worker #define LIBAGX_H
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker /* Define stdint types compatible between the CPU and GPU for shared headers */
10*61046927SAndroid Build Coastguard Worker #ifndef __OPENCL_VERSION__
11*61046927SAndroid Build Coastguard Worker #include <stdint.h>
12*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
13*61046927SAndroid Build Coastguard Worker #define GLOBAL(type_) uint64_t
14*61046927SAndroid Build Coastguard Worker #define CONSTANT(type_) uint64_t
15*61046927SAndroid Build Coastguard Worker #define AGX_STATIC_ASSERT(_COND) static_assert(_COND, #_COND)
16*61046927SAndroid Build Coastguard Worker #else
17*61046927SAndroid Build Coastguard Worker #pragma OPENCL EXTENSION cl_khr_fp16 : enable
18*61046927SAndroid Build Coastguard Worker #define PACKED __attribute__((packed, aligned(4)))
19*61046927SAndroid Build Coastguard Worker #define GLOBAL(type_) global type_ *
20*61046927SAndroid Build Coastguard Worker #define CONSTANT(type_) constant type_ *
21*61046927SAndroid Build Coastguard Worker
22*61046927SAndroid Build Coastguard Worker typedef ulong uint64_t;
23*61046927SAndroid Build Coastguard Worker typedef uint uint32_t;
24*61046927SAndroid Build Coastguard Worker typedef ushort uint16_t;
25*61046927SAndroid Build Coastguard Worker typedef uchar uint8_t;
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker typedef long int64_t;
28*61046927SAndroid Build Coastguard Worker typedef int int32_t;
29*61046927SAndroid Build Coastguard Worker typedef short int16_t;
30*61046927SAndroid Build Coastguard Worker typedef char int8_t;
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker /* Define NIR intrinsics for CL */
33*61046927SAndroid Build Coastguard Worker uint32_t nir_interleave_agx(uint16_t x, uint16_t y);
34*61046927SAndroid Build Coastguard Worker void nir_doorbell_agx(uint8_t value);
35*61046927SAndroid Build Coastguard Worker void nir_stack_map_agx(uint16_t index, uint32_t address);
36*61046927SAndroid Build Coastguard Worker uint32_t nir_stack_unmap_agx(uint16_t index);
37*61046927SAndroid Build Coastguard Worker uint32_t nir_load_core_id_agx(void);
38*61046927SAndroid Build Coastguard Worker uint32_t nir_load_helper_op_id_agx(void);
39*61046927SAndroid Build Coastguard Worker uint32_t nir_load_helper_arg_lo_agx(void);
40*61046927SAndroid Build Coastguard Worker uint32_t nir_load_helper_arg_hi_agx(void);
41*61046927SAndroid Build Coastguard Worker uint32_t nir_fence_helper_exit_agx(void);
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker uint4 nir_bindless_image_load_array(uint2 handle, int4 coord);
44*61046927SAndroid Build Coastguard Worker void nir_bindless_image_store_array(uint2 handle, int4 coord, uint4 datum);
45*61046927SAndroid Build Coastguard Worker uint4 nir_bindless_image_load_ms_array(uint2 handle, int4 coord, uint sample);
46*61046927SAndroid Build Coastguard Worker void nir_bindless_image_store_ms_array(uint2 handle, int4 coord, uint sample,
47*61046927SAndroid Build Coastguard Worker uint4 datum);
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker uint libagx_load_index_buffer_internal(uintptr_t index_buffer,
50*61046927SAndroid Build Coastguard Worker uint32_t index_buffer_range_el, uint id,
51*61046927SAndroid Build Coastguard Worker uint index_size);
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker /* I have no idea why CL doesn't have this */
54*61046927SAndroid Build Coastguard Worker uint ballot(bool cond);
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker #define _S(x) #x
57*61046927SAndroid Build Coastguard Worker #define AGX_PASTE_(x, y) x##y
58*61046927SAndroid Build Coastguard Worker #define AGX_PASTE(x, y) AGX_PASTE_(x, y)
59*61046927SAndroid Build Coastguard Worker #define AGX_STATIC_ASSERT(_COND) \
60*61046927SAndroid Build Coastguard Worker typedef char AGX_PASTE(static_assertion, __LINE__)[(_COND) ? 1 : -1]
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker static inline uint
align(uint x,uint y)63*61046927SAndroid Build Coastguard Worker align(uint x, uint y)
64*61046927SAndroid Build Coastguard Worker {
65*61046927SAndroid Build Coastguard Worker return (x + y - 1) & ~(y - 1);
66*61046927SAndroid Build Coastguard Worker }
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker static inline uint32_t
libagx_logbase2_ceil(uint32_t n)69*61046927SAndroid Build Coastguard Worker libagx_logbase2_ceil(uint32_t n)
70*61046927SAndroid Build Coastguard Worker {
71*61046927SAndroid Build Coastguard Worker return (n <= 1) ? 0 : 32 - clz(n - 1);
72*61046927SAndroid Build Coastguard Worker }
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker #define offsetof(x, y) __builtin_offsetof(x, y)
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker #endif
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker #endif
79