X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Ftexstate.c;h=6e0c0c688a19ac3171b7e1b86936ffbbab5f038c;hb=9b70c33e735ff060ddad7d0b501d19c670f41618;hp=672a125bf1ba66dc715a0aa988e7432f078360bf;hpb=7e0f47c1348273ed3bb39d00aa4a9498a28b8d6a;p=mesa.git diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index 672a125bf1b..6e0c0c688a1 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -95,6 +95,11 @@ _mesa_copy_texture_state( const GLcontext *src, GLcontext *dst ) /* GL_EXT_texture_env_combine */ dst->Texture.Unit[u].Combine = src->Texture.Unit[u].Combine; + /* GL_ATI_envmap_bumpmap - need this? */ + dst->Texture.Unit[u].BumpTarget = src->Texture.Unit[u].BumpTarget; + COPY_4V(dst->Texture.Unit[u].RotMatrix, src->Texture.Unit[u].RotMatrix); + + /* copy texture object bindings, not contents of texture objects */ _mesa_lock_context_textures(dst); @@ -174,11 +179,14 @@ calculate_derived_texenv( struct gl_tex_env_combine_state *state, case GL_LUMINANCE: case GL_RGB: case GL_YCBCR_MESA: + case GL_DUDV_ATI: state->SourceA[0] = GL_PREVIOUS; break; default: - _mesa_problem(NULL, "Invalid texBaseFormat in calculate_derived_texenv"); + _mesa_problem(NULL, + "Invalid texBaseFormat 0x%x in calculate_derived_texenv", + texBaseFormat); return; } @@ -211,6 +219,7 @@ calculate_derived_texenv( struct gl_tex_env_combine_state *state, break; case GL_RGB: case GL_YCBCR_MESA: + case GL_DUDV_ATI: mode_rgb = GL_REPLACE; break; case GL_RGBA: @@ -237,6 +246,7 @@ calculate_derived_texenv( struct gl_tex_env_combine_state *state, case GL_LUMINANCE_ALPHA: case GL_RGBA: case GL_YCBCR_MESA: + case GL_DUDV_ATI: state->SourceRGB[2] = GL_TEXTURE; state->SourceA[2] = GL_TEXTURE; state->SourceRGB[0] = GL_CONSTANT; @@ -252,7 +262,8 @@ calculate_derived_texenv( struct gl_tex_env_combine_state *state, default: _mesa_problem(NULL, - "Invalid texture env mode in calculate_derived_texenv"); + "Invalid texture env mode 0x%x in calculate_derived_texenv", + mode); return; } @@ -353,37 +364,6 @@ update_texture_matrices( GLcontext *ctx ) } -/** - * Update texture object's _Function field. We need to do this - * whenever any of the texture object's shadow-related fields change - * or when we start/stop using a fragment program. - * - * This function could be expanded someday to update additional per-object - * fields that depend on assorted state changes. - */ -static void -update_texture_compare_function(GLcontext *ctx, - struct gl_texture_object *tObj) -{ - /* XXX temporarily disable this test since it breaks the GLSL - * shadow2D(), etc. functions. - */ - if (0 /*ctx->FragmentProgram._Current*/) { - /* Texel/coordinate comparison is ignored for programs. - * See GL_ARB_fragment_program/shader spec for details. - */ - tObj->_Function = GL_NONE; - } - else if (tObj->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB) { - /* GL_ARB_shadow */ - tObj->_Function = tObj->CompareFunc; - } - else { - tObj->_Function = GL_NONE; /* pass depth through as grayscale */ - } -} - - /** * Examine texture unit's combine/env state to update derived state. */ @@ -442,6 +422,10 @@ update_tex_combine(GLcontext *ctx, struct gl_texture_unit *texUnit) case GL_MODULATE_SUBTRACT_ATI: combine->_NumArgsRGB = 3; break; + case GL_BUMP_ENVMAP_ATI: + /* no real arguments for this case */ + combine->_NumArgsRGB = 0; + break; default: combine->_NumArgsRGB = 0; _mesa_problem(ctx, "invalid RGB combine mode in update_texture_state"); @@ -549,13 +533,13 @@ update_texture_state( GLcontext *ctx ) enabledTargets = enabledVertTargets | enabledFragTargets; + texUnit->_ReallyEnabled = 0x0; + if (enabledTargets == 0x0) { /* neither vertex nor fragment processing uses this unit */ continue; } - texUnit->_ReallyEnabled = 0x0; - /* Look for the highest priority texture target that's enabled (or used * by the vert/frag shaders) and "complete". That's the one we'll use * for texturing. If we're using vert/frag program we're guaranteed @@ -576,11 +560,20 @@ update_texture_state( GLcontext *ctx ) } } - if (texUnit->_Current) - update_texture_compare_function(ctx, texUnit->_Current); - if (!texUnit->_ReallyEnabled) { - continue; + if (fprog) { + /* If we get here it means the shader is expecting a texture + * object, but there isn't one (or it's incomplete). Use the + * fallback texture. + */ + struct gl_texture_object *texObj = _mesa_get_fallback_texture(ctx); + texUnit->_ReallyEnabled = 1 << TEXTURE_2D_INDEX; + _mesa_reference_texobj(&texUnit->_Current, texObj); + } + else { + /* fixed-function: texture unit is really disabled */ + continue; + } } /* if we get here, we know this texture unit is enabled */ @@ -715,6 +708,7 @@ init_texture_unit( GLcontext *ctx, GLuint unit ) texUnit->Combine = default_combine_state; texUnit->_EnvMode = default_combine_state; texUnit->_CurrentCombine = & texUnit->_EnvMode; + texUnit->BumpTarget = GL_TEXTURE0; texUnit->TexGenEnabled = 0x0; texUnit->GenS.Mode = GL_EYE_LINEAR; @@ -735,6 +729,16 @@ init_texture_unit( GLcontext *ctx, GLuint unit ) ASSIGN_4V( texUnit->GenT.EyePlane, 0.0, 1.0, 0.0, 0.0 ); ASSIGN_4V( texUnit->GenR.EyePlane, 0.0, 0.0, 0.0, 0.0 ); ASSIGN_4V( texUnit->GenQ.EyePlane, 0.0, 0.0, 0.0, 0.0 ); + ASSIGN_4V( texUnit->GenS.ObjectPlane, 1.0, 0.0, 0.0, 0.0 ); + ASSIGN_4V( texUnit->GenT.ObjectPlane, 0.0, 1.0, 0.0, 0.0 ); + ASSIGN_4V( texUnit->GenR.ObjectPlane, 0.0, 0.0, 0.0, 0.0 ); + ASSIGN_4V( texUnit->GenQ.ObjectPlane, 0.0, 0.0, 0.0, 0.0 ); + ASSIGN_4V( texUnit->GenS.EyePlane, 1.0, 0.0, 0.0, 0.0 ); + ASSIGN_4V( texUnit->GenT.EyePlane, 0.0, 1.0, 0.0, 0.0 ); + ASSIGN_4V( texUnit->GenR.EyePlane, 0.0, 0.0, 0.0, 0.0 ); + ASSIGN_4V( texUnit->GenQ.EyePlane, 0.0, 0.0, 0.0, 0.0 ); + /* no mention of this in spec, but maybe id matrix expected? */ + ASSIGN_4V( texUnit->RotMatrix, 1.0, 0.0, 0.0, 1.0 ); /* initialize current texture object ptrs to the shared default objects */ for (tex = 0; tex < NUM_TEXTURE_TARGETS; tex++) { @@ -787,6 +791,9 @@ _mesa_free_texture_data(GLcontext *ctx) /* unreference current textures */ for (u = 0; u < MAX_TEXTURE_IMAGE_UNITS; u++) { + /* The _Current texture could account for another reference */ + _mesa_reference_texobj(&ctx->Texture.Unit[u]._Current, NULL); + for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) { _mesa_reference_texobj(&ctx->Texture.Unit[u].CurrentTex[tgt], NULL); }