summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2021-03-04 13:59:28 +1000
committerMarge Bot <eric+marge@anholt.net>2021-03-12 05:05:51 +0000
commite81cd3736339048fdc5cd343ef909016855b125a (patch)
tree4b136b47f898807346e6e53a040c4edb53bb7919
parentb76242b9c89e05878da845713ee30ec739dfedcf (diff)
llvmpipe: add view index support to rasterizer
Reviewed-by: Roland Scheidegger <sroland@vmware.com> Acked-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9399>
-rw-r--r--src/gallium/drivers/llvmpipe/lp_jit.c1
-rw-r--r--src/gallium/drivers/llvmpipe/lp_jit.h7
-rw-r--r--src/gallium/drivers/llvmpipe/lp_rast.c10
-rw-r--r--src/gallium/drivers/llvmpipe/lp_rast.h4
-rw-r--r--src/gallium/drivers/llvmpipe/lp_rast_priv.h5
-rw-r--r--src/gallium/drivers/llvmpipe/lp_setup_line.c1
-rw-r--r--src/gallium/drivers/llvmpipe/lp_setup_point.c1
-rw-r--r--src/gallium/drivers/llvmpipe/lp_setup_tri.c1
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_fs.c3
9 files changed, 25 insertions, 8 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_jit.c b/src/gallium/drivers/llvmpipe/lp_jit.c
index 3786c50e990..80d8d9e5c67 100644
--- a/src/gallium/drivers/llvmpipe/lp_jit.c
+++ b/src/gallium/drivers/llvmpipe/lp_jit.c
@@ -297,6 +297,7 @@ lp_jit_create_types(struct lp_fragment_shader_variant *lp)
elem_types[LP_JIT_THREAD_DATA_COUNTER] = LLVMInt64TypeInContext(lc);
elem_types[LP_JIT_THREAD_DATA_INVOCATIONS] = LLVMInt64TypeInContext(lc);
elem_types[LP_JIT_THREAD_DATA_RASTER_STATE_VIEWPORT_INDEX] =
+ elem_types[LP_JIT_THREAD_DATA_RASTER_STATE_VIEW_INDEX] =
LLVMInt32TypeInContext(lc);
thread_data_type = LLVMStructTypeInContext(lc, elem_types,
diff --git a/src/gallium/drivers/llvmpipe/lp_jit.h b/src/gallium/drivers/llvmpipe/lp_jit.h
index dcfe274b6f4..ce08b90dcdc 100644
--- a/src/gallium/drivers/llvmpipe/lp_jit.h
+++ b/src/gallium/drivers/llvmpipe/lp_jit.h
@@ -247,6 +247,7 @@ struct lp_jit_thread_data
*/
struct {
uint32_t viewport_index;
+ uint32_t view_index;
} raster_state;
};
@@ -256,6 +257,7 @@ enum {
LP_JIT_THREAD_DATA_COUNTER,
LP_JIT_THREAD_DATA_INVOCATIONS,
LP_JIT_THREAD_DATA_RASTER_STATE_VIEWPORT_INDEX,
+ LP_JIT_THREAD_DATA_RASTER_STATE_VIEW_INDEX,
LP_JIT_THREAD_DATA_COUNT
};
@@ -273,6 +275,11 @@ enum {
lp_build_struct_get(_gallivm, _ptr, \
LP_JIT_THREAD_DATA_RASTER_STATE_VIEWPORT_INDEX, \
"raster_state.viewport_index")
+
+#define lp_jit_thread_data_raster_state_view_index(_gallivm, _ptr) \
+ lp_build_struct_get(_gallivm, _ptr, \
+ LP_JIT_THREAD_DATA_RASTER_STATE_VIEW_INDEX, \
+ "raster_state.view_index")
/**
* typedef for fragment shader function
diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c
index 220133c75c2..6b5160667bf 100644
--- a/src/gallium/drivers/llvmpipe/lp_rast.c
+++ b/src/gallium/drivers/llvmpipe/lp_rast.c
@@ -342,7 +342,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task,
stride[i] = scene->cbufs[i].stride;
sample_stride[i] = scene->cbufs[i].sample_stride;
color[i] = lp_rast_get_color_block_pointer(task, i, tile_x + x,
- tile_y + y, inputs->layer);
+ tile_y + y, inputs->layer + inputs->view_index);
}
else {
stride[i] = 0;
@@ -354,7 +354,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task,
/* depth buffer */
if (scene->zsbuf.map) {
depth = lp_rast_get_depth_block_pointer(task, tile_x + x,
- tile_y + y, inputs->layer);
+ tile_y + y, inputs->layer + inputs->view_index);
depth_stride = scene->zsbuf.stride;
depth_sample_stride = scene->zsbuf.sample_stride;
}
@@ -365,6 +365,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task,
/* Propagate non-interpolated raster state. */
task->thread_data.raster_state.viewport_index = inputs->viewport_index;
+ task->thread_data.raster_state.view_index = inputs->view_index;
/* run shader on 4x4 block */
BEGIN_JIT_CALL(state, task);
@@ -448,7 +449,7 @@ lp_rast_shade_quads_mask_sample(struct lp_rasterizer_task *task,
stride[i] = scene->cbufs[i].stride;
sample_stride[i] = scene->cbufs[i].sample_stride;
color[i] = lp_rast_get_color_block_pointer(task, i, x, y,
- inputs->layer);
+ inputs->layer + inputs->view_index);
}
else {
stride[i] = 0;
@@ -461,7 +462,7 @@ lp_rast_shade_quads_mask_sample(struct lp_rasterizer_task *task,
if (scene->zsbuf.map) {
depth_stride = scene->zsbuf.stride;
depth_sample_stride = scene->zsbuf.sample_stride;
- depth = lp_rast_get_depth_block_pointer(task, x, y, inputs->layer);
+ depth = lp_rast_get_depth_block_pointer(task, x, y, inputs->layer + inputs->view_index);
}
assert(lp_check_alignment(state->jit_context.u8_blend_color, 16));
@@ -473,6 +474,7 @@ lp_rast_shade_quads_mask_sample(struct lp_rasterizer_task *task,
if ((x % TILE_SIZE) < task->width && (y % TILE_SIZE) < task->height) {
/* Propagate non-interpolated raster state. */
task->thread_data.raster_state.viewport_index = inputs->viewport_index;
+ task->thread_data.raster_state.view_index = inputs->view_index;
/* run shader on 4x4 block */
BEGIN_JIT_CALL(state, task);
diff --git a/src/gallium/drivers/llvmpipe/lp_rast.h b/src/gallium/drivers/llvmpipe/lp_rast.h
index 42589370447..2a2fdceb77f 100644
--- a/src/gallium/drivers/llvmpipe/lp_rast.h
+++ b/src/gallium/drivers/llvmpipe/lp_rast.h
@@ -101,10 +101,12 @@ struct lp_rast_shader_inputs {
unsigned frontfacing:1; /** True for front-facing */
unsigned disable:1; /** Partially binned, disable this command */
unsigned opaque:1; /** Is opaque */
- unsigned pad0:29; /* wasted space */
+ unsigned pad0:13; /* wasted space */
+ unsigned view_index:16;
unsigned stride; /* how much to advance data between a0, dadx, dady */
unsigned layer; /* the layer to render to (from gs, already clamped) */
unsigned viewport_index; /* the active viewport index (from gs, already clamped) */
+
/* followed by a0, dadx, dady and planes[] */
};
diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
index aaf52025f1c..c8154348ef9 100644
--- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h
+++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
@@ -246,7 +246,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task,
stride[i] = scene->cbufs[i].stride;
sample_stride[i] = scene->cbufs[i].sample_stride;
color[i] = lp_rast_get_color_block_pointer(task, i, x, y,
- inputs->layer);
+ inputs->layer + inputs->view_index);
}
else {
stride[i] = 0;
@@ -256,7 +256,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task,
}
if (scene->zsbuf.map) {
- depth = lp_rast_get_depth_block_pointer(task, x, y, inputs->layer);
+ depth = lp_rast_get_depth_block_pointer(task, x, y, inputs->layer + inputs->view_index);
depth_sample_stride = scene->zsbuf.sample_stride;
depth_stride = scene->zsbuf.stride;
}
@@ -272,6 +272,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task,
if ((x % TILE_SIZE) < task->width && (y % TILE_SIZE) < task->height) {
/* Propagate non-interpolated raster state. */
task->thread_data.raster_state.viewport_index = inputs->viewport_index;
+ task->thread_data.raster_state.view_index = inputs->view_index;
/* run shader on 4x4 block */
BEGIN_JIT_CALL(state, task);
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_line.c b/src/gallium/drivers/llvmpipe/lp_setup_line.c
index 675e5198517..62efa63bb57 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_line.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_line.c
@@ -648,6 +648,7 @@ try_setup_line( struct lp_setup_context *setup,
line->inputs.opaque = FALSE;
line->inputs.layer = layer;
line->inputs.viewport_index = viewport_index;
+ line->inputs.view_index = setup->view_index;
/*
* XXX: this code is mostly identical to the one in lp_setup_tri, except it
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_point.c b/src/gallium/drivers/llvmpipe/lp_setup_point.c
index 4a7fda5c9a7..d31f4d09a27 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_point.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_point.c
@@ -498,6 +498,7 @@ try_setup_point( struct lp_setup_context *setup,
point->inputs.opaque = FALSE;
point->inputs.layer = layer;
point->inputs.viewport_index = viewport_index;
+ point->inputs.view_index = setup->view_index;
{
struct lp_rast_plane *plane = GET_PLANES(point);
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
index acf36446669..4fb76dd22d2 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
@@ -395,6 +395,7 @@ do_triangle_ccw(struct lp_setup_context *setup,
tri->inputs.opaque = setup->fs.current.variant->opaque;
tri->inputs.layer = layer;
tri->inputs.viewport_index = viewport_index;
+ tri->inputs.view_index = setup->view_index;
if (0)
lp_dump_setup_coef(&setup->setup.variant->key,
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
index b30f5b661ae..1b1ae767db6 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
@@ -614,7 +614,8 @@ generate_fs_loop(struct gallivm_state *gallivm,
/* truncate then sign extend. */
system_values.front_facing = LLVMBuildTrunc(gallivm->builder, facing, LLVMInt1TypeInContext(gallivm->context), "");
system_values.front_facing = LLVMBuildSExt(gallivm->builder, system_values.front_facing, LLVMInt32TypeInContext(gallivm->context), "");
-
+ system_values.view_index = lp_jit_thread_data_raster_state_view_index(gallivm,
+ thread_data_ptr);
if (key->depth.enabled ||
key->stencil[0].enabled) {