[Mesa-dev] [PATCH v3 06/12] i965/fs: Get rid of load/store_foo_indirect
Kenneth Graunke
kenneth at whitecape.org
Tue Dec 8 16:44:21 PST 2015
On Tuesday, December 08, 2015 01:46:23 PM Jason Ekstrand wrote:
> ---
> src/mesa/drivers/dri/i965/brw_fs.h | 2 +-
> src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 106 ++++++++++++++-----------------
> src/mesa/drivers/dri/i965/brw_nir.c | 45 ++++++++++---
> 3 files changed, 84 insertions(+), 69 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
> index bca4589..b55589f 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -278,7 +278,7 @@ public:
> unsigned stream_id);
> void emit_gs_thread_end();
> void emit_gs_input_load(const fs_reg &dst, const nir_src &vertex_src,
> - const fs_reg &indirect_offset, unsigned imm_offset,
> + unsigned base_offset, const nir_src &offset_src,
> unsigned num_components);
> void emit_cs_terminate();
> fs_reg *emit_cs_local_invocation_id_setup();
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> index 3754622..18c9d65 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> @@ -1603,29 +1603,31 @@ fs_visitor::emit_gs_vertex(const nir_src &vertex_count_nir_src,
> void
> fs_visitor::emit_gs_input_load(const fs_reg &dst,
> const nir_src &vertex_src,
> - const fs_reg &indirect_offset,
> - unsigned imm_offset,
> + unsigned base_offset,
> + const nir_src &offset_src,
> unsigned num_components)
> {
> struct brw_gs_prog_data *gs_prog_data = (struct brw_gs_prog_data *) prog_data;
>
> + nir_const_value *vertex_const = nir_src_as_const_value(vertex_src);
> + nir_const_value *offset_const = nir_src_as_const_value(offset_src);
> + const unsigned push_reg_count = gs_prog_data->base.urb_read_length * 8;
> +
> /* Offset 0 is the VUE header, which contains VARYING_SLOT_LAYER [.y],
> * VARYING_SLOT_VIEWPORT [.z], and VARYING_SLOT_PSIZ [.w]. Only
> * gl_PointSize is available as a GS input, however, so it must be that.
> */
> - const bool is_point_size =
> - indirect_offset.file == BAD_FILE && imm_offset == 0;
> -
> - nir_const_value *vertex_const = nir_src_as_const_value(vertex_src);
> - const unsigned push_reg_count = gs_prog_data->base.urb_read_length * 8;
> + const bool is_point_size = (base_offset == 0);
>
> - if (indirect_offset.file == BAD_FILE && vertex_const != NULL &&
> - 4 * imm_offset < push_reg_count) {
> - imm_offset = 4 * imm_offset + vertex_const->u[0] * push_reg_count;
> + if (offset_const != NULL && vertex_const != NULL &&
> + 4 * offset_const->u[0] < push_reg_count) {
This needs to be
4 * (base_offset + offset_const->u[0]) < push_reg_count
otherwise we use the push model for inputs that aren't actually pushed,
which breaks around 1500 piglit tests with INTEL_SCALAR_GS=1.
> + int imm_offset = (base_offset + offset_const->u[0]) * 4 +
> + vertex_const->u[0] * push_reg_count;
> /* This input was pushed into registers. */
> if (is_point_size) {
> /* gl_PointSize comes in .w */
> - bld.MOV(dst, fs_reg(ATTR, imm_offset + 3, dst.type));
> + assert(imm_offset == 0);
> + bld.MOV(dst, fs_reg(ATTR, 3, dst.type));
This is wrong. imm_offset contains the offset derived from the vertex
index, and gl_PointSize exists for multiple vertices. So it won't be 0.
Please just remove this change, putting it back to:
bld.MOV(dst, fs_reg(ATTR, imm_offset + 3, dst.type));
That fixes assertion failures in 3 Piglit tests.
With that fixed, patches 1-8 and 11-12 are:
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20151208/aa5eaad6/attachment-0001.sig>
More information about the mesa-dev
mailing list