• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 D3D12_COMPILER_H
25 #define D3D12_COMPILER_H
26 
27 #include "dxil_nir_lower_int_samplers.h"
28 
29 #include "pipe/p_defines.h"
30 #include "pipe/p_state.h"
31 
32 #include "compiler/shader_info.h"
33 #include "program/prog_statevars.h"
34 
35 #include "nir.h"
36 
37 struct pipe_screen;
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 enum d3d12_state_var {
44    D3D12_STATE_VAR_Y_FLIP = 0,
45    D3D12_STATE_VAR_PT_SPRITE,
46    D3D12_STATE_VAR_FIRST_VERTEX,
47    D3D12_STATE_VAR_DEPTH_TRANSFORM,
48    D3D12_MAX_STATE_VARS
49 };
50 
51 #define D3D12_MAX_POINT_SIZE 255.0f
52 
53 struct d3d12_validation_tools *d3d12_validator_create();
54 
55 void d3d12_validator_destroy(struct d3d12_validation_tools *validator);
56 
57 const void *
58 d3d12_get_compiler_options(struct pipe_screen *screen,
59                            enum pipe_shader_ir ir,
60                            enum pipe_shader_type shader);
61 
62 struct d3d12_varying_info {
63    struct {
64       const struct glsl_type *type;
65       unsigned interpolation:3;   // INTERP_MODE_COUNT = 5
66       unsigned driver_location:6; // VARYING_SLOT_MAX = 64
67    } vars[VARYING_SLOT_MAX];
68    uint64_t mask;
69 };
70 
71 struct d3d12_shader_key {
72    enum pipe_shader_type stage;
73 
74    struct d3d12_varying_info required_varying_inputs;
75    struct d3d12_varying_info required_varying_outputs;
76    uint64_t next_varying_inputs;
77    uint64_t prev_varying_outputs;
78    unsigned last_vertex_processing_stage : 1;
79    unsigned invert_depth : 1;
80    unsigned samples_int_textures : 1;
81    unsigned tex_saturate_s : PIPE_MAX_SAMPLERS;
82    unsigned tex_saturate_r : PIPE_MAX_SAMPLERS;
83    unsigned tex_saturate_t : PIPE_MAX_SAMPLERS;
84 
85    struct {
86       unsigned needs_format_emulation:1;
87       enum pipe_format format_conversion[PIPE_MAX_ATTRIBS];
88    } vs;
89 
90    struct {
91       unsigned sprite_coord_enable:24;
92       unsigned sprite_origin_upper_left:1;
93       unsigned point_pos_stream_out:1;
94       unsigned writes_psize:1;
95       unsigned point_size_per_vertex:1;
96       unsigned aa_point:1;
97       unsigned stream_output_factor:3;
98       unsigned primitive_id:1;
99       unsigned triangle_strip:1;
100    } gs;
101 
102    struct {
103       unsigned missing_dual_src_outputs : 2;
104       unsigned frag_result_color_lowering : 4;
105       unsigned cast_to_uint : 1;
106       unsigned cast_to_int : 1;
107       unsigned provoking_vertex : 2;
108       unsigned manual_depth_range : 1;
109       unsigned polygon_stipple : 1;
110       unsigned remap_front_facing : 1;
111    } fs;
112 
113    int n_texture_states;
114    dxil_wrap_sampler_state tex_wrap_states[PIPE_MAX_SHADER_SAMPLER_VIEWS];
115    dxil_texture_swizzle_state swizzle_state[PIPE_MAX_SHADER_SAMPLER_VIEWS];
116    enum compare_func sampler_compare_funcs[PIPE_MAX_SHADER_SAMPLER_VIEWS];
117 };
118 
119 struct d3d12_shader {
120    void *bytecode;
121    size_t bytecode_length;
122 
123    nir_shader *nir;
124 
125    struct {
126       unsigned binding;
127    } cb_bindings[PIPE_MAX_CONSTANT_BUFFERS];
128    size_t num_cb_bindings;
129 
130    struct {
131       enum d3d12_state_var var;
132       unsigned offset;
133    } state_vars[D3D12_MAX_STATE_VARS];
134    unsigned num_state_vars;
135    size_t state_vars_size;
136    bool state_vars_used;
137 
138    struct {
139       int binding;
140       uint32_t dimension;
141    } srv_bindings[PIPE_MAX_SHADER_SAMPLER_VIEWS];
142    size_t begin_srv_binding;
143    size_t end_srv_binding;
144 
145    bool has_default_ubo0;
146    unsigned pstipple_binding;
147 
148    struct d3d12_shader_key key;
149    struct d3d12_shader *next_variant;
150 };
151 
152 struct d3d12_gs_variant_key
153 {
154    unsigned passthrough:1;
155    unsigned provoking_vertex:3;
156    unsigned alternate_tri:1;
157    unsigned fill_mode:2;
158    unsigned cull_mode:2;
159    unsigned has_front_face:1;
160    unsigned front_ccw:1;
161    unsigned edge_flag_fix:1;
162    unsigned flatshade_first:1;
163    uint64_t flat_varyings;
164    struct d3d12_varying_info varyings;
165 };
166 
167 struct d3d12_shader_selector {
168    enum pipe_shader_type stage;
169    nir_shader *initial;
170    struct d3d12_shader *first;
171    struct d3d12_shader *current;
172 
173    struct pipe_stream_output_info so_info;
174 
175    unsigned samples_int_textures:1;
176    unsigned compare_with_lod_bias_grad:1;
177 
178    bool is_gs_variant;
179    struct d3d12_gs_variant_key gs_key;
180 };
181 
182 struct d3d12_context;
183 
184 struct d3d12_shader_selector *
185 d3d12_create_shader(struct d3d12_context *ctx,
186                     enum pipe_shader_type stage,
187                     const struct pipe_shader_state *shader);
188 
189 void
190 d3d12_shader_free(struct d3d12_shader_selector *shader);
191 
192 void
193 d3d12_select_shader_variants(struct d3d12_context *ctx,
194                              const struct pipe_draw_info *dinfo);
195 
196 void
197 d3d12_gs_variant_cache_init(struct d3d12_context *ctx);
198 
199 void
200 d3d12_gs_variant_cache_destroy(struct d3d12_context *ctx);
201 
202 struct d3d12_shader_selector *
203 d3d12_get_gs_variant(struct d3d12_context *ctx, struct d3d12_gs_variant_key *key);
204 
205 #ifdef __cplusplus
206 }
207 #endif
208 
209 #endif
210