1 /* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 2015 LunarG, Inc. 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 OR 17 * 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 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 * 24 * Authors: 25 * Chia-I Wu <olv@lunarg.com> 26 */ 27 28 #ifndef ILO_STATE_RASTER_H 29 #define ILO_STATE_RASTER_H 30 31 #include "genhw/genhw.h" 32 33 #include "ilo_core.h" 34 #include "ilo_dev.h" 35 36 enum ilo_state_raster_dirty_bits { 37 ILO_STATE_RASTER_3DSTATE_CLIP = (1 << 0), 38 ILO_STATE_RASTER_3DSTATE_SF = (1 << 1), 39 ILO_STATE_RASTER_3DSTATE_RASTER = (1 << 2), 40 ILO_STATE_RASTER_3DSTATE_MULTISAMPLE = (1 << 3), 41 ILO_STATE_RASTER_3DSTATE_SAMPLE_MASK = (1 << 4), 42 ILO_STATE_RASTER_3DSTATE_WM = (1 << 5), 43 ILO_STATE_RASTER_3DSTATE_WM_HZ_OP = (1 << 6), 44 ILO_STATE_RASTER_3DSTATE_AA_LINE_PARAMETERS = (1 << 7), 45 }; 46 47 enum ilo_state_raster_earlyz_op { 48 ILO_STATE_RASTER_EARLYZ_NORMAL, 49 ILO_STATE_RASTER_EARLYZ_DEPTH_CLEAR, 50 ILO_STATE_RASTER_EARLYZ_DEPTH_RESOLVE, 51 ILO_STATE_RASTER_EARLYZ_HIZ_RESOLVE, 52 }; 53 54 /** 55 * VUE readback, VertexClipTest, ClipDetermination, and primitive output. 56 */ 57 struct ilo_state_raster_clip_info { 58 bool clip_enable; 59 /* CL_INVOCATION_COUNT and CL_PRIMITIVES_COUNT */ 60 bool stats_enable; 61 62 uint8_t viewport_count; 63 bool force_rtaindex_zero; 64 65 /* these should be mutually exclusive */ 66 uint8_t user_cull_enables; 67 uint8_t user_clip_enables; 68 69 bool gb_test_enable; 70 bool xy_test_enable; 71 72 /* far/near must be enabled together prior to Gen9 */ 73 bool z_far_enable; 74 bool z_near_enable; 75 bool z_near_zero; 76 }; 77 78 /** 79 * Primitive assembly, viewport transformation, scissoring, MSAA, etc. 80 */ 81 struct ilo_state_raster_setup_info { 82 bool cv_is_rectangle; 83 84 bool first_vertex_provoking; 85 bool viewport_transform; 86 87 bool scissor_enable; 88 89 /* MSAA enables for lines and non-lines */ 90 bool msaa_enable; 91 bool line_msaa_enable; 92 }; 93 94 /** 95 * 3DOBJ_POINT rasterization rules. 96 */ 97 struct ilo_state_raster_point_info { 98 /* ignored when msaa_enable is set */ 99 bool aa_enable; 100 101 bool programmable_width; 102 }; 103 104 /** 105 * 3DOBJ_LINE rasterization rules. 106 */ 107 struct ilo_state_raster_line_info { 108 /* ignored when line_msaa_enable is set */ 109 bool aa_enable; 110 111 /* ignored when line_msaa_enable or aa_enable is set */ 112 bool stipple_enable; 113 bool giq_enable; 114 bool giq_last_pixel; 115 }; 116 117 /** 118 * 3DOBJ_TRIANGLE rasterization rules. 119 */ 120 struct ilo_state_raster_tri_info { 121 enum gen_front_winding front_winding; 122 enum gen_cull_mode cull_mode; 123 enum gen_fill_mode fill_mode_front; 124 enum gen_fill_mode fill_mode_back; 125 126 enum gen_depth_format depth_offset_format; 127 bool depth_offset_solid; 128 bool depth_offset_wireframe; 129 bool depth_offset_point; 130 131 bool poly_stipple_enable; 132 }; 133 134 /** 135 * Scan conversion. 136 */ 137 struct ilo_state_raster_scan_info { 138 /* PS_DEPTH_COUNT and PS_INVOCATION_COUNT */ 139 bool stats_enable; 140 141 uint8_t sample_count; 142 143 /* pixel location for non-MSAA or 1x-MSAA */ 144 enum gen_pixel_location pixloc; 145 146 uint32_t sample_mask; 147 148 /* interpolations */ 149 enum gen_zw_interp zw_interp; 150 uint8_t barycentric_interps; 151 152 /* Gen7+ only */ 153 enum gen_edsc_mode earlyz_control; 154 enum ilo_state_raster_earlyz_op earlyz_op; 155 bool earlyz_stencil_clear; 156 }; 157 158 /** 159 * Raster parameters. 160 */ 161 struct ilo_state_raster_params_info { 162 bool any_integer_rt; 163 bool hiz_enable; 164 165 float point_width; 166 float line_width; 167 168 /* const term will be scaled by 'r' */ 169 float depth_offset_const; 170 float depth_offset_scale; 171 float depth_offset_clamp; 172 }; 173 174 struct ilo_state_raster_info { 175 struct ilo_state_raster_clip_info clip; 176 struct ilo_state_raster_setup_info setup; 177 struct ilo_state_raster_point_info point; 178 struct ilo_state_raster_line_info line; 179 struct ilo_state_raster_tri_info tri; 180 struct ilo_state_raster_scan_info scan; 181 182 struct ilo_state_raster_params_info params; 183 }; 184 185 struct ilo_state_raster { 186 uint32_t clip[3]; 187 uint32_t sf[3]; 188 uint32_t raster[4]; 189 uint32_t sample[2]; 190 uint32_t wm[3]; 191 192 bool line_aa_enable; 193 bool line_giq_enable; 194 }; 195 196 struct ilo_state_raster_delta { 197 uint32_t dirty; 198 }; 199 200 struct ilo_state_sample_pattern_offset_info { 201 /* in U0.4 */ 202 uint8_t x; 203 uint8_t y; 204 }; 205 206 struct ilo_state_sample_pattern_info { 207 struct ilo_state_sample_pattern_offset_info pattern_1x[1]; 208 struct ilo_state_sample_pattern_offset_info pattern_2x[2]; 209 struct ilo_state_sample_pattern_offset_info pattern_4x[4]; 210 struct ilo_state_sample_pattern_offset_info pattern_8x[8]; 211 struct ilo_state_sample_pattern_offset_info pattern_16x[16]; 212 }; 213 214 struct ilo_state_sample_pattern { 215 uint8_t pattern_1x[1]; 216 uint8_t pattern_2x[2]; 217 uint8_t pattern_4x[4]; 218 uint8_t pattern_8x[8]; 219 uint8_t pattern_16x[16]; 220 }; 221 222 struct ilo_state_line_stipple_info { 223 uint16_t pattern; 224 uint16_t repeat_count; 225 }; 226 227 struct ilo_state_line_stipple { 228 uint32_t stipple[2]; 229 }; 230 231 struct ilo_state_poly_stipple_info { 232 uint32_t pattern[32]; 233 }; 234 235 struct ilo_state_poly_stipple { 236 uint32_t stipple[32]; 237 }; 238 239 bool 240 ilo_state_raster_init(struct ilo_state_raster *rs, 241 const struct ilo_dev *dev, 242 const struct ilo_state_raster_info *info); 243 244 bool 245 ilo_state_raster_init_for_rectlist(struct ilo_state_raster *rs, 246 const struct ilo_dev *dev, 247 uint8_t sample_count, 248 enum ilo_state_raster_earlyz_op earlyz_op, 249 bool earlyz_stencil_clear); 250 251 bool 252 ilo_state_raster_set_info(struct ilo_state_raster *rs, 253 const struct ilo_dev *dev, 254 const struct ilo_state_raster_info *info); 255 256 bool 257 ilo_state_raster_set_params(struct ilo_state_raster *rs, 258 const struct ilo_dev *dev, 259 const struct ilo_state_raster_params_info *params); 260 261 void 262 ilo_state_raster_full_delta(const struct ilo_state_raster *rs, 263 const struct ilo_dev *dev, 264 struct ilo_state_raster_delta *delta); 265 266 void 267 ilo_state_raster_get_delta(const struct ilo_state_raster *rs, 268 const struct ilo_dev *dev, 269 const struct ilo_state_raster *old, 270 struct ilo_state_raster_delta *delta); 271 272 bool 273 ilo_state_sample_pattern_init(struct ilo_state_sample_pattern *pattern, 274 const struct ilo_dev *dev, 275 const struct ilo_state_sample_pattern_info *info); 276 277 bool 278 ilo_state_sample_pattern_init_default(struct ilo_state_sample_pattern *pattern, 279 const struct ilo_dev *dev); 280 281 const uint8_t * 282 ilo_state_sample_pattern_get_packed_offsets(const struct ilo_state_sample_pattern *pattern, 283 const struct ilo_dev *dev, 284 uint8_t sample_count); 285 286 void 287 ilo_state_sample_pattern_get_offset(const struct ilo_state_sample_pattern *pattern, 288 const struct ilo_dev *dev, 289 uint8_t sample_count, uint8_t sample_index, 290 uint8_t *x, uint8_t *y); 291 bool 292 ilo_state_line_stipple_set_info(struct ilo_state_line_stipple *stipple, 293 const struct ilo_dev *dev, 294 const struct ilo_state_line_stipple_info *info); 295 296 bool 297 ilo_state_poly_stipple_set_info(struct ilo_state_poly_stipple *stipple, 298 const struct ilo_dev *dev, 299 const struct ilo_state_poly_stipple_info *info); 300 301 #endif /* ILO_STATE_RASTER_H */ 302