state_texture.c revision bd1954d8b813c41aa6f882f123a01519e460ad2e
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/* Copyright (c) 2001, Stanford University
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * All rights reserved
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * See the file LICENSE.txt for information on redistributing this software.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define UNUSED(x) ((void) (x))
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync tobj = (CRTextureObj *) crHashtableSearch(g->shared->textureTable, id);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateDeleteTextureObjectData(&ctx->texture.base1D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateDeleteTextureObjectData(&ctx->texture.proxy1D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateDeleteTextureObjectData(&ctx->texture.base2D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateDeleteTextureObjectData(&ctx->texture.proxy2D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateDeleteTextureObjectData(&ctx->texture.base3D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateDeleteTextureObjectData(&ctx->texture.proxy3D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateDeleteTextureObjectData(&ctx->texture.baseCubeMap);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateDeleteTextureObjectData(&ctx->texture.proxyCubeMap);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateDeleteTextureObjectData(&ctx->texture.baseRect);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateDeleteTextureObjectData(&ctx->texture.proxyRect);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync unsigned int i;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync unsigned int a;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* compute max levels from max sizes */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync for (i=0, a=limits->maxTextureSize; a; i++, a=a>>1);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync for (i=0, a=limits->max3DTextureSize; a; i++, a=a>>1);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync for (i=0, a=limits->maxCubeMapTextureSize; a; i++, a=a>>1);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync for (i=0, a=limits->maxRectTextureSize; a; i++, a=a>>1);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, &(t->base1D), 0, GL_TEXTURE_1D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, &(t->base2D), 0, GL_TEXTURE_2D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, &(t->base3D), 0, GL_TEXTURE_3D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, &(t->baseCubeMap), 0,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, &(t->baseRect), 0,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, &(t->proxy1D), 0, GL_TEXTURE_1D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, &(t->proxy2D), 0, GL_TEXTURE_2D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, &(t->proxy3D), 0, GL_TEXTURE_3D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, &(t->proxyCubeMap), 0,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, &(t->proxyRect), 0,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* Per-unit initialization */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[i].currentTextureCubeMap = &(t->baseCubeMap);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsynccrStateTextureInitTextureObj(CRContext *ctx, CRTextureObj *tobj,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* XXX don't always need all six faces */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* allocate array of mipmap levels */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crCalloc(sizeof(CRTextureLevel) * CR_MAX_MIPMAP_LEVELS);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync return; /* out of memory */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* init non-zero fields */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync for (i = 0; i <= t->maxLevel; i++) {
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureFormat( tl, tl->internalFormat );
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync for (i = 0; i < CR_MAX_TEXTURE_UNITS; i++)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/* ================================================================
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Texture internal formats:
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* LuminanceBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* LuminanceBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* AlphaBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* LuminanceBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* AlphaBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* LuminanceBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* LuminanceBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* LuminanceBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* RedBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* GreenBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* BlueBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* AlphaBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* LuminanceBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* RedBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* GreenBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* BlueBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* LuminanceBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* RedBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* GreenBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* BlueBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* AlphaBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* RedBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* GreenBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* BlueBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* AlphaBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* LuminanceBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IndexBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* RedBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* GreenBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* BlueBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* AlphaBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* LuminanceBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync 0, /* IntensityBits */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Given an internal texture format enum or 1, 2, 3, 4 initialize the
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * texture levels texture format. This basically just indicates the
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * number of red, green, blue, alpha, luminance, etc. bits are used to
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * store the image.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsynccrStateTextureInitTextureFormat( CRTextureLevel *tl, GLenum internalFormat )
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if (!tobj) return;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(g, tobj, name, GL_NONE);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Return the texture object corresponding to the given target and ID.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Allocate a new texture object with the given name.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Also insert into hash table.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsynccrStateTextureAllocate_t(CRContext *ctx, GLuint name)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crHashtableAdd( ctx->shared->textureTable, name, (void *) tobj );
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureInitTextureObj(ctx, tobj, name, GL_NONE);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Delete all the data that hangs off a CRTextureObj, but don't
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * delete the texture object itself, since it may not have been
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * dynamically allocated.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* Free the texture images */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* free all mipmap levels for this face */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync for (k = 0; k < CR_MAX_MIPMAP_LEVELS; k++) {
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid crStateGenNames(CRContext *g, CRHashTable *table, GLsizei n, GLuint *names)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "crStateGenNames called in Begin/End");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "Negative n passed to crStateGenNames: %d", n);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync for (i = 0; i < n; i++)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_OUT_OF_MEMORY, "glGenTextures");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid STATE_APIENTRY crStateGenTextures(GLsizei n, GLuint *textures)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateGenNames(g, g->shared->textureTable, n, textures);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncstatic void crStateTextureCheckFBOAPs(GLenum target, GLuint texture)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync pFBO = GL_READ_FRAMEBUFFER==target ? fbo->readFB : fbo->drawFB;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if (!pFBO) return;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync for (u=0; u<CR_MAX_COLOR_ATTACHMENTS; ++u)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateFramebufferTexture1DEXT(target, u+GL_COLOR_ATTACHMENT0_EXT, 0, 0, 0);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateFramebufferTexture1DEXT(target, GL_DEPTH_ATTACHMENT_EXT, 0, 0, 0);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateFramebufferTexture1DEXT(target, GL_STENCIL_ATTACHMENT_EXT, 0, 0, 0);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncstatic void crStateCleanupTextureRefs(CRContext *g, CRTextureObj *tObj)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ** reset back to the base texture.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[u].currentTextureCubeMap = &(t->baseCubeMap);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureCheckFBOAPs(GL_DRAW_FRAMEBUFFER, tObj->id);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateTextureCheckFBOAPs(GL_READ_FRAMEBUFFER, tObj->id);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid STATE_APIENTRY crStateDeleteTextures(GLsizei n, const GLuint *textures)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "glDeleteTextures called in Begin/End");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "Negative n passed to glDeleteTextures: %d", n);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync for (i=0; i<n; i++)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* saved state version <= SHCROGL_SSM_VERSION_BEFORE_CTXUSAGE_BITS does not have usage bits info,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * so on restore, we set mark bits as used.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * This is why g_pAvailableContexts[j] could be NULL
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * also g_pAvailableContexts[0] will hold default context, which we should discard */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* on the host side, ogl texture object is deleted by a separate cr_server.head_spu->dispatch_table.DeleteTextures(n, newTextures);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * in crServerDispatchDeleteTextures, we just delete a state object here, which crStateDeleteTextureObject does */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crHashtableDelete(g->shared->textureTable, name, (CRHashtableCallback)crStateDeleteTextureObject);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync DIRTY(tb->current[t->curTextureUnit], g->neg_bitid);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid STATE_APIENTRY crStateClientActiveTextureARB( GLenum texture )
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "glClientActiveTextureARB not available");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "glClientActiveTextureARB called in Begin/End");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync texture >= GL_TEXTURE0_ARB + g->limits.maxTextureUnits)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "crStateClientActiveTexture: unit = %d (max is %d)",
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync c->curClientTextureUnit = texture - GL_TEXTURE0_ARB;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync DIRTY(GetCurrentBits()->client.dirty, g->neg_bitid);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid STATE_APIENTRY crStateActiveTextureARB( GLenum texture )
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "glActiveTextureARB not available");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glActiveTextureARB called in Begin/End");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if ( texture < GL_TEXTURE0_ARB || texture >= GL_TEXTURE0_ARB + g->limits.maxTextureUnits)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "Bad texture unit passed to crStateActiveTexture: %d (max is %d)", texture, g->limits.maxTextureUnits );
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* update the current matrix pointer, etc. */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncDECLEXPORT(void) crStateSetTextureUsed(GLuint texture, GLboolean used)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crWarning("crStateSetTextureUsed: null texture name specified!");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crWarning("crStateSetTextureUsed: failed to fined a HW name for texture(%d)!", texture);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* on the host side, we need to delete an ogl texture object here as well, which crStateDeleteTextureCallback will do
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * in addition to calling crStateDeleteTextureObject to delete a state object */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crHashtableDelete(g->shared->textureTable, texture, crStateDeleteTextureCallback);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync DIRTY(tb->current[t->curTextureUnit], g->neg_bitid);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid STATE_APIENTRY crStateBindTexture(GLenum target, GLuint texture)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glBindTexture called in Begin/End");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* Special Case name = 0 */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[t->curTextureUnit].currentTexture1D = &(t->base1D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[t->curTextureUnit].currentTexture2D = &(t->base2D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[t->curTextureUnit].currentTexture3D = &(t->base3D);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "Invalid target passed to glBindTexture: %d", target);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[t->curTextureUnit].currentTextureCubeMap = &(t->baseCubeMap);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "Invalid target passed to glBindTexture: %d", target);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[t->curTextureUnit].currentTextureRect = &(t->baseRect);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "Invalid target passed to glBindTexture: %d", target);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync DIRTY(tb->current[t->curTextureUnit], g->neg_bitid);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* texture != 0 */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* Get the texture */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* Check the targets */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* Target isn't set so set it now.*/
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync && !((target==GL_TEXTURE_RECTANGLE_NV && tobj->target==GL_TEXTURE_2D)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ||(target==GL_TEXTURE_2D && tobj->target==GL_TEXTURE_RECTANGLE_NV)))
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crWarning( "You called glBindTexture with a target of 0x%x, but the texture you wanted was target 0x%x [1D: %x 2D: %x 3D: %x cube: %x]", (int) target, (int) tobj->target, GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP );
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "Attempt to bind a texture of different dimensions");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* Set the current texture */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[t->curTextureUnit].currentTexture1D = tobj;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[t->curTextureUnit].currentTexture2D = tobj;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[t->curTextureUnit].currentTexture3D = tobj;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[t->curTextureUnit].currentTextureCubeMap = tobj;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync t->unit[t->curTextureUnit].currentTextureRect = tobj;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync "Invalid target passed to glBindTexture: %d", target);
void STATE_APIENTRY
FLUSH();
if (!tobj) {
switch (pname)
case GL_TEXTURE_MIN_FILTER:
if (e != GL_NEAREST &&
e != GL_LINEAR &&
e != GL_NEAREST_MIPMAP_NEAREST &&
e != GL_LINEAR_MIPMAP_NEAREST &&
e != GL_NEAREST_MIPMAP_LINEAR &&
e != GL_LINEAR_MIPMAP_LINEAR)
case GL_TEXTURE_MAG_FILTER:
case GL_TEXTURE_WRAP_S:
#ifdef CR_OPENGL_VERSION_1_2
else if (e == GL_CLAMP_TO_EDGE) {
#ifdef GL_CLAMP_TO_EDGE_EXT
#ifdef CR_ARB_texture_border_clamp
#ifdef CR_ATI_texture_mirror_once
else if ((e == GL_MIRROR_CLAMP_ATI || e == GL_MIRROR_CLAMP_TO_EDGE_ATI) && g->extensions.ATI_texture_mirror_once) {
case GL_TEXTURE_WRAP_T:
#ifdef CR_OPENGL_VERSION_1_2
else if (e == GL_CLAMP_TO_EDGE) {
#ifdef GL_CLAMP_TO_EDGE_EXT
#ifdef CR_ARB_texture_border_clamp
#ifdef CR_ATI_texture_mirror_once
else if ((e == GL_MIRROR_CLAMP_ATI || e == GL_MIRROR_CLAMP_TO_EDGE_ATI) && g->extensions.ATI_texture_mirror_once) {
#ifdef CR_OPENGL_VERSION_1_2
case GL_TEXTURE_WRAP_R:
else if (e == GL_CLAMP_TO_EDGE) {
#ifdef GL_CLAMP_TO_EDGE_EXT
#ifdef CR_ARB_texture_border_clamp
#ifdef CR_ATI_texture_mirror_once
else if ((e == GL_MIRROR_CLAMP_ATI || e == GL_MIRROR_CLAMP_TO_EDGE_ATI) && g->extensions.ATI_texture_mirror_once) {
case GL_TEXTURE_PRIORITY:
case GL_TEXTURE_MIN_LOD:
case GL_TEXTURE_MAX_LOD:
case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL:
case GL_TEXTURE_BORDER_COLOR:
#ifdef CR_ARB_depth_texture
#ifdef CR_ARB_shadow
#ifdef CR_EXT_shadow_funcs
#ifdef CR_ARB_shadow_ambient
#ifdef CR_SGIS_generate_mipmap
case GL_GENERATE_MIPMAP_SGIS:
void STATE_APIENTRY
switch (pname)
case GL_TEXTURE_MIN_FILTER:
case GL_TEXTURE_MAG_FILTER:
case GL_TEXTURE_WRAP_S:
case GL_TEXTURE_WRAP_T:
#ifdef CR_OPENGL_VERSION_1_2
case GL_TEXTURE_WRAP_R:
case GL_TEXTURE_PRIORITY:
case GL_TEXTURE_MIN_LOD:
case GL_TEXTURE_MAX_LOD:
case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL:
#ifdef CR_ARB_depth_texture
#ifdef CR_ARB_shadow
#ifdef CR_ARB_shadow_ambinet
#ifdef CR_SGIS_generate_mipmap
case GL_GENERATE_MIPMAP_SGIS:
case GL_TEXTURE_BORDER_COLOR:
void STATE_APIENTRY
void STATE_APIENTRY
void STATE_APIENTRY
GLenum e;
GLcolorf c;
(void) stage;
FLUSH();
switch (pname)
case GL_TEXTURE_ENV_MODE:
if (e != GL_MODULATE &&
e != GL_DECAL &&
e != GL_BLEND &&
e != GL_ADD &&
e != GL_REPLACE &&
e != GL_COMBINE_ARB)
case GL_TEXTURE_ENV_COLOR:
c.r = param[0];
#ifdef CR_ARB_texture_env_combine
case GL_COMBINE_RGB_ARB:
(e == GL_REPLACE ||
e == GL_MODULATE ||
e == GL_ADD ||
e == GL_ADD_SIGNED_ARB ||
e == GL_INTERPOLATE_ARB ||
e == GL_SUBTRACT_ARB)) {
#ifdef CR_ARB_texture_env_dot3
(e == GL_DOT3_RGB_ARB ||
e == GL_DOT3_RGBA_ARB ||
e == GL_DOT3_RGB_EXT ||
e == GL_DOT3_RGBA_EXT)) {
case GL_COMBINE_ALPHA_EXT:
(e == GL_REPLACE ||
e == GL_MODULATE ||
e == GL_ADD ||
e == GL_ADD_SIGNED_ARB ||
e == GL_INTERPOLATE_ARB ||
e == GL_SUBTRACT_ARB)) {
case GL_SOURCE0_RGB_ARB:
case GL_SOURCE1_RGB_ARB:
case GL_SOURCE2_RGB_ARB:
(e == GL_TEXTURE ||
e == GL_CONSTANT_ARB ||
e == GL_PRIMARY_COLOR_ARB ||
e == GL_PREVIOUS_ARB)) {
e >= GL_TEXTURE0_ARB &&
case GL_SOURCE0_ALPHA_ARB:
case GL_SOURCE1_ALPHA_ARB:
case GL_SOURCE2_ALPHA_ARB:
(e == GL_TEXTURE ||
e == GL_CONSTANT_ARB ||
e == GL_PRIMARY_COLOR_ARB ||
e == GL_PREVIOUS_ARB)) {
e >= GL_TEXTURE0_ARB &&
case GL_OPERAND0_RGB_ARB:
case GL_OPERAND1_RGB_ARB:
case GL_OPERAND2_RGB_ARB:
(e == GL_SRC_COLOR ||
e == GL_ONE_MINUS_SRC_COLOR ||
e == GL_SRC_ALPHA ||
e == GL_ONE_MINUS_SRC_ALPHA)) {
case GL_OPERAND0_ALPHA_ARB:
case GL_OPERAND1_ALPHA_ARB:
case GL_OPERAND2_ALPHA_ARB:
(e == GL_SRC_ALPHA ||
e == GL_ONE_MINUS_SRC_ALPHA)) {
case GL_RGB_SCALE_ARB:
case GL_ALPHA_SCALE:
void STATE_APIENTRY
switch (pname) {
case GL_TEXTURE_ENV_MODE:
case GL_TEXTURE_ENV_COLOR:
#ifdef CR_ARB_texture_env_combine
case GL_COMBINE_RGB_ARB:
case GL_COMBINE_ALPHA_EXT:
case GL_SOURCE0_RGB_ARB:
case GL_SOURCE1_RGB_ARB:
case GL_SOURCE2_RGB_ARB:
case GL_SOURCE0_ALPHA_ARB:
case GL_SOURCE1_ALPHA_ARB:
case GL_SOURCE2_ALPHA_ARB:
case GL_OPERAND0_RGB_ARB:
case GL_OPERAND1_RGB_ARB:
case GL_OPERAND2_RGB_ARB:
case GL_OPERAND0_ALPHA_ARB:
case GL_OPERAND1_ALPHA_ARB:
case GL_OPERAND2_ALPHA_ARB:
case GL_RGB_SCALE_ARB:
case GL_ALPHA_SCALE:
#ifdef CR_EXT_texture_lod_bias
case GL_TEXTURE_LOD_BIAS_EXT:
#ifdef CR_ARB_point_sprite
case GL_COORD_REPLACE_ARB:
void STATE_APIENTRY
void STATE_APIENTRY
void STATE_APIENTRY
switch (pname) {
case GL_TEXTURE_ENV_MODE:
case GL_TEXTURE_ENV_COLOR:
case GL_COMBINE_RGB_ARB:
case GL_COMBINE_ALPHA_ARB:
case GL_SOURCE0_RGB_ARB:
case GL_SOURCE1_RGB_ARB:
case GL_SOURCE2_RGB_ARB:
case GL_SOURCE0_ALPHA_ARB:
case GL_SOURCE1_ALPHA_ARB:
case GL_SOURCE2_ALPHA_ARB:
case GL_OPERAND0_RGB_ARB:
case GL_OPERAND1_RGB_ARB:
case GL_OPERAND2_RGB_ARB:
case GL_OPERAND0_ALPHA_ARB:
case GL_OPERAND1_ALPHA_ARB:
case GL_OPERAND2_ALPHA_ARB:
case GL_RGB_SCALE_ARB:
case GL_ALPHA_SCALE:
void STATE_APIENTRY
switch (pname) {
case GL_TEXTURE_ENV_MODE:
case GL_TEXTURE_ENV_COLOR:
case GL_COMBINE_RGB_ARB:
case GL_COMBINE_ALPHA_ARB:
case GL_SOURCE0_RGB_ARB:
case GL_SOURCE1_RGB_ARB:
case GL_SOURCE2_RGB_ARB:
case GL_SOURCE0_ALPHA_ARB:
case GL_SOURCE1_ALPHA_ARB:
case GL_SOURCE2_ALPHA_ARB:
case GL_OPERAND0_RGB_ARB:
case GL_OPERAND1_RGB_ARB:
case GL_OPERAND2_RGB_ARB:
case GL_OPERAND0_ALPHA_ARB:
case GL_OPERAND1_ALPHA_ARB:
case GL_OPERAND2_ALPHA_ARB:
case GL_RGB_SCALE_ARB:
case GL_ALPHA_SCALE:
void STATE_APIENTRY
GLvectorf v;
GLenum e;
FLUSH();
switch (coord)
case GL_S:
switch (pname)
case GL_TEXTURE_GEN_MODE:
if (e == GL_OBJECT_LINEAR ||
e == GL_EYE_LINEAR ||
e == GL_SPHERE_MAP
#if defined(GL_ARB_texture_cube_map) || defined(GL_EXT_texture_cube_map) || defined(GL_NV_texgen_reflection)
case GL_OBJECT_PLANE:
case GL_EYE_PLANE:
case GL_T:
switch (pname) {
case GL_TEXTURE_GEN_MODE:
if (e == GL_OBJECT_LINEAR ||
e == GL_EYE_LINEAR ||
e == GL_SPHERE_MAP
#if defined(GL_ARB_texture_cube_map) || defined(GL_EXT_texture_cube_map) || defined(GL_NV_texgen_reflection)
case GL_OBJECT_PLANE:
case GL_EYE_PLANE:
case GL_R:
switch (pname) {
case GL_TEXTURE_GEN_MODE:
if (e == GL_OBJECT_LINEAR ||
e == GL_EYE_LINEAR ||
e == GL_SPHERE_MAP
#if defined(GL_ARB_texture_cube_map) || defined(GL_EXT_texture_cube_map) || defined(GL_NV_texgen_reflection)
case GL_OBJECT_PLANE:
case GL_EYE_PLANE:
case GL_Q:
switch (pname) {
case GL_TEXTURE_GEN_MODE:
if (e == GL_OBJECT_LINEAR ||
e == GL_EYE_LINEAR ||
e == GL_SPHERE_MAP
#if defined(GL_ARB_texture_cube_map) || defined(GL_EXT_texture_cube_map) || defined(GL_NV_texgen_reflection)
case GL_OBJECT_PLANE:
case GL_EYE_PLANE:
void STATE_APIENTRY
switch (pname)
case GL_TEXTURE_GEN_MODE:
case GL_OBJECT_PLANE:
case GL_EYE_PLANE:
void STATE_APIENTRY
switch (pname)
case GL_TEXTURE_GEN_MODE:
case GL_OBJECT_PLANE:
case GL_EYE_PLANE:
void STATE_APIENTRY
void STATE_APIENTRY
void STATE_APIENTRY
void STATE_APIENTRY
switch (pname) {
case GL_TEXTURE_GEN_MODE:
switch (coord) {
case GL_S:
case GL_T:
case GL_R:
case GL_Q:
case GL_OBJECT_PLANE:
switch (coord) {
case GL_S:
case GL_T:
case GL_R:
case GL_Q:
case GL_EYE_PLANE:
switch (coord) {
case GL_S:
case GL_T:
case GL_R:
case GL_Q:
void STATE_APIENTRY
switch (pname) {
case GL_TEXTURE_GEN_MODE:
switch (coord) {
case GL_S:
case GL_T:
case GL_R:
case GL_Q:
case GL_OBJECT_PLANE:
switch (coord) {
case GL_S:
case GL_T:
case GL_R:
case GL_Q:
case GL_EYE_PLANE:
switch (coord) {
case GL_S:
case GL_T:
case GL_R:
case GL_Q:
void STATE_APIENTRY
switch (pname) {
case GL_TEXTURE_GEN_MODE:
switch (coord) {
case GL_S:
case GL_T:
case GL_R:
case GL_Q:
case GL_OBJECT_PLANE:
switch (coord) {
case GL_S:
case GL_T:
case GL_R:
case GL_Q:
case GL_EYE_PLANE:
switch (coord) {
case GL_S:
case GL_T:
case GL_R:
case GL_Q:
void STATE_APIENTRY
if (!timg)
switch (pname)
case GL_TEXTURE_WIDTH:
case GL_TEXTURE_HEIGHT:
#ifdef CR_OPENGL_VERSION_1_2
case GL_TEXTURE_DEPTH:
case GL_TEXTURE_BORDER:
case GL_TEXTURE_RED_SIZE:
case GL_TEXTURE_GREEN_SIZE:
case GL_TEXTURE_BLUE_SIZE:
case GL_TEXTURE_ALPHA_SIZE:
pname);
void STATE_APIENTRY
if (!timg)
target);
switch (pname)
case GL_TEXTURE_WIDTH:
case GL_TEXTURE_HEIGHT:
#ifdef CR_OPENGL_VERSION_1_2
case GL_TEXTURE_DEPTH:
case GL_TEXTURE_BORDER:
case GL_TEXTURE_RED_SIZE:
case GL_TEXTURE_GREEN_SIZE:
case GL_TEXTURE_BLUE_SIZE:
case GL_TEXTURE_ALPHA_SIZE:
case GL_TEXTURE_DEPTH_SIZE:
pname);
void STATE_APIENTRY
if (!tobj)
switch (pname)
case GL_TEXTURE_MAG_FILTER:
case GL_TEXTURE_MIN_FILTER:
case GL_TEXTURE_WRAP_S:
case GL_TEXTURE_WRAP_T:
#ifdef CR_OPENGL_VERSION_1_2
case GL_TEXTURE_WRAP_R:
case GL_TEXTURE_PRIORITY:
case GL_TEXTURE_BORDER_COLOR:
#ifdef CR_ARB_depth_texture
#ifdef CR_ARB_shadow
#ifdef CR_ARB_shadow_ambient
#ifdef CR_SGIS_generate_mipmap
case GL_GENERATE_MIPMAP_SGIS:
#ifdef CR_OPENGL_VERSION_1_2
case GL_TEXTURE_MIN_LOD:
case GL_TEXTURE_MAX_LOD:
case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL:
case GL_TEXTURE_LOD_BIAS_EXT:
case GL_TEXTURE_RESIDENT:
void STATE_APIENTRY
if (!tobj)
switch (pname)
case GL_TEXTURE_MAG_FILTER:
case GL_TEXTURE_MIN_FILTER:
case GL_TEXTURE_WRAP_S:
case GL_TEXTURE_WRAP_T:
#ifdef CR_OPENGL_VERSION_1_2
case GL_TEXTURE_WRAP_R:
case GL_TEXTURE_PRIORITY:
case GL_TEXTURE_BORDER_COLOR:
#ifdef CR_OPENGL_VERSION_1_2
case GL_TEXTURE_MIN_LOD:
case GL_TEXTURE_MAX_LOD:
case GL_TEXTURE_BASE_LEVEL:
case GL_TEXTURE_MAX_LEVEL:
#ifdef CR_ARB_depth_texture
#ifdef CR_ARB_shadow
#ifdef CR_ARB_shadow_ambient
#ifdef CR_SGIS_generate_mipmap
case GL_GENERATE_MIPMAP_SGIS:
case GL_TEXTURE_RESIDENT:
void STATE_APIENTRY
UNUSED(n);
UNUSED(n);
return GL_TRUE;
(void) key;
#ifdef DEBUG_misha
if (id)
if (tobj)
#ifndef IN_GUEST
#ifdef DEBUG_misha