diff options
| author | José Fonseca <jfonseca@vmware.com> | 2010-04-01 19:00:03 +0100 | 
|---|---|---|
| committer | José Fonseca <jfonseca@vmware.com> | 2010-04-01 19:01:46 +0100 | 
| commit | 7e1aceaf0a1fb7b4ee44c7bc488f03b584b8b785 (patch) | |
| tree | 36cc1782e1dfbbf362bc0a3ff1195d20f4d60b6f /src | |
| parent | 13d2f3c7380be6cf476d56269c17b52c53f313b3 (diff) | |
llvmpipe: Support sampling from PIPE_FORMAT_R32_FLOAT.
Diffstat (limited to 'src')
| -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 && | 
