draw: add disk cache callbacks for draw shaders
[mesa.git] / src / gallium / auxiliary / draw / draw_tess.h
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