"Fossies" - the Fresh Open Source Software Archive

Member "mesa-20.1.8/src/amd/llvm/ac_shader_abi.h" (16 Sep 2020, 6127 Bytes) of package /linux/misc/mesa-20.1.8.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "ac_shader_abi.h" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 20.1.5_vs_20.2.0-rc1.

    1 /*
    2  * Copyright 2017 Advanced Micro Devices, Inc.
    3  *
    4  * Permission is hereby granted, free of charge, to any person obtaining a
    5  * copy of this software and associated documentation files (the "Software"),
    6  * to deal in the Software without restriction, including without limitation
    7  * on the rights to use, copy, modify, merge, publish, distribute, sub
    8  * license, and/or sell copies of the Software, and to permit persons to whom
    9  * the Software is furnished to do so, subject to the following conditions:
   10  *
   11  * The above copyright notice and this permission notice (including the next
   12  * paragraph) shall be included in all copies or substantial portions of the
   13  * Software.
   14  *
   15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
   18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
   19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
   20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
   21  * USE OR OTHER DEALINGS IN THE SOFTWARE.
   22  */
   23 
   24 #ifndef AC_SHADER_ABI_H
   25 #define AC_SHADER_ABI_H
   26 
   27 #include <llvm-c/Core.h>
   28 #include <assert.h>
   29 #include "ac_shader_args.h"
   30 
   31 #include "compiler/shader_enums.h"
   32 
   33 struct nir_variable;
   34 
   35 #define AC_LLVM_MAX_OUTPUTS (VARYING_SLOT_VAR31 + 1)
   36 
   37 #define AC_MAX_INLINE_PUSH_CONSTS 8
   38 
   39 enum ac_descriptor_type {
   40     AC_DESC_IMAGE,
   41     AC_DESC_FMASK,
   42     AC_DESC_SAMPLER,
   43     AC_DESC_BUFFER,
   44     AC_DESC_PLANE_0,
   45     AC_DESC_PLANE_1,
   46     AC_DESC_PLANE_2,
   47 };
   48 
   49 /* Document the shader ABI during compilation. This is what allows radeonsi and
   50  * radv to share a compiler backend.
   51  */
   52 struct ac_shader_abi {
   53     LLVMValueRef outputs[AC_LLVM_MAX_OUTPUTS * 4];
   54 
   55     /* These input registers sometimes need to be fixed up. */
   56     LLVMValueRef vertex_id;
   57     LLVMValueRef instance_id;
   58     LLVMValueRef persp_centroid, linear_centroid;
   59     LLVMValueRef color0, color1;
   60     LLVMValueRef user_data;
   61 
   62     /* For VS and PS: pre-loaded shader inputs.
   63      *
   64      * Currently only used for NIR shaders; indexed by variables'
   65      * driver_location.
   66      */
   67     LLVMValueRef *inputs;
   68 
   69     /* Varying -> attribute number mapping. Also NIR-only */
   70     unsigned fs_input_attr_indices[MAX_VARYING];
   71 
   72     void (*emit_outputs)(struct ac_shader_abi *abi,
   73                  unsigned max_outputs,
   74                  LLVMValueRef *addrs);
   75 
   76     void (*emit_vertex)(struct ac_shader_abi *abi,
   77                 unsigned stream,
   78                 LLVMValueRef *addrs);
   79 
   80     void (*emit_primitive)(struct ac_shader_abi *abi,
   81                    unsigned stream);
   82 
   83     void (*emit_vertex_with_counter)(struct ac_shader_abi *abi,
   84                      unsigned stream,
   85                      LLVMValueRef vertexidx,
   86                      LLVMValueRef *addrs);
   87 
   88     LLVMValueRef (*load_inputs)(struct ac_shader_abi *abi,
   89                     unsigned location,
   90                     unsigned driver_location,
   91                     unsigned component,
   92                     unsigned num_components,
   93                     unsigned vertex_index,
   94                     unsigned const_index,
   95                     LLVMTypeRef type);
   96 
   97     LLVMValueRef (*load_tess_varyings)(struct ac_shader_abi *abi,
   98                        LLVMTypeRef type,
   99                        LLVMValueRef vertex_index,
  100                        LLVMValueRef param_index,
  101                        unsigned const_index,
  102                        unsigned location,
  103                        unsigned driver_location,
  104                        unsigned component,
  105                        unsigned num_components,
  106                        bool is_patch,
  107                        bool is_compact,
  108                        bool load_inputs);
  109 
  110     void (*store_tcs_outputs)(struct ac_shader_abi *abi,
  111                   const struct nir_variable *var,
  112                   LLVMValueRef vertex_index,
  113                   LLVMValueRef param_index,
  114                   unsigned const_index,
  115                   LLVMValueRef src,
  116                   unsigned writemask);
  117 
  118     LLVMValueRef (*load_tess_coord)(struct ac_shader_abi *abi);
  119 
  120     LLVMValueRef (*load_patch_vertices_in)(struct ac_shader_abi *abi);
  121 
  122     LLVMValueRef (*load_tess_level)(struct ac_shader_abi *abi,
  123                     unsigned varying_id,
  124                     bool load_default_state);
  125 
  126 
  127     LLVMValueRef (*load_ubo)(struct ac_shader_abi *abi, LLVMValueRef index);
  128 
  129     /**
  130      * Load the descriptor for the given buffer.
  131      *
  132      * \param buffer the buffer as presented in NIR: this is the descriptor
  133      *               in Vulkan, and the buffer index in OpenGL/Gallium
  134      * \param write whether buffer contents will be written
  135      */
  136     LLVMValueRef (*load_ssbo)(struct ac_shader_abi *abi,
  137                   LLVMValueRef buffer, bool write);
  138 
  139     /**
  140      * Load a descriptor associated to a sampler.
  141      *
  142      * \param descriptor_set the descriptor set index (only for Vulkan)
  143      * \param base_index the base index of the sampler variable
  144      * \param constant_index constant part of an array index (or 0, if the
  145      *                       sampler variable is not an array)
  146      * \param index non-constant part of an array index (may be NULL)
  147      * \param desc_type the type of descriptor to load
  148      * \param image whether the descriptor is loaded for an image operation
  149      */
  150     LLVMValueRef (*load_sampler_desc)(struct ac_shader_abi *abi,
  151                       unsigned descriptor_set,
  152                       unsigned base_index,
  153                       unsigned constant_index,
  154                       LLVMValueRef index,
  155                       enum ac_descriptor_type desc_type,
  156                       bool image, bool write,
  157                       bool bindless);
  158 
  159     /**
  160      * Load a Vulkan-specific resource.
  161      *
  162      * \param index resource index
  163      * \param desc_set descriptor set
  164      * \param binding descriptor set binding
  165      */
  166     LLVMValueRef (*load_resource)(struct ac_shader_abi *abi,
  167                       LLVMValueRef index,
  168                       unsigned desc_set,
  169                       unsigned binding);
  170 
  171     LLVMValueRef (*load_sample_position)(struct ac_shader_abi *abi,
  172                          LLVMValueRef sample_id);
  173 
  174     LLVMValueRef (*load_local_group_size)(struct ac_shader_abi *abi);
  175 
  176     LLVMValueRef (*load_sample_mask_in)(struct ac_shader_abi *abi);
  177 
  178     LLVMValueRef (*load_base_vertex)(struct ac_shader_abi *abi);
  179 
  180     LLVMValueRef (*emit_fbfetch)(struct ac_shader_abi *abi);
  181 
  182     /* Whether to clamp the shadow reference value to [0,1]on GFX8. Radeonsi currently
  183      * uses it due to promoting D16 to D32, but radv needs it off. */
  184     bool clamp_shadow_reference;
  185     bool interp_at_sample_force_center;
  186 
  187     /* Whether bounds checks are required */
  188     bool robust_buffer_access;
  189 
  190     /* Clamp div by 0 (so it won't produce NaN) */
  191     bool clamp_div_by_zero;
  192 };
  193 
  194 #endif /* AC_SHADER_ABI_H */