Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/llvmpipe/lp_rast.h
4570 views
1
/**************************************************************************
2
*
3
* Copyright 2009 VMware, Inc.
4
* All Rights Reserved.
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the
8
* "Software"), to deal in the Software without restriction, including
9
* without limitation the rights to use, copy, modify, merge, publish,
10
* distribute, sub license, and/or sell copies of the Software, and to
11
* permit persons to whom the Software is furnished to do so, subject to
12
* the following conditions:
13
*
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial portions
16
* of the Software.
17
*
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
*
26
**************************************************************************/
27
28
/**
29
* The rast code is concerned with rasterization of command bins.
30
* Each screen tile has a bin associated with it. To render the
31
* scene we iterate over the tile bins and execute the commands
32
* in each bin.
33
* We'll do that with multiple threads...
34
*/
35
36
37
#ifndef LP_RAST_H
38
#define LP_RAST_H
39
40
#include "pipe/p_compiler.h"
41
#include "util/u_pack_color.h"
42
#include "lp_jit.h"
43
44
45
struct lp_rasterizer;
46
struct lp_scene;
47
struct lp_fence;
48
struct cmd_bin;
49
50
#define FIXED_TYPE_WIDTH 64
51
/** For sub-pixel positioning */
52
#define FIXED_ORDER 8
53
#define FIXED_ONE (1<<FIXED_ORDER)
54
#define FIXED_SHIFT (FIXED_TYPE_WIDTH - 1)
55
/** Maximum length of an edge in a primitive in pixels.
56
* If the framebuffer is large we have to think about fixed-point
57
* integer overflow. Coordinates need ((FIXED_TYPE_WIDTH/2) - 1) bits
58
* to be able to fit product of two such coordinates inside
59
* FIXED_TYPE_WIDTH, any larger and we could overflow a
60
* FIXED_TYPE_WIDTH_-bit int.
61
*/
62
#define MAX_FIXED_LENGTH (1 << (((FIXED_TYPE_WIDTH/2) - 1) - FIXED_ORDER))
63
64
#define MAX_FIXED_LENGTH32 (1 << (((32/2) - 1) - FIXED_ORDER))
65
66
/* Rasterizer output size going to jit fs, width/height */
67
#define LP_RASTER_BLOCK_SIZE 4
68
69
#define LP_MAX_ACTIVE_BINNED_QUERIES 64
70
71
#define IMUL64(a, b) (((int64_t)(a)) * ((int64_t)(b)))
72
73
struct lp_rasterizer_task;
74
75
extern const float lp_sample_pos_4x[4][2];
76
77
/**
78
* Rasterization state.
79
* Objects of this type are put into the shared data bin and pointed
80
* to by commands in the per-tile bins.
81
*/
82
struct lp_rast_state {
83
/* State for the shader. This also contains state which feeds into
84
* the fragment shader, such as blend color and alpha ref value.
85
*/
86
struct lp_jit_context jit_context;
87
88
/* The shader itself. Probably we also need to pass a pointer to
89
* the tile color/z/stencil data somehow
90
*/
91
struct lp_fragment_shader_variant *variant;
92
};
93
94
95
/**
96
* Coefficients necessary to run the shader at a given location.
97
* First coefficient is position.
98
* These pointers point into the bin data buffer.
99
*/
100
struct lp_rast_shader_inputs {
101
unsigned frontfacing:1; /** True for front-facing */
102
unsigned disable:1; /** Partially binned, disable this command */
103
unsigned opaque:1; /** Is opaque */
104
unsigned pad0:13; /* wasted space */
105
unsigned view_index:16;
106
unsigned stride; /* how much to advance data between a0, dadx, dady */
107
unsigned layer; /* the layer to render to (from gs, already clamped) */
108
unsigned viewport_index; /* the active viewport index (from gs, already clamped) */
109
110
/* followed by a0, dadx, dady and planes[] */
111
};
112
113
struct lp_rast_plane {
114
/* edge function values at minx,miny ?? */
115
int64_t c;
116
117
int32_t dcdx;
118
int32_t dcdy;
119
120
/* one-pixel sized trivial reject offsets for each plane */
121
uint32_t eo;
122
/*
123
* We rely on this struct being 64bit aligned (ideally it would be 128bit
124
* but that's quite the waste) and therefore on 32bit we need padding
125
* since otherwise (even with the 64bit number in there) it wouldn't be.
126
*/
127
uint32_t pad;
128
};
129
130
/**
131
* Rasterization information for a triangle known to be in this bin,
132
* plus inputs to run the shader:
133
* These fields are tile- and bin-independent.
134
* Objects of this type are put into the lp_setup_context::data buffer.
135
*/
136
struct lp_rast_triangle {
137
#ifdef DEBUG
138
float v[3][2];
139
float pad0;
140
float pad1;
141
#endif
142
143
/* inputs for the shader */
144
struct lp_rast_shader_inputs inputs;
145
/* planes are also allocated here */
146
};
147
148
149
struct lp_rast_clear_rb {
150
union util_color color_val;
151
unsigned cbuf;
152
};
153
154
155
#define GET_A0(inputs) ((float (*)[4])((inputs)+1))
156
#define GET_DADX(inputs) ((float (*)[4])((char *)((inputs) + 1) + (inputs)->stride))
157
#define GET_DADY(inputs) ((float (*)[4])((char *)((inputs) + 1) + 2 * (inputs)->stride))
158
#define GET_PLANES(tri) ((struct lp_rast_plane *)((char *)(&(tri)->inputs + 1) + 3 * (tri)->inputs.stride))
159
160
161
162
struct lp_rasterizer *
163
lp_rast_create( unsigned num_threads );
164
165
void
166
lp_rast_destroy( struct lp_rasterizer * );
167
168
void
169
lp_rast_queue_scene( struct lp_rasterizer *rast,
170
struct lp_scene *scene );
171
172
void
173
lp_rast_finish( struct lp_rasterizer *rast );
174
175
176
union lp_rast_cmd_arg {
177
const struct lp_rast_shader_inputs *shade_tile;
178
struct {
179
const struct lp_rast_triangle *tri;
180
unsigned plane_mask;
181
} triangle;
182
const struct lp_rast_state *set_state;
183
const struct lp_rast_clear_rb *clear_rb;
184
struct {
185
uint64_t value;
186
uint64_t mask;
187
} clear_zstencil;
188
const struct lp_rast_state *state;
189
struct lp_fence *fence;
190
struct llvmpipe_query *query_obj;
191
};
192
193
194
/* Cast wrappers. Hopefully these compile to noops!
195
*/
196
static inline union lp_rast_cmd_arg
197
lp_rast_arg_inputs( const struct lp_rast_shader_inputs *shade_tile )
198
{
199
union lp_rast_cmd_arg arg;
200
arg.shade_tile = shade_tile;
201
return arg;
202
}
203
204
static inline union lp_rast_cmd_arg
205
lp_rast_arg_triangle( const struct lp_rast_triangle *triangle,
206
unsigned plane_mask)
207
{
208
union lp_rast_cmd_arg arg;
209
arg.triangle.tri = triangle;
210
arg.triangle.plane_mask = plane_mask;
211
return arg;
212
}
213
214
/**
215
* Build argument for a contained triangle.
216
*
217
* All planes are enabled, so instead of the plane mask we pass the upper
218
* left coordinates of the a block that fully encloses the triangle.
219
*/
220
static inline union lp_rast_cmd_arg
221
lp_rast_arg_triangle_contained( const struct lp_rast_triangle *triangle,
222
unsigned x, unsigned y)
223
{
224
union lp_rast_cmd_arg arg;
225
arg.triangle.tri = triangle;
226
arg.triangle.plane_mask = x | (y << 8);
227
return arg;
228
}
229
230
static inline union lp_rast_cmd_arg
231
lp_rast_arg_state( const struct lp_rast_state *state )
232
{
233
union lp_rast_cmd_arg arg;
234
arg.set_state = state;
235
return arg;
236
}
237
238
static inline union lp_rast_cmd_arg
239
lp_rast_arg_fence( struct lp_fence *fence )
240
{
241
union lp_rast_cmd_arg arg;
242
arg.fence = fence;
243
return arg;
244
}
245
246
247
static inline union lp_rast_cmd_arg
248
lp_rast_arg_clearzs( uint64_t value, uint64_t mask )
249
{
250
union lp_rast_cmd_arg arg;
251
arg.clear_zstencil.value = value;
252
arg.clear_zstencil.mask = mask;
253
return arg;
254
}
255
256
257
static inline union lp_rast_cmd_arg
258
lp_rast_arg_query( struct llvmpipe_query *pq )
259
{
260
union lp_rast_cmd_arg arg;
261
arg.query_obj = pq;
262
return arg;
263
}
264
265
static inline union lp_rast_cmd_arg
266
lp_rast_arg_null( void )
267
{
268
union lp_rast_cmd_arg arg;
269
arg.set_state = NULL;
270
return arg;
271
}
272
273
274
/**
275
* Binnable Commands.
276
* These get put into bins by the setup code and are called when
277
* the bins are executed.
278
*/
279
#define LP_RAST_OP_CLEAR_COLOR 0x0
280
#define LP_RAST_OP_CLEAR_ZSTENCIL 0x1
281
#define LP_RAST_OP_TRIANGLE_1 0x2
282
#define LP_RAST_OP_TRIANGLE_2 0x3
283
#define LP_RAST_OP_TRIANGLE_3 0x4
284
#define LP_RAST_OP_TRIANGLE_4 0x5
285
#define LP_RAST_OP_TRIANGLE_5 0x6
286
#define LP_RAST_OP_TRIANGLE_6 0x7
287
#define LP_RAST_OP_TRIANGLE_7 0x8
288
#define LP_RAST_OP_TRIANGLE_8 0x9
289
#define LP_RAST_OP_TRIANGLE_3_4 0xa
290
#define LP_RAST_OP_TRIANGLE_3_16 0xb
291
#define LP_RAST_OP_TRIANGLE_4_16 0xc
292
#define LP_RAST_OP_SHADE_TILE 0xd
293
#define LP_RAST_OP_SHADE_TILE_OPAQUE 0xe
294
#define LP_RAST_OP_BEGIN_QUERY 0xf
295
#define LP_RAST_OP_END_QUERY 0x10
296
#define LP_RAST_OP_SET_STATE 0x11
297
#define LP_RAST_OP_TRIANGLE_32_1 0x12
298
#define LP_RAST_OP_TRIANGLE_32_2 0x13
299
#define LP_RAST_OP_TRIANGLE_32_3 0x14
300
#define LP_RAST_OP_TRIANGLE_32_4 0x15
301
#define LP_RAST_OP_TRIANGLE_32_5 0x16
302
#define LP_RAST_OP_TRIANGLE_32_6 0x17
303
#define LP_RAST_OP_TRIANGLE_32_7 0x18
304
#define LP_RAST_OP_TRIANGLE_32_8 0x19
305
#define LP_RAST_OP_TRIANGLE_32_3_4 0x1a
306
#define LP_RAST_OP_TRIANGLE_32_3_16 0x1b
307
#define LP_RAST_OP_TRIANGLE_32_4_16 0x1c
308
309
#define LP_RAST_OP_MS_TRIANGLE_1 0x1d
310
#define LP_RAST_OP_MS_TRIANGLE_2 0x1e
311
#define LP_RAST_OP_MS_TRIANGLE_3 0x1f
312
#define LP_RAST_OP_MS_TRIANGLE_4 0x20
313
#define LP_RAST_OP_MS_TRIANGLE_5 0x21
314
#define LP_RAST_OP_MS_TRIANGLE_6 0x22
315
#define LP_RAST_OP_MS_TRIANGLE_7 0x23
316
#define LP_RAST_OP_MS_TRIANGLE_8 0x24
317
#define LP_RAST_OP_MS_TRIANGLE_3_4 0x25
318
#define LP_RAST_OP_MS_TRIANGLE_3_16 0x26
319
#define LP_RAST_OP_MS_TRIANGLE_4_16 0x27
320
#define LP_RAST_OP_MAX 0x28
321
#define LP_RAST_OP_MASK 0xff
322
323
void
324
lp_debug_bins( struct lp_scene *scene );
325
void
326
lp_debug_draw_bins_by_cmd_length( struct lp_scene *scene );
327
void
328
lp_debug_draw_bins_by_coverage( struct lp_scene *scene );
329
330
331
#endif
332
333