diff options
| -rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_format_soa.c | 46 | ||||
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_screen.c | 3 | 
2 files changed, 45 insertions, 4 deletions
| diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c index e5153a4bbb..9f242844e5 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c @@ -80,6 +80,24 @@ lp_build_format_swizzle_soa(const struct util_format_description *format_desc,  } +/** + * Unpack several pixels in SoA. + * + * It takes a vector of packed pixels: + * + *   packed = {P0, P1, P2, P3, ..., Pn} + * + * And will produce four vectors: + * + *   red    = {R0, R1, R2, R3, ..., Rn} + *   green  = {G0, G1, G2, G3, ..., Gn} + *   blue   = {B0, B1, B2, B3, ..., Bn} + *   alpha  = {A0, A1, A2, A3, ..., An} + * + * It requires that a packed pixel fits into an element of the output + * channels. The common case is when converting pixel with a depth of 32 bit or + * less into floats. + */  void  lp_build_unpack_rgba_soa(LLVMBuilderRef builder,                           const struct util_format_description *format_desc, @@ -91,11 +109,13 @@ lp_build_unpack_rgba_soa(LLVMBuilderRef builder,     unsigned start;     unsigned chan; -   /* FIXME: Support more formats */ -   assert(format_desc->is_bitmask); +   /* FIXME: Support more pixel formats */     assert(format_desc->block.width == 1);     assert(format_desc->block.height == 1); -   assert(format_desc->block.bits <= 32); +   assert(format_desc->block.bits <= type.width); +   /* FIXME: Support more output types */ +   assert(type.floating); +   assert(type.width == 32);     /* Decode the input vector components */     start = 0; @@ -188,7 +208,27 @@ lp_build_unpack_rgba_soa(LLVMBuilderRef builder,           break; +      case UTIL_FORMAT_TYPE_FLOAT: +         if (type.floating) { +            assert(start == 0); +            assert(stop == 32); +            assert(type.width == 32); +            input = LLVMBuildBitCast(builder, input, lp_build_vec_type(type), ""); +         } +         else { +            /* FIXME */ +            assert(0); +            input = lp_build_undef(type); +         } +         break; + +      case UTIL_FORMAT_TYPE_FIXED: +         assert(0); +         input = lp_build_undef(type); +         break; +        default: +         assert(0);           input = lp_build_undef(type);           break;        } diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 5ad581bd17..625d4092db 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -222,7 +222,8 @@ llvmpipe_is_format_supported( struct pipe_screen *_screen,     /* FIXME: Temporary restrictions. See lp_bld_sample_soa.c */     if(tex_usage & PIPE_TEXTURE_USAGE_SAMPLER) { -      if(!format_desc->is_bitmask) +      if(!format_desc->is_bitmask && +         format != PIPE_FORMAT_R32_FLOAT)           return FALSE;        if(format_desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB && | 
