diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_texture.c | 14 | 
1 files changed, 11 insertions, 3 deletions
| diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c index 08f0950d47..a00f2495df 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.c +++ b/src/gallium/drivers/llvmpipe/lp_texture.c @@ -66,16 +66,24 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen,     pf_get_block(lpt->base.format, &lpt->base.block);     for (level = 0; level <= pt->last_level; level++) { +      unsigned nblocksx, nblocksy; +        pt->width[level] = width;        pt->height[level] = height;        pt->depth[level] = depth;        pt->nblocksx[level] = pf_get_nblocksx(&pt->block, width);   -      pt->nblocksy[level] = pf_get_nblocksy(&pt->block, height);   -      lpt->stride[level] = align(pt->nblocksx[level]*pt->block.size, 16); +      pt->nblocksy[level] = pf_get_nblocksy(&pt->block, height); + +      /* Allocate storage for whole quads. This is particularly important +       * for depth surfaces, which are currently stored in a swizzled format. */ +      nblocksx = pf_get_nblocksx(&pt->block, align(width, 2)); +      nblocksy = pf_get_nblocksy(&pt->block, align(height, 2)); + +      lpt->stride[level] = align(nblocksx*pt->block.size, 16);        lpt->level_offset[level] = buffer_size; -      buffer_size += (pt->nblocksy[level] * +      buffer_size += (nblocksy *                        ((pt->target == PIPE_TEXTURE_CUBE) ? 6 : depth) *                        lpt->stride[level]); | 
