xref: /aosp_15_r20/external/mesa3d/src/asahi/lib/shaders/libagx.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 #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