1 /************************************************************************** 2 * 3 * Copyright 2020 Red Hat. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included 14 * in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 * 24 **************************************************************************/ 25 26 #ifndef DRAW_TESS_H 27 #define DRAW_TESS_H 28 29 #include "draw_context.h" 30 #include "draw_private.h" 31 32 struct draw_context; 33 #ifdef LLVM_AVAILABLE 34 35 #define NUM_PATCH_INPUTS 32 36 #define NUM_TCS_INPUTS (PIPE_MAX_SHADER_INPUTS - NUM_PATCH_INPUTS) 37 38 struct draw_tcs_inputs { 39 /* num vertices per prim */ 40 float data[32][NUM_TCS_INPUTS][4]; 41 }; 42 43 struct draw_tcs_outputs { 44 /* num vertices per prim */ 45 float data[32][PIPE_MAX_SHADER_INPUTS][4]; 46 }; 47 48 struct draw_tes_inputs { 49 /* num vertices per prim */ 50 float data[32][PIPE_MAX_SHADER_INPUTS][4]; 51 }; 52 53 #endif 54 55 struct draw_tess_ctrl_shader { 56 struct draw_context *draw; 57 58 struct pipe_shader_state state; 59 struct tgsi_shader_info info; 60 61 unsigned vector_length; 62 unsigned vertices_out; 63 64 unsigned input_vertex_stride; 65 const float (*input)[4]; 66 const struct tgsi_shader_info *input_info; 67 #ifdef LLVM_AVAILABLE 68 struct draw_tcs_inputs *tcs_input; 69 struct draw_tcs_outputs *tcs_output; 70 struct draw_tcs_jit_context *jit_context; 71 struct draw_tcs_llvm_variant *current_variant; 72 #endif 73 }; 74 75 struct draw_tess_eval_shader { 76 struct draw_context *draw; 77 struct pipe_shader_state state; 78 struct tgsi_shader_info info; 79 80 unsigned prim_mode; 81 unsigned spacing; 82 unsigned vertex_order_cw; 83 unsigned point_mode; 84 85 unsigned position_output; 86 unsigned viewport_index_output; 87 unsigned ccdistance_output[PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT]; 88 unsigned vector_length; 89 90 unsigned input_vertex_stride; 91 const float (*input)[4]; 92 const struct tgsi_shader_info *input_info; 93 94 #ifdef LLVM_AVAILABLE 95 struct draw_tes_inputs *tes_input; 96 struct draw_tes_jit_context *jit_context; 97 struct draw_tes_llvm_variant *current_variant; 98 #endif 99 }; 100 101 enum pipe_prim_type get_tes_output_prim(struct draw_tess_eval_shader *shader); 102 103 int draw_tess_ctrl_shader_run(struct draw_tess_ctrl_shader *shader, 104 const void *constants[PIPE_MAX_CONSTANT_BUFFERS], 105 const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], 106 const struct draw_vertex_info *input_verts, 107 const struct draw_prim_info *input_prim, 108 const struct tgsi_shader_info *input_info, 109 struct draw_vertex_info *output_verts, 110 struct draw_prim_info *output_prims ); 111 112 int draw_tess_eval_shader_run(struct draw_tess_eval_shader *shader, 113 const void *constants[PIPE_MAX_CONSTANT_BUFFERS], 114 const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], 115 unsigned num_input_vertices_per_patch, 116 const struct draw_vertex_info *input_verts, 117 const struct draw_prim_info *input_prim, 118 const struct tgsi_shader_info *input_info, 119 struct draw_vertex_info *output_verts, 120 struct draw_prim_info *output_prims, 121 ushort **elts_out); 122 123 #ifdef LLVM_AVAILABLE 124 void draw_tcs_set_current_variant(struct draw_tess_ctrl_shader *shader, 125 struct draw_tcs_llvm_variant *variant); 126 void draw_tes_set_current_variant(struct draw_tess_eval_shader *shader, 127 struct draw_tes_llvm_variant *variant); 128 #endif 129 130 #endif 131