diff options
author | Dave Airlie <airlied@redhat.com> | 2021-03-04 13:59:28 +1000 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-03-12 05:05:51 +0000 |
commit | e81cd3736339048fdc5cd343ef909016855b125a (patch) | |
tree | 4b136b47f898807346e6e53a040c4edb53bb7919 | |
parent | b76242b9c89e05878da845713ee30ec739dfedcf (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.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_jit.h | 7 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_rast.c | 10 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_rast.h | 4 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_rast_priv.h | 5 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_setup_line.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_setup_point.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_setup_tri.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_state_fs.c | 3 |
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) { |