[Mesa-dev] [PATCH] llvmpipe: Implement stencil export
Jose Fonseca
jfonseca at vmware.com
Wed Jun 3 04:39:32 PDT 2015
Looks perfect. Thanks!
Jose
On 03/06/15 00:35, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> Pretty trivial, fixes the issue that we're expected to be able to blit
> stencil surfaces (as the blit just relies on util blitter code which needs
> stencil export to do it).
> 2 piglits skip->pass, 11 fail->pass
>
> v2: prettify, keep different stencil ref value handling out of depth/stencil
> test itself.
> ---
> src/gallium/drivers/llvmpipe/lp_bld_depth.c | 4 ----
> src/gallium/drivers/llvmpipe/lp_screen.c | 2 +-
> src/gallium/drivers/llvmpipe/lp_state_fs.c | 25 ++++++++++++++++++++-----
> src/gallium/drivers/llvmpipe/lp_surface.c | 5 -----
> 4 files changed, 21 insertions(+), 15 deletions(-)
>
> diff --git a/src/gallium/drivers/llvmpipe/lp_bld_depth.c b/src/gallium/drivers/llvmpipe/lp_bld_depth.c
> index b6c32ff..b25e041 100644
> --- a/src/gallium/drivers/llvmpipe/lp_bld_depth.c
> +++ b/src/gallium/drivers/llvmpipe/lp_bld_depth.c
> @@ -975,10 +975,6 @@ lp_build_depth_stencil_test(struct gallivm_state *gallivm,
> s_bld.int_vec_type, "");
> }
>
> - /* convert scalar stencil refs into vectors */
> - stencil_refs[0] = lp_build_broadcast_scalar(&s_bld, stencil_refs[0]);
> - stencil_refs[1] = lp_build_broadcast_scalar(&s_bld, stencil_refs[1]);
> -
> s_pass_mask = lp_build_stencil_test(&s_bld, stencil,
> stencil_refs, stencil_vals,
> front_facing);
> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
> index 09ac9af..47f1897 100644
> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
> @@ -165,7 +165,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
> case PIPE_CAP_DEPTH_CLIP_DISABLE:
> return 1;
> case PIPE_CAP_SHADER_STENCIL_EXPORT:
> - return 0;
> + return 1;
> case PIPE_CAP_TGSI_INSTANCEID:
> case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
> case PIPE_CAP_START_INSTANCE:
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> index 35fe7b2..b5ce868 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> @@ -260,7 +260,8 @@ generate_fs_loop(struct gallivm_state *gallivm,
> {
> const struct util_format_description *zs_format_desc = NULL;
> const struct tgsi_token *tokens = shader->base.tokens;
> - LLVMTypeRef vec_type;
> + struct lp_type int_type = lp_int_type(type);
> + LLVMTypeRef vec_type, int_vec_type;
> LLVMValueRef mask_ptr, mask_val;
> LLVMValueRef consts_ptr, num_consts_ptr;
> LLVMValueRef z;
> @@ -295,7 +296,7 @@ generate_fs_loop(struct gallivm_state *gallivm,
> zs_format_desc = util_format_description(key->zsbuf_format);
> assert(zs_format_desc);
>
> - if (!shader->info.base.writes_z) {
> + if (!shader->info.base.writes_z && !shader->info.base.writes_stencil) {
> if (key->alpha.enabled ||
> key->blend.alpha_to_coverage ||
> shader->info.base.uses_kill) {
> @@ -329,11 +330,14 @@ generate_fs_loop(struct gallivm_state *gallivm,
> depth_mode = 0;
> }
>
> + vec_type = lp_build_vec_type(gallivm, type);
> + int_vec_type = lp_build_vec_type(gallivm, int_type);
>
> stencil_refs[0] = lp_jit_context_stencil_ref_front_value(gallivm, context_ptr);
> stencil_refs[1] = lp_jit_context_stencil_ref_back_value(gallivm, context_ptr);
> -
> - vec_type = lp_build_vec_type(gallivm, type);
> + /* convert scalar stencil refs into vectors */
> + stencil_refs[0] = lp_build_broadcast(gallivm, int_vec_type, stencil_refs[0]);
> + stencil_refs[1] = lp_build_broadcast(gallivm, int_vec_type, stencil_refs[1]);
>
> consts_ptr = lp_jit_context_constants(gallivm, context_ptr);
> num_consts_ptr = lp_jit_context_num_constants(gallivm, context_ptr);
> @@ -462,7 +466,9 @@ generate_fs_loop(struct gallivm_state *gallivm,
> int pos0 = find_output_by_semantic(&shader->info.base,
> TGSI_SEMANTIC_POSITION,
> 0);
> -
> + int s_out = find_output_by_semantic(&shader->info.base,
> + TGSI_SEMANTIC_STENCIL,
> + 0);
> if (pos0 != -1 && outputs[pos0][2]) {
> z = LLVMBuildLoad(builder, outputs[pos0][2], "output.z");
>
> @@ -512,6 +518,15 @@ generate_fs_loop(struct gallivm_state *gallivm,
> }
> }
>
> + if (s_out != -1 && outputs[s_out][1]) {
> + /* there's only one value, and spec says to discard additional bits */
> + LLVMValueRef s_max_mask = lp_build_const_int_vec(gallivm, int_type, 255);
> + stencil_refs[0] = LLVMBuildLoad(builder, outputs[s_out][1], "output.s");
> + stencil_refs[0] = LLVMBuildBitCast(builder, stencil_refs[0], int_vec_type, "");
> + stencil_refs[0] = LLVMBuildAnd(builder, stencil_refs[0], s_max_mask, "");
> + stencil_refs[1] = stencil_refs[0];
> + }
> +
> lp_build_depth_stencil_load_swizzled(gallivm, type,
> zs_format_desc, key->resource_1d,
> depth_ptr, depth_stride,
> diff --git a/src/gallium/drivers/llvmpipe/lp_surface.c b/src/gallium/drivers/llvmpipe/lp_surface.c
> index 08f968f..b985877 100644
> --- a/src/gallium/drivers/llvmpipe/lp_surface.c
> +++ b/src/gallium/drivers/llvmpipe/lp_surface.c
> @@ -139,11 +139,6 @@ static void lp_blit(struct pipe_context *pipe,
> return; /* done */
> }
>
> - if (info.mask & PIPE_MASK_S) {
> - debug_printf("llvmpipe: cannot blit stencil, skipping\n");
> - info.mask &= ~PIPE_MASK_S;
> - }
> -
> if (!util_blitter_is_blit_supported(lp->blitter, &info)) {
> debug_printf("llvmpipe: blit unsupported %s -> %s\n",
> util_format_short_name(info.src.resource->format),
>
More information about the mesa-dev
mailing list