[Mesa-dev] [PATCH v3 06/12] i965/fs: Get rid of load/store_foo_indirect

Jason Ekstrand jason at jlekstrand.net
Tue Dec 8 16:55:48 PST 2015


On Tue, Dec 8, 2015 at 4:44 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> 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.

Fixed both locally.  Thanks for the careful review and for watching
out for scalar GS!

> With that fixed, patches 1-8 and 11-12 are:
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

Thanks!
--Jason


More information about the mesa-dev mailing list