1bf215546Sopenharmony_ci/**************************************************************************
2bf215546Sopenharmony_ci *
3bf215546Sopenharmony_ci * Copyright 2009 VMware, Inc.
4bf215546Sopenharmony_ci * All Rights Reserved.
5bf215546Sopenharmony_ci *
6bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
7bf215546Sopenharmony_ci * copy of this software and associated documentation files (the
8bf215546Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
9bf215546Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
10bf215546Sopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to
11bf215546Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
12bf215546Sopenharmony_ci * the following conditions:
13bf215546Sopenharmony_ci *
14bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the
15bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions
16bf215546Sopenharmony_ci * of the Software.
17bf215546Sopenharmony_ci *
18bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19bf215546Sopenharmony_ci * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20bf215546Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21bf215546Sopenharmony_ci * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22bf215546Sopenharmony_ci * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23bf215546Sopenharmony_ci * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24bf215546Sopenharmony_ci * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25bf215546Sopenharmony_ci *
26bf215546Sopenharmony_ci **************************************************************************/
27bf215546Sopenharmony_ci
28bf215546Sopenharmony_ci#ifndef LP_RAST_PRIV_H
29bf215546Sopenharmony_ci#define LP_RAST_PRIV_H
30bf215546Sopenharmony_ci
31bf215546Sopenharmony_ci#include "util/format/u_format.h"
32bf215546Sopenharmony_ci#include "util/u_thread.h"
33bf215546Sopenharmony_ci#include "gallivm/lp_bld_debug.h"
34bf215546Sopenharmony_ci#include "lp_memory.h"
35bf215546Sopenharmony_ci#include "lp_rast.h"
36bf215546Sopenharmony_ci#include "lp_scene.h"
37bf215546Sopenharmony_ci#include "lp_state.h"
38bf215546Sopenharmony_ci#include "lp_texture.h"
39bf215546Sopenharmony_ci#include "lp_limits.h"
40bf215546Sopenharmony_ci
41bf215546Sopenharmony_ci
42bf215546Sopenharmony_ci#define TILE_VECTOR_HEIGHT 4
43bf215546Sopenharmony_ci#define TILE_VECTOR_WIDTH 4
44bf215546Sopenharmony_ci
45bf215546Sopenharmony_ci/* If we crash in a jitted function, we can examine jit_line and jit_state
46bf215546Sopenharmony_ci * to get some info.  This is not thread-safe, however.
47bf215546Sopenharmony_ci */
48bf215546Sopenharmony_ci#ifdef DEBUG
49bf215546Sopenharmony_ci
50bf215546Sopenharmony_cistruct lp_rasterizer_task;
51bf215546Sopenharmony_ciextern int jit_line;
52bf215546Sopenharmony_ciextern const struct lp_rast_state *jit_state;
53bf215546Sopenharmony_ciextern const struct lp_rasterizer_task *jit_task;
54bf215546Sopenharmony_ci
55bf215546Sopenharmony_ci#define BEGIN_JIT_CALL(state, task)                  \
56bf215546Sopenharmony_ci   do { \
57bf215546Sopenharmony_ci      jit_line = __LINE__; \
58bf215546Sopenharmony_ci      jit_state = state; \
59bf215546Sopenharmony_ci      jit_task = task; \
60bf215546Sopenharmony_ci   } while (0)
61bf215546Sopenharmony_ci
62bf215546Sopenharmony_ci#define END_JIT_CALL() \
63bf215546Sopenharmony_ci   do { \
64bf215546Sopenharmony_ci      jit_line = 0; \
65bf215546Sopenharmony_ci      jit_state = NULL; \
66bf215546Sopenharmony_ci   } while (0)
67bf215546Sopenharmony_ci
68bf215546Sopenharmony_ci#else
69bf215546Sopenharmony_ci
70bf215546Sopenharmony_ci#define BEGIN_JIT_CALL(X, Y)
71bf215546Sopenharmony_ci#define END_JIT_CALL()
72bf215546Sopenharmony_ci
73bf215546Sopenharmony_ci#endif
74bf215546Sopenharmony_ci
75bf215546Sopenharmony_ci
76bf215546Sopenharmony_cistruct lp_rasterizer;
77bf215546Sopenharmony_cistruct cmd_bin;
78bf215546Sopenharmony_ci
79bf215546Sopenharmony_ci/**
80bf215546Sopenharmony_ci * Per-thread rasterization state
81bf215546Sopenharmony_ci */
82bf215546Sopenharmony_cistruct lp_rasterizer_task
83bf215546Sopenharmony_ci{
84bf215546Sopenharmony_ci   const struct cmd_bin *bin;
85bf215546Sopenharmony_ci   const struct lp_rast_state *state;
86bf215546Sopenharmony_ci
87bf215546Sopenharmony_ci   struct lp_scene *scene;
88bf215546Sopenharmony_ci   unsigned x, y;          /**< Pos of this tile in framebuffer, in pixels */
89bf215546Sopenharmony_ci   unsigned width, height; /**< width, height of current tile, in pixels */
90bf215546Sopenharmony_ci
91bf215546Sopenharmony_ci   uint8_t *color_tiles[PIPE_MAX_COLOR_BUFS];
92bf215546Sopenharmony_ci   uint8_t *depth_tile;
93bf215546Sopenharmony_ci
94bf215546Sopenharmony_ci   /** "back" pointer */
95bf215546Sopenharmony_ci   struct lp_rasterizer *rast;
96bf215546Sopenharmony_ci
97bf215546Sopenharmony_ci   /** "my" index */
98bf215546Sopenharmony_ci   unsigned thread_index;
99bf215546Sopenharmony_ci
100bf215546Sopenharmony_ci   /** Non-interpolated passthru state and occlude counter for visible pixels */
101bf215546Sopenharmony_ci   struct lp_jit_thread_data thread_data;
102bf215546Sopenharmony_ci
103bf215546Sopenharmony_ci   pipe_semaphore work_ready;
104bf215546Sopenharmony_ci   pipe_semaphore work_done;
105bf215546Sopenharmony_ci};
106bf215546Sopenharmony_ci
107bf215546Sopenharmony_ci
108bf215546Sopenharmony_ci/**
109bf215546Sopenharmony_ci * This is the state required while rasterizing tiles.
110bf215546Sopenharmony_ci * Note that this contains per-thread information too.
111bf215546Sopenharmony_ci * The tile size is TILE_SIZE x TILE_SIZE pixels.
112bf215546Sopenharmony_ci */
113bf215546Sopenharmony_cistruct lp_rasterizer
114bf215546Sopenharmony_ci{
115bf215546Sopenharmony_ci   boolean exit_flag;
116bf215546Sopenharmony_ci   boolean no_rast;  /**< For debugging/profiling */
117bf215546Sopenharmony_ci
118bf215546Sopenharmony_ci   /** The incoming queue of scenes ready to rasterize */
119bf215546Sopenharmony_ci   struct lp_scene_queue *full_scenes;
120bf215546Sopenharmony_ci
121bf215546Sopenharmony_ci   /** The scene currently being rasterized by the threads */
122bf215546Sopenharmony_ci   struct lp_scene *curr_scene;
123bf215546Sopenharmony_ci
124bf215546Sopenharmony_ci   /** A task object for each rasterization thread */
125bf215546Sopenharmony_ci   struct lp_rasterizer_task tasks[LP_MAX_THREADS];
126bf215546Sopenharmony_ci
127bf215546Sopenharmony_ci   unsigned num_threads;
128bf215546Sopenharmony_ci   thrd_t threads[LP_MAX_THREADS];
129bf215546Sopenharmony_ci
130bf215546Sopenharmony_ci   /** For synchronizing the rasterization threads */
131bf215546Sopenharmony_ci   util_barrier barrier;
132bf215546Sopenharmony_ci
133bf215546Sopenharmony_ci   struct lp_fence *last_fence;
134bf215546Sopenharmony_ci};
135bf215546Sopenharmony_ci
136bf215546Sopenharmony_ci
137bf215546Sopenharmony_civoid
138bf215546Sopenharmony_cilp_rast_shade_quads_mask_sample(struct lp_rasterizer_task *task,
139bf215546Sopenharmony_ci                                const struct lp_rast_shader_inputs *inputs,
140bf215546Sopenharmony_ci                                unsigned x, unsigned y,
141bf215546Sopenharmony_ci                                uint64_t mask);
142bf215546Sopenharmony_ci
143bf215546Sopenharmony_civoid
144bf215546Sopenharmony_cilp_rast_shade_quads_mask(struct lp_rasterizer_task *task,
145bf215546Sopenharmony_ci                         const struct lp_rast_shader_inputs *inputs,
146bf215546Sopenharmony_ci                         unsigned x, unsigned y,
147bf215546Sopenharmony_ci                         unsigned mask);
148bf215546Sopenharmony_ci
149bf215546Sopenharmony_ci
150bf215546Sopenharmony_ci/**
151bf215546Sopenharmony_ci * Get the pointer to a 4x4 color block (within a 64x64 tile).
152bf215546Sopenharmony_ci * \param x, y location of 4x4 block in window coords
153bf215546Sopenharmony_ci */
154bf215546Sopenharmony_cistatic inline uint8_t *
155bf215546Sopenharmony_cilp_rast_get_color_block_pointer(struct lp_rasterizer_task *task,
156bf215546Sopenharmony_ci                                unsigned buf, unsigned x, unsigned y,
157bf215546Sopenharmony_ci                                unsigned layer)
158bf215546Sopenharmony_ci{
159bf215546Sopenharmony_ci   assert(x < task->scene->tiles_x * TILE_SIZE);
160bf215546Sopenharmony_ci   assert(y < task->scene->tiles_y * TILE_SIZE);
161bf215546Sopenharmony_ci   assert((x % TILE_VECTOR_WIDTH) == 0);
162bf215546Sopenharmony_ci   assert((y % TILE_VECTOR_HEIGHT) == 0);
163bf215546Sopenharmony_ci   assert(buf < task->scene->fb.nr_cbufs);
164bf215546Sopenharmony_ci   assert(task->color_tiles[buf]);
165bf215546Sopenharmony_ci
166bf215546Sopenharmony_ci   /*
167bf215546Sopenharmony_ci    * We don't actually benefit from having per tile cbuf/zsbuf pointers,
168bf215546Sopenharmony_ci    * it's just extra work - the mul/add would be exactly the same anyway.
169bf215546Sopenharmony_ci    * Fortunately the extra work (modulo) here is very cheap at least...
170bf215546Sopenharmony_ci    */
171bf215546Sopenharmony_ci   unsigned px = x % TILE_SIZE;
172bf215546Sopenharmony_ci   unsigned py = y % TILE_SIZE;
173bf215546Sopenharmony_ci
174bf215546Sopenharmony_ci   unsigned pixel_offset = px * task->scene->cbufs[buf].format_bytes +
175bf215546Sopenharmony_ci                           py * task->scene->cbufs[buf].stride;
176bf215546Sopenharmony_ci   uint8_t *color = task->color_tiles[buf] + pixel_offset;
177bf215546Sopenharmony_ci
178bf215546Sopenharmony_ci   if (layer) {
179bf215546Sopenharmony_ci      assert(layer <= task->scene->fb_max_layer);
180bf215546Sopenharmony_ci      color += layer * task->scene->cbufs[buf].layer_stride;
181bf215546Sopenharmony_ci   }
182bf215546Sopenharmony_ci
183bf215546Sopenharmony_ci   assert(lp_check_alignment(color, llvmpipe_get_format_alignment(task->scene->fb.cbufs[buf]->format)));
184bf215546Sopenharmony_ci   return color;
185bf215546Sopenharmony_ci}
186bf215546Sopenharmony_ci
187bf215546Sopenharmony_ci
188bf215546Sopenharmony_ci/**
189bf215546Sopenharmony_ci * Get the pointer to a 4x4 depth block (within a 64x64 tile).
190bf215546Sopenharmony_ci * \param x, y location of 4x4 block in window coords
191bf215546Sopenharmony_ci */
192bf215546Sopenharmony_cistatic inline uint8_t *
193bf215546Sopenharmony_cilp_rast_get_depth_block_pointer(struct lp_rasterizer_task *task,
194bf215546Sopenharmony_ci                                unsigned x, unsigned y, unsigned layer)
195bf215546Sopenharmony_ci{
196bf215546Sopenharmony_ci   assert(x < task->scene->tiles_x * TILE_SIZE);
197bf215546Sopenharmony_ci   assert(y < task->scene->tiles_y * TILE_SIZE);
198bf215546Sopenharmony_ci   assert((x % TILE_VECTOR_WIDTH) == 0);
199bf215546Sopenharmony_ci   assert((y % TILE_VECTOR_HEIGHT) == 0);
200bf215546Sopenharmony_ci   assert(task->depth_tile);
201bf215546Sopenharmony_ci
202bf215546Sopenharmony_ci   unsigned px = x % TILE_SIZE;
203bf215546Sopenharmony_ci   unsigned py = y % TILE_SIZE;
204bf215546Sopenharmony_ci
205bf215546Sopenharmony_ci   unsigned pixel_offset = px * task->scene->zsbuf.format_bytes +
206bf215546Sopenharmony_ci                           py * task->scene->zsbuf.stride;
207bf215546Sopenharmony_ci   uint8_t *depth = task->depth_tile + pixel_offset;
208bf215546Sopenharmony_ci
209bf215546Sopenharmony_ci   if (layer) {
210bf215546Sopenharmony_ci      depth += layer * task->scene->zsbuf.layer_stride;
211bf215546Sopenharmony_ci   }
212bf215546Sopenharmony_ci
213bf215546Sopenharmony_ci   assert(lp_check_alignment(depth, llvmpipe_get_format_alignment(task->scene->fb.zsbuf->format)));
214bf215546Sopenharmony_ci   return depth;
215bf215546Sopenharmony_ci}
216bf215546Sopenharmony_ci
217bf215546Sopenharmony_ci
218bf215546Sopenharmony_ci
219bf215546Sopenharmony_ci/**
220bf215546Sopenharmony_ci * Shade all pixels in a 4x4 block.  The fragment code omits the
221bf215546Sopenharmony_ci * triangle in/out tests.
222bf215546Sopenharmony_ci * \param x, y location of 4x4 block in window coords
223bf215546Sopenharmony_ci */
224bf215546Sopenharmony_cistatic inline void
225bf215546Sopenharmony_cilp_rast_shade_quads_all( struct lp_rasterizer_task *task,
226bf215546Sopenharmony_ci                         const struct lp_rast_shader_inputs *inputs,
227bf215546Sopenharmony_ci                         unsigned x, unsigned y )
228bf215546Sopenharmony_ci{
229bf215546Sopenharmony_ci   const struct lp_scene *scene = task->scene;
230bf215546Sopenharmony_ci   const struct lp_rast_state *state = task->state;
231bf215546Sopenharmony_ci   struct lp_fragment_shader_variant *variant = state->variant;
232bf215546Sopenharmony_ci   uint8_t *color[PIPE_MAX_COLOR_BUFS];
233bf215546Sopenharmony_ci   unsigned stride[PIPE_MAX_COLOR_BUFS];
234bf215546Sopenharmony_ci   unsigned sample_stride[PIPE_MAX_COLOR_BUFS];
235bf215546Sopenharmony_ci   uint8_t *depth = NULL;
236bf215546Sopenharmony_ci   unsigned depth_stride = 0;
237bf215546Sopenharmony_ci   unsigned depth_sample_stride = 0;
238bf215546Sopenharmony_ci
239bf215546Sopenharmony_ci   /* color buffer */
240bf215546Sopenharmony_ci   for (unsigned i = 0; i < scene->fb.nr_cbufs; i++) {
241bf215546Sopenharmony_ci      if (scene->fb.cbufs[i]) {
242bf215546Sopenharmony_ci         stride[i] = scene->cbufs[i].stride;
243bf215546Sopenharmony_ci         sample_stride[i] = scene->cbufs[i].sample_stride;
244bf215546Sopenharmony_ci         color[i] = lp_rast_get_color_block_pointer(task, i, x, y,
245bf215546Sopenharmony_ci                                                    inputs->layer + inputs->view_index);
246bf215546Sopenharmony_ci      }
247bf215546Sopenharmony_ci      else {
248bf215546Sopenharmony_ci         stride[i] = 0;
249bf215546Sopenharmony_ci         sample_stride[i] = 0;
250bf215546Sopenharmony_ci         color[i] = NULL;
251bf215546Sopenharmony_ci      }
252bf215546Sopenharmony_ci   }
253bf215546Sopenharmony_ci
254bf215546Sopenharmony_ci   if (scene->zsbuf.map) {
255bf215546Sopenharmony_ci      depth = lp_rast_get_depth_block_pointer(task, x, y, inputs->layer + inputs->view_index);
256bf215546Sopenharmony_ci      depth_sample_stride = scene->zsbuf.sample_stride;
257bf215546Sopenharmony_ci      depth_stride = scene->zsbuf.stride;
258bf215546Sopenharmony_ci   }
259bf215546Sopenharmony_ci
260bf215546Sopenharmony_ci   uint64_t mask = 0;
261bf215546Sopenharmony_ci   for (unsigned i = 0; i < scene->fb_max_samples; i++)
262bf215546Sopenharmony_ci      mask |= (uint64_t)0xffff << (16 * i);
263bf215546Sopenharmony_ci
264bf215546Sopenharmony_ci   /*
265bf215546Sopenharmony_ci    * The rasterizer may produce fragments outside our
266bf215546Sopenharmony_ci    * allocated 4x4 blocks hence need to filter them out here.
267bf215546Sopenharmony_ci    */
268bf215546Sopenharmony_ci   if ((x % TILE_SIZE) < task->width && (y % TILE_SIZE) < task->height) {
269bf215546Sopenharmony_ci      /* Propagate non-interpolated raster state. */
270bf215546Sopenharmony_ci      task->thread_data.raster_state.viewport_index = inputs->viewport_index;
271bf215546Sopenharmony_ci      task->thread_data.raster_state.view_index = inputs->view_index;
272bf215546Sopenharmony_ci
273bf215546Sopenharmony_ci      /* run shader on 4x4 block */
274bf215546Sopenharmony_ci      BEGIN_JIT_CALL(state, task);
275bf215546Sopenharmony_ci      variant->jit_function[RAST_WHOLE]( &state->jit_context,
276bf215546Sopenharmony_ci                                         x, y,
277bf215546Sopenharmony_ci                                         inputs->frontfacing,
278bf215546Sopenharmony_ci                                         GET_A0(inputs),
279bf215546Sopenharmony_ci                                         GET_DADX(inputs),
280bf215546Sopenharmony_ci                                         GET_DADY(inputs),
281bf215546Sopenharmony_ci                                         color,
282bf215546Sopenharmony_ci                                         depth,
283bf215546Sopenharmony_ci                                         mask,
284bf215546Sopenharmony_ci                                         &task->thread_data,
285bf215546Sopenharmony_ci                                         stride,
286bf215546Sopenharmony_ci                                         depth_stride,
287bf215546Sopenharmony_ci                                         sample_stride,
288bf215546Sopenharmony_ci                                         depth_sample_stride);
289bf215546Sopenharmony_ci      END_JIT_CALL();
290bf215546Sopenharmony_ci   }
291bf215546Sopenharmony_ci}
292bf215546Sopenharmony_ci
293bf215546Sopenharmony_civoid
294bf215546Sopenharmony_cilp_rast_triangle_1(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
295bf215546Sopenharmony_ci
296bf215546Sopenharmony_civoid
297bf215546Sopenharmony_cilp_rast_triangle_2(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
298bf215546Sopenharmony_ci
299bf215546Sopenharmony_civoid
300bf215546Sopenharmony_cilp_rast_triangle_3(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
301bf215546Sopenharmony_ci
302bf215546Sopenharmony_civoid
303bf215546Sopenharmony_cilp_rast_triangle_4(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
304bf215546Sopenharmony_ci
305bf215546Sopenharmony_civoid
306bf215546Sopenharmony_cilp_rast_triangle_5(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
307bf215546Sopenharmony_ci
308bf215546Sopenharmony_civoid
309bf215546Sopenharmony_cilp_rast_triangle_6(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
310bf215546Sopenharmony_ci
311bf215546Sopenharmony_civoid
312bf215546Sopenharmony_cilp_rast_triangle_7(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
313bf215546Sopenharmony_ci
314bf215546Sopenharmony_civoid
315bf215546Sopenharmony_cilp_rast_triangle_8(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
316bf215546Sopenharmony_ci
317bf215546Sopenharmony_civoid
318bf215546Sopenharmony_cilp_rast_triangle_3_4(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
319bf215546Sopenharmony_ci
320bf215546Sopenharmony_civoid
321bf215546Sopenharmony_cilp_rast_triangle_3_16(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
322bf215546Sopenharmony_ci
323bf215546Sopenharmony_civoid
324bf215546Sopenharmony_cilp_rast_triangle_4_16(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
325bf215546Sopenharmony_ci
326bf215546Sopenharmony_civoid
327bf215546Sopenharmony_cilp_rast_triangle_32_1(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
328bf215546Sopenharmony_ci
329bf215546Sopenharmony_civoid
330bf215546Sopenharmony_cilp_rast_triangle_32_2(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
331bf215546Sopenharmony_ci
332bf215546Sopenharmony_civoid
333bf215546Sopenharmony_cilp_rast_triangle_32_3(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
334bf215546Sopenharmony_ci
335bf215546Sopenharmony_civoid
336bf215546Sopenharmony_cilp_rast_triangle_32_4(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
337bf215546Sopenharmony_ci
338bf215546Sopenharmony_civoid
339bf215546Sopenharmony_cilp_rast_triangle_32_5(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
340bf215546Sopenharmony_ci
341bf215546Sopenharmony_civoid
342bf215546Sopenharmony_cilp_rast_triangle_32_6(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
343bf215546Sopenharmony_ci
344bf215546Sopenharmony_civoid
345bf215546Sopenharmony_cilp_rast_triangle_32_7(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
346bf215546Sopenharmony_ci
347bf215546Sopenharmony_civoid
348bf215546Sopenharmony_cilp_rast_triangle_32_8(struct lp_rasterizer_task *, const union lp_rast_cmd_arg);
349bf215546Sopenharmony_ci
350bf215546Sopenharmony_civoid
351bf215546Sopenharmony_cilp_rast_triangle_32_3_4(struct lp_rasterizer_task *,
352bf215546Sopenharmony_ci                        const union lp_rast_cmd_arg);
353bf215546Sopenharmony_ci
354bf215546Sopenharmony_civoid
355bf215546Sopenharmony_cilp_rast_triangle_32_3_16(struct lp_rasterizer_task *,
356bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
357bf215546Sopenharmony_ci
358bf215546Sopenharmony_civoid
359bf215546Sopenharmony_cilp_rast_triangle_32_4_16(struct lp_rasterizer_task *,
360bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
361bf215546Sopenharmony_ci
362bf215546Sopenharmony_civoid
363bf215546Sopenharmony_cilp_rast_rectangle(struct lp_rasterizer_task *,
364bf215546Sopenharmony_ci                  const union lp_rast_cmd_arg);
365bf215546Sopenharmony_ci
366bf215546Sopenharmony_civoid
367bf215546Sopenharmony_cilp_rast_triangle_ms_1(struct lp_rasterizer_task *,
368bf215546Sopenharmony_ci                      const union lp_rast_cmd_arg);
369bf215546Sopenharmony_ci
370bf215546Sopenharmony_civoid
371bf215546Sopenharmony_cilp_rast_triangle_ms_2(struct lp_rasterizer_task *,
372bf215546Sopenharmony_ci                      const union lp_rast_cmd_arg);
373bf215546Sopenharmony_ci
374bf215546Sopenharmony_civoid
375bf215546Sopenharmony_cilp_rast_triangle_ms_3(struct lp_rasterizer_task *,
376bf215546Sopenharmony_ci                      const union lp_rast_cmd_arg);
377bf215546Sopenharmony_ci
378bf215546Sopenharmony_civoid
379bf215546Sopenharmony_cilp_rast_triangle_ms_4(struct lp_rasterizer_task *,
380bf215546Sopenharmony_ci                      const union lp_rast_cmd_arg);
381bf215546Sopenharmony_ci
382bf215546Sopenharmony_civoid
383bf215546Sopenharmony_cilp_rast_triangle_ms_5(struct lp_rasterizer_task *,
384bf215546Sopenharmony_ci                      const union lp_rast_cmd_arg);
385bf215546Sopenharmony_ci
386bf215546Sopenharmony_civoid
387bf215546Sopenharmony_cilp_rast_triangle_ms_6(struct lp_rasterizer_task *,
388bf215546Sopenharmony_ci                      const union lp_rast_cmd_arg);
389bf215546Sopenharmony_ci
390bf215546Sopenharmony_civoid
391bf215546Sopenharmony_cilp_rast_triangle_ms_7(struct lp_rasterizer_task *,
392bf215546Sopenharmony_ci                      const union lp_rast_cmd_arg);
393bf215546Sopenharmony_ci
394bf215546Sopenharmony_civoid
395bf215546Sopenharmony_cilp_rast_triangle_ms_8(struct lp_rasterizer_task *,
396bf215546Sopenharmony_ci                      const union lp_rast_cmd_arg);
397bf215546Sopenharmony_ci
398bf215546Sopenharmony_ci
399bf215546Sopenharmony_civoid
400bf215546Sopenharmony_cilp_rast_triangle_ms_3_4(struct lp_rasterizer_task *,
401bf215546Sopenharmony_ci                        const union lp_rast_cmd_arg);
402bf215546Sopenharmony_ci
403bf215546Sopenharmony_ci
404bf215546Sopenharmony_civoid
405bf215546Sopenharmony_cilp_rast_triangle_ms_3_16(struct lp_rasterizer_task *,
406bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
407bf215546Sopenharmony_ci
408bf215546Sopenharmony_ci
409bf215546Sopenharmony_civoid
410bf215546Sopenharmony_cilp_rast_triangle_ms_4_16(struct lp_rasterizer_task *,
411bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
412bf215546Sopenharmony_ci
413bf215546Sopenharmony_ci
414bf215546Sopenharmony_civoid
415bf215546Sopenharmony_cilp_rast_triangle_ms_32_1(struct lp_rasterizer_task *,
416bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
417bf215546Sopenharmony_ci
418bf215546Sopenharmony_civoid
419bf215546Sopenharmony_cilp_rast_triangle_ms_32_2(struct lp_rasterizer_task *,
420bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
421bf215546Sopenharmony_ci
422bf215546Sopenharmony_civoid
423bf215546Sopenharmony_cilp_rast_triangle_ms_32_3(struct lp_rasterizer_task *,
424bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
425bf215546Sopenharmony_ci
426bf215546Sopenharmony_civoid
427bf215546Sopenharmony_cilp_rast_triangle_ms_32_4(struct lp_rasterizer_task *,
428bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
429bf215546Sopenharmony_ci
430bf215546Sopenharmony_civoid
431bf215546Sopenharmony_cilp_rast_triangle_ms_32_5(struct lp_rasterizer_task *,
432bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
433bf215546Sopenharmony_ci
434bf215546Sopenharmony_civoid
435bf215546Sopenharmony_cilp_rast_triangle_ms_32_6(struct lp_rasterizer_task *,
436bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
437bf215546Sopenharmony_ci
438bf215546Sopenharmony_civoid
439bf215546Sopenharmony_cilp_rast_triangle_ms_32_7(struct lp_rasterizer_task *,
440bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
441bf215546Sopenharmony_ci
442bf215546Sopenharmony_civoid
443bf215546Sopenharmony_cilp_rast_triangle_ms_32_8(struct lp_rasterizer_task *,
444bf215546Sopenharmony_ci                         const union lp_rast_cmd_arg);
445bf215546Sopenharmony_ci
446bf215546Sopenharmony_civoid
447bf215546Sopenharmony_cilp_rast_triangle_ms_32_3_4(struct lp_rasterizer_task *,
448bf215546Sopenharmony_ci                           const union lp_rast_cmd_arg);
449bf215546Sopenharmony_ci
450bf215546Sopenharmony_civoid
451bf215546Sopenharmony_cilp_rast_triangle_ms_32_3_16(struct lp_rasterizer_task *,
452bf215546Sopenharmony_ci                            const union lp_rast_cmd_arg);
453bf215546Sopenharmony_ci
454bf215546Sopenharmony_civoid
455bf215546Sopenharmony_cilp_rast_triangle_ms_32_4_16(struct lp_rasterizer_task *,
456bf215546Sopenharmony_ci                            const union lp_rast_cmd_arg);
457bf215546Sopenharmony_ci
458bf215546Sopenharmony_civoid
459bf215546Sopenharmony_cilp_rast_set_state(struct lp_rasterizer_task *task,
460bf215546Sopenharmony_ci                  const union lp_rast_cmd_arg arg);
461bf215546Sopenharmony_ci
462bf215546Sopenharmony_civoid
463bf215546Sopenharmony_cilp_debug_bin(const struct cmd_bin *bin, int x, int y);
464bf215546Sopenharmony_ci
465bf215546Sopenharmony_civoid
466bf215546Sopenharmony_cilp_linear_rasterize_bin(struct lp_rasterizer_task *task,
467bf215546Sopenharmony_ci                        const struct cmd_bin *bin);
468bf215546Sopenharmony_ci
469bf215546Sopenharmony_civoid
470bf215546Sopenharmony_cilp_rast_linear_rect_fallback(struct lp_rasterizer_task *task,
471bf215546Sopenharmony_ci                             const struct lp_rast_shader_inputs *inputs,
472bf215546Sopenharmony_ci                             const struct u_rect *box);
473bf215546Sopenharmony_ci
474bf215546Sopenharmony_ci#endif
475