Not that I'm qualified to review r600 code, but couldn't you create
different shader variants depending on whether you need alpha test? At
least I would assume shader exports aren't free.

Roland

Am 27.08.2013 19:56, schrieb Vadim Girlin:
> We need to export at least one color if the shader writes it,
> even when nr_cbufs==0.
> 
> Signed-off-by: Vadim Girlin <vadimgir...@gmail.com>
> ---
> 
> Tested on evergreen with multiple combinations of backends - no regressions,
> fixes some tests:
> 
>   default    - fixes fb-alphatest-nocolor and fb_alphatest-nocolor-ff
>   default+sb - fixes fb-alphatest-nocolor and fb_alphatest-nocolor-ff
>   llvm       - fixes about 25 tests related to depth/stencil
>   llvm+sb    - fixes about 300 tests (llvm's depth/stencil issues and
>                regressions cased by reordering of exports in sb)
> 
> With this patch, there are no regressions with default+sb vs default.
> There is one regression with llvm+sb vs llvm - fs-texturegrad-miplevels,
> AFAICS it's a problem with llvm backend uncovered by sb - SET_GRADIENTS_V/H 
> instructions are not placed in the same TEX clause with corresponding 
> SAMPLE_G.
> 
>  src/gallium/drivers/r600/r600_shader.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/r600_shader.c 
> b/src/gallium/drivers/r600/r600_shader.c
> index 300b5c4..f7eab76 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -918,6 +918,7 @@ static int r600_shader_from_tgsi(struct r600_screen 
> *rscreen,
>       unsigned opcode;
>       int i, j, k, r = 0;
>       int next_pos_base = 60, next_param_base = 0;
> +     int max_color_exports = MAX2(key.nr_cbufs, 1);
>       /* Declarations used by llvm code */
>       bool use_llvm = false;
>       bool indirect_gprs;
> @@ -1130,7 +1131,7 @@ static int r600_shader_from_tgsi(struct r600_screen 
> *rscreen,
>               radeon_llvm_ctx.face_gpr = ctx.face_gpr;
>               radeon_llvm_ctx.r600_inputs = ctx.shader->input;
>               radeon_llvm_ctx.r600_outputs = ctx.shader->output;
> -             radeon_llvm_ctx.color_buffer_count = MAX2(key.nr_cbufs , 1);
> +             radeon_llvm_ctx.color_buffer_count = max_color_exports;
>               radeon_llvm_ctx.chip_class = ctx.bc->chip_class;
>               radeon_llvm_ctx.fs_color_all = shader->fs_write_all && 
> (rscreen->chip_class >= EVERGREEN);
>               radeon_llvm_ctx.stream_outputs = &so;
> @@ -1440,7 +1441,7 @@ static int r600_shader_from_tgsi(struct r600_screen 
> *rscreen,
>               case TGSI_PROCESSOR_FRAGMENT:
>                       if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
>                               /* never export more colors than the number of 
> CBs */
> -                             if (shader->output[i].sid >= key.nr_cbufs) {
> +                             if (shader->output[i].sid >= max_color_exports) 
> {
>                                       /* skip export */
>                                       j--;
>                                       continue;
> @@ -1450,7 +1451,7 @@ static int r600_shader_from_tgsi(struct r600_screen 
> *rscreen,
>                               output[j].type = 
> V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
>                               shader->nr_ps_color_exports++;
>                               if (shader->fs_write_all && 
> (rscreen->chip_class >= EVERGREEN)) {
> -                                     for (k = 1; k < key.nr_cbufs; k++) {
> +                                     for (k = 1; k < max_color_exports; k++) 
> {
>                                               j++;
>                                               memset(&output[j], 0, 
> sizeof(struct r600_bytecode_output));
>                                               output[j].gpr = 
> shader->output[i].gpr;
> 
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to