1 /* 2 * Copyright © Microsoft Corporation 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 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * 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 NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24 #ifndef DZN_NIR_H 25 #define DZN_NIR_H 26 27 #define D3D12_IGNORE_SDK_LAYERS 28 #define COBJMACROS 29 #include <unknwn.h> 30 #include <directx/d3d12.h> 31 32 #include "nir.h" 33 34 struct dzn_indirect_draw_params { 35 uint32_t vertex_count; 36 uint32_t instance_count; 37 uint32_t first_vertex; 38 uint32_t first_instance; 39 }; 40 41 struct dzn_indirect_indexed_draw_params { 42 uint32_t index_count; 43 uint32_t instance_count; 44 uint32_t first_index; 45 int32_t vertex_offset; 46 uint32_t first_instance; 47 }; 48 49 struct dzn_indirect_draw_rewrite_params { 50 uint32_t draw_buf_stride; 51 }; 52 53 struct dzn_indirect_draw_triangle_fan_rewrite_params { 54 uint32_t draw_buf_stride; 55 uint32_t triangle_fan_index_buf_stride; 56 uint64_t triangle_fan_index_buf_start; 57 }; 58 59 struct dzn_indirect_draw_triangle_fan_prim_restart_rewrite_params { 60 uint32_t draw_buf_stride; 61 uint32_t triangle_fan_index_buf_stride; 62 uint64_t triangle_fan_index_buf_start; 63 uint64_t exec_buf_start; 64 }; 65 66 struct dzn_indirect_draw_exec_params { 67 struct { 68 uint32_t first_vertex; 69 uint32_t base_instance; 70 uint32_t draw_id; 71 } sysvals; 72 union { 73 struct dzn_indirect_draw_params draw; 74 struct dzn_indirect_indexed_draw_params indexed_draw; 75 }; 76 }; 77 78 struct dzn_indirect_triangle_fan_draw_exec_params { 79 D3D12_INDEX_BUFFER_VIEW ibview; 80 struct { 81 uint32_t first_vertex; 82 uint32_t base_instance; 83 uint32_t draw_id; 84 } sysvals; 85 union { 86 struct dzn_indirect_draw_params draw; 87 struct dzn_indirect_indexed_draw_params indexed_draw; 88 }; 89 }; 90 91 struct dzn_triangle_fan_rewrite_index_params { 92 uint32_t first_index; 93 }; 94 95 struct dzn_triangle_fan_prim_restart_rewrite_index_params { 96 uint32_t first_index; 97 uint32_t index_count; 98 }; 99 100 struct dzn_indirect_triangle_fan_rewrite_index_exec_params { 101 uint64_t new_index_buf; 102 struct dzn_triangle_fan_rewrite_index_params params; 103 struct { 104 uint32_t x, y, z; 105 } group_count; 106 }; 107 108 struct dzn_indirect_triangle_fan_prim_restart_rewrite_index_exec_params { 109 uint64_t new_index_buf; 110 struct dzn_triangle_fan_prim_restart_rewrite_index_params params; 111 uint64_t index_count_ptr; 112 struct { 113 uint32_t x, y, z; 114 } group_count; 115 }; 116 117 enum dzn_indirect_draw_type { 118 DZN_INDIRECT_DRAW, 119 DZN_INDIRECT_DRAW_COUNT, 120 DZN_INDIRECT_INDEXED_DRAW, 121 DZN_INDIRECT_INDEXED_DRAW_COUNT, 122 DZN_INDIRECT_DRAW_TRIANGLE_FAN, 123 DZN_INDIRECT_DRAW_COUNT_TRIANGLE_FAN, 124 DZN_INDIRECT_INDEXED_DRAW_TRIANGLE_FAN, 125 DZN_INDIRECT_INDEXED_DRAW_COUNT_TRIANGLE_FAN, 126 DZN_INDIRECT_INDEXED_DRAW_TRIANGLE_FAN_PRIM_RESTART, 127 DZN_INDIRECT_INDEXED_DRAW_COUNT_TRIANGLE_FAN_PRIM_RESTART, 128 DZN_NUM_INDIRECT_DRAW_TYPES, 129 }; 130 131 nir_shader * 132 dzn_nir_indirect_draw_shader(enum dzn_indirect_draw_type type); 133 134 nir_shader * 135 dzn_nir_triangle_fan_rewrite_index_shader(uint8_t old_index_size); 136 137 nir_shader * 138 dzn_nir_triangle_fan_prim_restart_rewrite_index_shader(uint8_t old_index_size); 139 140 enum dzn_blit_resolve_mode { 141 dzn_blit_resolve_none, 142 dzn_blit_resolve_average, 143 dzn_blit_resolve_min, 144 dzn_blit_resolve_max, 145 dzn_blit_resolve_sample_zero, 146 }; 147 struct dzn_nir_blit_info { 148 union { 149 struct { 150 uint32_t src_samples : 6; 151 uint32_t loc : 4; 152 uint32_t out_type : 4; 153 uint32_t sampler_dim : 4; 154 uint32_t src_is_array : 1; 155 uint32_t resolve_mode : 3; 156 uint32_t stencil_fallback : 1; 157 uint32_t padding : 9; 158 }; 159 const uint32_t hash_key; 160 }; 161 }; 162 163 nir_shader * 164 dzn_nir_blit_vs(void); 165 166 nir_shader * 167 dzn_nir_blit_fs(const struct dzn_nir_blit_info *info); 168 169 struct dzn_nir_point_gs_info { 170 unsigned cull_mode; 171 bool front_ccw; 172 bool depth_bias; 173 bool depth_bias_dynamic; 174 DXGI_FORMAT ds_fmt; 175 /* Constant values */ 176 float constant_depth_bias; 177 float slope_scaled_depth_bias; 178 float depth_bias_clamp; 179 /* Used for loading dynamic values */ 180 struct { 181 uint32_t register_space; 182 uint32_t base_shader_register; 183 } runtime_data_cbv; 184 }; 185 nir_shader * 186 dzn_nir_polygon_point_mode_gs(const nir_shader *vs, struct dzn_nir_point_gs_info *info); 187 188 #endif 189