-// important technical note:
-// fragment textures must have a width that is compatible with the fragment
-// update system, to get a compliant size, use R_CompatibleFragmentWidth
-int R_CompatibleFragmentWidth(int width, int textype, int flags);
-
-// these two functions add a texture to a pool, and may precache (upload) it
-// a normal static texture
-rtexture_t *R_LoadTexture (rtexturepool_t *rtexturepool, char *identifier, int width, int height, qbyte *data, int textype, int flags);
-// a procedurally generated texture, often animated over time, note: generate can be NULL (for odd uses)
-rtexture_t *R_ProceduralTexture (rtexturepool_t *rtexturepool, char *identifier, int width, int height, int textype, int flags, int (*generate)(qbyte *buffer, int width, int height, void *parameterdata, int parameterdatasize), void *parameterdata, int parameterdatasize);
-
-// update the image data of a texture, used by lightmap updates and procedural
-// textures.
-void R_UpdateTexture(rtexture_t *rt, qbyte *data);
-
-// location of the fragment in the texture (note: any parameter except rt can be NULL)
-void R_FragmentLocation(rtexture_t *rt, int *x, int *y, float *fx1, float *fy1, float *fx2, float *fy2);
-
-// returns the renderer dependent texture slot number (call this before each use, as a texture might not have been precached, or it might change over time if it is procedural)
-int R_GetTexture (rtexture_t *rt);
-
-// returns true if the texture is transparent (useful for rendering code)
-int R_TextureHasAlpha(rtexture_t *rt);
+// the color/normal/etc cvars should be checked by callers of R_LoadTexture* functions to decide whether to add TEXF_COMPRESS to the flags
+extern cvar_t gl_texturecompression;
+extern cvar_t gl_texturecompression_color;
+extern cvar_t gl_texturecompression_normal;
+extern cvar_t gl_texturecompression_gloss;
+extern cvar_t gl_texturecompression_glow;
+extern cvar_t gl_texturecompression_2d;
+extern cvar_t gl_texturecompression_q3bsplightmaps;
+extern cvar_t gl_texturecompression_q3bspdeluxemaps;
+extern cvar_t gl_texturecompression_sky;
+extern cvar_t gl_texturecompression_lightcubemaps;
+
+// add a texture to a pool and optionally precache (upload) it
+// (note: data == NULL is perfectly acceptable)
+// (note: palette must not be NULL if using TEXTYPE_PALETTE)
+rtexture_t *R_LoadTexture2D(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, const unsigned char *data, textype_t textype, int flags, const unsigned int *palette);
+rtexture_t *R_LoadTexture3D(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, int depth, const unsigned char *data, textype_t textype, int flags, const unsigned int *palette);
+rtexture_t *R_LoadTextureCubeMap(rtexturepool_t *rtexturepool, const char *identifier, int width, const unsigned char *data, textype_t textype, int flags, const unsigned int *palette);
+rtexture_t *R_LoadTextureRectangle(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, const unsigned char *data, textype_t textype, int flags, const unsigned int *palette);
+rtexture_t *R_LoadTextureShadowMapRectangle(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, int precision, qboolean filter);
+rtexture_t *R_LoadTextureShadowMap2D(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, int precision, qboolean filter);
+rtexture_t *R_LoadTextureShadowMapCube(rtexturepool_t *rtexturepool, const char *identifier, int width, int precision, qboolean filter);
+
+// free a texture
+void R_FreeTexture(rtexture_t *rt);
+
+// update a portion of the image data of a texture, used by lightmap updates
+// and procedural textures such as video playback.
+// if TEXF_MANUALFLUSHUPDATES is used, you MUST call R_FlushTexture to apply the updates
+void R_UpdateTexture(rtexture_t *rt, const unsigned char *data, int x, int y, int width, int height);
+// if TEXF_MANUALFLUSHUPDATES is used, call this to apply the updates,
+// otherwise this function does nothing
+void R_FlushTexture(rtexture_t *rt);
+
+// returns the renderer dependent texture slot number (call this before each
+// use, as a texture might not have been precached)
+#define R_GetTexture(rt) ((rt) ? ((rt)->texnum > 0 ? (rt)->texnum : R_RealGetTexture(rt)) : r_texture_white->texnum)
+int R_RealGetTexture (rtexture_t *rt);