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_priv.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
#ifndef LP_RAST_PRIV_H
29
#define LP_RAST_PRIV_H
30
31
#include "util/format/u_format.h"
32
#include "util/u_thread.h"
33
#include "gallivm/lp_bld_debug.h"
34
#include "lp_memory.h"
35
#include "lp_rast.h"
36
#include "lp_scene.h"
37
#include "lp_state.h"
38
#include "lp_texture.h"
39
#include "lp_limits.h"
40
41
42
#define TILE_VECTOR_HEIGHT 4
43
#define TILE_VECTOR_WIDTH 4
44
45
/* If we crash in a jitted function, we can examine jit_line and jit_state
46
* to get some info. This is not thread-safe, however.
47
*/
48
#ifdef DEBUG
49
50
struct lp_rasterizer_task;
51
extern int jit_line;
52
extern const struct lp_rast_state *jit_state;
53
extern const struct lp_rasterizer_task *jit_task;
54
55
#define BEGIN_JIT_CALL(state, task) \
56
do { \
57
jit_line = __LINE__; \
58
jit_state = state; \
59
jit_task = task; \
60
} while (0)
61
62
#define END_JIT_CALL() \
63
do { \
64
jit_line = 0; \
65
jit_state = NULL; \
66
} while (0)
67
68
#else
69
70
#define BEGIN_JIT_CALL(X, Y)
71
#define END_JIT_CALL()
72
73
#endif
74
75
76
struct lp_rasterizer;
77
struct cmd_bin;
78
79
/**
80
* Per-thread rasterization state
81
*/
82
struct lp_rasterizer_task
83
{
84
const struct cmd_bin *bin;
85
const struct lp_rast_state *state;
86
87
struct lp_scene *scene;
88
unsigned x, y; /**< Pos of this tile in framebuffer, in pixels */
89
unsigned width, height; /**< width, height of current tile, in pixels */
90
91
uint8_t *color_tiles[PIPE_MAX_COLOR_BUFS];
92
uint8_t *depth_tile;
93
94
/** "back" pointer */
95
struct lp_rasterizer *rast;
96
97
/** "my" index */
98
unsigned thread_index;
99
100
/** Non-interpolated passthru state and occlude counter for visible pixels */
101
struct lp_jit_thread_data thread_data;
102
103
pipe_semaphore work_ready;
104
pipe_semaphore work_done;
105
};
106
107
108
/**
109
* This is the state required while rasterizing tiles.
110
* Note that this contains per-thread information too.
111
* The tile size is TILE_SIZE x TILE_SIZE pixels.
112
*/
113
struct lp_rasterizer
114
{
115
boolean exit_flag;
116
boolean no_rast; /**< For debugging/profiling */
117
118
/** The incoming queue of scenes ready to rasterize */
119
struct lp_scene_queue *full_scenes;
120
121
/** The scene currently being rasterized by the threads */
122
struct lp_scene *curr_scene;
123
124
/** A task object for each rasterization thread */
125
struct lp_rasterizer_task tasks[LP_MAX_THREADS];
126
127
unsigned num_threads;
128
thrd_t threads[LP_MAX_THREADS];
129
130
/** For synchronizing the rasterization threads */
131
util_barrier barrier;
132
};
133
134
void
135
lp_rast_shade_quads_mask_sample(struct lp_rasterizer_task *task,
136
const struct lp_rast_shader_inputs *inputs,
137
unsigned x, unsigned y,
138
uint64_t mask);
139
void
140
lp_rast_shade_quads_mask(struct lp_rasterizer_task *task,
141
const struct lp_rast_shader_inputs *inputs,
142
unsigned x, unsigned y,
143
unsigned mask);
144
145
146
/**
147
* Get the pointer to a 4x4 color block (within a 64x64 tile).
148
* \param x, y location of 4x4 block in window coords
149
*/
150
static inline uint8_t *
151
lp_rast_get_color_block_pointer(struct lp_rasterizer_task *task,
152
unsigned buf, unsigned x, unsigned y,
153
unsigned layer)
154
{
155
unsigned px, py, pixel_offset;
156
uint8_t *color;
157
158
assert(x < task->scene->tiles_x * TILE_SIZE);
159
assert(y < task->scene->tiles_y * TILE_SIZE);
160
assert((x % TILE_VECTOR_WIDTH) == 0);
161
assert((y % TILE_VECTOR_HEIGHT) == 0);
162
assert(buf < task->scene->fb.nr_cbufs);
163
164
assert(task->color_tiles[buf]);
165
166
/*
167
* We don't actually benefit from having per tile cbuf/zsbuf pointers,
168
* it's just extra work - the mul/add would be exactly the same anyway.
169
* Fortunately the extra work (modulo) here is very cheap at least...
170
*/
171
px = x % TILE_SIZE;
172
py = y % TILE_SIZE;
173
174
pixel_offset = px * task->scene->cbufs[buf].format_bytes +
175
py * task->scene->cbufs[buf].stride;
176
color = task->color_tiles[buf] + pixel_offset;
177
178
if (layer) {
179
color += layer * task->scene->cbufs[buf].layer_stride;
180
}
181
182
assert(lp_check_alignment(color, llvmpipe_get_format_alignment(task->scene->fb.cbufs[buf]->format)));
183
return color;
184
}
185
186
187
/**
188
* Get the pointer to a 4x4 depth block (within a 64x64 tile).
189
* \param x, y location of 4x4 block in window coords
190
*/
191
static inline uint8_t *
192
lp_rast_get_depth_block_pointer(struct lp_rasterizer_task *task,
193
unsigned x, unsigned y, unsigned layer)
194
{
195
unsigned px, py, pixel_offset;
196
uint8_t *depth;
197
198
assert(x < task->scene->tiles_x * TILE_SIZE);
199
assert(y < task->scene->tiles_y * TILE_SIZE);
200
assert((x % TILE_VECTOR_WIDTH) == 0);
201
assert((y % TILE_VECTOR_HEIGHT) == 0);
202
203
assert(task->depth_tile);
204
205
px = x % TILE_SIZE;
206
py = y % TILE_SIZE;
207
208
pixel_offset = px * task->scene->zsbuf.format_bytes +
209
py * task->scene->zsbuf.stride;
210
depth = task->depth_tile + pixel_offset;
211
212
if (layer) {
213
depth += layer * task->scene->zsbuf.layer_stride;
214
}
215
216
assert(lp_check_alignment(depth, llvmpipe_get_format_alignment(task->scene->fb.zsbuf->format)));
217
return depth;
218
}
219
220
221
222
/**
223
* Shade all pixels in a 4x4 block. The fragment code omits the
224
* triangle in/out tests.
225
* \param x, y location of 4x4 block in window coords
226
*/
227
static inline void
228
lp_rast_shade_quads_all( struct lp_rasterizer_task *task,
229
const struct lp_rast_shader_inputs *inputs,
230
unsigned x, unsigned y )
231
{
232
const struct lp_scene *scene = task->scene;
233
const struct lp_rast_state *state = task->state;
234
struct lp_fragment_shader_variant *variant = state->variant;
235
uint8_t *color[PIPE_MAX_COLOR_BUFS];
236
unsigned stride[PIPE_MAX_COLOR_BUFS];
237
unsigned sample_stride[PIPE_MAX_COLOR_BUFS];
238
uint8_t *depth = NULL;
239
unsigned depth_stride = 0;
240
unsigned depth_sample_stride = 0;
241
unsigned i;
242
243
/* color buffer */
244
for (i = 0; i < scene->fb.nr_cbufs; i++) {
245
if (scene->fb.cbufs[i]) {
246
stride[i] = scene->cbufs[i].stride;
247
sample_stride[i] = scene->cbufs[i].sample_stride;
248
color[i] = lp_rast_get_color_block_pointer(task, i, x, y,
249
inputs->layer + inputs->view_index);
250
}
251
else {
252
stride[i] = 0;
253
sample_stride[i] = 0;
254
color[i] = NULL;
255
}
256
}
257
258
if (scene->zsbuf.map) {
259
depth = lp_rast_get_depth_block_pointer(task, x, y, inputs->layer + inputs->view_index);
260
depth_sample_stride = scene->zsbuf.sample_stride;
261
depth_stride = scene->zsbuf.stride;
262
}
263
264
uint64_t mask = 0;
265
for (unsigned i = 0; i < scene->fb_max_samples; i++)
266
mask |= (uint64_t)0xffff << (16 * i);
267
268
/*
269
* The rasterizer may produce fragments outside our
270
* allocated 4x4 blocks hence need to filter them out here.
271
*/
272
if ((x % TILE_SIZE) < task->width && (y % TILE_SIZE) < task->height) {
273
/* Propagate non-interpolated raster state. */
274
task->thread_data.raster_state.viewport_index = inputs->viewport_index;
275
task->thread_data.raster_state.view_index = inputs->view_index;
276
277
/* run shader on 4x4 block */
278
BEGIN_JIT_CALL(state, task);
279
variant->jit_function[RAST_WHOLE]( &state->jit_context,
280
x, y,
281
inputs->frontfacing,
282
GET_A0(inputs),
283
GET_DADX(inputs),
284
GET_DADY(inputs),
285
color,
286
depth,
287
mask,
288
&task->thread_data,
289
stride,
290
depth_stride,
291
sample_stride,
292
depth_sample_stride);
293
END_JIT_CALL();
294
}
295
}
296
297
void lp_rast_triangle_1( struct lp_rasterizer_task *,
298
const union lp_rast_cmd_arg );
299
void lp_rast_triangle_2( struct lp_rasterizer_task *,
300
const union lp_rast_cmd_arg );
301
void lp_rast_triangle_3( struct lp_rasterizer_task *,
302
const union lp_rast_cmd_arg );
303
void lp_rast_triangle_4( struct lp_rasterizer_task *,
304
const union lp_rast_cmd_arg );
305
void lp_rast_triangle_5( struct lp_rasterizer_task *,
306
const union lp_rast_cmd_arg );
307
void lp_rast_triangle_6( struct lp_rasterizer_task *,
308
const union lp_rast_cmd_arg );
309
void lp_rast_triangle_7( struct lp_rasterizer_task *,
310
const union lp_rast_cmd_arg );
311
void lp_rast_triangle_8( struct lp_rasterizer_task *,
312
const union lp_rast_cmd_arg );
313
314
void lp_rast_triangle_3_4(struct lp_rasterizer_task *,
315
const union lp_rast_cmd_arg );
316
317
void lp_rast_triangle_3_16( struct lp_rasterizer_task *,
318
const union lp_rast_cmd_arg );
319
320
void lp_rast_triangle_4_16( struct lp_rasterizer_task *,
321
const union lp_rast_cmd_arg );
322
323
324
void lp_rast_triangle_32_1( struct lp_rasterizer_task *,
325
const union lp_rast_cmd_arg );
326
void lp_rast_triangle_32_2( struct lp_rasterizer_task *,
327
const union lp_rast_cmd_arg );
328
void lp_rast_triangle_32_3( struct lp_rasterizer_task *,
329
const union lp_rast_cmd_arg );
330
void lp_rast_triangle_32_4( struct lp_rasterizer_task *,
331
const union lp_rast_cmd_arg );
332
void lp_rast_triangle_32_5( struct lp_rasterizer_task *,
333
const union lp_rast_cmd_arg );
334
void lp_rast_triangle_32_6( struct lp_rasterizer_task *,
335
const union lp_rast_cmd_arg );
336
void lp_rast_triangle_32_7( struct lp_rasterizer_task *,
337
const union lp_rast_cmd_arg );
338
void lp_rast_triangle_32_8( struct lp_rasterizer_task *,
339
const union lp_rast_cmd_arg );
340
341
void lp_rast_triangle_32_3_4(struct lp_rasterizer_task *,
342
const union lp_rast_cmd_arg );
343
344
void lp_rast_triangle_32_3_16( struct lp_rasterizer_task *,
345
const union lp_rast_cmd_arg );
346
347
void lp_rast_triangle_32_4_16( struct lp_rasterizer_task *,
348
const union lp_rast_cmd_arg );
349
350
void lp_rast_triangle_ms_1( struct lp_rasterizer_task *,
351
const union lp_rast_cmd_arg );
352
void lp_rast_triangle_ms_2( struct lp_rasterizer_task *,
353
const union lp_rast_cmd_arg );
354
void lp_rast_triangle_ms_3( struct lp_rasterizer_task *,
355
const union lp_rast_cmd_arg );
356
void lp_rast_triangle_ms_4( struct lp_rasterizer_task *,
357
const union lp_rast_cmd_arg );
358
void lp_rast_triangle_ms_5( struct lp_rasterizer_task *,
359
const union lp_rast_cmd_arg );
360
void lp_rast_triangle_ms_6( struct lp_rasterizer_task *,
361
const union lp_rast_cmd_arg );
362
void lp_rast_triangle_ms_7( struct lp_rasterizer_task *,
363
const union lp_rast_cmd_arg );
364
void lp_rast_triangle_ms_8( struct lp_rasterizer_task *,
365
const union lp_rast_cmd_arg );
366
367
void lp_rast_triangle_ms_3_4(struct lp_rasterizer_task *,
368
const union lp_rast_cmd_arg );
369
370
void lp_rast_triangle_ms_3_16( struct lp_rasterizer_task *,
371
const union lp_rast_cmd_arg );
372
373
void lp_rast_triangle_ms_4_16( struct lp_rasterizer_task *,
374
const union lp_rast_cmd_arg );
375
376
void lp_rast_triangle_ms_32_1( struct lp_rasterizer_task *,
377
const union lp_rast_cmd_arg );
378
void lp_rast_triangle_ms_32_2( struct lp_rasterizer_task *,
379
const union lp_rast_cmd_arg );
380
void lp_rast_triangle_ms_32_3( struct lp_rasterizer_task *,
381
const union lp_rast_cmd_arg );
382
void lp_rast_triangle_ms_32_4( struct lp_rasterizer_task *,
383
const union lp_rast_cmd_arg );
384
void lp_rast_triangle_ms_32_5( struct lp_rasterizer_task *,
385
const union lp_rast_cmd_arg );
386
void lp_rast_triangle_ms_32_6( struct lp_rasterizer_task *,
387
const union lp_rast_cmd_arg );
388
void lp_rast_triangle_ms_32_7( struct lp_rasterizer_task *,
389
const union lp_rast_cmd_arg );
390
void lp_rast_triangle_ms_32_8( struct lp_rasterizer_task *,
391
const union lp_rast_cmd_arg );
392
393
void lp_rast_triangle_ms_32_3_4(struct lp_rasterizer_task *,
394
const union lp_rast_cmd_arg );
395
396
void lp_rast_triangle_ms_32_3_16( struct lp_rasterizer_task *,
397
const union lp_rast_cmd_arg );
398
399
void lp_rast_triangle_ms_32_4_16( struct lp_rasterizer_task *,
400
const union lp_rast_cmd_arg );
401
402
void
403
lp_rast_set_state(struct lp_rasterizer_task *task,
404
const union lp_rast_cmd_arg arg);
405
406
void
407
lp_debug_bin( const struct cmd_bin *bin, int x, int y );
408
409
#endif
410
411