From: res Date: Thu, 6 Dec 2007 05:19:25 +0000 (+0000) Subject: Changed R_Upload() to not allocate memory for a texture when a NULL texture data... X-Git-Tag: xonotic-v0.1.0preview~2722 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=7c378b46e3de63b6ba6769f6d0d8ce6767053ff8;p=xonotic%2Fdarkplaces.git Changed R_Upload() to not allocate memory for a texture when a NULL texture data pointer is given. GL should cope with a NULL texture data pointer just fine, and it's slightly faster. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7767 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/gl_textures.c b/gl_textures.c index a5566040..ab18e722 100644 --- a/gl_textures.c +++ b/gl_textures.c @@ -798,19 +798,16 @@ static void R_Upload(gltexture_t *glt, const unsigned char *data, int fragx, int for (depth = 1;depth < glt->inputdepth ;depth <<= 1); } - R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel); - R_MakeResizeBufferBigger(fragwidth * fragheight * fragdepth * glt->sides * glt->bytesperpixel); - - if (prevbuffer == NULL) - { - memset(resizebuffer, 0, fragwidth * fragheight * fragdepth * glt->bytesperpixel); - prevbuffer = resizebuffer; - } - else if (glt->textype->textype == TEXTYPE_PALETTE) + if (prevbuffer != NULL) { - // promote paletted to BGRA, so we only have to worry about BGRA in the rest of this code - Image_Copy8bitBGRA(prevbuffer, colorconvertbuffer, fragwidth * fragheight * fragdepth * glt->sides, glt->palette); - prevbuffer = colorconvertbuffer; + R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel); + R_MakeResizeBufferBigger(fragwidth * fragheight * fragdepth * glt->sides * glt->bytesperpixel); + if (glt->textype->textype == TEXTYPE_PALETTE) + { + // promote paletted to BGRA, so we only have to worry about BGRA in the rest of this code + Image_Copy8bitBGRA(prevbuffer, colorconvertbuffer, fragwidth * fragheight * fragdepth * glt->sides, glt->palette); + prevbuffer = colorconvertbuffer; + } } if ((glt->flags & (TEXF_MIPMAP | TEXF_PICMIP | GLTEXF_UPLOAD)) == 0 && glt->inputwidth == glt->tilewidth && glt->inputheight == glt->tileheight && glt->inputdepth == glt->tiledepth) @@ -841,7 +838,7 @@ static void R_Upload(gltexture_t *glt, const unsigned char *data, int fragx, int glt->flags &= ~GLTEXF_UPLOAD; // cubemaps contain multiple images and thus get processed a bit differently - if (glt->texturetype != GLTEXTURETYPE_CUBEMAP) + if ((prevbuffer != NULL) && (glt->texturetype != GLTEXTURETYPE_CUBEMAP)) { if (glt->inputwidth != width || glt->inputheight != height || glt->inputdepth != depth) { @@ -872,8 +869,11 @@ static void R_Upload(gltexture_t *glt, const unsigned char *data, int fragx, int { while (width > 1 || height > 1 || depth > 1) { - Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1); - prevbuffer = resizebuffer; + if (prevbuffer != NULL) + { + Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1); + prevbuffer = resizebuffer; + } qglTexImage1D(GL_TEXTURE_1D, mip++, glt->glinternalformat, width, 0, glt->glformat, GL_UNSIGNED_BYTE, prevbuffer);CHECKGLERROR } } @@ -884,8 +884,11 @@ static void R_Upload(gltexture_t *glt, const unsigned char *data, int fragx, int { while (width > 1 || height > 1 || depth > 1) { - Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1); - prevbuffer = resizebuffer; + if (prevbuffer != NULL) + { + Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1); + prevbuffer = resizebuffer; + } qglTexImage2D(GL_TEXTURE_2D, mip++, glt->glinternalformat, width, height, 0, glt->glformat, GL_UNSIGNED_BYTE, prevbuffer);CHECKGLERROR } } @@ -896,8 +899,11 @@ static void R_Upload(gltexture_t *glt, const unsigned char *data, int fragx, int { while (width > 1 || height > 1 || depth > 1) { - Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1); - prevbuffer = resizebuffer; + if (prevbuffer != NULL) + { + Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1); + prevbuffer = resizebuffer; + } qglTexImage3D(GL_TEXTURE_3D, mip++, glt->glinternalformat, width, height, depth, 0, glt->glformat, GL_UNSIGNED_BYTE, prevbuffer);CHECKGLERROR } } @@ -905,21 +911,24 @@ static void R_Upload(gltexture_t *glt, const unsigned char *data, int fragx, int case GLTEXTURETYPE_CUBEMAP: // convert and upload each side in turn, // from a continuous block of input texels - texturebuffer = (unsigned char *)prevbuffer; + texturebuffer = prevbuffer ? (unsigned char *)prevbuffer : NULL; for (i = 0;i < 6;i++) { prevbuffer = texturebuffer; - texturebuffer += glt->inputwidth * glt->inputheight * glt->inputdepth * glt->textype->inputbytesperpixel; - if (glt->inputwidth != width || glt->inputheight != height || glt->inputdepth != depth) + if (prevbuffer != NULL) { - Image_Resample32(prevbuffer, glt->inputwidth, glt->inputheight, glt->inputdepth, resizebuffer, width, height, depth, r_lerpimages.integer); - prevbuffer = resizebuffer; - } - // picmip/max_size - while (width > glt->tilewidth || height > glt->tileheight || depth > glt->tiledepth) - { - Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, glt->tilewidth, glt->tileheight, glt->tiledepth); - prevbuffer = resizebuffer; + texturebuffer += glt->inputwidth * glt->inputheight * glt->inputdepth * glt->textype->inputbytesperpixel; + if (glt->inputwidth != width || glt->inputheight != height || glt->inputdepth != depth) + { + Image_Resample32(prevbuffer, glt->inputwidth, glt->inputheight, glt->inputdepth, resizebuffer, width, height, depth, r_lerpimages.integer); + prevbuffer = resizebuffer; + } + // picmip/max_size + while (width > glt->tilewidth || height > glt->tileheight || depth > glt->tiledepth) + { + Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, glt->tilewidth, glt->tileheight, glt->tiledepth); + prevbuffer = resizebuffer; + } } mip = 0; qglTexImage2D(cubemapside[i], mip++, glt->glinternalformat, width, height, 0, glt->glformat, GL_UNSIGNED_BYTE, prevbuffer);CHECKGLERROR @@ -927,8 +936,11 @@ static void R_Upload(gltexture_t *glt, const unsigned char *data, int fragx, int { while (width > 1 || height > 1 || depth > 1) { - Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1); - prevbuffer = resizebuffer; + if (prevbuffer != NULL) + { + Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1); + prevbuffer = resizebuffer; + } qglTexImage2D(cubemapside[i], mip++, glt->glinternalformat, width, height, 0, glt->glformat, GL_UNSIGNED_BYTE, prevbuffer);CHECKGLERROR } }