1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.5 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file texenv.c 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glTexEnv-related functions 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/state.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texenv.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texstate.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TE_ERROR(errCode, msg, value) \ 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value)); 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Set texture env mode */ 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_env_mode(struct gl_context *ctx, 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit, 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum mode) 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean legal; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->EnvMode == mode) 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mode) { 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MODULATE: 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLEND: 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DECAL: 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REPLACE: 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ADD: 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMBINE: 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = GL_TRUE; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REPLACE_EXT: 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = GL_REPLACE; /* GL_REPLACE_EXT != GL_REPLACE */ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = GL_TRUE; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMBINE4_NV: 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = ctx->Extensions.NV_texture_env_combine4; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = GL_FALSE; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (legal) { 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->EnvMode = mode; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_env_color(struct gl_context *ctx, 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit, 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *color) 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TEST_EQ_4V(color, texUnit->EnvColorUnclamped)) 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4FV(texUnit->EnvColorUnclamped, color); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->EnvColor[0] = CLAMP(color[0], 0.0F, 1.0F); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->EnvColor[1] = CLAMP(color[1], 0.0F, 1.0F); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->EnvColor[2] = CLAMP(color[2], 0.0F, 1.0F); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->EnvColor[3] = CLAMP(color[3], 0.0F, 1.0F); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Set an RGB or A combiner mode/function */ 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_combiner_mode(struct gl_context *ctx, 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum pname, GLenum mode) 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean legal; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mode) { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REPLACE: 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MODULATE: 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ADD: 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ADD_SIGNED: 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTERPOLATE: 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = GL_TRUE; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SUBTRACT: 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = ctx->Extensions.ARB_texture_env_combine; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DOT3_RGB_EXT: 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DOT3_RGBA_EXT: 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = (ctx->API == API_OPENGL && 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_env_dot3 && 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pname == GL_COMBINE_RGB); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DOT3_RGB: 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DOT3_RGBA: 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = (ctx->Extensions.ARB_texture_env_dot3 && 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pname == GL_COMBINE_RGB); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MODULATE_ADD_ATI: 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MODULATE_SIGNED_ADD_ATI: 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MODULATE_SUBTRACT_ATI: 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = (ctx->API == API_OPENGL && 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ATI_texture_env_combine3); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BUMP_ENVMAP_ATI: 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = (ctx->API == API_OPENGL && 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ATI_envmap_bumpmap && 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pname == GL_COMBINE_RGB); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = GL_FALSE; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!legal) { 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMBINE_RGB: 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->Combine.ModeRGB == mode) 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->Combine.ModeRGB = mode; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMBINE_ALPHA: 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->Combine.ModeA == mode) 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->Combine.ModeA = mode; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Set an RGB or A combiner source term */ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_combiner_source(struct gl_context *ctx, 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit, 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum pname, GLenum param) 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint term; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean alpha, legal; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Translate pname to (term, alpha). 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The enums were given sequential values for a reason. 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE0_RGB: 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE1_RGB: 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE2_RGB: 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE3_RGB_NV: 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org term = pname - GL_SOURCE0_RGB; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha = GL_FALSE; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE0_ALPHA: 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE1_ALPHA: 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE2_ALPHA: 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE3_ALPHA_NV: 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org term = pname - GL_SOURCE0_ALPHA; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha = GL_TRUE; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((term == 3) && (ctx->API != API_OPENGL 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || !ctx->Extensions.NV_texture_env_combine4)) { 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(term < MAX_COMBINER_TERMS); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Error-check param (the source term) 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (param) { 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE: 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CONSTANT: 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PRIMARY_COLOR: 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PREVIOUS: 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = GL_TRUE; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE0: 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE1: 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE2: 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE3: 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE4: 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE5: 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE6: 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE7: 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = (ctx->Extensions.ARB_texture_env_crossbar && 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param - GL_TEXTURE0 < ctx->Const.MaxTextureUnits); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ZERO: 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = (ctx->API == API_OPENGL && 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (ctx->Extensions.ATI_texture_env_combine3 || 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.NV_texture_env_combine4)); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ONE: 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = (ctx->API == API_OPENGL && 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ATI_texture_env_combine3); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = GL_FALSE; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!legal) { 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (alpha) 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->Combine.SourceA[term] = param; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->Combine.SourceRGB[term] = param; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Set an RGB or A combiner operand term */ 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_combiner_operand(struct gl_context *ctx, 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit, 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum pname, GLenum param) 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint term; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean alpha, legal; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The enums were given sequential values for a reason. 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND0_RGB: 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND1_RGB: 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND2_RGB: 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND3_RGB_NV: 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org term = pname - GL_OPERAND0_RGB; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha = GL_FALSE; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND0_ALPHA: 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND1_ALPHA: 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND2_ALPHA: 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND3_ALPHA_NV: 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org term = pname - GL_OPERAND0_ALPHA; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha = GL_TRUE; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((term == 3) && (ctx->API != API_OPENGL 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || !ctx->Extensions.NV_texture_env_combine4)) { 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(term < MAX_COMBINER_TERMS); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Error-check param (the source operand) 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (param) { 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRC_COLOR: 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ONE_MINUS_SRC_COLOR: 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The color input can only be used with GL_OPERAND[01]_RGB in the EXT 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * version. In the ARB and NV versions and OpenGL ES 1.x they can be 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * used for any RGB operand. 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = !alpha 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ((term < 2) || ctx->Extensions.ARB_texture_env_combine 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || ctx->Extensions.NV_texture_env_combine4); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ONE_MINUS_SRC_ALPHA: 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GL_ONE_MINUS_SRC_ALPHA can only be used with 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_OPERAND[01]_(RGB|ALPHA) in the EXT version. In the ARB and NV 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * versions and OpenGL ES 1.x it can be used for any operand. 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = (term < 2) || ctx->Extensions.ARB_texture_env_combine 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || ctx->Extensions.NV_texture_env_combine4; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRC_ALPHA: 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = GL_TRUE; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legal = GL_FALSE; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!legal) { 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (alpha) 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->Combine.OperandA[term] = param; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->Combine.OperandRGB[term] = param; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_combiner_scale(struct gl_context *ctx, 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit, 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum pname, GLfloat scale) 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint shift; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (scale == 1.0F) { 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift = 0; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (scale == 2.0F) { 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift = 1; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (scale == 4.0F) { 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift = 2; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_VALUE, 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" ); 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_SCALE: 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->Combine.ScaleShiftRGB == shift) 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->Combine.ScaleShiftRGB = shift; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_SCALE: 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->Combine.ScaleShiftA == shift) 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->Combine.ScaleShiftA = shift; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param ) 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint iparam0 = (GLint) param[0]; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint maxUnit; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Texture.CurrentUnit >= maxUnit) { 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(current unit)"); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit = _mesa_get_current_tex_unit(ctx); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_TEXTURE_ENV) { 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_ENV_MODE: 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_env_mode(ctx, texUnit, (GLenum) iparam0); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_ENV_COLOR: 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_env_color(ctx, texUnit, param); 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMBINE_RGB: 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMBINE_ALPHA: 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_combiner_mode(ctx, texUnit, pname, (GLenum) iparam0); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE0_RGB: 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE1_RGB: 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE2_RGB: 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE3_RGB_NV: 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE0_ALPHA: 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE1_ALPHA: 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE2_ALPHA: 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE3_ALPHA_NV: 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_combiner_source(ctx, texUnit, pname, (GLenum) iparam0); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND0_RGB: 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND1_RGB: 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND2_RGB: 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND3_RGB_NV: 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND0_ALPHA: 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND1_ALPHA: 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND2_ALPHA: 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND3_ALPHA_NV: 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_combiner_operand(ctx, texUnit, pname, (GLenum) iparam0); 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_SCALE: 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_SCALE: 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_combiner_scale(ctx, texUnit, pname, param[0]); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BUMP_TARGET_ATI: 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API != API_OPENGL || !ctx->Extensions.ATI_envmap_bumpmap) { 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname ); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((iparam0 < GL_TEXTURE0) || 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (iparam0 > GL_TEXTURE31)) { 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* spec doesn't say this but it seems logical */ 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(param=0x%x)", iparam0); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!((1 << (iparam0 - GL_TEXTURE0)) & ctx->Const.SupportedBumpUnits)) { 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->BumpTarget = iparam0; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" ); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->LodBias == param[0]) 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->LodBias = param[0]; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (target == GL_POINT_SPRITE_NV) { 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GL_ARB_point_sprite / GL_NV_point_sprite */ 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.NV_point_sprite 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && !ctx->Extensions.ARB_point_sprite) { 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target ); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_COORD_REPLACE_NV) { 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iparam0 == GL_TRUE || iparam0 == GL_FALSE) { 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* It's kind of weird to set point state via glTexEnv, 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but that's what the spec calls for. 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean state = (GLboolean) iparam0; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state) 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_POINT); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname ); 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target ); 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE)) 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n", 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(target), 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(pname), 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *param, 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr((GLenum) iparam0)); 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Tell device driver about the new texture environment */ 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Driver.TexEnv) { 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*ctx->Driver.TexEnv)( ctx, target, pname, param ); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param ) 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat p[4]; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[0] = param; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[1] = p[2] = p[3] = 0.0; 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_TexEnvfv( target, pname, p ); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexEnvi( GLenum target, GLenum pname, GLint param ) 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat p[4]; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[0] = (GLfloat) param; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[1] = p[2] = p[3] = 0.0; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_TexEnvfv( target, pname, p ); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param ) 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat p[4]; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_TEXTURE_ENV_COLOR) { 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[0] = INT_TO_FLOAT( param[0] ); 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[1] = INT_TO_FLOAT( param[1] ); 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[2] = INT_TO_FLOAT( param[2] ); 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[3] = INT_TO_FLOAT( param[3] ); 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[0] = (GLfloat) param[0]; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[1] = p[2] = p[3] = 0; /* init to zero, just to be safe */ 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_TexEnvfv( target, pname, p ); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper for glGetTexEnvi/f() 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return value of queried pname or -1 if error. 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_texenvi(struct gl_context *ctx, const struct gl_texture_unit *texUnit, 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum pname) 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_ENV_MODE: 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->EnvMode; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMBINE_RGB: 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->Combine.ModeRGB; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMBINE_ALPHA: 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->Combine.ModeA; 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE0_RGB: 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE1_RGB: 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE2_RGB: { 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned rgb_idx = pname - GL_SOURCE0_RGB; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->Combine.SourceRGB[rgb_idx]; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE3_RGB_NV: 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API == API_OPENGL && ctx->Extensions.NV_texture_env_combine4) { 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->Combine.SourceRGB[3]; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE0_ALPHA: 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE1_ALPHA: 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE2_ALPHA: { 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned alpha_idx = pname - GL_SOURCE0_ALPHA; 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->Combine.SourceA[alpha_idx]; 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SOURCE3_ALPHA_NV: 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API == API_OPENGL && ctx->Extensions.NV_texture_env_combine4) { 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->Combine.SourceA[3]; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND0_RGB: 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND1_RGB: 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND2_RGB: { 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned op_rgb = pname - GL_OPERAND0_RGB; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->Combine.OperandRGB[op_rgb]; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND3_RGB_NV: 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API == API_OPENGL && ctx->Extensions.NV_texture_env_combine4) { 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->Combine.OperandRGB[3]; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND0_ALPHA: 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND1_ALPHA: 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND2_ALPHA: { 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned op_alpha = pname - GL_OPERAND0_ALPHA; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->Combine.OperandA[op_alpha]; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OPERAND3_ALPHA_NV: 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API == API_OPENGL && ctx->Extensions.NV_texture_env_combine4) { 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->Combine.OperandA[3]; 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_SCALE: 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1 << texUnit->Combine.ScaleShiftRGB; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_SCALE: 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1 << texUnit->Combine.ScaleShiftA; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BUMP_TARGET_ATI: 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* spec doesn't say so, but I think this should be queryable */ 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API == API_OPENGL && ctx->Extensions.ATI_envmap_bumpmap) { 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->BumpTarget; 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; /* error */ 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint maxUnit; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_unit *texUnit; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Texture.CurrentUnit >= maxUnit) { 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnvfv(current unit)"); 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit = _mesa_get_current_tex_unit(ctx); 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_TEXTURE_ENV) { 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_TEXTURE_ENV_COLOR) { 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP)) 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_state(ctx); 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(ctx->Color._ClampFragmentColor) 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4FV( params, texUnit->EnvColor ); 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4FV( params, texUnit->EnvColorUnclamped ); 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint val = get_texenvi(ctx, texUnit, pname); 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (val >= 0) { 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *params = (GLfloat) val; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *params = texUnit->LodBias; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (target == GL_POINT_SPRITE_NV) { 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GL_ARB_point_sprite / GL_NV_point_sprite */ 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.NV_point_sprite 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && !ctx->Extensions.ARB_point_sprite) { 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_COORD_REPLACE_NV) { 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit]; 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params ) 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint maxUnit; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_unit *texUnit; 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits; 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Texture.CurrentUnit >= maxUnit) { 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnviv(current unit)"); 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit = _mesa_get_current_tex_unit(ctx); 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_TEXTURE_ENV) { 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_TEXTURE_ENV_COLOR) { 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] ); 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] ); 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] ); 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] ); 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint val = get_texenvi(ctx, texUnit, pname); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (val >= 0) { 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *params = val; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *params = (GLint) texUnit->LodBias; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (target == GL_POINT_SPRITE_NV) { 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GL_ARB_point_sprite / GL_NV_point_sprite */ 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.NV_point_sprite 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && !ctx->Extensions.ARB_point_sprite) { 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_COORD_REPLACE_NV) { 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit]; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Why does ATI_envmap_bumpmap require new entrypoints? Should just 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reuse TexEnv ones... 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexBumpParameterivATI( GLenum pname, const GLint *param ) 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat p[4]; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ATI_envmap_bumpmap) { 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This isn't an "official" error case, but let's tell the user 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that something's wrong. 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterivATI"); 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_BUMP_ROT_MATRIX_ATI) { 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* hope that conversion is correct here */ 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[0] = INT_TO_FLOAT( param[0] ); 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[1] = INT_TO_FLOAT( param[1] ); 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[2] = INT_TO_FLOAT( param[2] ); 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[3] = INT_TO_FLOAT( param[3] ); 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[0] = (GLfloat) param[0]; 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p[1] = p[2] = p[3] = 0.0F; /* init to zero, just to be safe */ 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_TexBumpParameterfvATI( pname, p ); 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexBumpParameterfvATI( GLenum pname, const GLfloat *param ) 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit; 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ATI_envmap_bumpmap) { 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterfvATI"); 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit = _mesa_get_current_tex_unit(ctx); 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_BUMP_ROT_MATRIX_ATI) { 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TEST_EQ_4V(param, texUnit->RotMatrix)) 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TEXTURE); 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4FV(texUnit->RotMatrix, param); 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glTexBumpParameter(pname)" ); 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Drivers might want to know about this, instead of dedicated function 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org just shove it into TexEnv where it really belongs anyway */ 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Driver.TexEnv) { 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*ctx->Driver.TexEnv)( ctx, 0, pname, param ); 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetTexBumpParameterivATI( GLenum pname, GLint *param ) 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_unit *texUnit; 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ATI_envmap_bumpmap) { 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterivATI"); 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit = _mesa_get_current_tex_unit(ctx); 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) { 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* spec leaves open to support larger matrices. 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Don't think anyone would ever want to use it 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (and apps almost certainly would not understand it and 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org thus fail to submit matrices correctly) so hardcode this. */ 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *param = 4; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (pname == GL_BUMP_ROT_MATRIX_ATI) { 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* hope that conversion is correct here */ 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param[0] = FLOAT_TO_INT(texUnit->RotMatrix[0]); 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param[1] = FLOAT_TO_INT(texUnit->RotMatrix[1]); 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param[2] = FLOAT_TO_INT(texUnit->RotMatrix[2]); 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param[3] = FLOAT_TO_INT(texUnit->RotMatrix[3]); 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) { 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint count = 0; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Const.SupportedBumpUnits & (1 << i)) { 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count++; 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *param = count; 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (pname == GL_BUMP_TEX_UNITS_ATI) { 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Const.SupportedBumpUnits & (1 << i)) { 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *param++ = i + GL_TEXTURE0; 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" ); 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetTexBumpParameterfvATI( GLenum pname, GLfloat *param ) 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_unit *texUnit; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ATI_envmap_bumpmap) { 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterfvATI"); 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit = _mesa_get_current_tex_unit(ctx); 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) { 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* spec leaves open to support larger matrices. 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Don't think anyone would ever want to use it 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (and apps might not understand it) so hardcode this. */ 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *param = 4.0F; 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (pname == GL_BUMP_ROT_MATRIX_ATI) { 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param[0] = texUnit->RotMatrix[0]; 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param[1] = texUnit->RotMatrix[1]; 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param[2] = texUnit->RotMatrix[2]; 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org param[3] = texUnit->RotMatrix[3]; 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) { 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint count = 0; 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Const.SupportedBumpUnits & (1 << i)) { 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count++; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *param = (GLfloat) count; 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (pname == GL_BUMP_TEX_UNITS_ATI) { 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Const.SupportedBumpUnits & (1 << i)) { 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *param++ = (GLfloat) (i + GL_TEXTURE0); 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" ); 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 956