📄 attrib.c
字号:
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 (i = 0; i < NUM_TEXTURE_TARGETS; i++) {
GLenum target = 0;
const struct gl_texture_object *obj = NULL;
GLfloat bordColor[4];
switch (i) {
case 0:
target = GL_TEXTURE_1D;
obj = &unit->Saved1D;
break;
case 1:
target = GL_TEXTURE_2D;
obj = &unit->Saved2D;
break;
case 2:
target = GL_TEXTURE_3D;
obj = &unit->Saved3D;
break;
case 3:
if (!ctx->Extensions.ARB_texture_cube_map)
continue;
target = GL_TEXTURE_CUBE_MAP_ARB;
obj = &unit->SavedCubeMap;
break;
case 4:
if (!ctx->Extensions.NV_texture_rectangle)
continue;
target = GL_TEXTURE_RECTANGLE_NV;
obj = &unit->SavedRect;
break;
default:
; /* silence warnings */
}
_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_TexParameterf(target, GL_TEXTURE_PRIORITY, obj->Priority);
_mesa_TexParameterfv(target, GL_TEXTURE_BORDER_COLOR, bordColor);
_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_TexParameteri(target, GL_TEXTURE_BASE_LEVEL, obj->BaseLevel);
_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);
}
}
}
_mesa_ActiveTextureARB(GL_TEXTURE0_ARB
+ texAttrib->CurrentUnit);
/* "un-bump" the texture object reference counts. We did that so they
* wouldn't inadvertantly get deleted while they were still referenced
* inside the attribute state stack.
*/
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
ctx->Texture.Unit[u].Current1D->RefCount--;
ctx->Texture.Unit[u].Current2D->RefCount--;
ctx->Texture.Unit[u].Current3D->RefCount--;
ctx->Texture.Unit[u].CurrentCubeMap->RefCount--;
ctx->Texture.Unit[u].CurrentRect->RefCount--;
}
}
/*
* 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));
#if 0
_mesa_DrawBuffersARB(ctx->Const.MaxDrawBuffers,
color->DrawBuffer);
#else
_mesa_drawbuffers(ctx, ctx->Const.MaxDrawBuffers,
color->DrawBuffer, NULL);
#endif
_mesa_set_enable(ctx, GL_ALPHA_TEST, color->AlphaEnabled);
_mesa_AlphaFunc(color->AlphaFunc, color->AlphaRef);
_mesa_set_enable(ctx, GL_BLEND, color->BlendEnabled);
_mesa_BlendFuncSeparateEXT(color->BlendSrcRGB,
color->BlendDstRGB,
color->BlendSrcA,
color->BlendDstA);
/* This special case is because glBlendEquationSeparateEXT
* cannot take GL_LOGIC_OP as a parameter.
*/
if ( color->BlendEquationRGB == color->BlendEquationA ) {
_mesa_BlendEquation(color->BlendEquationRGB);
}
else {
_mesa_BlendEquationSeparateEXT(color->BlendEquationRGB,
color->BlendEquationA);
}
_mesa_BlendColor(color->BlendColor[0],
color->BlendColor[1],
color->BlendColor[2],
color->BlendColor[3]);
_mesa_LogicOp(color->LogicOp);
_mesa_set_enable(ctx, GL_COLOR_LOGIC_OP,
color->ColorLogicOpEnabled);
_mesa_set_enable(ctx, GL_INDEX_LOGIC_OP,
color->IndexLogicOpEnabled);
_mesa_set_enable(ctx, GL_DITHER, color->DitherFlag);
}
break;
case GL_CURRENT_BIT:
FLUSH_CURRENT( ctx, 0 );
MEMCPY( &ctx->Current, attr->data,
sizeof(struct gl_current_attrib) );
break;
case GL_DEPTH_BUFFER_BIT:
{
const struct gl_depthbuffer_attrib *depth;
depth = (const struct gl_depthbuffer_attrib *) attr->data;
_mesa_DepthFunc(depth->Func);
_mesa_ClearDepth(depth->Clear);
_mesa_set_enable(ctx, GL_DEPTH_TEST, depth->Test);
_mesa_DepthMask(depth->Mask);
if (ctx->Extensions.HP_occlusion_test)
_mesa_set_enable(ctx, GL_OCCLUSION_TEST_HP,
depth->OcclusionTest);
}
break;
case GL_ENABLE_BIT:
{
const struct gl_enable_attrib *enable;
enable = (const struct gl_enable_attrib *) attr->data;
pop_enable_group(ctx, enable);
ctx->NewState |= _NEW_ALL;
}
break;
case GL_EVAL_BIT:
MEMCPY( &ctx->Eval, attr->data, sizeof(struct gl_eval_attrib) );
ctx->NewState |= _NEW_EVAL;
break;
case GL_FOG_BIT:
{
const struct gl_fog_attrib *fog;
fog = (const struct gl_fog_attrib *) attr->data;
_mesa_set_enable(ctx, GL_FOG, fog->Enabled);
_mesa_Fogfv(GL_FOG_COLOR, fog->Color);
_mesa_Fogf(GL_FOG_DENSITY, fog->Density);
_mesa_Fogf(GL_FOG_START, fog->Start);
_mesa_Fogf(GL_FOG_END, fog->End);
_mesa_Fogf(GL_FOG_INDEX, fog->Index);
_mesa_Fogi(GL_FOG_MODE, fog->Mode);
}
break;
case GL_HINT_BIT:
{
const struct gl_hint_attrib *hint;
hint = (const struct gl_hint_attrib *) attr->data;
_mesa_Hint(GL_PERSPECTIVE_CORRECTION_HINT,
hint->PerspectiveCorrection );
_mesa_Hint(GL_POINT_SMOOTH_HINT, hint->PointSmooth);
_mesa_Hint(GL_LINE_SMOOTH_HINT, hint->LineSmooth);
_mesa_Hint(GL_POLYGON_SMOOTH_HINT, hint->PolygonSmooth);
_mesa_Hint(GL_FOG_HINT, hint->Fog);
_mesa_Hint(GL_CLIP_VOLUME_CLIPPING_HINT_EXT,
hint->ClipVolumeClipping);
if (ctx->Extensions.ARB_texture_compression)
_mesa_Hint(GL_TEXTURE_COMPRESSION_HINT_ARB,
hint->TextureCompression);
}
break;
case GL_LIGHTING_BIT:
{
GLuint i;
const struct gl_light_attrib *light;
light = (const struct gl_light_attrib *) attr->data;
/* lighting enable */
_mesa_set_enable(ctx, GL_LIGHTING, light->Enabled);
/* per-light state */
if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top))
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
for (i = 0; i < MAX_LIGHTS; i++) {
GLenum lgt = (GLenum) (GL_LIGHT0 + i);
const struct gl_light *l = &light->Light[i];
GLfloat tmp[4];
_mesa_set_enable(ctx, lgt, l->Enabled);
_mesa_Lightfv( lgt, GL_AMBIENT, l->Ambient );
_mesa_Lightfv( lgt, GL_DIFFUSE, l->Diffuse );
_mesa_Lightfv( lgt, GL_SPECULAR, l->Specular );
TRANSFORM_POINT( tmp, ctx->ModelviewMatrixStack.Top->inv, l->EyePosition );
_mesa_Lightfv( lgt, GL_POSITION, tmp );
TRANSFORM_POINT( tmp, ctx->ModelviewMatrixStack.Top->m, l->EyeDirection );
_mesa_Lightfv( lgt, GL_SPOT_DIRECTION, tmp );
_mesa_Lightfv( lgt, GL_SPOT_EXPONENT, &l->SpotExponent );
_mesa_Lightfv( lgt, GL_SPOT_CUTOFF, &l->SpotCutoff );
_mesa_Lightfv( lgt, GL_CONSTANT_ATTENUATION,
&l->ConstantAttenuation );
_mesa_Lightfv( lgt, GL_LINEAR_ATTENUATION,
&l->LinearAttenuation );
_mesa_Lightfv( lgt, GL_QUADRATIC_ATTENUATION,
&l->QuadraticAttenuation );
}
/* light model */
_mesa_LightModelfv(GL_LIGHT_MODEL_AMBIENT,
light->Model.Ambient);
_mesa_LightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER,
(GLfloat) light->Model.LocalViewer);
_mesa_LightModelf(GL_LIGHT_MODEL_TWO_SIDE,
(GLfloat) light->Model.TwoSide);
_mesa_LightModelf(GL_LIGHT_MODEL_COLOR_CONTROL,
(GLfloat) light->Model.ColorControl);
/* materials */
MEMCPY(&ctx->Light.Material, &light->Material,
sizeof(struct gl_material));
/* shade model */
_mesa_ShadeModel(light->ShadeModel);
/* color material */
_mesa_ColorMaterial(light->ColorMaterialFace,
light->ColorMaterialMode);
_mesa_set_enable(ctx, GL_COLOR_MATERIAL,
light->ColorMaterialEnabled);
}
break;
case GL_LINE_BIT:
{
const struct gl_line_attrib *line;
line = (const struct gl_line_attrib *) attr->data;
_mesa_set_enable(ctx, GL_LINE_SMOOTH, line->SmoothFlag);
_mesa_set_enable(ctx, GL_LINE_STIPPLE, line->StippleFlag);
_mesa_LineStipple(line->StippleFactor, line->StipplePattern);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -