Hi Dave,

Picking this patch (and the two follow ups that fix it) against the 10.3
branch seems to produce a handful of non-intuitive conflicts. Can you
confirm if it's truly meant to be picked for 10.3 and if so can you
provide a backport.

Thanks
Emil

On 24/11/14 03:36, Dave Airlie wrote:
> From: Dave Airlie <airl...@redhat.com>
> 
> We are using 1 more buffer than we have, although in the future the
> driver should just end up using one buffer in total probably, this
> is a good first step, it merges the txq cube array and buffer info
> constants on r600 and evergreen.
> 
> this also most likely breaks llvm backend, I've changed it,
> but it definitely needs fixes for this.
> 
> this fixes a bunch of geom shader textureSize tests on rv635
> from gpu reset to pass.
> 
> Signed-off-by: Dave Airlie <airl...@redhat.com>
> ---
>  src/gallium/drivers/r600/r600_llvm.c         |  3 +-
>  src/gallium/drivers/r600/r600_pipe.h         |  8 +--
>  src/gallium/drivers/r600/r600_shader.c       | 18 ++++--
>  src/gallium/drivers/r600/r600_state_common.c | 92 
> +++++++++++-----------------
>  4 files changed, 54 insertions(+), 67 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/r600_llvm.c 
> b/src/gallium/drivers/r600/r600_llvm.c
> index c19693a..470c65f 100644
> --- a/src/gallium/drivers/r600/r600_llvm.c
> +++ b/src/gallium/drivers/r600/r600_llvm.c
> @@ -23,7 +23,6 @@
>  
>  #define CONSTANT_BUFFER_0_ADDR_SPACE 8
>  #define CONSTANT_BUFFER_1_ADDR_SPACE (CONSTANT_BUFFER_0_ADDR_SPACE + 
> R600_UCP_CONST_BUFFER)
> -#define CONSTANT_TXQ_BUFFER (CONSTANT_BUFFER_0_ADDR_SPACE + 
> R600_TXQ_CONST_BUFFER)
>  #define LLVM_R600_BUFFER_INFO_CONST_BUFFER \
>       (CONSTANT_BUFFER_0_ADDR_SPACE + R600_BUFFER_INFO_CONST_BUFFER)
>  
> @@ -690,7 +689,7 @@ static void llvm_emit_tex(
>               if (emit_data->inst->Dst[0].Register.WriteMask & 4) {
>                       LLVMValueRef offset = 
> lp_build_const_int32(bld_base->base.gallivm, 0);
>                       LLVMValueRef ZLayer = 
> LLVMBuildExtractElement(gallivm->builder,
> -                             llvm_load_const_buffer(bld_base, offset, 
> CONSTANT_TXQ_BUFFER),
> +                             llvm_load_const_buffer(bld_base, offset, 
> LLVM_R600_BUFFER_INFO_CONST_BUFFER,
>                               lp_build_const_int32(gallivm, 0), "");
>  
>                       emit_data->output[0] = 
> LLVMBuildInsertElement(gallivm->builder, emit_data->output[0], ZLayer, 
> lp_build_const_int32(gallivm, 2), "");
> diff --git a/src/gallium/drivers/r600/r600_pipe.h 
> b/src/gallium/drivers/r600/r600_pipe.h
> index 40b0328..e27e877 100644
> --- a/src/gallium/drivers/r600/r600_pipe.h
> +++ b/src/gallium/drivers/r600/r600_pipe.h
> @@ -44,14 +44,13 @@
>  #define R600_TRACE_CS_DWORDS         7
>  
>  #define R600_MAX_USER_CONST_BUFFERS 13
> -#define R600_MAX_DRIVER_CONST_BUFFERS 4
> +#define R600_MAX_DRIVER_CONST_BUFFERS 3
>  #define R600_MAX_CONST_BUFFERS (R600_MAX_USER_CONST_BUFFERS + 
> R600_MAX_DRIVER_CONST_BUFFERS)
>  
>  /* start driver buffers after user buffers */
>  #define R600_UCP_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS)
> -#define R600_TXQ_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 1)
> -#define R600_BUFFER_INFO_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 2)
> -#define R600_GS_RING_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 3)
> +#define R600_BUFFER_INFO_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 1)
> +#define R600_GS_RING_CONST_BUFFER (R600_MAX_USER_CONST_BUFFERS + 2)
>  /* Currently R600_MAX_CONST_BUFFERS is too large, the hardware only has 16 
> buffers, but the driver is
>   * trying to use 17. Avoid accidentally aliasing with user UBOs for 
> SAMPLE_POSITIONS by using an id<16.
>   * UCP/SAMPLE_POSITIONS are never accessed by same shader stage so they can 
> use the same id.
> @@ -316,7 +315,6 @@ struct r600_samplerview_state {
>       uint32_t                        dirty_mask;
>       uint32_t                        compressed_depthtex_mask; /* which 
> textures are depth */
>       uint32_t                        compressed_colortex_mask;
> -     boolean                         dirty_txq_constants;
>       boolean                         dirty_buffer_constants;
>  };
>  
> diff --git a/src/gallium/drivers/r600/r600_shader.c 
> b/src/gallium/drivers/r600/r600_shader.c
> index a772dee..61ff162 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -5035,8 +5035,9 @@ static int r600_do_buffer_txq(struct r600_shader_ctx 
> *ctx)
>       alu.op = ALU_OP1_MOV;
>  
>       if (ctx->bc->chip_class >= EVERGREEN) {
> -             alu.src[0].sel = 512 + (id / 4);
> -             alu.src[0].chan = id % 4;
> +             /* channel 0 or 2 of each word */
> +             alu.src[0].sel = 512 + (id / 2);
> +             alu.src[0].chan = (id % 2) * 2;
>       } else {
>               /* r600 we have them at channel 2 of the second dword */
>               alu.src[0].sel = 512 + (id * 2) + 1;
> @@ -5697,9 +5698,16 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
>               memset(&alu, 0, sizeof(struct r600_bytecode_alu));
>               alu.op = ALU_OP1_MOV;
>  
> -             alu.src[0].sel = 512 + (id / 4);
> -             alu.src[0].kc_bank = R600_TXQ_CONST_BUFFER;
> -             alu.src[0].chan = id % 4;
> +             if (ctx->bc->chip_class >= EVERGREEN) {
> +                     /* channel 1 or 3 of each word */
> +                     alu.src[0].sel = 512 + (id / 2);
> +                     alu.src[0].chan = ((id % 2) * 2) + 1;
> +             } else {
> +                     /* r600 we have them at channel 2 of the second dword */
> +                     alu.src[0].sel = 512 + (id * 2) + 1;
> +                     alu.src[0].chan = 2;
> +             }
> +             alu.src[0].kc_bank = R600_BUFFER_INFO_CONST_BUFFER;
>               tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
>               alu.last = 1;
>               r = r600_bytecode_add_alu(ctx->bc, &alu);
> diff --git a/src/gallium/drivers/r600/r600_state_common.c 
> b/src/gallium/drivers/r600/r600_state_common.c
> index c3f21cb..ff94454 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -649,7 +649,6 @@ static void r600_set_sampler_views(struct pipe_context 
> *pipe, unsigned shader,
>       dst->views.dirty_mask |= new_mask;
>       dst->views.compressed_depthtex_mask &= dst->views.enabled_mask;
>       dst->views.compressed_colortex_mask &= dst->views.enabled_mask;
> -     dst->views.dirty_txq_constants = TRUE;
>       dst->views.dirty_buffer_constants = TRUE;
>       r600_sampler_views_dirty(rctx, &dst->views);
>  
> @@ -984,6 +983,7 @@ static void r600_set_sample_mask(struct pipe_context 
> *pipe, unsigned sample_mask
>   * then in the shader, we AND the 4 components with 0xffffffff or 0,
>   * then OR the alpha with the value given here.
>   * We use a 6th constant to store the txq buffer size in
> + * we use 7th slot for cube map
>   */
>  static void r600_setup_buffer_constants(struct r600_context *rctx, int 
> shader_type)
>  {
> @@ -1022,6 +1022,7 @@ static void r600_setup_buffer_constants(struct 
> r600_context *rctx, int shader_ty
>                               samplers->buffer_constants[offset + 4] = 0;
>  
>                       samplers->buffer_constants[offset + 5] = 
> samplers->views.views[i]->base.texture->width0 / 
> util_format_get_blocksize(samplers->views.views[i]->base.format);
> +                     samplers->buffer_constants[offset + 6] = 
> samplers->views.views[i]->base.texture->array_size / 6;
>               }
>       }
>  
> @@ -1048,12 +1049,16 @@ static void eg_setup_buffer_constants(struct 
> r600_context *rctx, int shader_type
>       samplers->views.dirty_buffer_constants = FALSE;
>  
>       bits = util_last_bit(samplers->views.enabled_mask);
> -     array_size = bits * sizeof(uint32_t) * 4;
> +     array_size = bits * 2 * sizeof(uint32_t) * 4;
>       samplers->buffer_constants = realloc(samplers->buffer_constants, 
> array_size);
>       memset(samplers->buffer_constants, 0, array_size);
> -     for (i = 0; i < bits; i++)
> -             if (samplers->views.enabled_mask & (1 << i))
> -                samplers->buffer_constants[i] = 
> samplers->views.views[i]->base.texture->width0 / 
> util_format_get_blocksize(samplers->views.views[i]->base.format);
> +     for (i = 0; i < bits; i++) {
> +             if (samplers->views.enabled_mask & (1 << i)) {
> +                     uint32_t offset = i * 2;
> +                     samplers->buffer_constants[offset] = 
> samplers->views.views[i]->base.texture->width0 / 
> util_format_get_blocksize(samplers->views.views[i]->base.format);
> +                     samplers->buffer_constants[offset + 1] = 
> samplers->views.views[i]->base.texture->array_size / 6;
> +             }
> +     }
>  
>       cb.buffer = NULL;
>       cb.user_buffer = samplers->buffer_constants;
> @@ -1063,35 +1068,6 @@ static void eg_setup_buffer_constants(struct 
> r600_context *rctx, int shader_type
>       pipe_resource_reference(&cb.buffer, NULL);
>  }
>  
> -static void r600_setup_txq_cube_array_constants(struct r600_context *rctx, 
> int shader_type)
> -{
> -     struct r600_textures_info *samplers = &rctx->samplers[shader_type];
> -     int bits;
> -     uint32_t array_size;
> -     struct pipe_constant_buffer cb;
> -     int i;
> -
> -     if (!samplers->views.dirty_txq_constants)
> -             return;
> -
> -     samplers->views.dirty_txq_constants = FALSE;
> -
> -     bits = util_last_bit(samplers->views.enabled_mask);
> -     array_size = bits * sizeof(uint32_t) * 4;
> -     samplers->txq_constants = realloc(samplers->txq_constants, array_size);
> -     memset(samplers->txq_constants, 0, array_size);
> -     for (i = 0; i < bits; i++)
> -             if (samplers->views.enabled_mask & (1 << i))
> -                     samplers->txq_constants[i] = 
> samplers->views.views[i]->base.texture->array_size / 6;
> -
> -     cb.buffer = NULL;
> -     cb.user_buffer = samplers->txq_constants;
> -     cb.buffer_offset = 0;
> -     cb.buffer_size = array_size;
> -     rctx->b.b.set_constant_buffer(&rctx->b.b, shader_type, 
> R600_TXQ_CONST_BUFFER, &cb);
> -     pipe_resource_reference(&cb.buffer, NULL);
> -}
> -
>  /* set sample xy locations as array of fragment shader constants */
>  void r600_set_sample_locations_constant_buffer(struct r600_context *rctx)
>  {
> @@ -1175,7 +1151,7 @@ static bool r600_update_derived_state(struct 
> r600_context *rctx)
>       struct pipe_context * ctx = (struct pipe_context*)rctx;
>       bool ps_dirty = false, vs_dirty = false, gs_dirty = false;
>       bool blend_disable;
> -
> +     bool need_buf_const;
>       if (!rctx->blitter->running) {
>               unsigned i;
>  
> @@ -1296,29 +1272,35 @@ static bool r600_update_derived_state(struct 
> r600_context *rctx)
>  
>       /* on R600 we stuff masks + txq info into one constant buffer */
>       /* on evergreen we only need a txq info one */
> -     if (rctx->b.chip_class < EVERGREEN) {
> -             if (rctx->ps_shader && 
> rctx->ps_shader->current->shader.uses_tex_buffers)
> -                     r600_setup_buffer_constants(rctx, PIPE_SHADER_FRAGMENT);
> -             if (rctx->vs_shader && 
> rctx->vs_shader->current->shader.uses_tex_buffers)
> -                     r600_setup_buffer_constants(rctx, PIPE_SHADER_VERTEX);
> -             if (rctx->gs_shader && 
> rctx->gs_shader->current->shader.uses_tex_buffers)
> -                     r600_setup_buffer_constants(rctx, PIPE_SHADER_GEOMETRY);
> -     } else {
> -             if (rctx->ps_shader && 
> rctx->ps_shader->current->shader.uses_tex_buffers)
> -                     eg_setup_buffer_constants(rctx, PIPE_SHADER_FRAGMENT);
> -             if (rctx->vs_shader && 
> rctx->vs_shader->current->shader.uses_tex_buffers)
> -                     eg_setup_buffer_constants(rctx, PIPE_SHADER_VERTEX);
> -             if (rctx->gs_shader && 
> rctx->gs_shader->current->shader.uses_tex_buffers)
> -                     eg_setup_buffer_constants(rctx, PIPE_SHADER_GEOMETRY);
> +     if (rctx->ps_shader) {
> +             need_buf_const = 
> rctx->ps_shader->current->shader.uses_tex_buffers || 
> rctx->ps_shader->current->shader.has_txq_cube_array_z_comp;
> +             if (need_buf_const) {
> +                     if (rctx->b.chip_class < EVERGREEN)
> +                             r600_setup_buffer_constants(rctx, 
> PIPE_SHADER_FRAGMENT);
> +                     else
> +                             eg_setup_buffer_constants(rctx, 
> PIPE_SHADER_FRAGMENT);
> +             }
>       }
>  
> +     if (rctx->vs_shader) {
> +             need_buf_const = 
> rctx->vs_shader->current->shader.uses_tex_buffers || 
> rctx->vs_shader->current->shader.has_txq_cube_array_z_comp;
> +             if (need_buf_const) {
> +                     if (rctx->b.chip_class < EVERGREEN)
> +                             r600_setup_buffer_constants(rctx, 
> PIPE_SHADER_VERTEX);
> +                     else
> +                             eg_setup_buffer_constants(rctx, 
> PIPE_SHADER_VERTEX);
> +             }
> +     }
>  
> -     if (rctx->ps_shader && 
> rctx->ps_shader->current->shader.has_txq_cube_array_z_comp)
> -             r600_setup_txq_cube_array_constants(rctx, PIPE_SHADER_FRAGMENT);
> -     if (rctx->vs_shader && 
> rctx->vs_shader->current->shader.has_txq_cube_array_z_comp)
> -             r600_setup_txq_cube_array_constants(rctx, PIPE_SHADER_VERTEX);
> -     if (rctx->gs_shader && 
> rctx->gs_shader->current->shader.has_txq_cube_array_z_comp)
> -             r600_setup_txq_cube_array_constants(rctx, PIPE_SHADER_GEOMETRY);
> +     if (rctx->gs_shader) {
> +             need_buf_const = 
> rctx->gs_shader->current->shader.uses_tex_buffers || 
> rctx->gs_shader->current->shader.has_txq_cube_array_z_comp;
> +             if (need_buf_const) {
> +                     if (rctx->b.chip_class < EVERGREEN)
> +                             r600_setup_buffer_constants(rctx, 
> PIPE_SHADER_GEOMETRY);
> +                     else
> +                             eg_setup_buffer_constants(rctx, 
> PIPE_SHADER_GEOMETRY);
> +             }
> +     }
>  
>       if (rctx->b.chip_class < EVERGREEN && rctx->ps_shader && 
> rctx->vs_shader) {
>               if (!r600_adjust_gprs(rctx)) {
> 

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to