d3d12_compiler.h revision 7ec681f3
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
37struct pipe_screen;
38
39#ifdef __cplusplus
40extern "C" {
41#endif
42
43enum 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
53struct d3d12_validation_tools *d3d12_validator_create();
54
55void d3d12_validator_destroy(struct d3d12_validation_tools *validator);
56
57const void *
58d3d12_get_compiler_options(struct pipe_screen *screen,
59                           enum pipe_shader_ir ir,
60                           enum pipe_shader_type shader);
61
62struct 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
71struct 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
119struct 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
152struct 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
167struct 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
182struct d3d12_context;
183
184struct d3d12_shader_selector *
185d3d12_create_shader(struct d3d12_context *ctx,
186                    enum pipe_shader_type stage,
187                    const struct pipe_shader_state *shader);
188
189void
190d3d12_shader_free(struct d3d12_shader_selector *shader);
191
192void
193d3d12_select_shader_variants(struct d3d12_context *ctx,
194                             const struct pipe_draw_info *dinfo);
195
196void
197d3d12_gs_variant_cache_init(struct d3d12_context *ctx);
198
199void
200d3d12_gs_variant_cache_destroy(struct d3d12_context *ctx);
201
202struct d3d12_shader_selector *
203d3d12_get_gs_variant(struct d3d12_context *ctx, struct d3d12_gs_variant_key *key);
204
205#ifdef __cplusplus
206}
207#endif
208
209#endif
210