📄 attrib.c
字号:
/* texture unit enables */ for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { if (ctx->Texture.Unit[i].Enabled != enable->Texture[i]) { ctx->Texture.Unit[i].Enabled = enable->Texture[i]; if (ctx->Driver.Enable) { if (ctx->Driver.ActiveTexture) { (*ctx->Driver.ActiveTexture)(ctx, i); } (*ctx->Driver.Enable)( ctx, GL_TEXTURE_1D, (GLboolean) (enable->Texture[i] & TEXTURE_1D_BIT) ); (*ctx->Driver.Enable)( ctx, GL_TEXTURE_2D, (GLboolean) (enable->Texture[i] & TEXTURE_2D_BIT) ); (*ctx->Driver.Enable)( ctx, GL_TEXTURE_3D, (GLboolean) (enable->Texture[i] & TEXTURE_3D_BIT) ); if (ctx->Extensions.ARB_texture_cube_map) (*ctx->Driver.Enable)( ctx, GL_TEXTURE_CUBE_MAP_ARB, (GLboolean) (enable->Texture[i] & TEXTURE_CUBE_BIT) ); if (ctx->Extensions.NV_texture_rectangle) (*ctx->Driver.Enable)( ctx, GL_TEXTURE_RECTANGLE_NV, (GLboolean) (enable->Texture[i] & TEXTURE_RECT_BIT) ); } } if (ctx->Texture.Unit[i].TexGenEnabled != enable->TexGen[i]) { ctx->Texture.Unit[i].TexGenEnabled = enable->TexGen[i]; if (ctx->Driver.Enable) { if (ctx->Driver.ActiveTexture) { (*ctx->Driver.ActiveTexture)(ctx, i); } if (enable->TexGen[i] & S_BIT) (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_S, GL_TRUE); else (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_S, GL_FALSE); if (enable->TexGen[i] & T_BIT) (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_T, GL_TRUE); else (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_T, GL_FALSE); if (enable->TexGen[i] & R_BIT) (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_R, GL_TRUE); else (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_R, GL_FALSE); if (enable->TexGen[i] & Q_BIT) (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_Q, GL_TRUE); else (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_Q, GL_FALSE); } } /* GL_SGI_texture_color_table */ ctx->Texture.Unit[i].ColorTableEnabled = enable->TextureColorTable[i]; } if (ctx->Driver.ActiveTexture) { (*ctx->Driver.ActiveTexture)(ctx, ctx->Texture.CurrentUnit); }}/** * Pop/restore texture attribute/group state. */static voidpop_texture_group(GLcontext *ctx, struct texture_state *texstate){ GLuint u; _mesa_lock_context_textures(ctx); for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { const struct gl_texture_unit *unit = &texstate->Texture.Unit[u]; GLuint tgt; _mesa_ActiveTextureARB(GL_TEXTURE0_ARB + u); _mesa_set_enable(ctx, GL_TEXTURE_1D, (unit->Enabled & TEXTURE_1D_BIT) ? GL_TRUE : GL_FALSE); _mesa_set_enable(ctx, GL_TEXTURE_2D, (unit->Enabled & TEXTURE_2D_BIT) ? GL_TRUE : GL_FALSE); _mesa_set_enable(ctx, GL_TEXTURE_3D, (unit->Enabled & TEXTURE_3D_BIT) ? GL_TRUE : GL_FALSE); if (ctx->Extensions.ARB_texture_cube_map) { _mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP_ARB, (unit->Enabled & TEXTURE_CUBE_BIT) ? GL_TRUE : GL_FALSE); } if (ctx->Extensions.NV_texture_rectangle) { _mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE_NV, (unit->Enabled & TEXTURE_RECT_BIT) ? GL_TRUE : GL_FALSE); } if (ctx->Extensions.SGI_texture_color_table) { _mesa_set_enable(ctx, GL_TEXTURE_COLOR_TABLE_SGI, unit->ColorTableEnabled); } _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, unit->EnvMode); _mesa_TexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, unit->EnvColor); _mesa_TexGeni(GL_S, GL_TEXTURE_GEN_MODE, unit->GenModeS); _mesa_TexGeni(GL_T, GL_TEXTURE_GEN_MODE, unit->GenModeT); _mesa_TexGeni(GL_R, GL_TEXTURE_GEN_MODE, unit->GenModeR); _mesa_TexGeni(GL_Q, GL_TEXTURE_GEN_MODE, unit->GenModeQ); _mesa_TexGenfv(GL_S, GL_OBJECT_PLANE, unit->ObjectPlaneS); _mesa_TexGenfv(GL_T, GL_OBJECT_PLANE, unit->ObjectPlaneT); _mesa_TexGenfv(GL_R, GL_OBJECT_PLANE, unit->ObjectPlaneR); _mesa_TexGenfv(GL_Q, GL_OBJECT_PLANE, unit->ObjectPlaneQ); /* Eye plane done differently to avoid re-transformation */ { struct gl_texture_unit *destUnit = &ctx->Texture.Unit[u]; COPY_4FV(destUnit->EyePlaneS, unit->EyePlaneS); COPY_4FV(destUnit->EyePlaneT, unit->EyePlaneT); COPY_4FV(destUnit->EyePlaneR, unit->EyePlaneR); COPY_4FV(destUnit->EyePlaneQ, unit->EyePlaneQ); if (ctx->Driver.TexGen) { ctx->Driver.TexGen(ctx, GL_S, GL_EYE_PLANE, unit->EyePlaneS); ctx->Driver.TexGen(ctx, GL_T, GL_EYE_PLANE, unit->EyePlaneT); ctx->Driver.TexGen(ctx, GL_R, GL_EYE_PLANE, unit->EyePlaneR); ctx->Driver.TexGen(ctx, GL_Q, GL_EYE_PLANE, unit->EyePlaneQ); } } _mesa_set_enable(ctx, GL_TEXTURE_GEN_S, ((unit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE)); _mesa_set_enable(ctx, GL_TEXTURE_GEN_T, ((unit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE)); _mesa_set_enable(ctx, GL_TEXTURE_GEN_R, ((unit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE)); _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, ((unit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE)); if (ctx->Extensions.EXT_texture_lod_bias) { _mesa_TexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, unit->LodBias); } if (ctx->Extensions.EXT_texture_env_combine || ctx->Extensions.ARB_texture_env_combine) { _mesa_TexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, unit->Combine.ModeRGB); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, unit->Combine.ModeA); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, unit->Combine.SourceRGB[0]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, unit->Combine.SourceRGB[1]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, unit->Combine.SourceRGB[2]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, unit->Combine.SourceA[0]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, unit->Combine.SourceA[1]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, unit->Combine.SourceA[2]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, unit->Combine.OperandRGB[0]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, unit->Combine.OperandRGB[1]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, unit->Combine.OperandRGB[2]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, unit->Combine.OperandA[0]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, unit->Combine.OperandA[1]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, unit->Combine.OperandA[2]); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 1 << unit->Combine.ScaleShiftRGB); _mesa_TexEnvi(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1 << unit->Combine.ScaleShiftA); } /* Restore texture object state for each target */ for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) { const struct gl_texture_object *obj = NULL; GLfloat bordColor[4]; GLenum target; obj = &texstate->SavedObj[u][tgt]; /* don't restore state for unsupported targets to prevent * raising GL errors. */ if (obj->Target == GL_TEXTURE_CUBE_MAP_ARB && !ctx->Extensions.ARB_texture_cube_map) { continue; } else if (obj->Target == GL_TEXTURE_RECTANGLE_NV && !ctx->Extensions.NV_texture_rectangle) { continue; } else if ((obj->Target == GL_TEXTURE_1D_ARRAY_EXT || obj->Target == GL_TEXTURE_2D_ARRAY_EXT) && !ctx->Extensions.MESA_texture_array) { continue; } target = obj->Target; _mesa_BindTexture(target, obj->Name); bordColor[0] = CHAN_TO_FLOAT(obj->BorderColor[0]); bordColor[1] = CHAN_TO_FLOAT(obj->BorderColor[1]); bordColor[2] = CHAN_TO_FLOAT(obj->BorderColor[2]); bordColor[3] = CHAN_TO_FLOAT(obj->BorderColor[3]); _mesa_TexParameterfv(target, GL_TEXTURE_BORDER_COLOR, bordColor); _mesa_TexParameterf(target, GL_TEXTURE_PRIORITY, obj->Priority); _mesa_TexParameteri(target, GL_TEXTURE_WRAP_S, obj->WrapS); _mesa_TexParameteri(target, GL_TEXTURE_WRAP_T, obj->WrapT); _mesa_TexParameteri(target, GL_TEXTURE_WRAP_R, obj->WrapR); _mesa_TexParameteri(target, GL_TEXTURE_MIN_FILTER, obj->MinFilter); _mesa_TexParameteri(target, GL_TEXTURE_MAG_FILTER, obj->MagFilter); _mesa_TexParameterf(target, GL_TEXTURE_MIN_LOD, obj->MinLod); _mesa_TexParameterf(target, GL_TEXTURE_MAX_LOD, obj->MaxLod); _mesa_TexParameterf(target, GL_TEXTURE_LOD_BIAS, obj->LodBias); _mesa_TexParameteri(target, GL_TEXTURE_BASE_LEVEL, obj->BaseLevel); if (target != GL_TEXTURE_RECTANGLE_ARB) _mesa_TexParameteri(target, GL_TEXTURE_MAX_LEVEL, obj->MaxLevel); if (ctx->Extensions.EXT_texture_filter_anisotropic) { _mesa_TexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, obj->MaxAnisotropy); } if (ctx->Extensions.SGIX_shadow) { _mesa_TexParameteri(target, GL_TEXTURE_COMPARE_SGIX, obj->CompareFlag); _mesa_TexParameteri(target, GL_TEXTURE_COMPARE_OPERATOR_SGIX, obj->CompareOperator); } if (ctx->Extensions.SGIX_shadow_ambient) { _mesa_TexParameterf(target, GL_SHADOW_AMBIENT_SGIX, obj->ShadowAmbient); } } /* remove saved references to the texture objects */ for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) { _mesa_reference_texobj(&texstate->SavedTexRef[u][tgt], NULL); } } _mesa_ActiveTextureARB(GL_TEXTURE0_ARB + texstate->Texture.CurrentUnit); _mesa_unlock_context_textures(ctx);}/* * This function is kind of long just because we have to call a lot * of device driver functions to update device driver state. * * XXX As it is now, most of the pop-code calls immediate-mode Mesa functions * in order to restore GL state. This isn't terribly efficient but it * ensures that dirty flags and any derived state gets updated correctly. * We could at least check if the value to restore equals the current value * and then skip the Mesa call. */void GLAPIENTRY_mesa_PopAttrib(void){ struct gl_attrib_node *attr, *next; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); if (ctx->AttribStackDepth == 0) { _mesa_error( ctx, GL_STACK_UNDERFLOW, "glPopAttrib" ); return; } ctx->AttribStackDepth--; attr = ctx->AttribStack[ctx->AttribStackDepth]; while (attr) { if (MESA_VERBOSE & VERBOSE_API) { _mesa_debug(ctx, "glPopAttrib %s\n", _mesa_lookup_enum_by_nr(attr->kind)); } switch (attr->kind) { case GL_ACCUM_BUFFER_BIT: { const struct gl_accum_attrib *accum; accum = (const struct gl_accum_attrib *) attr->data; _mesa_ClearAccum(accum->ClearColor[0], accum->ClearColor[1], accum->ClearColor[2], accum->ClearColor[3]); } break; case GL_COLOR_BUFFER_BIT: { const struct gl_colorbuffer_attrib *color; color = (const struct gl_colorbuffer_attrib *) attr->data; _mesa_ClearIndex((GLfloat) color->ClearIndex); _mesa_ClearColor(color->ClearColor[0], color->ClearColor[1], color->ClearColor[2], color->ClearColor[3]); _mesa_IndexMask(color->IndexMask); _mesa_ColorMask((GLboolean) (color->ColorMask[0] != 0), (GLboolean) (color->ColorMask[1] != 0), (GLboolean) (color->ColorMask[2] != 0), (GLboolean) (color->ColorMask[3] != 0)); { /* Need to determine if more than one color output is * specified. If so, call glDrawBuffersARB, else call * glDrawBuffer(). This is a subtle, but essential point
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -