1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2022 Collabora, Ltd. 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 NAK_H 7*61046927SAndroid Build Coastguard Worker #define NAK_H 8*61046927SAndroid Build Coastguard Worker 9*61046927SAndroid Build Coastguard Worker #include "compiler/shader_enums.h" 10*61046927SAndroid Build Coastguard Worker #include "nir.h" 11*61046927SAndroid Build Coastguard Worker 12*61046927SAndroid Build Coastguard Worker #include <assert.h> 13*61046927SAndroid Build Coastguard Worker #include <stdbool.h> 14*61046927SAndroid Build Coastguard Worker #include <stdint.h> 15*61046927SAndroid Build Coastguard Worker 16*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 17*61046927SAndroid Build Coastguard Worker extern "C" { 18*61046927SAndroid Build Coastguard Worker #endif 19*61046927SAndroid Build Coastguard Worker 20*61046927SAndroid Build Coastguard Worker #define NAK_SUBGROUP_SIZE 32 21*61046927SAndroid Build Coastguard Worker 22*61046927SAndroid Build Coastguard Worker struct nak_compiler; 23*61046927SAndroid Build Coastguard Worker struct nir_shader_compiler_options; 24*61046927SAndroid Build Coastguard Worker struct nv_device_info; 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Worker struct nak_compiler *nak_compiler_create(const struct nv_device_info *dev); 27*61046927SAndroid Build Coastguard Worker void nak_compiler_destroy(struct nak_compiler *nak); 28*61046927SAndroid Build Coastguard Worker 29*61046927SAndroid Build Coastguard Worker uint64_t nak_debug_flags(const struct nak_compiler *nak); 30*61046927SAndroid Build Coastguard Worker 31*61046927SAndroid Build Coastguard Worker const struct nir_shader_compiler_options * 32*61046927SAndroid Build Coastguard Worker nak_nir_options(const struct nak_compiler *nak); 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Worker void nak_preprocess_nir(nir_shader *nir, const struct nak_compiler *nak); 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker struct nak_sample_location { 37*61046927SAndroid Build Coastguard Worker uint8_t x_u4 : 4; 38*61046927SAndroid Build Coastguard Worker uint8_t y_u4 : 4; 39*61046927SAndroid Build Coastguard Worker }; 40*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct nak_sample_location) == 1, 41*61046927SAndroid Build Coastguard Worker "This struct has no holes"); 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker struct nak_sample_mask { 44*61046927SAndroid Build Coastguard Worker uint16_t sample_mask; 45*61046927SAndroid Build Coastguard Worker }; 46*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct nak_sample_mask) == 2, 47*61046927SAndroid Build Coastguard Worker "This struct has no holes"); 48*61046927SAndroid Build Coastguard Worker 49*61046927SAndroid Build Coastguard Worker PRAGMA_DIAGNOSTIC_PUSH 50*61046927SAndroid Build Coastguard Worker PRAGMA_DIAGNOSTIC_ERROR(-Wpadded) 51*61046927SAndroid Build Coastguard Worker struct nak_fs_key { 52*61046927SAndroid Build Coastguard Worker bool zs_self_dep; 53*61046927SAndroid Build Coastguard Worker 54*61046927SAndroid Build Coastguard Worker /** True if sample shading is forced on via an API knob such as 55*61046927SAndroid Build Coastguard Worker * VkPipelineMultisampleStateCreateInfo::minSampleShading 56*61046927SAndroid Build Coastguard Worker */ 57*61046927SAndroid Build Coastguard Worker bool force_sample_shading; 58*61046927SAndroid Build Coastguard Worker bool uses_underestimate; 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard Worker /** 61*61046927SAndroid Build Coastguard Worker * The constant buffer index and offset at which the sample locations and 62*61046927SAndroid Build Coastguard Worker * pass sample masks tables lives. 63*61046927SAndroid Build Coastguard Worker */ 64*61046927SAndroid Build Coastguard Worker uint8_t sample_info_cb; 65*61046927SAndroid Build Coastguard Worker 66*61046927SAndroid Build Coastguard Worker /** 67*61046927SAndroid Build Coastguard Worker * The offset into sample_info_cb at which the sample locations live. The 68*61046927SAndroid Build Coastguard Worker * sample locations table is an array of nak_sample_location where each 69*61046927SAndroid Build Coastguard Worker * sample location is two 4-bit unorm values packed into an 8-bit value 70*61046927SAndroid Build Coastguard Worker * with the bottom 4 bits for x and the top 4 bits for y. 71*61046927SAndroid Build Coastguard Worker */ 72*61046927SAndroid Build Coastguard Worker uint32_t sample_locations_offset; 73*61046927SAndroid Build Coastguard Worker 74*61046927SAndroid Build Coastguard Worker /** 75*61046927SAndroid Build Coastguard Worker * The offset into sample_info_cb at which the sample masks table lives. 76*61046927SAndroid Build Coastguard Worker * The sample masks table is an array of nak_sample_mask where each entry 77*61046927SAndroid Build Coastguard Worker * represents the set of samples covered by that pass corresponding to that 78*61046927SAndroid Build Coastguard Worker * sample in a multi-pass fragment shader invocaiton. 79*61046927SAndroid Build Coastguard Worker */ 80*61046927SAndroid Build Coastguard Worker uint32_t sample_masks_offset; 81*61046927SAndroid Build Coastguard Worker }; 82*61046927SAndroid Build Coastguard Worker PRAGMA_DIAGNOSTIC_POP 83*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct nak_fs_key) == 12, "This struct has no holes"); 84*61046927SAndroid Build Coastguard Worker 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker void nak_postprocess_nir(nir_shader *nir, const struct nak_compiler *nak, 87*61046927SAndroid Build Coastguard Worker nir_variable_mode robust2_modes, 88*61046927SAndroid Build Coastguard Worker const struct nak_fs_key *fs_key); 89*61046927SAndroid Build Coastguard Worker 90*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED nak_ts_domain { 91*61046927SAndroid Build Coastguard Worker NAK_TS_DOMAIN_ISOLINE = 0, 92*61046927SAndroid Build Coastguard Worker NAK_TS_DOMAIN_TRIANGLE = 1, 93*61046927SAndroid Build Coastguard Worker NAK_TS_DOMAIN_QUAD = 2, 94*61046927SAndroid Build Coastguard Worker }; 95*61046927SAndroid Build Coastguard Worker 96*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED nak_ts_spacing { 97*61046927SAndroid Build Coastguard Worker NAK_TS_SPACING_INTEGER = 0, 98*61046927SAndroid Build Coastguard Worker NAK_TS_SPACING_FRACT_ODD = 1, 99*61046927SAndroid Build Coastguard Worker NAK_TS_SPACING_FRACT_EVEN = 2, 100*61046927SAndroid Build Coastguard Worker }; 101*61046927SAndroid Build Coastguard Worker 102*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED nak_ts_prims { 103*61046927SAndroid Build Coastguard Worker NAK_TS_PRIMS_POINTS = 0, 104*61046927SAndroid Build Coastguard Worker NAK_TS_PRIMS_LINES = 1, 105*61046927SAndroid Build Coastguard Worker NAK_TS_PRIMS_TRIANGLES_CW = 2, 106*61046927SAndroid Build Coastguard Worker NAK_TS_PRIMS_TRIANGLES_CCW = 3, 107*61046927SAndroid Build Coastguard Worker }; 108*61046927SAndroid Build Coastguard Worker 109*61046927SAndroid Build Coastguard Worker struct nak_xfb_info { 110*61046927SAndroid Build Coastguard Worker uint32_t stride[4]; 111*61046927SAndroid Build Coastguard Worker uint8_t stream[4]; 112*61046927SAndroid Build Coastguard Worker uint8_t attr_count[4]; 113*61046927SAndroid Build Coastguard Worker uint8_t attr_index[4][128]; 114*61046927SAndroid Build Coastguard Worker }; 115*61046927SAndroid Build Coastguard Worker 116*61046927SAndroid Build Coastguard Worker /* This struct MUST have explicit padding fields to ensure that all padding is 117*61046927SAndroid Build Coastguard Worker * zeroed and the zeros get properly copied, even across API boundaries. 118*61046927SAndroid Build Coastguard Worker */ 119*61046927SAndroid Build Coastguard Worker #pragma GCC diagnostic push 120*61046927SAndroid Build Coastguard Worker #pragma GCC diagnostic error "-Wpadded" 121*61046927SAndroid Build Coastguard Worker struct nak_shader_info { 122*61046927SAndroid Build Coastguard Worker gl_shader_stage stage; 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard Worker /** Shader model */ 125*61046927SAndroid Build Coastguard Worker uint8_t sm; 126*61046927SAndroid Build Coastguard Worker 127*61046927SAndroid Build Coastguard Worker /** Number of GPRs used */ 128*61046927SAndroid Build Coastguard Worker uint8_t num_gprs; 129*61046927SAndroid Build Coastguard Worker 130*61046927SAndroid Build Coastguard Worker /** 131*61046927SAndroid Build Coastguard Worker * Number of control barriers used 132*61046927SAndroid Build Coastguard Worker * 133*61046927SAndroid Build Coastguard Worker * These are barriers in the sense of glsl barrier(), not reconvergence 134*61046927SAndroid Build Coastguard Worker * barriers. In CUDA, these barriers have an index, but we currently 135*61046927SAndroid Build Coastguard Worker * only use index zero for vulkan, which means this will be at most 1. 136*61046927SAndroid Build Coastguard Worker */ 137*61046927SAndroid Build Coastguard Worker uint8_t num_control_barriers; 138*61046927SAndroid Build Coastguard Worker 139*61046927SAndroid Build Coastguard Worker uint8_t _pad0; 140*61046927SAndroid Build Coastguard Worker 141*61046927SAndroid Build Coastguard Worker /** Number of instructions used */ 142*61046927SAndroid Build Coastguard Worker uint32_t num_instrs; 143*61046927SAndroid Build Coastguard Worker 144*61046927SAndroid Build Coastguard Worker /** Size of shader local (scratch) memory */ 145*61046927SAndroid Build Coastguard Worker uint32_t slm_size; 146*61046927SAndroid Build Coastguard Worker 147*61046927SAndroid Build Coastguard Worker /** Size of call/return stack in bytes/warp */ 148*61046927SAndroid Build Coastguard Worker uint32_t crs_size; 149*61046927SAndroid Build Coastguard Worker 150*61046927SAndroid Build Coastguard Worker union { 151*61046927SAndroid Build Coastguard Worker struct { 152*61046927SAndroid Build Coastguard Worker /* Local workgroup size */ 153*61046927SAndroid Build Coastguard Worker uint16_t local_size[3]; 154*61046927SAndroid Build Coastguard Worker 155*61046927SAndroid Build Coastguard Worker /* Shared memory size */ 156*61046927SAndroid Build Coastguard Worker uint16_t smem_size; 157*61046927SAndroid Build Coastguard Worker 158*61046927SAndroid Build Coastguard Worker uint8_t _pad[4]; 159*61046927SAndroid Build Coastguard Worker } cs; 160*61046927SAndroid Build Coastguard Worker 161*61046927SAndroid Build Coastguard Worker struct { 162*61046927SAndroid Build Coastguard Worker bool writes_depth; 163*61046927SAndroid Build Coastguard Worker bool reads_sample_mask; 164*61046927SAndroid Build Coastguard Worker bool post_depth_coverage; 165*61046927SAndroid Build Coastguard Worker bool uses_sample_shading; 166*61046927SAndroid Build Coastguard Worker bool early_fragment_tests; 167*61046927SAndroid Build Coastguard Worker 168*61046927SAndroid Build Coastguard Worker uint8_t _pad[7]; 169*61046927SAndroid Build Coastguard Worker } fs; 170*61046927SAndroid Build Coastguard Worker 171*61046927SAndroid Build Coastguard Worker struct { 172*61046927SAndroid Build Coastguard Worker enum nak_ts_domain domain; 173*61046927SAndroid Build Coastguard Worker enum nak_ts_spacing spacing; 174*61046927SAndroid Build Coastguard Worker enum nak_ts_prims prims; 175*61046927SAndroid Build Coastguard Worker 176*61046927SAndroid Build Coastguard Worker uint8_t _pad[9]; 177*61046927SAndroid Build Coastguard Worker } ts; 178*61046927SAndroid Build Coastguard Worker 179*61046927SAndroid Build Coastguard Worker /* Used to initialize the union for other stages */ 180*61046927SAndroid Build Coastguard Worker uint8_t _pad[12]; 181*61046927SAndroid Build Coastguard Worker }; 182*61046927SAndroid Build Coastguard Worker 183*61046927SAndroid Build Coastguard Worker struct { 184*61046927SAndroid Build Coastguard Worker bool writes_layer; 185*61046927SAndroid Build Coastguard Worker bool writes_point_size; 186*61046927SAndroid Build Coastguard Worker uint8_t clip_enable; 187*61046927SAndroid Build Coastguard Worker uint8_t cull_enable; 188*61046927SAndroid Build Coastguard Worker 189*61046927SAndroid Build Coastguard Worker struct nak_xfb_info xfb; 190*61046927SAndroid Build Coastguard Worker } vtg; 191*61046927SAndroid Build Coastguard Worker 192*61046927SAndroid Build Coastguard Worker /** Shader header for 3D stages */ 193*61046927SAndroid Build Coastguard Worker uint32_t hdr[32]; 194*61046927SAndroid Build Coastguard Worker }; 195*61046927SAndroid Build Coastguard Worker #pragma GCC diagnostic pop 196*61046927SAndroid Build Coastguard Worker 197*61046927SAndroid Build Coastguard Worker struct nak_shader_bin { 198*61046927SAndroid Build Coastguard Worker struct nak_shader_info info; 199*61046927SAndroid Build Coastguard Worker 200*61046927SAndroid Build Coastguard Worker uint32_t code_size; 201*61046927SAndroid Build Coastguard Worker const void *code; 202*61046927SAndroid Build Coastguard Worker 203*61046927SAndroid Build Coastguard Worker const char *asm_str; 204*61046927SAndroid Build Coastguard Worker }; 205*61046927SAndroid Build Coastguard Worker 206*61046927SAndroid Build Coastguard Worker void nak_shader_bin_destroy(struct nak_shader_bin *bin); 207*61046927SAndroid Build Coastguard Worker 208*61046927SAndroid Build Coastguard Worker struct nak_shader_bin * 209*61046927SAndroid Build Coastguard Worker nak_compile_shader(nir_shader *nir, bool dump_asm, 210*61046927SAndroid Build Coastguard Worker const struct nak_compiler *nak, 211*61046927SAndroid Build Coastguard Worker nir_variable_mode robust2_modes, 212*61046927SAndroid Build Coastguard Worker const struct nak_fs_key *fs_key); 213*61046927SAndroid Build Coastguard Worker 214*61046927SAndroid Build Coastguard Worker struct nak_qmd_cbuf { 215*61046927SAndroid Build Coastguard Worker uint32_t index; 216*61046927SAndroid Build Coastguard Worker uint32_t size; 217*61046927SAndroid Build Coastguard Worker uint64_t addr; 218*61046927SAndroid Build Coastguard Worker }; 219*61046927SAndroid Build Coastguard Worker 220*61046927SAndroid Build Coastguard Worker struct nak_qmd_info { 221*61046927SAndroid Build Coastguard Worker uint64_t addr; 222*61046927SAndroid Build Coastguard Worker 223*61046927SAndroid Build Coastguard Worker uint16_t smem_size; 224*61046927SAndroid Build Coastguard Worker uint16_t smem_max; 225*61046927SAndroid Build Coastguard Worker 226*61046927SAndroid Build Coastguard Worker uint32_t global_size[3]; 227*61046927SAndroid Build Coastguard Worker 228*61046927SAndroid Build Coastguard Worker uint32_t num_cbufs; 229*61046927SAndroid Build Coastguard Worker struct nak_qmd_cbuf cbufs[8]; 230*61046927SAndroid Build Coastguard Worker }; 231*61046927SAndroid Build Coastguard Worker 232*61046927SAndroid Build Coastguard Worker void nak_fill_qmd(const struct nv_device_info *dev, 233*61046927SAndroid Build Coastguard Worker const struct nak_shader_info *info, 234*61046927SAndroid Build Coastguard Worker const struct nak_qmd_info *qmd_info, 235*61046927SAndroid Build Coastguard Worker void *qmd_out, size_t qmd_size); 236*61046927SAndroid Build Coastguard Worker 237*61046927SAndroid Build Coastguard Worker struct nak_qmd_dispatch_size_layout { 238*61046927SAndroid Build Coastguard Worker uint16_t x_start, x_end; 239*61046927SAndroid Build Coastguard Worker uint16_t y_start, y_end; 240*61046927SAndroid Build Coastguard Worker uint16_t z_start, z_end; 241*61046927SAndroid Build Coastguard Worker }; 242*61046927SAndroid Build Coastguard Worker 243*61046927SAndroid Build Coastguard Worker struct nak_qmd_dispatch_size_layout 244*61046927SAndroid Build Coastguard Worker nak_get_qmd_dispatch_size_layout(const struct nv_device_info *dev); 245*61046927SAndroid Build Coastguard Worker 246*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 247*61046927SAndroid Build Coastguard Worker } 248*61046927SAndroid Build Coastguard Worker #endif 249*61046927SAndroid Build Coastguard Worker 250*61046927SAndroid Build Coastguard Worker #endif /* NAK_H */ 251