1 /* 2 * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 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 #ifndef R600_SHADER_H 24 #define R600_SHADER_H 25 26 #include "r600_asm.h" 27 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 /* Valid shader configurations: 34 * 35 * API shaders VS | TCS | TES | GS |pass| PS 36 * are compiled as: | | | |thru| 37 * | | | | | 38 * Only VS & PS: VS | -- | -- | -- | -- | PS 39 * With GS: ES | -- | -- | GS | VS | PS 40 * With Tessel.: LS | HS | VS | -- | -- | PS 41 * With both: LS | HS | ES | GS | VS | PS 42 */ 43 44 struct r600_shader_io { 45 unsigned name; 46 unsigned gpr; 47 unsigned done; 48 unsigned sid; 49 int spi_sid; 50 unsigned interpolate; 51 unsigned ij_index; 52 unsigned interpolate_location; // TGSI_INTERPOLATE_LOC_CENTER, CENTROID, SAMPLE 53 unsigned lds_pos; /* for evergreen */ 54 unsigned back_color_input; 55 unsigned write_mask; 56 int ring_offset; 57 unsigned uses_interpolate_at_centroid; 58 }; 59 60 struct r600_shader_atomic { 61 unsigned start, end; 62 unsigned buffer_id; 63 unsigned hw_idx; 64 unsigned array_id; 65 }; 66 67 struct r600_shader { 68 unsigned processor_type; 69 struct r600_bytecode bc; 70 unsigned ninput; 71 unsigned noutput; 72 unsigned nhwatomic; 73 unsigned nlds; 74 unsigned nsys_inputs; 75 struct r600_shader_io input[PIPE_MAX_SHADER_INPUTS]; 76 struct r600_shader_io output[PIPE_MAX_SHADER_OUTPUTS]; 77 struct r600_shader_atomic atomics[8]; 78 unsigned nhwatomic_ranges; 79 boolean uses_kill; 80 boolean fs_write_all; 81 boolean two_side; 82 boolean needs_scratch_space; 83 /* Number of color outputs in the TGSI shader, 84 * sometimes it could be higher than nr_cbufs (bug?). 85 * Also with writes_all property on eg+ it will be set to max CB number */ 86 unsigned nr_ps_max_color_exports; 87 /* Real number of ps color exports compiled in the bytecode */ 88 unsigned nr_ps_color_exports; 89 unsigned ps_color_export_mask; 90 unsigned ps_export_highest; 91 /* bit n is set if the shader writes gl_ClipDistance[n] */ 92 unsigned cc_dist_mask; 93 unsigned clip_dist_write; 94 unsigned cull_dist_write; 95 boolean vs_position_window_space; 96 /* flag is set if the shader writes VS_OUT_MISC_VEC (e.g. for PSIZE) */ 97 boolean vs_out_misc_write; 98 boolean vs_out_point_size; 99 boolean vs_out_layer; 100 boolean vs_out_viewport; 101 boolean vs_out_edgeflag; 102 boolean has_txq_cube_array_z_comp; 103 boolean uses_tex_buffers; 104 boolean gs_prim_id_input; 105 boolean gs_tri_strip_adj_fix; 106 uint8_t ps_conservative_z; 107 108 /* Size in bytes of a data item in the ring(s) (single vertex data). 109 Stages with only one ring items 123 will be set to 0. */ 110 unsigned ring_item_sizes[4]; 111 112 unsigned indirect_files; 113 unsigned max_arrays; 114 unsigned num_arrays; 115 unsigned vs_as_es; 116 unsigned vs_as_ls; 117 unsigned vs_as_gs_a; 118 unsigned tes_as_es; 119 unsigned tcs_prim_mode; 120 unsigned ps_prim_id_input; 121 struct r600_shader_array * arrays; 122 123 boolean uses_doubles; 124 boolean uses_atomics; 125 boolean uses_images; 126 boolean uses_helper_invocation; 127 uint8_t atomic_base; 128 uint8_t rat_base; 129 uint8_t image_size_const_offset; 130 }; 131 132 union r600_shader_key { 133 struct { 134 unsigned nr_cbufs:4; 135 unsigned first_atomic_counter:4; 136 unsigned image_size_const_offset:5; 137 unsigned color_two_side:1; 138 unsigned alpha_to_one:1; 139 unsigned apply_sample_id_mask:1; 140 unsigned dual_source_blend:1; 141 } ps; 142 struct { 143 unsigned prim_id_out:8; 144 unsigned first_atomic_counter:4; 145 unsigned as_es:1; /* export shader */ 146 unsigned as_ls:1; /* local shader */ 147 unsigned as_gs_a:1; 148 } vs; 149 struct { 150 unsigned first_atomic_counter:4; 151 unsigned as_es:1; 152 } tes; 153 struct { 154 unsigned first_atomic_counter:4; 155 unsigned prim_mode:3; 156 } tcs; 157 struct { 158 unsigned first_atomic_counter:4; 159 unsigned tri_strip_adj_fix:1; 160 } gs; 161 }; 162 163 struct r600_shader_array { 164 unsigned gpr_start; 165 unsigned gpr_count; 166 unsigned comp_mask; 167 }; 168 169 struct r600_pipe_shader { 170 struct r600_pipe_shader_selector *selector; 171 struct r600_pipe_shader *next_variant; 172 /* for GS - corresponding copy shader (installed as VS) */ 173 struct r600_pipe_shader *gs_copy_shader; 174 struct r600_shader shader; 175 struct r600_command_buffer command_buffer; /* register writes */ 176 struct r600_resource *bo; 177 unsigned sprite_coord_enable; 178 unsigned flatshade; 179 unsigned pa_cl_vs_out_cntl; 180 unsigned nr_ps_color_outputs; 181 unsigned ps_color_export_mask; 182 183 union r600_shader_key key; 184 unsigned db_shader_control; 185 unsigned ps_depth_export; 186 unsigned enabled_stream_buffers_mask; 187 unsigned scratch_space_needed; /* size of scratch space (if > 0) counted in vec4 */ 188 }; 189 190 /* return the table index 0-5 for TGSI_INTERPOLATE_LINEAR/PERSPECTIVE and 191 TGSI_INTERPOLATE_LOC_CENTER/SAMPLE/COUNT. Other input values return -1. */ 192 int eg_get_interpolator_index(unsigned interpolate, unsigned location); 193 194 int r600_get_lds_unique_index(unsigned semantic_name, unsigned index); 195 196 int generate_gs_copy_shader(struct r600_context *rctx, 197 struct r600_pipe_shader *gs, 198 struct pipe_stream_output_info *so); 199 200 #ifdef __cplusplus 201 } // extern "C" 202 #endif 203 204 205 #endif 206