[Mesa-dev] [PATCH 10/11] mesa: Add pixel storage support for GetCompressedTexImage
Ian Romanick
idr at freedesktop.org
Mon Jun 2 15:35:07 PDT 2014
This patch is
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
On 06/01/2014 11:29 PM, Chris Forbes wrote:
> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
> ---
> src/mesa/main/texgetimage.c | 73 +++++++++++++++++++++++++--------------------
> 1 file changed, 40 insertions(+), 33 deletions(-)
>
> diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c
> index c22fb9b..8c0d3a1 100644
> --- a/src/mesa/main/texgetimage.c
> +++ b/src/mesa/main/texgetimage.c
> @@ -43,6 +43,7 @@
> #include "texcompress.h"
> #include "texgetimage.h"
> #include "teximage.h"
> +#include "texstore.h"
>
>
>
> @@ -686,56 +687,62 @@ _mesa_get_compressed_teximage(struct gl_context *ctx,
> struct gl_texture_image *texImage,
> GLvoid *img)
> {
> - const GLuint row_stride =
> - _mesa_format_row_stride(texImage->TexFormat, texImage->Width);
> - GLuint i;
> - GLubyte *src;
> - GLint srcRowStride;
> + const GLuint dimensions =
> + _mesa_get_texture_dimensions(texImage->TexObject->Target);
> + struct compressed_pixelstore store;
> + GLuint i, slice;
> + GLubyte *dest;
> +
> + _mesa_compute_compressed_pixelstore(dimensions, texImage,
> + texImage->Width, texImage->Height,
> + texImage->Depth,
> + &ctx->Pack,
> + &store);
>
> if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
> /* pack texture image into a PBO */
> - GLubyte *buf = (GLubyte *)
> + dest = (GLubyte *)
> ctx->Driver.MapBufferRange(ctx, 0, ctx->Pack.BufferObj->Size,
> GL_MAP_WRITE_BIT, ctx->Pack.BufferObj,
> MAP_INTERNAL);
> - if (!buf) {
> + if (!dest) {
> /* out of memory or other unexpected error */
> _mesa_error(ctx, GL_OUT_OF_MEMORY,
> "glGetCompresssedTexImage(map PBO failed)");
> return;
> }
> - img = ADD_POINTERS(buf, img);
> + dest = ADD_POINTERS(dest, img);
> + } else {
> + dest = img;
> }
>
> - /* map src texture buffer */
> - ctx->Driver.MapTextureImage(ctx, texImage, 0,
> - 0, 0, texImage->Width, texImage->Height,
> - GL_MAP_READ_BIT, &src, &srcRowStride);
> + dest += store.SkipBytes;
>
> - if (src) {
> - /* no pixelstore or pixel transfer, but respect stride */
> + for (slice = 0; slice < store.CopySlices; slice++) {
> + GLint srcRowStride;
> + GLubyte *src;
>
> - if (row_stride == srcRowStride) {
> - const GLuint size = _mesa_format_image_size(texImage->TexFormat,
> - texImage->Width,
> - texImage->Height,
> - texImage->Depth);
> - memcpy(img, src, size);
> - }
> - else {
> - GLuint bw, bh;
> - _mesa_get_format_block_size(texImage->TexFormat, &bw, &bh);
> - for (i = 0; i < (texImage->Height + bh - 1) / bh; i++) {
> - memcpy((GLubyte *)img + i * row_stride,
> - (GLubyte *)src + i * srcRowStride,
> - row_stride);
> + /* map src texture buffer */
> + ctx->Driver.MapTextureImage(ctx, texImage, 0,
> + 0, 0, texImage->Width, texImage->Height,
> + GL_MAP_READ_BIT, &src, &srcRowStride);
> +
> + if (src) {
> +
> + for (i = 0; i < store.CopyRowsPerSlice; i++) {
> + memcpy(dest, src, store.CopyBytesPerRow);
> + dest += store.TotalBytesPerRow;
> + src += srcRowStride;
> }
> - }
>
> - ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
> - }
> - else {
> - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetCompresssedTexImage");
> + ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
> +
> + /* Advance to next slice */
> + dest += store.TotalBytesPerRow * (store.TotalRowsPerSlice - store.CopyRowsPerSlice);
> +
> + } else {
> + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetCompresssedTexImage");
> + }
> }
>
> if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
>
More information about the mesa-dev
mailing list