#include "quakedef.h"
-#ifdef SUPPORTD3D
-#include <d3d9.h>
-extern LPDIRECT3DDEVICE9 vid_d3d9dev;
-#endif
#include "image.h"
#include "jpeg.h"
#include "image_png.h"
#include "intoverflow.h"
-#include "dpsoftrast.h"
#ifndef GL_TEXTURE_3D
#define GL_TEXTURE_3D 0x806F
qboolean gl_filter_force = false;
int gl_filter_min = GL_LINEAR_MIPMAP_LINEAR;
int gl_filter_mag = GL_LINEAR;
-DPSOFTRAST_TEXTURE_FILTER dpsoftrast_filter_mipmap = DPSOFTRAST_TEXTURE_FILTER_LINEAR_MIPMAP_TRIANGLE;
-DPSOFTRAST_TEXTURE_FILTER dpsoftrast_filter_nomipmap = DPSOFTRAST_TEXTURE_FILTER_LINEAR;
-
-#ifdef SUPPORTD3D
-int d3d_filter_flatmin = D3DTEXF_LINEAR;
-int d3d_filter_flatmag = D3DTEXF_LINEAR;
-int d3d_filter_flatmix = D3DTEXF_POINT;
-int d3d_filter_mipmin = D3DTEXF_LINEAR;
-int d3d_filter_mipmag = D3DTEXF_LINEAR;
-int d3d_filter_mipmix = D3DTEXF_LINEAR;
-int d3d_filter_nomip = false;
-#endif
static mempool_t *texturemempool;
static textypeinfo_t textype_depth24 = {"depth24", TEXTYPE_DEPTHBUFFER24 , 2, 2, 2.0f, GL_DEPTH_COMPONENT16 , GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT};
static textypeinfo_t textype_depth24stencil8 = {"depth24stencil8", TEXTYPE_DEPTHBUFFER24STENCIL8, 2, 2, 2.0f, GL_DEPTH_COMPONENT16 , GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT};
static textypeinfo_t textype_colorbuffer = {"colorbuffer", TEXTYPE_COLORBUFFER , 2, 2, 2.0f, GL_RGB565 , GL_RGBA , GL_UNSIGNED_SHORT_5_6_5};
-static textypeinfo_t textype_colorbuffer16f = {"colorbuffer16f", TEXTYPE_COLORBUFFER16F , 2, 2, 2.0f, GL_RGB565 , GL_RGBA , GL_UNSIGNED_SHORT_5_6_5};
-static textypeinfo_t textype_colorbuffer32f = {"colorbuffer32f", TEXTYPE_COLORBUFFER32F , 2, 2, 2.0f, GL_RGB565 , GL_RGBA , GL_UNSIGNED_SHORT_5_6_5};
+static textypeinfo_t textype_colorbuffer16f = {"colorbuffer16f", TEXTYPE_COLORBUFFER16F , 2, 2, 2.0f, GL_RGBA16F , GL_RGBA , GL_HALF_FLOAT_ARB};
+static textypeinfo_t textype_colorbuffer32f = {"colorbuffer32f", TEXTYPE_COLORBUFFER32F , 2, 2, 2.0f, GL_RGBA32F , GL_RGBA , GL_FLOAT};
// image formats:
static textypeinfo_t textype_alpha = {"alpha", TEXTYPE_ALPHA , 1, 4, 4.0f, GL_ALPHA , GL_ALPHA , GL_UNSIGNED_BYTE };
static textypeinfo_t textype_depth24 = {"depth24", TEXTYPE_DEPTHBUFFER24 , 4, 4, 4.0f, GL_DEPTH_COMPONENT24_ARB , GL_DEPTH_COMPONENT, GL_UNSIGNED_INT };
static textypeinfo_t textype_depth24stencil8 = {"depth24stencil8", TEXTYPE_DEPTHBUFFER24STENCIL8, 4, 4, 4.0f, GL_DEPTH24_STENCIL8_EXT , GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT};
static textypeinfo_t textype_colorbuffer = {"colorbuffer", TEXTYPE_COLORBUFFER , 4, 4, 4.0f, GL_RGBA , GL_BGRA , GL_UNSIGNED_BYTE };
-static textypeinfo_t textype_colorbuffer16f = {"colorbuffer16f", TEXTYPE_COLORBUFFER16F , 8, 8, 8.0f, GL_RGBA16F_ARB , GL_RGBA , GL_FLOAT };
+static textypeinfo_t textype_colorbuffer16f = {"colorbuffer16f", TEXTYPE_COLORBUFFER16F , 8, 8, 8.0f, GL_RGBA16F_ARB , GL_RGBA , GL_HALF_FLOAT_ARB};
static textypeinfo_t textype_colorbuffer32f = {"colorbuffer32f", TEXTYPE_COLORBUFFER32F , 16, 16, 16.0f, GL_RGBA32F_ARB , GL_RGBA , GL_FLOAT };
// image formats:
qboolean dirty; // indicates that R_RealGetTexture should be called
qboolean glisdepthstencil; // indicates that FBO attachment has to be GL_DEPTH_STENCIL_ATTACHMENT
int gltexturetypeenum; // used by R_Mesh_TexBind
- // d3d stuff the backend needs
- void *d3dtexture;
- void *d3dsurface;
-#ifdef SUPPORTD3D
- qboolean d3disrendertargetsurface;
- qboolean d3disdepthstencilsurface;
- int d3dformat;
- int d3dusage;
- int d3dpool;
- int d3daddressu;
- int d3daddressv;
- int d3daddressw;
- int d3dmagfilter;
- int d3dminfilter;
- int d3dmipfilter;
- int d3dmaxmiplevelfilter;
- int d3dmipmaplodbias;
- int d3dmaxmiplevel;
-#endif
// dynamic texture stuff [11/22/2007 Black]
updatecallback_t updatecallback;
- void *updatacallback_data;
+ void *updatecallback_data;
// --- [11/22/2007 Black]
// stores backup copy of texture for deferred texture updates (gl_nopartialtextureupdates cvar)
// palette if the texture is TEXTYPE_PALETTE
const unsigned int *palette;
// actual stored texture size after gl_picmip and gl_max_size are applied
- // (power of 2 if vid.support.arb_texture_non_power_of_two is not supported)
int tilewidth, tileheight, tiledepth;
// 1 or 6 depending on texturetype
int sides;
case TEXTYPE_SRGB_BGRA: return ((flags & TEXF_COMPRESS) && vid.support.ext_texture_compression_s3tc) ? ((flags & TEXF_ALPHA) ? &textype_sRGB_bgra_alpha_compress : &textype_sRGB_bgra_compress) : ((flags & TEXF_ALPHA) ? &textype_sRGB_bgra_alpha : &textype_sRGB_bgra);
#endif
default:
- Host_Error("R_GetTexTypeInfo: unknown texture format");
+ Host_Error("R_GetTexTypeInfo: unknown texture format %i with flags %x", (int)textype, flags);
break;
}
return NULL;
glt->flags |= GLTEXF_DYNAMIC;
glt->updatecallback = updatecallback;
- glt->updatacallback_data = data;
+ glt->updatecallback_data = data;
}
static void R_UpdateDynamicTexture(gltexture_t *glt) {
glt->dirty = false;
if( glt->updatecallback ) {
- glt->updatecallback( (rtexture_t*) glt, glt->updatacallback_data );
+ glt->updatecallback( (rtexture_t*) glt, glt->updatecallback_data );
}
}
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
if (glt->texnum)
{
qglDeleteRenderbuffers(1, (GLuint *)&glt->renderbuffernum);CHECKGLERROR
}
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- if (glt->d3dsurface)
- IDirect3DSurface9_Release((IDirect3DSurface9 *)glt->d3dsurface);
- else if (glt->tiledepth > 1)
- IDirect3DVolumeTexture9_Release((IDirect3DVolumeTexture9 *)glt->d3dtexture);
- else if (glt->sides == 6)
- IDirect3DCubeTexture9_Release((IDirect3DCubeTexture9 *)glt->d3dtexture);
- else
- IDirect3DTexture9_Release((IDirect3DTexture9 *)glt->d3dtexture);
- glt->d3dtexture = NULL;
- glt->d3dsurface = NULL;
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- if (glt->texnum)
- DPSOFTRAST_Texture_Free(glt->texnum);
- break;
}
if (glt->inputtexels)
{
const char *name;
int minification, magnification;
- DPSOFTRAST_TEXTURE_FILTER dpsoftrastfilter_mipmap, dpsoftrastfilter_nomipmap;
}
glmode_t;
static glmode_t modes[6] =
{
- {"GL_NEAREST", GL_NEAREST, GL_NEAREST, DPSOFTRAST_TEXTURE_FILTER_NEAREST, DPSOFTRAST_TEXTURE_FILTER_NEAREST},
- {"GL_LINEAR", GL_LINEAR, GL_LINEAR, DPSOFTRAST_TEXTURE_FILTER_LINEAR, DPSOFTRAST_TEXTURE_FILTER_LINEAR},
- {"GL_NEAREST_MIPMAP_NEAREST", GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST, DPSOFTRAST_TEXTURE_FILTER_NEAREST_MIPMAP_TRIANGLE, DPSOFTRAST_TEXTURE_FILTER_NEAREST},
- {"GL_LINEAR_MIPMAP_NEAREST", GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR, DPSOFTRAST_TEXTURE_FILTER_LINEAR_MIPMAP_TRIANGLE, DPSOFTRAST_TEXTURE_FILTER_LINEAR},
- {"GL_NEAREST_MIPMAP_LINEAR", GL_NEAREST_MIPMAP_LINEAR, GL_NEAREST, DPSOFTRAST_TEXTURE_FILTER_NEAREST_MIPMAP_TRIANGLE, DPSOFTRAST_TEXTURE_FILTER_NEAREST},
- {"GL_LINEAR_MIPMAP_LINEAR", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, DPSOFTRAST_TEXTURE_FILTER_LINEAR_MIPMAP_TRIANGLE, DPSOFTRAST_TEXTURE_FILTER_LINEAR}
+ {"GL_NEAREST", GL_NEAREST, GL_NEAREST},
+ {"GL_LINEAR", GL_LINEAR, GL_LINEAR},
+ {"GL_NEAREST_MIPMAP_NEAREST", GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST},
+ {"GL_LINEAR_MIPMAP_NEAREST", GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR},
+ {"GL_NEAREST_MIPMAP_LINEAR", GL_NEAREST_MIPMAP_LINEAR, GL_NEAREST},
+ {"GL_LINEAR_MIPMAP_LINEAR", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR}
};
-#ifdef SUPPORTD3D
-typedef struct d3dmode_s
-{
- const char *name;
- int m1, m2;
-}
-d3dmode_t;
-
-static d3dmode_t d3dmodes[6] =
-{
- {"GL_NEAREST", D3DTEXF_POINT, D3DTEXF_POINT},
- {"GL_LINEAR", D3DTEXF_LINEAR, D3DTEXF_POINT},
- {"GL_NEAREST_MIPMAP_NEAREST", D3DTEXF_POINT, D3DTEXF_POINT},
- {"GL_LINEAR_MIPMAP_NEAREST", D3DTEXF_LINEAR, D3DTEXF_POINT},
- {"GL_NEAREST_MIPMAP_LINEAR", D3DTEXF_POINT, D3DTEXF_LINEAR},
- {"GL_LINEAR_MIPMAP_LINEAR", D3DTEXF_LINEAR, D3DTEXF_LINEAR}
-};
-#endif
-
static void GL_TextureMode_f (void)
{
int i;
gl_filter_mag = modes[i].magnification;
gl_filter_force = ((Cmd_Argc() > 2) && !strcasecmp(Cmd_Argv(2), "force"));
- dpsoftrast_filter_mipmap = modes[i].dpsoftrastfilter_mipmap;
- dpsoftrast_filter_nomipmap = modes[i].dpsoftrastfilter_nomipmap;
-
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
// change all the existing mipmap texture objects
// FIXME: force renderer(/client/something?) restart instead?
}
}
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- d3d_filter_flatmin = d3dmodes[i].m1;
- d3d_filter_flatmag = d3dmodes[i].m1;
- d3d_filter_flatmix = D3DTEXF_POINT;
- d3d_filter_mipmin = d3dmodes[i].m1;
- d3d_filter_mipmag = d3dmodes[i].m1;
- d3d_filter_mipmix = d3dmodes[i].m2;
- d3d_filter_nomip = i < 2;
- if (gl_texture_anisotropy.integer > 1 && i == 5)
- d3d_filter_mipmin = d3d_filter_mipmag = D3DTEXF_ANISOTROPIC;
- for (pool = gltexturepoolchain;pool;pool = pool->next)
- {
- for (glt = pool->gltchain;glt;glt = glt->chain)
- {
- // only update already uploaded images
- if (glt->d3dtexture && !glt->d3dsurface && (gl_filter_force || !(glt->flags & (TEXF_FORCENEAREST | TEXF_FORCELINEAR))))
- {
- if (glt->flags & TEXF_MIPMAP)
- {
- glt->d3dminfilter = d3d_filter_mipmin;
- glt->d3dmagfilter = d3d_filter_mipmag;
- glt->d3dmipfilter = d3d_filter_mipmix;
- glt->d3dmaxmiplevelfilter = 0;
- }
- else
- {
- glt->d3dminfilter = d3d_filter_flatmin;
- glt->d3dmagfilter = d3d_filter_flatmag;
- glt->d3dmipfilter = d3d_filter_flatmix;
- glt->d3dmaxmiplevelfilter = 0;
- }
- }
- }
- }
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- // change all the existing texture objects
- for (pool = gltexturepoolchain;pool;pool = pool->next)
- for (glt = pool->gltchain;glt;glt = glt->chain)
- if (glt->texnum && (gl_filter_force || !(glt->flags & (TEXF_FORCENEAREST | TEXF_FORCELINEAR))))
- DPSOFTRAST_Texture_Filter(glt->texnum, (glt->flags & TEXF_MIPMAP) ? dpsoftrast_filter_mipmap : dpsoftrast_filter_nomipmap);
- break;
}
}
break;
}
- if (vid.support.arb_texture_non_power_of_two)
- {
- width2 = min(inwidth >> picmip, maxsize);
- height2 = min(inheight >> picmip, maxsize);
- depth2 = min(indepth >> picmip, maxsize);
- }
- else
- {
- for (width2 = 1;width2 < inwidth;width2 <<= 1);
- for (width2 >>= picmip;width2 > maxsize;width2 >>= 1);
- for (height2 = 1;height2 < inheight;height2 <<= 1);
- for (height2 >>= picmip;height2 > maxsize;height2 >>= 1);
- for (depth2 = 1;depth2 < indepth;depth2 <<= 1);
- for (depth2 >>= picmip;depth2 > maxsize;depth2 >>= 1);
- }
-
- switch(vid.renderpath)
- {
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_D3D10:
- case RENDERPATH_D3D11:
- case RENDERPATH_SOFT:
- case RENDERPATH_GLES1:
- case RENDERPATH_GLES2:
- break;
- case RENDERPATH_D3D9:
-#if 0
- // for some reason the REF rasterizer (and hence the PIX debugger) does not like small textures...
- if (texturetype == GLTEXTURETYPE_2D)
- {
- width2 = max(width2, 2);
- height2 = max(height2, 2);
- }
-#endif
- break;
- }
+ width2 = min(inwidth >> picmip, maxsize);
+ height2 = min(inheight >> picmip, maxsize);
+ depth2 = min(indepth >> picmip, maxsize);
miplevels = 1;
if (flags & TEXF_MIPMAP)
for (glt = pool->gltchain;glt;glt = glt->chain)
{
glsize = R_CalcTexelDataSize(glt);
- isloaded = glt->texnum != 0 || glt->renderbuffernum != 0 || glt->d3dtexture || glt->d3dsurface;
+ isloaded = glt->texnum != 0 || glt->renderbuffernum != 0;
pooltotal++;
pooltotalt += glsize;
pooltotalp += glt->inputdatasize;
{
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
// LordHavoc: allow any alignment
CHECKGLERROR
qglPixelStorei(GL_UNPACK_ALIGNMENT, 1);CHECKGLERROR
qglPixelStorei(GL_PACK_ALIGNMENT, 1);CHECKGLERROR
break;
- case RENDERPATH_D3D9:
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- break;
}
texturemempool = Mem_AllocPool("texture management", 0, NULL);
continue;
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- if (glt->d3dsurface)
- IDirect3DSurface9_Release((IDirect3DSurface9 *)glt->d3dsurface);
- else if (glt->tiledepth > 1)
- IDirect3DVolumeTexture9_Release((IDirect3DVolumeTexture9 *)glt->d3dtexture);
- else if (glt->sides == 6)
- IDirect3DCubeTexture9_Release((IDirect3DCubeTexture9 *)glt->d3dtexture);
- else
- IDirect3DTexture9_Release((IDirect3DTexture9 *)glt->d3dtexture);
- glt->d3dtexture = NULL;
- glt->d3dsurface = NULL;
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- break;
}
}
}
continue;
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- {
- HRESULT d3dresult;
- if (glt->d3disrendertargetsurface)
- {
- if (FAILED(d3dresult = IDirect3DDevice9_CreateRenderTarget(vid_d3d9dev, glt->tilewidth, glt->tileheight, (D3DFORMAT)glt->d3dformat, D3DMULTISAMPLE_NONE, 0, false, (IDirect3DSurface9 **)&glt->d3dsurface, NULL)))
- Sys_Error("IDirect3DDevice9_CreateRenderTarget failed!");
- }
- else if (glt->d3disdepthstencilsurface)
- {
- if (FAILED(d3dresult = IDirect3DDevice9_CreateDepthStencilSurface(vid_d3d9dev, glt->tilewidth, glt->tileheight, (D3DFORMAT)glt->d3dformat, D3DMULTISAMPLE_NONE, 0, false, (IDirect3DSurface9 **)&glt->d3dsurface, NULL)))
- Sys_Error("IDirect3DDevice9_CreateDepthStencilSurface failed!");
- }
- else if (glt->tiledepth > 1)
- {
- if (FAILED(d3dresult = IDirect3DDevice9_CreateVolumeTexture(vid_d3d9dev, glt->tilewidth, glt->tileheight, glt->tiledepth, glt->miplevels, glt->d3dusage, (D3DFORMAT)glt->d3dformat, (D3DPOOL)glt->d3dpool, (IDirect3DVolumeTexture9 **)&glt->d3dtexture, NULL)))
- Sys_Error("IDirect3DDevice9_CreateVolumeTexture failed!");
- }
- else if (glt->sides == 6)
- {
- if (FAILED(d3dresult = IDirect3DDevice9_CreateCubeTexture(vid_d3d9dev, glt->tilewidth, glt->miplevels, glt->d3dusage, (D3DFORMAT)glt->d3dformat, (D3DPOOL)glt->d3dpool, (IDirect3DCubeTexture9 **)&glt->d3dtexture, NULL)))
- Sys_Error("IDirect3DDevice9_CreateCubeTexture failed!");
- }
- else
- {
- if (FAILED(d3dresult = IDirect3DDevice9_CreateTexture(vid_d3d9dev, glt->tilewidth, glt->tileheight, glt->miplevels, glt->d3dusage, (D3DFORMAT)glt->d3dformat, (D3DPOOL)glt->d3dpool, (IDirect3DTexture9 **)&glt->d3dtexture, NULL)))
- Sys_Error("IDirect3DDevice9_CreateTexture failed!");
- }
- }
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- break;
}
}
}
{
#ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
static int old_aniso = 0;
+ static qboolean first_time_aniso = true;
#endif
// could do procedural texture animation here, if we keep track of which
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
+ // ignore the first difference, any textures loaded by now probably had the same aniso value
+ if (first_time_aniso)
+ {
+ first_time_aniso = false;
+ break;
+ }
CHECKGLERROR
GL_ActiveTexture(0);
for (pool = gltexturepoolchain;pool;pool = pool->next)
}
}
break;
- case RENDERPATH_D3D9:
- case RENDERPATH_D3D10:
- case RENDERPATH_D3D11:
- case RENDERPATH_SOFT:
- break;
}
}
#endif
case TEXTYPE_SHADOWMAP24_COMP:
qglTexParameteri(textureenum, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);CHECKGLERROR
qglTexParameteri(textureenum, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);CHECKGLERROR
- qglTexParameteri(textureenum, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);CHECKGLERROR
break;
case TEXTYPE_SHADOWMAP16_RAW:
case TEXTYPE_SHADOWMAP24_RAW:
qglTexParameteri(textureenum, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);CHECKGLERROR
qglTexParameteri(textureenum, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);CHECKGLERROR
- qglTexParameteri(textureenum, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);CHECKGLERROR
break;
default:
break;
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
{
int oldbindtexnum;
qglBindTexture(gltexturetypeenums[glt->texturetype], oldbindtexnum);CHECKGLERROR
}
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- {
- RECT d3drect;
- D3DLOCKED_RECT d3dlockedrect;
- int y;
- memset(&d3drect, 0, sizeof(d3drect));
- d3drect.left = fragx;
- d3drect.top = fragy;
- d3drect.right = fragx+fragwidth;
- d3drect.bottom = fragy+fragheight;
- if (IDirect3DTexture9_LockRect((IDirect3DTexture9*)glt->d3dtexture, 0, &d3dlockedrect, &d3drect, 0) == D3D_OK && d3dlockedrect.pBits)
- {
- for (y = 0;y < fragheight;y++)
- memcpy((unsigned char *)d3dlockedrect.pBits + d3dlockedrect.Pitch * y, data + fragwidth*glt->bytesperpixel * y, fragwidth*glt->bytesperpixel);
- IDirect3DTexture9_UnlockRect((IDirect3DTexture9*)glt->d3dtexture, 0);
- }
- }
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- DPSOFTRAST_Texture_UpdatePartial(glt->texnum, 0, data, fragx, fragy, fragwidth, fragheight);
- break;
}
}
for (width = glt->tilewidth;width < glt->inputwidth ;width <<= 1);
for (height = glt->tileheight;height < glt->inputheight;height <<= 1);
for (depth = glt->tiledepth;depth < glt->inputdepth ;depth <<= 1);
- R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
if (prevbuffer == NULL)
{
width = glt->tilewidth;
height = glt->tileheight;
depth = glt->tiledepth;
+// R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
// memset(resizebuffer, 0, width * height * depth * glt->sides * glt->bytesperpixel);
// prevbuffer = resizebuffer;
}
if (glt->textype->textype == TEXTYPE_PALETTE)
{
// promote paletted to BGRA, so we only have to worry about BGRA in the rest of this code
+ R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
Image_Copy8bitBGRA(prevbuffer, colorconvertbuffer, glt->inputwidth * glt->inputheight * glt->inputdepth * glt->sides, glt->palette);
prevbuffer = colorconvertbuffer;
}
{
// multiply RGB channels by A channel before uploading
int alpha;
+ R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
for (i = 0;i < glt->inputwidth*glt->inputheight*glt->inputdepth*4;i += 4)
{
alpha = prevbuffer[i+3];
// scale up to a power of 2 size (if appropriate)
if (glt->inputwidth != width || glt->inputheight != height || glt->inputdepth != depth)
{
+ R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
Image_Resample32(prevbuffer, glt->inputwidth, glt->inputheight, glt->inputdepth, resizebuffer, width, height, depth, r_lerpimages.integer);
prevbuffer = resizebuffer;
}
// apply mipmap reduction algorithm to get down to picmip/max_size
while (width > glt->tilewidth || height > glt->tileheight || depth > glt->tiledepth)
{
+ R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, glt->tilewidth, glt->tileheight, glt->tiledepth);
prevbuffer = resizebuffer;
}
// do the appropriate upload type...
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
if (glt->texnum) // not renderbuffers
{
{
while (width > 1 || height > 1 || depth > 1)
{
+ R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1);
prevbuffer = resizebuffer;
qglTexImage2D(GL_TEXTURE_2D, mip++, glt->glinternalformat, width, height, 0, glt->glformat, glt->gltype, prevbuffer);CHECKGLERROR
{
while (width > 1 || height > 1 || depth > 1)
{
+ R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
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, glt->gltype, prevbuffer);CHECKGLERROR
texturebuffer += glt->inputwidth * glt->inputheight * glt->inputdepth * glt->textype->inputbytesperpixel;
if (glt->inputwidth != width || glt->inputheight != height || glt->inputdepth != depth)
{
+ R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
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)
{
+ R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, glt->tilewidth, glt->tileheight, glt->tiledepth);
prevbuffer = resizebuffer;
}
{
while (width > 1 || height > 1 || depth > 1)
{
+ R_MakeResizeBufferBigger(width * height * depth * glt->sides * glt->bytesperpixel);
Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1);
prevbuffer = resizebuffer;
qglTexImage2D(cubemapside[i], mip++, glt->glinternalformat, width, height, 0, glt->glformat, glt->gltype, prevbuffer);CHECKGLERROR
qglBindTexture(gltexturetypeenums[glt->texturetype], oldbindtexnum);CHECKGLERROR
}
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- if (!(glt->flags & TEXF_RENDERTARGET) && glt->d3dtexture && !glt->d3dsurface)
- {
- D3DLOCKED_RECT d3dlockedrect;
- D3DLOCKED_BOX d3dlockedbox;
- switch(glt->texturetype)
- {
- case GLTEXTURETYPE_2D:
- if (IDirect3DTexture9_LockRect((IDirect3DTexture9*)glt->d3dtexture, mip, &d3dlockedrect, NULL, 0) == D3D_OK && d3dlockedrect.pBits)
- {
- if (prevbuffer)
- memcpy(d3dlockedrect.pBits, prevbuffer, width*height*glt->bytesperpixel);
- else
- memset(d3dlockedrect.pBits, 255, width*height*glt->bytesperpixel);
- IDirect3DTexture9_UnlockRect((IDirect3DTexture9*)glt->d3dtexture, mip);
- }
- mip++;
- if ((glt->flags & TEXF_MIPMAP) && prevbuffer)
- {
- while (width > 1 || height > 1 || depth > 1)
- {
- Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1);
- prevbuffer = resizebuffer;
- if (IDirect3DTexture9_LockRect((IDirect3DTexture9*)glt->d3dtexture, mip, &d3dlockedrect, NULL, 0) == D3D_OK && d3dlockedrect.pBits)
- {
- memcpy(d3dlockedrect.pBits, prevbuffer, width*height*glt->bytesperpixel);
- IDirect3DTexture9_UnlockRect((IDirect3DTexture9*)glt->d3dtexture, mip);
- }
- mip++;
- }
- }
- break;
- case GLTEXTURETYPE_3D:
- if (IDirect3DVolumeTexture9_LockBox((IDirect3DVolumeTexture9*)glt->d3dtexture, mip, &d3dlockedbox, NULL, 0) == D3D_OK && d3dlockedbox.pBits)
- {
- // we are not honoring the RowPitch or SlicePitch, hopefully this works with all sizes
- memcpy(d3dlockedbox.pBits, prevbuffer, width*height*depth*glt->bytesperpixel);
- IDirect3DVolumeTexture9_UnlockBox((IDirect3DVolumeTexture9*)glt->d3dtexture, mip);
- }
- mip++;
- if (glt->flags & TEXF_MIPMAP)
- {
- while (width > 1 || height > 1 || depth > 1)
- {
- Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1);
- prevbuffer = resizebuffer;
- if (IDirect3DVolumeTexture9_LockBox((IDirect3DVolumeTexture9*)glt->d3dtexture, mip, &d3dlockedbox, NULL, 0) == D3D_OK && d3dlockedbox.pBits)
- {
- // we are not honoring the RowPitch or SlicePitch, hopefully this works with all sizes
- memcpy(d3dlockedbox.pBits, prevbuffer, width*height*depth*glt->bytesperpixel);
- IDirect3DVolumeTexture9_UnlockBox((IDirect3DVolumeTexture9*)glt->d3dtexture, mip);
- }
- mip++;
- }
- }
- break;
- case GLTEXTURETYPE_CUBEMAP:
- // convert and upload each side in turn,
- // from a continuous block of input texels
- texturebuffer = (unsigned char *)prevbuffer;
- 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)
- {
- 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;
- if (IDirect3DCubeTexture9_LockRect((IDirect3DCubeTexture9*)glt->d3dtexture, (D3DCUBEMAP_FACES)i, mip, &d3dlockedrect, NULL, 0) == D3D_OK && d3dlockedrect.pBits)
- {
- memcpy(d3dlockedrect.pBits, prevbuffer, width*height*glt->bytesperpixel);
- IDirect3DCubeTexture9_UnlockRect((IDirect3DCubeTexture9*)glt->d3dtexture, (D3DCUBEMAP_FACES)i, mip);
- }
- mip++;
- if (glt->flags & TEXF_MIPMAP)
- {
- while (width > 1 || height > 1 || depth > 1)
- {
- Image_MipReduce32(prevbuffer, resizebuffer, &width, &height, &depth, 1, 1, 1);
- prevbuffer = resizebuffer;
- if (IDirect3DCubeTexture9_LockRect((IDirect3DCubeTexture9*)glt->d3dtexture, (D3DCUBEMAP_FACES)i, mip, &d3dlockedrect, NULL, 0) == D3D_OK && d3dlockedrect.pBits)
- {
- memcpy(d3dlockedrect.pBits, prevbuffer, width*height*glt->bytesperpixel);
- IDirect3DCubeTexture9_UnlockRect((IDirect3DCubeTexture9*)glt->d3dtexture, (D3DCUBEMAP_FACES)i, mip);
- }
- mip++;
- }
- }
- }
- break;
- }
- }
- glt->d3daddressw = 0;
- if (glt->flags & TEXF_CLAMP)
- {
- glt->d3daddressu = D3DTADDRESS_CLAMP;
- glt->d3daddressv = D3DTADDRESS_CLAMP;
- if (glt->tiledepth > 1)
- glt->d3daddressw = D3DTADDRESS_CLAMP;
- }
- else
- {
- glt->d3daddressu = D3DTADDRESS_WRAP;
- glt->d3daddressv = D3DTADDRESS_WRAP;
- if (glt->tiledepth > 1)
- glt->d3daddressw = D3DTADDRESS_WRAP;
- }
- glt->d3dmipmaplodbias = 0;
- glt->d3dmaxmiplevel = 0;
- glt->d3dmaxmiplevelfilter = d3d_filter_nomip ? 0 : glt->d3dmaxmiplevel;
- if (glt->flags & TEXF_FORCELINEAR)
- {
- glt->d3dminfilter = D3DTEXF_LINEAR;
- glt->d3dmagfilter = D3DTEXF_LINEAR;
- glt->d3dmipfilter = D3DTEXF_POINT;
- }
- else if (glt->flags & TEXF_FORCENEAREST)
- {
- glt->d3dminfilter = D3DTEXF_POINT;
- glt->d3dmagfilter = D3DTEXF_POINT;
- glt->d3dmipfilter = D3DTEXF_POINT;
- }
- else if (glt->flags & TEXF_MIPMAP)
- {
- glt->d3dminfilter = d3d_filter_mipmin;
- glt->d3dmagfilter = d3d_filter_mipmag;
- glt->d3dmipfilter = d3d_filter_mipmix;
- }
- else
- {
- glt->d3dminfilter = d3d_filter_flatmin;
- glt->d3dmagfilter = d3d_filter_flatmag;
- glt->d3dmipfilter = d3d_filter_flatmix;
- }
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- switch(glt->texturetype)
- {
- case GLTEXTURETYPE_2D:
- DPSOFTRAST_Texture_UpdateFull(glt->texnum, prevbuffer);
- break;
- case GLTEXTURETYPE_3D:
- DPSOFTRAST_Texture_UpdateFull(glt->texnum, prevbuffer);
- break;
- case GLTEXTURETYPE_CUBEMAP:
- if (glt->inputwidth != width || glt->inputheight != height || glt->inputdepth != depth)
- {
- unsigned char *combinedbuffer = (unsigned char *)Mem_Alloc(tempmempool, glt->tilewidth*glt->tileheight*glt->tiledepth*glt->sides*glt->bytesperpixel);
- // convert and upload each side in turn,
- // from a continuous block of input texels
- // copy the results into combinedbuffer
- texturebuffer = (unsigned char *)prevbuffer;
- 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)
- {
- 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;
- }
- memcpy(combinedbuffer + i*glt->tilewidth*glt->tileheight*glt->tiledepth*glt->bytesperpixel, prevbuffer, glt->tilewidth*glt->tileheight*glt->tiledepth*glt->bytesperpixel);
- }
- DPSOFTRAST_Texture_UpdateFull(glt->texnum, combinedbuffer);
- Mem_Free(combinedbuffer);
- }
- else
- DPSOFTRAST_Texture_UpdateFull(glt->texnum, prevbuffer);
- break;
- }
- if (glt->flags & TEXF_FORCELINEAR)
- DPSOFTRAST_Texture_Filter(glt->texnum, DPSOFTRAST_TEXTURE_FILTER_LINEAR);
- else if (glt->flags & TEXF_FORCENEAREST)
- DPSOFTRAST_Texture_Filter(glt->texnum, DPSOFTRAST_TEXTURE_FILTER_NEAREST);
- else if (glt->flags & TEXF_MIPMAP)
- DPSOFTRAST_Texture_Filter(glt->texnum, dpsoftrast_filter_mipmap);
- else
- DPSOFTRAST_Texture_Filter(glt->texnum, dpsoftrast_filter_nomipmap);
- break;
}
}
}
}
- if (texturetype == GLTEXTURETYPE_CUBEMAP && !vid.support.arb_texture_cube_map)
- {
- Con_Printf ("R_LoadTexture: cubemap texture not supported by driver\n");
- return NULL;
- }
- if (texturetype == GLTEXTURETYPE_3D && !vid.support.ext_texture_3d)
- {
- Con_Printf ("R_LoadTexture: 3d texture not supported by driver\n");
- return NULL;
- }
-
texinfo = R_GetTexTypeInfo(textype, flags);
size = width * height * depth * sides * texinfo->inputbytesperpixel;
if (size < 1)
glt->gltexturetypeenum = gltexturetypeenums[glt->texturetype];
// init the dynamic texture attributes, too [11/22/2007 Black]
glt->updatecallback = NULL;
- glt->updatacallback_data = NULL;
+ glt->updatecallback_data = NULL;
GL_Texture_CalcImageSize(glt->texturetype, glt->flags, glt->miplevel, glt->inputwidth, glt->inputheight, glt->inputdepth, &glt->tilewidth, &glt->tileheight, &glt->tiledepth, &glt->miplevels);
// data may be NULL (blank texture for dynamic rendering)
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
CHECKGLERROR
qglGenTextures(1, (GLuint *)&glt->texnum);CHECKGLERROR
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- {
- D3DFORMAT d3dformat;
- D3DPOOL d3dpool;
- DWORD d3dusage;
- HRESULT d3dresult;
- d3dusage = 0;
- d3dpool = D3DPOOL_MANAGED;
- if (flags & TEXF_RENDERTARGET)
- {
- d3dusage |= D3DUSAGE_RENDERTARGET;
- d3dpool = D3DPOOL_DEFAULT;
- }
- switch(textype)
- {
- case TEXTYPE_PALETTE: d3dformat = (flags & TEXF_ALPHA) ? D3DFMT_A8R8G8B8 : D3DFMT_X8R8G8B8;break;
- case TEXTYPE_RGBA: d3dformat = (flags & TEXF_ALPHA) ? D3DFMT_A8B8G8R8 : D3DFMT_X8B8G8R8;break;
- case TEXTYPE_BGRA: d3dformat = (flags & TEXF_ALPHA) ? D3DFMT_A8R8G8B8 : D3DFMT_X8R8G8B8;break;
- case TEXTYPE_COLORBUFFER: d3dformat = D3DFMT_A8R8G8B8;break;
- case TEXTYPE_COLORBUFFER16F: d3dformat = D3DFMT_A16B16G16R16F;break;
- case TEXTYPE_COLORBUFFER32F: d3dformat = D3DFMT_A32B32G32R32F;break;
- case TEXTYPE_ALPHA: d3dformat = D3DFMT_A8;break;
- default: d3dformat = D3DFMT_A8R8G8B8;Sys_Error("R_LoadTexture: unsupported texture type %i when picking D3DFMT", (int)textype);break;
- }
- glt->d3dformat = d3dformat;
- glt->d3dusage = d3dusage;
- glt->d3dpool = d3dpool;
- glt->d3disrendertargetsurface = false;
- glt->d3disdepthstencilsurface = false;
- if (glt->tiledepth > 1)
- {
- if (FAILED(d3dresult = IDirect3DDevice9_CreateVolumeTexture(vid_d3d9dev, glt->tilewidth, glt->tileheight, glt->tiledepth, glt->miplevels, glt->d3dusage, (D3DFORMAT)glt->d3dformat, (D3DPOOL)glt->d3dpool, (IDirect3DVolumeTexture9 **)&glt->d3dtexture, NULL)))
- Sys_Error("IDirect3DDevice9_CreateVolumeTexture failed!");
- }
- else if (glt->sides == 6)
- {
- if (FAILED(d3dresult = IDirect3DDevice9_CreateCubeTexture(vid_d3d9dev, glt->tilewidth, glt->miplevels, glt->d3dusage, (D3DFORMAT)glt->d3dformat, (D3DPOOL)glt->d3dpool, (IDirect3DCubeTexture9 **)&glt->d3dtexture, NULL)))
- Sys_Error("IDirect3DDevice9_CreateCubeTexture failed!");
- }
- else
- {
- if (FAILED(d3dresult = IDirect3DDevice9_CreateTexture(vid_d3d9dev, glt->tilewidth, glt->tileheight, glt->miplevels, glt->d3dusage, (D3DFORMAT)glt->d3dformat, (D3DPOOL)glt->d3dpool, (IDirect3DTexture9 **)&glt->d3dtexture, NULL)))
- Sys_Error("IDirect3DDevice9_CreateTexture failed!");
- }
- }
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- {
- int tflags = 0;
- switch(textype)
- {
- case TEXTYPE_PALETTE: tflags = DPSOFTRAST_TEXTURE_FORMAT_BGRA8;break;
- case TEXTYPE_RGBA: tflags = DPSOFTRAST_TEXTURE_FORMAT_RGBA8;break;
- case TEXTYPE_BGRA: tflags = DPSOFTRAST_TEXTURE_FORMAT_BGRA8;break;
- case TEXTYPE_COLORBUFFER: tflags = DPSOFTRAST_TEXTURE_FORMAT_BGRA8;break;
- case TEXTYPE_COLORBUFFER16F: tflags = DPSOFTRAST_TEXTURE_FORMAT_RGBA16F;break;
- case TEXTYPE_COLORBUFFER32F: tflags = DPSOFTRAST_TEXTURE_FORMAT_RGBA32F;break;
- case TEXTYPE_SHADOWMAP16_COMP:
- case TEXTYPE_SHADOWMAP16_RAW:
- case TEXTYPE_SHADOWMAP24_COMP:
- case TEXTYPE_SHADOWMAP24_RAW: tflags = DPSOFTRAST_TEXTURE_FORMAT_DEPTH;break;
- case TEXTYPE_DEPTHBUFFER16:
- case TEXTYPE_DEPTHBUFFER24:
- case TEXTYPE_DEPTHBUFFER24STENCIL8: tflags = DPSOFTRAST_TEXTURE_FORMAT_DEPTH;break;
- case TEXTYPE_ALPHA: tflags = DPSOFTRAST_TEXTURE_FORMAT_ALPHA8;break;
- default: Sys_Error("R_LoadTexture: unsupported texture type %i when picking DPSOFTRAST_TEXTURE_FLAGS", (int)textype);
- }
- if (glt->miplevels > 1) tflags |= DPSOFTRAST_TEXTURE_FLAG_MIPMAP;
- if (flags & TEXF_ALPHA) tflags |= DPSOFTRAST_TEXTURE_FLAG_USEALPHA;
- if (glt->sides == 6) tflags |= DPSOFTRAST_TEXTURE_FLAG_CUBEMAP;
- if (glt->flags & TEXF_CLAMP) tflags |= DPSOFTRAST_TEXTURE_FLAG_CLAMPTOEDGE;
- glt->texnum = DPSOFTRAST_Texture_New(tflags, glt->tilewidth, glt->tileheight, glt->tiledepth);
- }
- break;
}
R_UploadFullTexture(glt, data);
glt->inputdepth = 1;
glt->flags = TEXF_RENDERTARGET | TEXF_CLAMP | TEXF_FORCENEAREST;
glt->miplevel = 0;
- glt->textype = GL_TEXTURE_2D;
+ glt->textype = texinfo;
glt->texturetype = textype;
glt->inputdatasize = width*height*texinfo->internalbytesperpixel;
glt->palette = NULL;
glt->texnum = 0;
glt->dirty = false;
glt->glisdepthstencil = textype == TEXTYPE_DEPTHBUFFER24STENCIL8;
- glt->gltexturetypeenum = gltexturetypeenums[glt->texturetype];
+ glt->gltexturetypeenum = GL_TEXTURE_2D;
// init the dynamic texture attributes, too [11/22/2007 Black]
glt->updatecallback = NULL;
- glt->updatacallback_data = NULL;
+ glt->updatecallback_data = NULL;
GL_Texture_CalcImageSize(glt->texturetype, glt->flags, glt->miplevel, glt->inputwidth, glt->inputheight, glt->inputdepth, &glt->tilewidth, &glt->tileheight, &glt->tiledepth, &glt->miplevels);
// data may be NULL (blank texture for dynamic rendering)
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
CHECKGLERROR
qglGenRenderbuffers(1, (GLuint *)&glt->renderbuffernum);CHECKGLERROR
// note we can query the renderbuffer for info with glGetRenderbufferParameteriv for GL_WIDTH, GL_HEIGHt, GL_RED_SIZE, GL_GREEN_SIZE, GL_BLUE_SIZE, GL_GL_ALPHA_SIZE, GL_DEPTH_SIZE, GL_STENCIL_SIZE, GL_INTERNAL_FORMAT
qglBindRenderbuffer(GL_RENDERBUFFER, 0);CHECKGLERROR
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- {
- D3DFORMAT d3dformat;
- HRESULT d3dresult;
- glt->d3disrendertargetsurface = false;
- glt->d3disdepthstencilsurface = false;
- switch(textype)
- {
- case TEXTYPE_COLORBUFFER: d3dformat = D3DFMT_A8R8G8B8;glt->d3disrendertargetsurface = true;break;
- case TEXTYPE_COLORBUFFER16F: d3dformat = D3DFMT_A16B16G16R16F;glt->d3disrendertargetsurface = true;break;
- case TEXTYPE_COLORBUFFER32F: d3dformat = D3DFMT_A32B32G32R32F;glt->d3disrendertargetsurface = true;break;
- case TEXTYPE_DEPTHBUFFER16: d3dformat = D3DFMT_D16;glt->d3disdepthstencilsurface = true;break;
- case TEXTYPE_DEPTHBUFFER24: d3dformat = D3DFMT_D24X8;glt->d3disdepthstencilsurface = true;break;
- case TEXTYPE_DEPTHBUFFER24STENCIL8: d3dformat = D3DFMT_D24S8;glt->d3disdepthstencilsurface = true;break;
- default: d3dformat = D3DFMT_A8R8G8B8;Sys_Error("R_LoadTextureRenderbuffer: unsupported texture type %i when picking D3DFMT", (int)textype);break;
- }
- glt->d3dformat = d3dformat;
- glt->d3dusage = 0;
- glt->d3dpool = 0;
- if (glt->d3disrendertargetsurface)
- {
- if (FAILED(d3dresult = IDirect3DDevice9_CreateRenderTarget(vid_d3d9dev, glt->tilewidth, glt->tileheight, (D3DFORMAT)glt->d3dformat, D3DMULTISAMPLE_NONE, 0, false, (IDirect3DSurface9 **)&glt->d3dsurface, NULL)))
- Sys_Error("IDirect3DDevice9_CreateRenderTarget failed!");
- }
- else if (glt->d3disdepthstencilsurface)
- {
- if (FAILED(d3dresult = IDirect3DDevice9_CreateDepthStencilSurface(vid_d3d9dev, glt->tilewidth, glt->tileheight, (D3DFORMAT)glt->d3dformat, D3DMULTISAMPLE_NONE, 0, false, (IDirect3DSurface9 **)&glt->d3dsurface, NULL)))
- Sys_Error("IDirect3DDevice9_CreateDepthStencilSurface failed!");
- }
- }
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- {
- int tflags = 0;
- switch(textype)
- {
- case TEXTYPE_COLORBUFFER: tflags = DPSOFTRAST_TEXTURE_FORMAT_BGRA8 | DPSOFTRAST_TEXTURE_FLAG_USEALPHA | DPSOFTRAST_TEXTURE_FLAG_CLAMPTOEDGE;break;
- case TEXTYPE_COLORBUFFER16F: tflags = DPSOFTRAST_TEXTURE_FORMAT_RGBA16F | DPSOFTRAST_TEXTURE_FLAG_USEALPHA | DPSOFTRAST_TEXTURE_FLAG_CLAMPTOEDGE;break;
- case TEXTYPE_COLORBUFFER32F: tflags = DPSOFTRAST_TEXTURE_FORMAT_RGBA32F | DPSOFTRAST_TEXTURE_FLAG_USEALPHA | DPSOFTRAST_TEXTURE_FLAG_CLAMPTOEDGE;break;
- case TEXTYPE_DEPTHBUFFER16:
- case TEXTYPE_DEPTHBUFFER24:
- case TEXTYPE_DEPTHBUFFER24STENCIL8: tflags = DPSOFTRAST_TEXTURE_FORMAT_DEPTH | DPSOFTRAST_TEXTURE_FLAG_CLAMPTOEDGE;break;
- default: Sys_Error("R_LoadTextureRenderbuffer: unsupported texture type %i when picking DPSOFTRAST_TEXTURE_FLAGS", (int)textype);
- }
- glt->texnum = DPSOFTRAST_Texture_New(tflags, glt->tilewidth, glt->tileheight, glt->tiledepth);
- }
- break;
}
return (rtexture_t *)glt;
unsigned char *dds;
fs_offset_t ddsfilesize;
unsigned int ddssize;
- qboolean force_swdecode, npothack;
+ qboolean force_swdecode;
#ifdef __ANDROID__
// ELUAN: FIXME: separate this code
char vabuf[1024];
}
force_swdecode = false;
- npothack =
- (!vid.support.arb_texture_non_power_of_two &&
- (
- (dds_width & (dds_width - 1))
- ||
- (dds_height & (dds_height - 1))
- )
- );
if(bytesperblock)
{
- if(vid.support.arb_texture_compression && vid.support.ext_texture_compression_s3tc && !npothack)
+ if(vid.support.arb_texture_compression && vid.support.ext_texture_compression_s3tc)
{
if(r_texture_dds_swdecode.integer > 1)
force_swdecode = true;
glt->tiledepth = 1;
glt->miplevels = dds_miplevels;
- if(npothack)
- {
- for (glt->tilewidth = 1;glt->tilewidth < mipwidth;glt->tilewidth <<= 1);
- for (glt->tileheight = 1;glt->tileheight < mipheight;glt->tileheight <<= 1);
- }
-
// texture uploading can take a while, so make sure we're sending keepalives
CL_KeepaliveMessage(false);
// create the texture object
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
CHECKGLERROR
GL_ActiveTexture(0);
qglGenTextures(1, (GLuint *)&glt->texnum);CHECKGLERROR
qglBindTexture(gltexturetypeenums[glt->texturetype], glt->texnum);CHECKGLERROR
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- {
- D3DFORMAT d3dformat;
- D3DPOOL d3dpool;
- DWORD d3dusage;
- switch(textype)
- {
- case TEXTYPE_BGRA: d3dformat = (flags & TEXF_ALPHA) ? D3DFMT_A8R8G8B8 : D3DFMT_X8R8G8B8;break;
- case TEXTYPE_DXT1: case TEXTYPE_DXT1A: d3dformat = D3DFMT_DXT1;break;
- case TEXTYPE_DXT3: d3dformat = D3DFMT_DXT3;break;
- case TEXTYPE_DXT5: d3dformat = D3DFMT_DXT5;break;
- default: d3dformat = D3DFMT_A8R8G8B8;Host_Error("R_LoadTextureDDSFile: unsupported texture type %i when picking D3DFMT", (int)textype);break;
- }
- d3dusage = 0;
- d3dpool = D3DPOOL_MANAGED;
- IDirect3DDevice9_CreateTexture(vid_d3d9dev, glt->tilewidth, glt->tileheight, glt->miplevels, d3dusage, d3dformat, d3dpool, (IDirect3DTexture9 **)&glt->d3dtexture, NULL);
- }
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- glt->texnum = DPSOFTRAST_Texture_New(((glt->flags & TEXF_CLAMP) ? DPSOFTRAST_TEXTURE_FLAG_CLAMPTOEDGE : 0) | (dds_miplevels > 1 ? DPSOFTRAST_TEXTURE_FLAG_MIPMAP : 0), glt->tilewidth, glt->tileheight, glt->tiledepth);
- break;
}
// upload the texture
mipsize = bytesperblock ? ((mipwidth+3)/4)*((mipheight+3)/4)*bytesperblock : mipwidth*mipheight*bytesperpixel;
if (mippixels + mipsize > mippixels_start + mipsize_total)
break;
- if(npothack)
- {
- upload_mipwidth = (glt->tilewidth >> mip);
- upload_mipheight = (glt->tileheight >> mip);
- if(upload_mipwidth != mipwidth || upload_mipheight != mipheight)
- // I _think_ they always mismatch, but I was too lazy
- // to properly check, and this test here is really
- // harmless
- {
- upload_mippixels = (unsigned char *) Mem_Alloc(tempmempool, 4 * upload_mipwidth * upload_mipheight);
- Image_Resample32(mippixels, mipwidth, mipheight, 1, upload_mippixels, upload_mipwidth, upload_mipheight, 1, r_lerpimages.integer);
- }
- }
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
if (bytesperblock)
{
qglTexImage2D(GL_TEXTURE_2D, mip, glt->glinternalformat, upload_mipwidth, upload_mipheight, 0, glt->glformat, glt->gltype, upload_mippixels);CHECKGLERROR
}
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- {
- D3DLOCKED_RECT d3dlockedrect;
- if (IDirect3DTexture9_LockRect((IDirect3DTexture9*)glt->d3dtexture, mip, &d3dlockedrect, NULL, 0) == D3D_OK && d3dlockedrect.pBits)
- {
- memcpy(d3dlockedrect.pBits, upload_mippixels, mipsize);
- IDirect3DTexture9_UnlockRect((IDirect3DTexture9*)glt->d3dtexture, mip);
- }
- break;
- }
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- if (bytesperblock)
- Con_DPrintf("FIXME SOFT %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- else
- DPSOFTRAST_Texture_UpdateFull(glt->texnum, upload_mippixels);
- // DPSOFTRAST calculates its own mipmaps
- mip = dds_miplevels;
- break;
}
if(upload_mippixels != mippixels)
Mem_Free(upload_mippixels);
// after upload we have to set some parameters...
switch(vid.renderpath)
{
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_GLES1:
+ case RENDERPATH_GL32:
case RENDERPATH_GLES2:
#ifdef GL_TEXTURE_MAX_LEVEL
if (dds_miplevels >= 1 && !mipcomplete)
GL_SetupTextureParameters(glt->flags, glt->textype->textype, glt->texturetype);
qglBindTexture(gltexturetypeenums[glt->texturetype], oldbindtexnum);CHECKGLERROR
break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- glt->d3daddressw = 0;
- if (glt->flags & TEXF_CLAMP)
- {
- glt->d3daddressu = D3DTADDRESS_CLAMP;
- glt->d3daddressv = D3DTADDRESS_CLAMP;
- if (glt->tiledepth > 1)
- glt->d3daddressw = D3DTADDRESS_CLAMP;
- }
- else
- {
- glt->d3daddressu = D3DTADDRESS_WRAP;
- glt->d3daddressv = D3DTADDRESS_WRAP;
- if (glt->tiledepth > 1)
- glt->d3daddressw = D3DTADDRESS_WRAP;
- }
- glt->d3dmipmaplodbias = 0;
- glt->d3dmaxmiplevel = 0;
- glt->d3dmaxmiplevelfilter = 0;
- if (glt->flags & TEXF_MIPMAP)
- {
- glt->d3dminfilter = d3d_filter_mipmin;
- glt->d3dmagfilter = d3d_filter_mipmag;
- glt->d3dmipfilter = d3d_filter_mipmix;
- }
- else
- {
- glt->d3dminfilter = d3d_filter_flatmin;
- glt->d3dmagfilter = d3d_filter_flatmag;
- glt->d3dmipfilter = d3d_filter_flatmix;
- }
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- if (glt->flags & TEXF_FORCELINEAR)
- DPSOFTRAST_Texture_Filter(glt->texnum, DPSOFTRAST_TEXTURE_FILTER_LINEAR);
- else if (glt->flags & TEXF_FORCENEAREST)
- DPSOFTRAST_Texture_Filter(glt->texnum, DPSOFTRAST_TEXTURE_FILTER_NEAREST);
- else if (glt->flags & TEXF_MIPMAP)
- DPSOFTRAST_Texture_Filter(glt->texnum, dpsoftrast_filter_mipmap);
- else
- DPSOFTRAST_Texture_Filter(glt->texnum, dpsoftrast_filter_nomipmap);
- break;
}
Mem_Free(dds);
Host_Error("R_UpdateTexture: no data supplied");
if (glt == NULL)
Host_Error("R_UpdateTexture: no texture supplied");
- if (!glt->texnum && !glt->d3dtexture)
+ if (!glt->texnum)
{
Con_DPrintf("R_UpdateTexture: texture %p \"%s\" in pool %p has not been uploaded yet\n", (void *)glt, glt->identifier, (void *)glt->pool);
return;
return glt->texnum;
}
else
- return 0;
+ return r_texture_white->texnum;
}
void R_ClearTexture (rtexture_t *rt)