⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 attrib.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
   /* 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 + -