[virglrenderer-devel] [PATCH] Handling all exit points in vert and frag shaders

Jakob Bornecrantz jakob at collabora.com
Tue Feb 27 13:11:16 UTC 2018


On 2018-02-23 23:46, Robert Tarasov wrote:
> Refactors vertex/fragment shader exit routine. Handles all end points properly.
> Fixes dEQP-GLES2.functional.shaders.return.output_write_dynamic_vertex test.

Tested-by: Jakob Bornecrantz <jakob at collabora.com>

> ---
>   src/vrend_shader.c | 115 +++++++++++++++++++++++++++------------------
>   1 file changed, 68 insertions(+), 47 deletions(-)
> 
> diff --git a/src/vrend_shader.c b/src/vrend_shader.c
> index 8e925d3..e8ee8b9 100644
> --- a/src/vrend_shader.c
> +++ b/src/vrend_shader.c
> @@ -997,6 +997,50 @@ static int emit_buf(struct dump_ctx *ctx, const char *buf)
>         if (_ret) return FALSE;                        \
>      } while(0)
>   
> +static int handle_vertex_proc_exit(struct dump_ctx *ctx)
> +{
> +    if (ctx->so && !ctx->key->gs_present) {
> +       if (emit_so_movs(ctx))
> +          return FALSE;
> +    }
> +
> +    if (emit_clip_dist_movs(ctx))
> +       return FALSE;
> +
> +    if (!ctx->key->gs_present) {
> +       if (emit_prescale(ctx))
> +          return FALSE;
> +    }
> +
> +    return TRUE;
> +}
> +
> +static int handle_fragment_proc_exit(struct dump_ctx *ctx)
> +{
> +    if (ctx->key->pstipple_tex) {
> +       if (emit_pstipple_pass(ctx))
> +          return FALSE;
> +    }
> +
> +    if (ctx->key->cbufs_are_a8_bitmask) {
> +       if (emit_a8_swizzle(ctx))
> +          return FALSE;
> +    }
> +
> +    if (ctx->key->add_alpha_test) {
> +       if (emit_alpha_test(ctx))
> +          return FALSE;
> +    }
> +
> +    if (ctx->write_all_cbufs) {
> +       if (emit_cbuf_writes(ctx))
> +          return FALSE;
> +    }
> +
> +    return TRUE;
> +}
> +
> +
>   static int translate_tex(struct dump_ctx *ctx,
>                            struct tgsi_full_instruction *inst,
>                            int sreg_index,
> @@ -1967,53 +2011,30 @@ iter_instruction(struct tgsi_iterate_context *iter,
>         snprintf(buf, 255, "%s = mix(%s, %s, notEqual(floatBitsToUint(%s), uvec4(0.0)))%s;\n", dsts[0], srcs[2], srcs[1], srcs[0], writemask);
>         EMIT_BUF_WITH_RET(ctx, buf);
>         break;
> -   case TGSI_OPCODE_END:
> -      if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) {
> -         if (ctx->so && !ctx->key->gs_present) {
> -            ret = emit_so_movs(ctx);
> -            if (ret)
> -               return FALSE;
> -         }
> -         ret = emit_clip_dist_movs(ctx);
> -         if (ret)
> -            return FALSE;
> -         if (!ctx->key->gs_present) {
> -            ret = emit_prescale(ctx);
> -            if (ret)
> -               return FALSE;
> -         }
> -
> -      } else if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) {
> -
> -      } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) {
> -         if (ctx->key->pstipple_tex) {
> -            ret = emit_pstipple_pass(ctx);
> -            if (ret)
> -               return FALSE;
> -         }
> -         if (ctx->key->cbufs_are_a8_bitmask) {
> -            ret = emit_a8_swizzle(ctx);
> -            if (ret)
> -               return FALSE;
> -         }
> -         if (ctx->key->add_alpha_test) {
> -            ret = emit_alpha_test(ctx);
> -            if (ret)
> -               return FALSE;
> -         }
> -         if (ctx->write_all_cbufs) {
> -            ret = emit_cbuf_writes(ctx);
> -            if (ret)
> -               return FALSE;
> -         }
> -      }
> -      sret = add_str_to_glsl_main(ctx, "}\n");
> -      if (!sret)
> -         return FALSE;
> -      break;
> -   case TGSI_OPCODE_RET:
> -      EMIT_BUF_WITH_RET(ctx, "return;\n");
> -      break;
> +    case TGSI_OPCODE_END:
> +       if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) {
> +          if (handle_vertex_proc_exit(ctx) == FALSE)
> +             return FALSE;
> +    } else if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) {
> +    } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) {
> +       if (handle_fragment_proc_exit(ctx) == FALSE)
> +          return FALSE;
> +       }
> +       sret = add_str_to_glsl_main(ctx, "}\n");
> +       if (!sret)
> +          return FALSE;
> +       break;
> +    case TGSI_OPCODE_RET:
> +       if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) {
> +          if (handle_vertex_proc_exit(ctx) == FALSE)
> +             return FALSE;
> +       } else if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) {
> +       } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) {
> +          if (handle_fragment_proc_exit(ctx) == FALSE)
> +             return FALSE;
> +          }
> +          EMIT_BUF_WITH_RET(ctx, "return;\n");
> +          break;
>      case TGSI_OPCODE_ARL:
>         snprintf(buf, 255, "addr0 = int(floor(%s)%s);\n", srcs[0], writemask);
>         EMIT_BUF_WITH_RET(ctx, buf);
> 



More information about the virglrenderer-devel mailing list