From f93dc9dc77c3189cfeba5dbe471ac087f62b37be Mon Sep 17 00:00:00 2001 From: Erico Nunes Date: Mon, 12 Apr 2021 10:05:43 +0200 Subject: [PATCH] gallium/hud: create vs_text to match fs_text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gallium hud uses different tgsi fragment shaders for text and background quads, which have different varying layouts. Since these are compiled directly from tgsi they bypass some optimizations and may not work properly on all backends. A simple fix for the varying layout problem is to define a vs_text shader to match the varyings in fs_text so the problem is avoided. Signed-off-by: Erico Nunes Reviewed-by: Marek Olšák Part-of: --- src/gallium/auxiliary/hud/hud_context.c | 57 ++++++++++++++++++++++--- src/gallium/auxiliary/hud/hud_private.h | 2 +- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c index d5e03f77d68..ff077950773 100644 --- a/src/gallium/auxiliary/hud/hud_context.c +++ b/src/gallium/auxiliary/hud/hud_context.c @@ -538,7 +538,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) cso_set_tessctrl_shader_handle(cso, NULL); cso_set_tesseval_shader_handle(cso, NULL); cso_set_geometry_shader_handle(cso, NULL); - cso_set_vertex_shader_handle(cso, hud->vs); + cso_set_vertex_shader_handle(cso, hud->vs_color); cso_set_vertex_elements(cso, &hud->velems); cso_set_render_condition(cso, NULL, FALSE, 0); pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 1, 0, @@ -569,6 +569,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) /* draw accumulated vertices for text */ if (hud->text.num_vertices) { + cso_set_vertex_shader_handle(cso, hud->vs_text); cso_set_vertex_buffers(cso, 0, 1, &hud->text.vbuf); cso_set_fragment_shader_handle(hud->cso, hud->fs_text); cso_draw_arrays(cso, PIPE_PRIM_QUADS, 0, hud->text.num_vertices); @@ -592,6 +593,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, false, &hud->constbuf); if (hud->whitelines.num_vertices) { + cso_set_vertex_shader_handle(cso, hud->vs_color); cso_set_vertex_buffers(cso, 0, 1, &hud->whitelines.vbuf); cso_set_fragment_shader_handle(hud->cso, hud->fs_color); cso_draw_arrays(cso, PIPE_PRIM_LINES, 0, hud->whitelines.num_vertices); @@ -1639,9 +1641,13 @@ hud_unset_draw_context(struct hud_context *hud) pipe->delete_fs_state(pipe, hud->fs_text); hud->fs_text = NULL; } - if (hud->vs) { - pipe->delete_vs_state(pipe, hud->vs); - hud->vs = NULL; + if (hud->vs_color) { + pipe->delete_vs_state(pipe, hud->vs_color); + hud->vs_color = NULL; + } + if (hud->vs_text) { + pipe->delete_vs_state(pipe, hud->vs_text); + hud->vs_text = NULL; } hud->cso = NULL; @@ -1667,13 +1673,14 @@ hud_set_draw_context(struct hud_context *hud, struct cso_context *cso, if (!hud->font_sampler_view) goto fail; - /* fragment shader */ + /* color fragment shader */ hud->fs_color = util_make_fragment_passthrough_shader(pipe, TGSI_SEMANTIC_COLOR, TGSI_INTERPOLATE_CONSTANT, TRUE); + /* text fragment shader */ { /* Read a texture and do .xxxx swizzling. */ static const char *fragment_shader_text = { @@ -1700,7 +1707,7 @@ hud_set_draw_context(struct hud_context *hud, struct cso_context *cso, hud->fs_text = pipe->create_fs_state(pipe, &state); } - /* vertex shader */ + /* color vertex shader */ { static const char *vertex_shader_text = { "VERT\n" @@ -1733,7 +1740,43 @@ hud_set_draw_context(struct hud_context *hud, struct cso_context *cso, goto fail; } pipe_shader_state_from_tgsi(&state, tokens); - hud->vs = pipe->create_vs_state(pipe, &state); + hud->vs_color = pipe->create_vs_state(pipe, &state); + } + + /* text vertex shader */ + { + /* similar to the above, without the color component + * to match the varyings in fs_text */ + static const char *vertex_shader_text = { + "VERT\n" + "DCL IN[0..1]\n" + "DCL OUT[0], POSITION\n" + "DCL OUT[1], GENERIC[0]\n" /* texcoord */ + /* [0] = color, + * [1] = (2/fb_width, 2/fb_height, xoffset, yoffset) + * [2] = (xscale, yscale, 0, 0) */ + "DCL CONST[0][0..2]\n" + "DCL TEMP[0]\n" + "IMM[0] FLT32 { -1, 0, 0, 1 }\n" + + /* v = in * (xscale, yscale) + (xoffset, yoffset) */ + "MAD TEMP[0].xy, IN[0], CONST[0][2].xyyy, CONST[0][1].zwww\n" + /* pos = v * (2 / fb_width, 2 / fb_height) - (1, 1) */ + "MAD OUT[0].xy, TEMP[0], CONST[0][1].xyyy, IMM[0].xxxx\n" + "MOV OUT[0].zw, IMM[0]\n" + + "MOV OUT[1], IN[1]\n" + "END\n" + }; + + struct tgsi_token tokens[1000]; + struct pipe_shader_state state = {0}; + if (!tgsi_text_translate(vertex_shader_text, tokens, ARRAY_SIZE(tokens))) { + assert(0); + goto fail; + } + pipe_shader_state_from_tgsi(&state, tokens); + hud->vs_text = pipe->create_vs_state(pipe, &state); } return true; diff --git a/src/gallium/auxiliary/hud/hud_private.h b/src/gallium/auxiliary/hud/hud_private.h index 4caa99f3c72..b8ee49532e2 100644 --- a/src/gallium/auxiliary/hud/hud_private.h +++ b/src/gallium/auxiliary/hud/hud_private.h @@ -62,7 +62,7 @@ struct hud_context { struct pipe_depth_stencil_alpha_state dsa; void *fs_color, *fs_text; struct pipe_rasterizer_state rasterizer, rasterizer_aa_lines; - void *vs; + void *vs_color, *vs_text; struct cso_velems_state velems; /* font */