diff options
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/include/state/cr_texture.h')
-rw-r--r-- | src/VBox/GuestHost/OpenGL/include/state/cr_texture.h | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/include/state/cr_texture.h b/src/VBox/GuestHost/OpenGL/include/state/cr_texture.h new file mode 100644 index 00000000..707db996 --- /dev/null +++ b/src/VBox/GuestHost/OpenGL/include/state/cr_texture.h @@ -0,0 +1,250 @@ +/* Copyright (c) 2001, Stanford University + * All rights reserved. + * + * See the file LICENSE.txt for information on redistributing this software. + */ + +#ifndef CR_STATE_TEXTURE_H +#define CR_STATE_TEXTURE_H + +#include "cr_hash.h" +#include "state/cr_statetypes.h" +#include "state/cr_limits.h" + +#include <iprt/cdefs.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* Tells state tracker to rely on diff_api to store/load texture images + * and avoid host memory allocation. + */ +#define CR_STATE_NO_TEXTURE_IMAGE_STORE + +#if defined(CR_ARB_pixel_buffer_object) && !defined(CR_STATE_NO_TEXTURE_IMAGE_STORE) +#error CR_ARB_pixel_buffer_object not supported without CR_STATE_NO_TEXTURE_IMAGE_STORE +#endif + +#define CR_MAX_MIPMAP_LEVELS 20 + +typedef struct { + GLubyte redbits; + GLubyte greenbits; + GLubyte bluebits; + GLubyte alphabits; + GLubyte luminancebits; + GLubyte intensitybits; + GLubyte indexbits; +} CRTextureFormat; + +typedef struct { + GLubyte *img; + int bytes; + GLint width; /* width, height, depth includes the border */ + GLint height; + GLint depth; + GLint internalFormat; + GLint border; + GLenum format; + GLenum type; + int bytesPerPixel; +#if CR_ARB_texture_compression + GLboolean compressed; +#endif + GLboolean generateMipmap; + const CRTextureFormat *texFormat; + + CRbitvalue dirty[CR_MAX_BITARRAY]; +} CRTextureLevel; + +typedef struct { + GLenum target; + GLuint id; + GLuint hwid; + + /* The mipmap levels */ + CRTextureLevel *level[6]; /* 6 cube faces */ + + GLcolorf borderColor; + GLenum minFilter, magFilter; + GLenum wrapS, wrapT; +#ifdef CR_OPENGL_VERSION_1_2 + GLenum wrapR; + GLfloat priority; + GLfloat minLod; + GLfloat maxLod; + GLint baseLevel; + GLint maxLevel; +#endif +#ifdef CR_EXT_texture_filter_anisotropic + GLfloat maxAnisotropy; +#endif +#ifdef CR_ARB_depth_texture + GLenum depthMode; +#endif +#ifdef CR_ARB_shadow + GLenum compareMode; + GLenum compareFunc; +#endif +#ifdef CR_ARB_shadow_ambient + GLfloat compareFailValue; +#endif +#ifdef CR_SGIS_generate_mipmap + GLboolean generateMipmap; +#endif + GLboolean pinned; /* <- keep the texture alive if its ctxUsage reaches zero */ + CRbitvalue dirty[CR_MAX_BITARRAY]; + CRbitvalue imageBit[CR_MAX_BITARRAY]; + CRbitvalue paramsBit[CR_MAX_TEXTURE_UNITS][CR_MAX_BITARRAY]; + /* bitfield representing the object usage. 1 means the object is used by the context with the given bitid */ + CRbitvalue ctxUsage[CR_MAX_BITARRAY]; +} CRTextureObj; + +typedef struct { + CRbitvalue dirty[CR_MAX_BITARRAY]; + CRbitvalue enable[CR_MAX_TEXTURE_UNITS][CR_MAX_BITARRAY]; + CRbitvalue current[CR_MAX_TEXTURE_UNITS][CR_MAX_BITARRAY]; + CRbitvalue objGen[CR_MAX_TEXTURE_UNITS][CR_MAX_BITARRAY]; + CRbitvalue eyeGen[CR_MAX_TEXTURE_UNITS][CR_MAX_BITARRAY]; + CRbitvalue genMode[CR_MAX_TEXTURE_UNITS][CR_MAX_BITARRAY]; + /* XXX someday create more bits for texture env state */ + CRbitvalue envBit[CR_MAX_TEXTURE_UNITS][CR_MAX_BITARRAY]; +} CRTextureBits; + +typedef struct { + /* Current texture objects (in terms of glBindTexture and glActiveTexture) */ + CRTextureObj *currentTexture1D; + CRTextureObj *currentTexture2D; + CRTextureObj *currentTexture3D; +#ifdef CR_ARB_texture_cube_map + CRTextureObj *currentTextureCubeMap; +#endif +#ifdef CR_NV_texture_rectangle + CRTextureObj *currentTextureRect; +#endif + + GLboolean enabled1D; + GLboolean enabled2D; + GLboolean enabled3D; +#ifdef CR_ARB_texture_cube_map + GLboolean enabledCubeMap; +#endif +#ifdef CR_NV_texture_rectangle + GLboolean enabledRect; +#endif +#ifdef CR_EXT_texture_lod_bias + GLfloat lodBias; +#endif + + GLenum envMode; + GLcolorf envColor; + + /* GL_ARB_texture_env_combine */ + GLenum combineModeRGB; /* GL_REPLACE, GL_DECAL, GL_ADD, etc. */ + GLenum combineModeA; /* GL_REPLACE, GL_DECAL, GL_ADD, etc. */ + GLenum combineSourceRGB[3]; /* GL_PRIMARY_COLOR, GL_TEXTURE, etc. */ + GLenum combineSourceA[3]; /* GL_PRIMARY_COLOR, GL_TEXTURE, etc. */ + GLenum combineOperandRGB[3]; /* SRC_COLOR, ONE_MINUS_SRC_COLOR, etc */ + GLenum combineOperandA[3]; /* SRC_ALPHA, ONE_MINUS_SRC_ALPHA, etc */ + GLfloat combineScaleRGB; /* 1 or 2 or 4 */ + GLfloat combineScaleA; /* 1 or 2 or 4 */ + + GLtexcoordb textureGen; + GLvectorf objSCoeff; + GLvectorf objTCoeff; + GLvectorf objRCoeff; + GLvectorf objQCoeff; + GLvectorf eyeSCoeff; + GLvectorf eyeTCoeff; + GLvectorf eyeRCoeff; + GLvectorf eyeQCoeff; + GLtexcoorde gen; + + /* These are only used for glPush/PopAttrib */ + CRTextureObj Saved1D; + CRTextureObj Saved2D; + CRTextureObj Saved3D; +#ifdef CR_ARB_texture_cube_map + CRTextureObj SavedCubeMap; +#endif +#ifdef CR_NV_texture_rectangle + CRTextureObj SavedRect; +#endif +} CRTextureUnit; + +typedef struct { + /* Default texture objects (name = 0) */ + CRTextureObj base1D; + CRTextureObj base2D; + CRTextureObj base3D; +#ifdef CR_ARB_texture_cube_map + CRTextureObj baseCubeMap; +#endif +#ifdef CR_NV_texture_rectangle + CRTextureObj baseRect; +#endif + + /* Proxy texture objects */ + CRTextureObj proxy1D; + CRTextureObj proxy2D; + CRTextureObj proxy3D; +#ifdef CR_ARB_texture_cube_map + CRTextureObj proxyCubeMap; +#endif +#ifdef CR_NV_texture_rectangle + CRTextureObj proxyRect; +#endif + + GLuint curTextureUnit; /* GL_ACTIVE_TEXTURE */ + + GLint maxLevel; /* number of mipmap levels possible: [0..max] */ + GLint max3DLevel; + GLint maxCubeMapLevel; + GLint maxRectLevel; + + GLboolean broadcastTextures; /*@todo what is it for?*/ + + /* Per-texture unit state: */ + CRTextureUnit unit[CR_MAX_TEXTURE_UNITS]; +} CRTextureState; + +DECLEXPORT(void) crStateTextureInit(CRContext *ctx); +DECLEXPORT(void) crStateTextureDestroy(CRContext *ctx); +DECLEXPORT(void) crStateTextureFree(CRContext *ctx); + +DECLEXPORT(void) crStateTextureInitTexture(GLuint name); +DECLEXPORT(CRTextureObj *) crStateTextureAllocate(GLuint name); + /*void crStateTextureDelete(GLuint name);*/ +DECLEXPORT(CRTextureObj *) crStateTextureGet(GLenum target, GLuint textureid); +DECLEXPORT(int) crStateTextureGetSize(GLenum target, GLenum level); +DECLEXPORT(const GLvoid *) crStateTextureGetData(GLenum target, GLenum level); + +DECLEXPORT(int) crStateTextureCheckDirtyImages(CRContext *from, CRContext *to, GLenum target, int textureUnit); + +DECLEXPORT(void) crStateTextureDiff(CRTextureBits *t, CRbitvalue *bitID, + CRContext *fromCtx, CRContext *toCtx); +DECLEXPORT(void) crStateTextureSwitch(CRTextureBits *t, CRbitvalue *bitID, + CRContext *fromCtx, CRContext *toCtx); + +DECLEXPORT(void) crStateTextureObjectDiff(CRContext *fromCtx, + const CRbitvalue *bitID, + const CRbitvalue *nbitID, + CRTextureObj *tobj, GLboolean alwaysDirty); + +DECLEXPORT(void) crStateDiffAllTextureObjects( CRContext *g, CRbitvalue *bitID, GLboolean bForceUpdate ); + +DECLEXPORT(void) crStateDeleteTextureObjectData(CRTextureObj *tobj); +DECLEXPORT(void) crStateDeleteTextureObject(CRTextureObj *tobj); + +DECLEXPORT(GLuint) STATE_APIENTRY crStateTextureHWIDtoID(GLuint hwid); +DECLEXPORT(GLuint) STATE_APIENTRY crStateGetTextureHWID(GLuint id); +DECLEXPORT(GLuint) STATE_APIENTRY crStateGetTextureObjHWID(CRTextureObj *tobj); + +void crStateRegTextures(GLsizei n, GLuint *names); + +#ifdef __cplusplus +} +#endif + +#endif /* CR_STATE_TEXTURE_H */ |