[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