From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/auxiliary/util/u_blitter.c | 2 +- src/gallium/auxiliary/util/u_simple_shaders.c | 40 ++++++++++++--------------- src/gallium/auxiliary/util/u_simple_shaders.h | 2 +- 3 files changed, 19 insertions(+), 25 deletions(-)
diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c index d71a238..7a3eb63 100644 --- a/src/gallium/auxiliary/util/u_blitter.c +++ b/src/gallium/auxiliary/util/u_blitter.c @@ -331,21 +331,21 @@ static void bind_vs_pos_only(struct blitter_context_priv *ctx, const uint semantic_indices[] = { 0 }; memset(&so, 0, sizeof(so)); so.num_outputs = 1; so.output[0].num_components = num_so_channels; so.stride[0] = num_so_channels; ctx->vs_pos_only[index] = util_make_vertex_passthrough_shader_with_so(pipe, 1, semantic_names, semantic_indices, FALSE, - &so); + false, &so); } pipe->bind_vs_state(pipe, ctx->vs_pos_only[index]); } static void bind_vs_passthrough(struct blitter_context_priv *ctx) { struct pipe_context *pipe = ctx->base.pipe; if (!ctx->vs) { diff --git a/src/gallium/auxiliary/util/u_simple_shaders.c b/src/gallium/auxiliary/util/u_simple_shaders.c index 127bb7a..9679545 100644 --- a/src/gallium/auxiliary/util/u_simple_shaders.c +++ b/src/gallium/auxiliary/util/u_simple_shaders.c @@ -59,29 +59,29 @@ void * util_make_vertex_passthrough_shader(struct pipe_context *pipe, uint num_attribs, const uint *semantic_names, const uint *semantic_indexes, bool window_space) { return util_make_vertex_passthrough_shader_with_so(pipe, num_attribs, semantic_names, semantic_indexes, - window_space, NULL); + window_space, false, NULL); } void * util_make_vertex_passthrough_shader_with_so(struct pipe_context *pipe, uint num_attribs, const uint *semantic_names, const uint *semantic_indexes, - bool window_space, + bool window_space, bool layered, const struct pipe_stream_output_info *so) { struct ureg_program *ureg; uint i; ureg = ureg_create( PIPE_SHADER_VERTEX ); if (!ureg) return NULL; if (window_space) @@ -93,50 +93,44 @@ util_make_vertex_passthrough_shader_with_so(struct pipe_context *pipe, src = ureg_DECL_vs_input( ureg, i ); dst = ureg_DECL_output( ureg, semantic_names[i], semantic_indexes[i]); ureg_MOV( ureg, dst, src ); } + if (layered) { + struct ureg_src instance_id = + ureg_DECL_system_value(ureg, TGSI_SEMANTIC_INSTANCEID, 0); + struct ureg_dst layer = ureg_DECL_output(ureg, TGSI_SEMANTIC_LAYER, 0); + + ureg_MOV(ureg, ureg_writemask(layer, TGSI_WRITEMASK_X), + ureg_scalar(instance_id, TGSI_SWIZZLE_X)); + } + ureg_END( ureg ); return ureg_create_shader_with_so_and_destroy( ureg, pipe, so ); } void *util_make_layered_clear_vertex_shader(struct pipe_context *pipe) { - static const char text[] = - "VERT\n" - "DCL IN[0]\n" - "DCL IN[1]\n" - "DCL SV[0], INSTANCEID\n" - "DCL OUT[0], POSITION\n" - "DCL OUT[1], GENERIC[0]\n" - "DCL OUT[2], LAYER\n" + const unsigned semantic_names[] = {TGSI_SEMANTIC_POSITION, + TGSI_SEMANTIC_GENERIC}; + const unsigned semantic_indices[] = {0, 0}; - "MOV OUT[0], IN[0]\n" - "MOV OUT[1], IN[1]\n" - "MOV OUT[2].x, SV[0].xxxx\n" - "END\n"; - struct tgsi_token tokens[1000]; - struct pipe_shader_state state; - - if (!tgsi_text_translate(text, tokens, ARRAY_SIZE(tokens))) { - assert(0); - return NULL; - } - pipe_shader_state_from_tgsi(&state, tokens); - return pipe->create_vs_state(pipe, &state); + return util_make_vertex_passthrough_shader_with_so(pipe, 2, semantic_names, + semantic_indices, false, + true, NULL); } /** * Takes position and color, and outputs position, color, and instance id. */ void *util_make_layered_clear_helper_vertex_shader(struct pipe_context *pipe) { static const char text[] = "VERT\n" "DCL IN[0]\n" diff --git a/src/gallium/auxiliary/util/u_simple_shaders.h b/src/gallium/auxiliary/util/u_simple_shaders.h index aadc7af..a281f57 100644 --- a/src/gallium/auxiliary/util/u_simple_shaders.h +++ b/src/gallium/auxiliary/util/u_simple_shaders.h @@ -49,21 +49,21 @@ util_make_vertex_passthrough_shader(struct pipe_context *pipe, uint num_attribs, const uint *semantic_names, const uint *semantic_indexes, bool window_space); extern void * util_make_vertex_passthrough_shader_with_so(struct pipe_context *pipe, uint num_attribs, const uint *semantic_names, const uint *semantic_indexes, - bool window_space, + bool window_space, bool layered, const struct pipe_stream_output_info *so); extern void * util_make_layered_clear_vertex_shader(struct pipe_context *pipe); extern void * util_make_layered_clear_helper_vertex_shader(struct pipe_context *pipe); extern void * util_make_layered_clear_geometry_shader(struct pipe_context *pipe); -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev