1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Red Hat. 3*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Bas Nieuwenhuizen 4*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 5*61046927SAndroid Build Coastguard Worker * 6*61046927SAndroid Build Coastguard Worker * based in part on anv driver which is: 7*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation 8*61046927SAndroid Build Coastguard Worker */ 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker #ifndef TU_SHADER_H 11*61046927SAndroid Build Coastguard Worker #define TU_SHADER_H 12*61046927SAndroid Build Coastguard Worker 13*61046927SAndroid Build Coastguard Worker #include "tu_common.h" 14*61046927SAndroid Build Coastguard Worker #include "tu_cs.h" 15*61046927SAndroid Build Coastguard Worker #include "tu_suballoc.h" 16*61046927SAndroid Build Coastguard Worker #include "tu_descriptor_set.h" 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard Worker struct tu_inline_ubo 19*61046927SAndroid Build Coastguard Worker { 20*61046927SAndroid Build Coastguard Worker /* Push the data at BINDLESS_BASE[base] + offset */ 21*61046927SAndroid Build Coastguard Worker unsigned base; 22*61046927SAndroid Build Coastguard Worker unsigned offset; 23*61046927SAndroid Build Coastguard Worker 24*61046927SAndroid Build Coastguard Worker /* If true, push the base address instead */ 25*61046927SAndroid Build Coastguard Worker bool push_address; 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker /* Push it to this location in the const file, in vec4s */ 28*61046927SAndroid Build Coastguard Worker unsigned const_offset_vec4; 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker /* How much to push */ 31*61046927SAndroid Build Coastguard Worker unsigned size_vec4; 32*61046927SAndroid Build Coastguard Worker }; 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Worker /* The meaning of the range depends on "type". If it's 35*61046927SAndroid Build Coastguard Worker * IR3_PUSH_CONSTS_PER_STAGE, then it's the range used by this shader. If 36*61046927SAndroid Build Coastguard Worker * it's IR3_PUSH_CONSTS_SHARED then it's the overall range as provided by 37*61046927SAndroid Build Coastguard Worker * the pipeline layout and must match between shaders where it's non-zero. 38*61046927SAndroid Build Coastguard Worker */ 39*61046927SAndroid Build Coastguard Worker struct tu_push_constant_range 40*61046927SAndroid Build Coastguard Worker { 41*61046927SAndroid Build Coastguard Worker uint32_t lo; 42*61046927SAndroid Build Coastguard Worker uint32_t dwords; 43*61046927SAndroid Build Coastguard Worker enum ir3_push_consts_type type; 44*61046927SAndroid Build Coastguard Worker }; 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker struct tu_const_state 47*61046927SAndroid Build Coastguard Worker { 48*61046927SAndroid Build Coastguard Worker struct tu_push_constant_range push_consts; 49*61046927SAndroid Build Coastguard Worker uint32_t dynamic_offset_loc; 50*61046927SAndroid Build Coastguard Worker unsigned num_inline_ubos; 51*61046927SAndroid Build Coastguard Worker struct tu_inline_ubo ubos[MAX_INLINE_UBOS]; 52*61046927SAndroid Build Coastguard Worker 53*61046927SAndroid Build Coastguard Worker struct ir3_driver_ubo fdm_ubo; 54*61046927SAndroid Build Coastguard Worker struct ir3_driver_ubo dynamic_offsets_ubo; 55*61046927SAndroid Build Coastguard Worker struct ir3_driver_ubo inline_uniforms_ubo; 56*61046927SAndroid Build Coastguard Worker }; 57*61046927SAndroid Build Coastguard Worker 58*61046927SAndroid Build Coastguard Worker struct tu_shader 59*61046927SAndroid Build Coastguard Worker { 60*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache_object base; 61*61046927SAndroid Build Coastguard Worker 62*61046927SAndroid Build Coastguard Worker const struct ir3_shader_variant *variant; 63*61046927SAndroid Build Coastguard Worker const struct ir3_shader_variant *safe_const_variant; 64*61046927SAndroid Build Coastguard Worker 65*61046927SAndroid Build Coastguard Worker struct tu_suballoc_bo bo; 66*61046927SAndroid Build Coastguard Worker struct tu_cs cs; 67*61046927SAndroid Build Coastguard Worker struct tu_bo *pvtmem_bo; 68*61046927SAndroid Build Coastguard Worker 69*61046927SAndroid Build Coastguard Worker struct tu_draw_state state; 70*61046927SAndroid Build Coastguard Worker struct tu_draw_state safe_const_state; 71*61046927SAndroid Build Coastguard Worker struct tu_draw_state binning_state; 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker struct tu_const_state const_state; 74*61046927SAndroid Build Coastguard Worker uint32_t view_mask; 75*61046927SAndroid Build Coastguard Worker uint8_t active_desc_sets; 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Worker /* The dynamic buffer descriptor size for descriptor sets that we know 78*61046927SAndroid Build Coastguard Worker * about. This is used when linking to piece together the sizes and from 79*61046927SAndroid Build Coastguard Worker * there calculate the offsets. It's -1 if we don't know because the 80*61046927SAndroid Build Coastguard Worker * descriptor set layout is NULL. 81*61046927SAndroid Build Coastguard Worker */ 82*61046927SAndroid Build Coastguard Worker int dynamic_descriptor_sizes[MAX_SETS]; 83*61046927SAndroid Build Coastguard Worker 84*61046927SAndroid Build Coastguard Worker union { 85*61046927SAndroid Build Coastguard Worker struct { 86*61046927SAndroid Build Coastguard Worker unsigned patch_type; 87*61046927SAndroid Build Coastguard Worker enum a6xx_tess_output tess_output_upper_left, tess_output_lower_left; 88*61046927SAndroid Build Coastguard Worker enum a6xx_tess_spacing tess_spacing; 89*61046927SAndroid Build Coastguard Worker } tes; 90*61046927SAndroid Build Coastguard Worker 91*61046927SAndroid Build Coastguard Worker struct { 92*61046927SAndroid Build Coastguard Worker bool per_samp; 93*61046927SAndroid Build Coastguard Worker bool has_fdm; 94*61046927SAndroid Build Coastguard Worker 95*61046927SAndroid Build Coastguard Worker struct { 96*61046927SAndroid Build Coastguard Worker uint32_t status; 97*61046927SAndroid Build Coastguard Worker bool force_late_z; 98*61046927SAndroid Build Coastguard Worker } lrz; 99*61046927SAndroid Build Coastguard Worker } fs; 100*61046927SAndroid Build Coastguard Worker }; 101*61046927SAndroid Build Coastguard Worker }; 102*61046927SAndroid Build Coastguard Worker 103*61046927SAndroid Build Coastguard Worker struct tu_shader_key { 104*61046927SAndroid Build Coastguard Worker unsigned multiview_mask; 105*61046927SAndroid Build Coastguard Worker bool force_sample_interp; 106*61046927SAndroid Build Coastguard Worker bool fragment_density_map; 107*61046927SAndroid Build Coastguard Worker uint8_t unscaled_input_fragcoord; 108*61046927SAndroid Build Coastguard Worker enum ir3_wavesize_option api_wavesize, real_wavesize; 109*61046927SAndroid Build Coastguard Worker }; 110*61046927SAndroid Build Coastguard Worker 111*61046927SAndroid Build Coastguard Worker extern const struct vk_pipeline_cache_object_ops tu_shader_ops; 112*61046927SAndroid Build Coastguard Worker bool 113*61046927SAndroid Build Coastguard Worker tu_nir_lower_multiview(nir_shader *nir, uint32_t mask, struct tu_device *dev); 114*61046927SAndroid Build Coastguard Worker 115*61046927SAndroid Build Coastguard Worker nir_shader * 116*61046927SAndroid Build Coastguard Worker tu_spirv_to_nir(struct tu_device *dev, 117*61046927SAndroid Build Coastguard Worker void *mem_ctx, 118*61046927SAndroid Build Coastguard Worker VkPipelineCreateFlags2KHR pipeline_flags, 119*61046927SAndroid Build Coastguard Worker const VkPipelineShaderStageCreateInfo *stage_info, 120*61046927SAndroid Build Coastguard Worker gl_shader_stage stage); 121*61046927SAndroid Build Coastguard Worker 122*61046927SAndroid Build Coastguard Worker void 123*61046927SAndroid Build Coastguard Worker tu6_emit_xs(struct tu_cs *cs, 124*61046927SAndroid Build Coastguard Worker gl_shader_stage stage, 125*61046927SAndroid Build Coastguard Worker const struct ir3_shader_variant *xs, 126*61046927SAndroid Build Coastguard Worker const struct tu_pvtmem_config *pvtmem, 127*61046927SAndroid Build Coastguard Worker uint64_t binary_iova); 128*61046927SAndroid Build Coastguard Worker 129*61046927SAndroid Build Coastguard Worker template <chip CHIP> 130*61046927SAndroid Build Coastguard Worker void 131*61046927SAndroid Build Coastguard Worker tu6_emit_vs(struct tu_cs *cs, const struct ir3_shader_variant *vs, 132*61046927SAndroid Build Coastguard Worker uint32_t view_mask); 133*61046927SAndroid Build Coastguard Worker 134*61046927SAndroid Build Coastguard Worker template <chip CHIP> 135*61046927SAndroid Build Coastguard Worker void 136*61046927SAndroid Build Coastguard Worker tu6_emit_hs(struct tu_cs *cs, const struct ir3_shader_variant *hs); 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Worker template <chip CHIP> 139*61046927SAndroid Build Coastguard Worker void 140*61046927SAndroid Build Coastguard Worker tu6_emit_ds(struct tu_cs *cs, const struct ir3_shader_variant *hs); 141*61046927SAndroid Build Coastguard Worker 142*61046927SAndroid Build Coastguard Worker template <chip CHIP> 143*61046927SAndroid Build Coastguard Worker void 144*61046927SAndroid Build Coastguard Worker tu6_emit_gs(struct tu_cs *cs, const struct ir3_shader_variant *hs); 145*61046927SAndroid Build Coastguard Worker 146*61046927SAndroid Build Coastguard Worker template <chip CHIP> 147*61046927SAndroid Build Coastguard Worker void 148*61046927SAndroid Build Coastguard Worker tu6_emit_fs(struct tu_cs *cs, const struct ir3_shader_variant *fs); 149*61046927SAndroid Build Coastguard Worker 150*61046927SAndroid Build Coastguard Worker VkResult 151*61046927SAndroid Build Coastguard Worker tu_shader_create(struct tu_device *dev, 152*61046927SAndroid Build Coastguard Worker struct tu_shader **shader_out, 153*61046927SAndroid Build Coastguard Worker nir_shader *nir, 154*61046927SAndroid Build Coastguard Worker const struct tu_shader_key *key, 155*61046927SAndroid Build Coastguard Worker const struct ir3_shader_key *ir3_key, 156*61046927SAndroid Build Coastguard Worker const void *key_data, 157*61046927SAndroid Build Coastguard Worker size_t key_size, 158*61046927SAndroid Build Coastguard Worker struct tu_pipeline_layout *layout, 159*61046927SAndroid Build Coastguard Worker bool executable_info); 160*61046927SAndroid Build Coastguard Worker 161*61046927SAndroid Build Coastguard Worker void 162*61046927SAndroid Build Coastguard Worker tu_shader_key_subgroup_size(struct tu_shader_key *key, 163*61046927SAndroid Build Coastguard Worker bool allow_varying_subgroup_size, 164*61046927SAndroid Build Coastguard Worker bool require_full_subgroups, 165*61046927SAndroid Build Coastguard Worker const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *subgroup_info, 166*61046927SAndroid Build Coastguard Worker struct tu_device *dev); 167*61046927SAndroid Build Coastguard Worker 168*61046927SAndroid Build Coastguard Worker VkResult 169*61046927SAndroid Build Coastguard Worker tu_compile_shaders(struct tu_device *device, 170*61046927SAndroid Build Coastguard Worker VkPipelineCreateFlags2KHR pipeline_flags, 171*61046927SAndroid Build Coastguard Worker const VkPipelineShaderStageCreateInfo **stage_infos, 172*61046927SAndroid Build Coastguard Worker nir_shader **nir, 173*61046927SAndroid Build Coastguard Worker const struct tu_shader_key *keys, 174*61046927SAndroid Build Coastguard Worker struct tu_pipeline_layout *layout, 175*61046927SAndroid Build Coastguard Worker const unsigned char *pipeline_sha1, 176*61046927SAndroid Build Coastguard Worker struct tu_shader **shaders, 177*61046927SAndroid Build Coastguard Worker char **nir_initial_disasm, 178*61046927SAndroid Build Coastguard Worker void *nir_initial_disasm_mem_ctx, 179*61046927SAndroid Build Coastguard Worker nir_shader **nir_out, 180*61046927SAndroid Build Coastguard Worker VkPipelineCreationFeedback *stage_feedbacks); 181*61046927SAndroid Build Coastguard Worker 182*61046927SAndroid Build Coastguard Worker VkResult 183*61046927SAndroid Build Coastguard Worker tu_init_empty_shaders(struct tu_device *device); 184*61046927SAndroid Build Coastguard Worker 185*61046927SAndroid Build Coastguard Worker void 186*61046927SAndroid Build Coastguard Worker tu_destroy_empty_shaders(struct tu_device *device); 187*61046927SAndroid Build Coastguard Worker 188*61046927SAndroid Build Coastguard Worker void 189*61046927SAndroid Build Coastguard Worker tu_shader_destroy(struct tu_device *dev, 190*61046927SAndroid Build Coastguard Worker struct tu_shader *shader); 191*61046927SAndroid Build Coastguard Worker 192*61046927SAndroid Build Coastguard Worker #endif /* TU_SHADER_H */ 193