Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/d3d12/d3d12_compiler.h
4570 views
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
211