Pārlūkot izejas kodu

mesa: When storing texture data for a 1D array, map each slice separately.

Reviewed-by: Brian Paul <brianp@vmware.com>
tags/mesa-8.0-rc1
Eric Anholt pirms 14 gadiem
vecāks
revīzija
229ebf511d
1 mainītis faili ar 52 papildinājumiem un 16 dzēšanām
  1. 52
    16
      src/mesa/main/texstore.c

+ 52
- 16
src/mesa/main/texstore.c Parādīt failu

@@ -4626,22 +4626,53 @@ _mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level,
return;
}

/* Map dest texture buffer (write to whole region) */
ctx->Driver.MapTextureImage(ctx, texImage, 0,
0, 0, width, height,
rwMode,
&dstMap, &dstRowStride);
assert(dstMap);
success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
texImage->TexFormat,
dstMap,
0, 0, 0, /* dstX/Y/Zoffset */
dstRowStride,
&zeroImageOffset,
width, height, 1,
format, type, pixels, packing);

ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
if (target == GL_TEXTURE_1D_ARRAY) {
const GLint srcStride =
_mesa_image_row_stride(packing, width, format, type);
int y;

success = GL_TRUE;

for (y = 0; y < height; y++) {
/* Map dest texture buffer (write to whole region) */
ctx->Driver.MapTextureImage(ctx, texImage, y,
0, 0, width, 1,
rwMode,
&dstMap, &dstRowStride);
assert(dstMap);
success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
texImage->TexFormat,
dstMap,
0, 0, 0, /* dstX/Y/Zoffset */
dstRowStride,
&zeroImageOffset,
width, 1, 1,
format, type, pixels, packing);
ctx->Driver.UnmapTextureImage(ctx, texImage, y);

if (!success)
break;

pixels += srcStride;
}
} else {
/* Map dest texture buffer (write to whole region) */
ctx->Driver.MapTextureImage(ctx, texImage, 0,
0, 0, width, height,
rwMode,
&dstMap, &dstRowStride);
assert(dstMap);
success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
texImage->TexFormat,
dstMap,
0, 0, 0, /* dstX/Y/Zoffset */
dstRowStride,
&zeroImageOffset,
width, height, 1,
format, type, pixels, packing);

ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
}

if (!success)
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
@@ -4691,6 +4722,11 @@ _mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level,
return;
}

if (target == GL_TEXTURE_1D_ARRAY) {
depth = height;
height = 1;
}

sliceMaps = (GLubyte **) malloc(depth * sizeof(GLubyte *));
dstImageOffsets = (GLuint *) malloc(depth * sizeof(GLuint));


Notiek ielāde…
Atcelt
Saglabāt