X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fllvmpipe%2Flp_texture.c;h=f4d2cb6c5d0ac50fdee240455b8409388edb15e5;hb=1d35f77228ad540a551a8e09e062b764a6e31f5e;hp=39d646964e4e99f2e684a50692d94588d4e96bdd;hpb=75da95c50aedaa4b1abf51ec1dcaf2fe8ddd4f3b;p=mesa.git diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c index 39d646964e4..f4d2cb6c5d0 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.c +++ b/src/gallium/drivers/llvmpipe/lp_texture.c @@ -67,7 +67,9 @@ resource_is_texture(const struct pipe_resource *resource) case PIPE_BUFFER: return FALSE; case PIPE_TEXTURE_1D: + case PIPE_TEXTURE_1D_ARRAY: case PIPE_TEXTURE_2D: + case PIPE_TEXTURE_2D_ARRAY: case PIPE_TEXTURE_RECT: case PIPE_TEXTURE_3D: case PIPE_TEXTURE_CUBE: @@ -114,6 +116,7 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, unsigned height = pt->height0; unsigned depth = pt->depth0; uint64_t total_size = 0; + unsigned layers = pt->array_size; assert(LP_MAX_TEXTURE_2D_LEVELS <= LP_MAX_TEXTURE_LEVELS); assert(LP_MAX_TEXTURE_3D_LEVELS <= LP_MAX_TEXTURE_LEVELS); @@ -126,6 +129,8 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, /* For non-compressed formats we need to align the texture size * to the tile size to facilitate render-to-texture. + * XXX this blows up 1d/1d array textures by unreasonable + * amount (factor 64), probably should do something about it. */ if (util_format_is_compressed(pt->format)) alignment = 1; @@ -157,7 +162,7 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, lpr->tiles_per_image[level] = width_t * height_t; } - /* Number of 3D image slices or cube faces */ + /* Number of 3D image slices, cube faces or texture array layers */ { unsigned num_slices; @@ -165,6 +170,9 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen, num_slices = 6; else if (lpr->base.target == PIPE_TEXTURE_3D) num_slices = depth; + else if (lpr->base.target == PIPE_TEXTURE_1D_ARRAY || + lpr->base.target == PIPE_TEXTURE_2D_ARRAY) + num_slices = layers; else num_slices = 1; @@ -820,7 +828,7 @@ llvmpipe_user_buffer_create(struct pipe_screen *screen, /** * Compute size (in bytes) need to store a texture image / mipmap level, - * for just one cube face or one 3D texture slice + * for just one cube face, one array layer or one 3D texture slice */ static unsigned tex_image_face_size(const struct llvmpipe_resource *lpr, unsigned level,