llvmpipe: consolidate code in lp_rast_linear_fallback.c

Combine shade_quads_all() and shade_quads_mask() into new
shade_quads() function which takes a mask parameter.  It calls either
jit_function[RAST_WHOLE] or jit_function[RAST_EDGE_TEST] depending on
the mask argument.

Signed-off-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17561>
This commit is contained in:
Brian Paul 2022-07-18 10:12:50 -06:00 committed by Marge Bot
parent 593282a9cd
commit c7239dfe5d
1 changed files with 19 additions and 80 deletions

View File

@ -86,52 +86,12 @@ static unsigned bottom_mask_tab[STAMP_SIZE] = {
};
/**
* Shade all pixels in a 4x4 block. The fragment code omits the
* triangle in/out tests.
* \param x, y location of 4x4 block in window coords
*/
static void
shade_quads_all(struct lp_rasterizer_task *task,
const struct lp_rast_shader_inputs *inputs,
unsigned x, unsigned y)
{
const struct lp_scene *scene = task->scene;
const struct lp_rast_state *state = task->state;
struct lp_fragment_shader_variant *variant = state->variant;
uint8_t *color = scene->cbufs[0].map;
unsigned stride = scene->cbufs[0].stride;
uint8_t *cbufs[1];
unsigned strides[1];
color += x * 4;
color += y * stride;
cbufs[0] = color;
strides[0] = stride;
assert(!variant->key.depth.enabled);
/* run shader on 4x4 block */
BEGIN_JIT_CALL(state, task);
variant->jit_function[RAST_WHOLE](&state->jit_context,
x, y,
inputs->frontfacing,
GET_A0(inputs),
GET_DADX(inputs),
GET_DADY(inputs),
cbufs,
NULL,
0xffff,
&task->thread_data,
strides, 0, 0, 0);
END_JIT_CALL();
}
static void
shade_quads_mask(struct lp_rasterizer_task *task,
const struct lp_rast_shader_inputs *inputs,
unsigned x, unsigned y,
unsigned mask)
shade_quads(struct lp_rasterizer_task *task,
const struct lp_rast_shader_inputs *inputs,
unsigned x, unsigned y,
unsigned mask)
{
const struct lp_rast_state *state = task->state;
struct lp_fragment_shader_variant *variant = state->variant;
@ -153,35 +113,22 @@ shade_quads_mask(struct lp_rasterizer_task *task,
/* run shader on 4x4 block */
BEGIN_JIT_CALL(state, task);
variant->jit_function[RAST_EDGE_TEST](&state->jit_context,
x, y,
inputs->frontfacing,
GET_A0(inputs),
GET_DADX(inputs),
GET_DADY(inputs),
cbufs,
NULL,
mask,
&task->thread_data,
strides, 0, 0, 0);
const unsigned fn_index = mask == 0xffff ? RAST_WHOLE : RAST_EDGE_TEST;
variant->jit_function[fn_index](&state->jit_context,
x, y,
inputs->frontfacing,
GET_A0(inputs),
GET_DADX(inputs),
GET_DADY(inputs),
cbufs,
NULL,
mask,
&task->thread_data,
strides, 0, 0, 0);
END_JIT_CALL();
}
/* Shade a 4x4 stamp completely within the rectangle.
*/
static inline void
full(struct lp_rasterizer_task *task,
const struct lp_rast_shader_inputs *inputs,
unsigned ix, unsigned iy)
{
shade_quads_all(task,
inputs,
ix * STAMP_SIZE,
iy * STAMP_SIZE);
}
/* Shade a 4x4 stamp which may be partially outside the rectangle,
* according to the mask parameter.
*/
@ -194,16 +141,8 @@ partial(struct lp_rasterizer_task *task,
/* Unfortunately we can end up generating full blocks on this path,
* need to catch them.
*/
if (mask == 0xffff)
full(task, inputs, ix, iy);
else {
assert(mask);
shade_quads_mask(task,
inputs,
ix * STAMP_SIZE,
iy * STAMP_SIZE,
mask);
}
assert(mask != 0x0);
shade_quads(task, inputs, ix * STAMP_SIZE, iy * STAMP_SIZE, mask);
}
@ -291,7 +230,7 @@ lp_rast_linear_rect_fallback(struct lp_rasterizer_task *task,
*/
for (unsigned j = iy0 + 1; j < iy1; j++) {
for (unsigned i = ix0 + 1; i < ix1; i++) {
full(task, inputs, i, j);
shade_quads(task, inputs, i * STAMP_SIZE, j * STAMP_SIZE, 0xffff);
}
}
}