st/mesa: remove TexSubImage code, use core mesa routines instead.

Since the move to Map/UnmapTextureImage, the core mesa routines are
equivalent to what the state tracker was doing.

The TexImage functions can be replaced too, but there's a few differences
that will need to be handled.
This commit is contained in:
Brian Paul
2011-12-30 08:24:55 -07:00
parent 4ca624f8e0
commit c22a95c4f2
+3 -140
View File
@@ -929,143 +929,6 @@ st_GetTexImage(struct gl_context * ctx,
}
static void
st_TexSubimage(struct gl_context *ctx, GLint dims, GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLint width, GLint height, GLint depth,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
struct st_context *st = st_context(ctx);
struct st_texture_image *stImage = st_texture_image(texImage);
GLuint dstRowStride;
const GLuint srcImageStride =
_mesa_image_image_stride(packing, width, height, format, type);
GLint i;
const GLubyte *src;
/* init to silence warning only: */
enum pipe_transfer_usage transfer_usage = PIPE_TRANSFER_WRITE;
GLubyte *dstMap;
DBG("%s target %s level %d offset %d,%d %dx%d\n", __FUNCTION__,
_mesa_lookup_enum_by_nr(target),
level, xoffset, yoffset, width, height);
pixels =
_mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format,
type, pixels, packing, "glTexSubImage2D");
if (!pixels)
return;
/* for a 1D array upload the image as a series of layer with height = 1 */
if (target == GL_TEXTURE_1D_ARRAY) {
depth = height;
height = 1;
}
/* Map buffer if necessary. Need to lock to prevent other contexts
* from uploading the buffer under us.
*/
if (stImage->pt) {
if (format == GL_DEPTH_COMPONENT &&
util_format_is_depth_and_stencil(stImage->pt->format))
transfer_usage = PIPE_TRANSFER_READ_WRITE;
else
transfer_usage = PIPE_TRANSFER_WRITE;
dstMap = st_texture_image_map(st, stImage, zoffset,
transfer_usage,
xoffset, yoffset,
width, height);
}
if (!dstMap) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage");
goto done;
}
src = (const GLubyte *) pixels;
dstRowStride = stImage->transfer->stride;
for (i = 0; i < depth; i++) {
if (!_mesa_texstore(ctx, dims, texImage->_BaseFormat,
texImage->TexFormat,
0, 0, 0,
dstRowStride,
(GLubyte **) &dstMap,
width, height, 1,
format, type, src, packing)) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage");
}
if (stImage->pt && i + 1 < depth) {
/* unmap this slice */
st_texture_image_unmap(st, stImage);
/* map next slice of 3D texture */
dstMap = st_texture_image_map(st, stImage,
zoffset + i + 1,
transfer_usage,
xoffset, yoffset,
width, height);
src += srcImageStride;
}
}
done:
_mesa_unmap_teximage_pbo(ctx, packing);
if (stImage->pt && stImage->transfer) {
st_texture_image_unmap(st, stImage);
}
}
static void
st_TexSubImage3D(struct gl_context *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
st_TexSubimage(ctx, 3, target, level, xoffset, yoffset, zoffset,
width, height, depth, format, type,
pixels, packing, texObj, texImage);
}
static void
st_TexSubImage2D(struct gl_context *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height,
GLenum format, GLenum type, const GLvoid * pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
st_TexSubimage(ctx, 2, target, level, xoffset, yoffset, 0,
width, height, 1, format, type,
pixels, packing, texObj, texImage);
}
static void
st_TexSubImage1D(struct gl_context *ctx, GLenum target, GLint level,
GLint xoffset, GLsizei width, GLenum format, GLenum type,
const GLvoid * pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
st_TexSubimage(ctx, 1, target, level, xoffset, 0, 0, width, 1, 1,
format, type, pixels, packing, texObj, texImage);
}
static void
st_CompressedTexSubImage1D(struct gl_context *ctx, GLenum target, GLint level,
GLint xoffset, GLsizei width,
@@ -1866,9 +1729,9 @@ st_init_texture_functions(struct dd_function_table *functions)
functions->TexImage1D = st_TexImage1D;
functions->TexImage2D = st_TexImage2D;
functions->TexImage3D = st_TexImage3D;
functions->TexSubImage1D = st_TexSubImage1D;
functions->TexSubImage2D = st_TexSubImage2D;
functions->TexSubImage3D = st_TexSubImage3D;
functions->TexSubImage1D = _mesa_store_texsubimage1d;
functions->TexSubImage2D = _mesa_store_texsubimage2d;
functions->TexSubImage3D = _mesa_store_texsubimage3d;
functions->CompressedTexSubImage1D = st_CompressedTexSubImage1D;
functions->CompressedTexSubImage2D = st_CompressedTexSubImage2D;
functions->CompressedTexSubImage3D = st_CompressedTexSubImage3D;