diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_bld_depth.c | 47 | 
1 files changed, 26 insertions, 21 deletions
| diff --git a/src/gallium/drivers/llvmpipe/lp_bld_depth.c b/src/gallium/drivers/llvmpipe/lp_bld_depth.c index ddf7da0b14..167ac0ed2e 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_depth.c +++ b/src/gallium/drivers/llvmpipe/lp_bld_depth.c @@ -330,7 +330,7 @@ lp_depth_type(const struct util_format_description *format_desc,   * in the Z buffer (typically 0xffffff00 or 0x00ffffff).  That lets us   * get by with fewer bit twiddling steps.   */ -static void +static boolean  get_z_shift_and_mask(const struct util_format_description *format_desc,                       unsigned *shift, unsigned *width, unsigned *mask)  { @@ -345,7 +345,8 @@ get_z_shift_and_mask(const struct util_format_description *format_desc,     z_swizzle = format_desc->swizzle[0]; -   assert(z_swizzle != UTIL_FORMAT_SWIZZLE_NONE); +   if (z_swizzle == UTIL_FORMAT_SWIZZLE_NONE) +      return FALSE;     *width = format_desc->channel[z_swizzle].size; @@ -366,6 +367,8 @@ get_z_shift_and_mask(const struct util_format_description *format_desc,     }     *shift = padding_right; + +   return TRUE;  } @@ -554,6 +557,27 @@ lp_build_depth_stencil_test(LLVMBuilderRef builder,     {        unsigned s_shift, s_mask; +      if (get_z_shift_and_mask(format_desc, &z_shift, &z_width, &z_mask)) { +         if (z_mask != 0xffffffff) { +            z_bitmask = lp_build_const_int_vec(z_type, z_mask); +         } + +         /* +          * Align the framebuffer Z 's LSB to the right. +          */ +         if (z_shift) { +            LLVMValueRef shift = lp_build_const_int_vec(z_type, z_shift); +            z_dst = LLVMBuildLShr(builder, zs_dst, shift, "z_dst"); +         } else if (z_bitmask) { +	    /* TODO: Instead of loading a mask from memory and ANDing, it's +	     * probably faster to just shake the bits with two shifts. */ +            z_dst = LLVMBuildAnd(builder, zs_dst, z_bitmask, "z_dst"); +         } else { +            z_dst = zs_dst; +            lp_build_name(z_dst, "z_dst"); +         } +      } +        if (get_s_shift_and_mask(format_desc, &s_shift, &s_mask)) {           if (s_shift) {              LLVMValueRef shift = lp_build_const_int_vec(s_type, s_shift); @@ -605,8 +629,6 @@ lp_build_depth_stencil_test(LLVMBuilderRef builder,     }     if (depth->enabled) { -      get_z_shift_and_mask(format_desc, &z_shift, &z_width, &z_mask); -        /*         * Convert fragment Z to the desired type, aligning the LSB to the right.         */ @@ -644,23 +666,6 @@ lp_build_depth_stencil_test(LLVMBuilderRef builder,        lp_build_name(z_src, "z_src"); -      if (z_mask != 0xffffffff) { -         z_bitmask = lp_build_const_int_vec(z_type, z_mask); -      } - -      /* -       * Align the framebuffer Z 's LSB to the right. -       */ -      if (z_shift) { -         LLVMValueRef shift = lp_build_const_int_vec(z_type, z_shift); -         z_dst = LLVMBuildLShr(builder, zs_dst, shift, "z_dst"); -      } else if (z_bitmask) { -         z_dst = LLVMBuildAnd(builder, zs_dst, z_bitmask, "z_dst"); -      } else { -         z_dst = zs_dst; -         lp_build_name(z_dst, "z_dst"); -      } -        /* compare src Z to dst Z, returning 'pass' mask */        z_pass = lp_build_cmp(&z_bld, depth->func, z_src, z_dst); | 
