mesa: increase max texture image units and GLSL samplers to 16
The max texture coord units is still 8. All the fixed-function paths are still limited to 8 too. But GLSL shaders can use more samplers now. Note that some texcoord-related data structures are declared to be 16 elements in size rather than 8. This just simplifies the code in a few places; the extra elements aren't accessible to the user. These changes haven't been extensively tested yet, but sanity checking has been done. It should be possible to increase the max image units/samplers to 32 without doing anything special. Beyond that we'll need longer bitfields in a few places.
This commit is contained in:
@@ -142,7 +142,7 @@ _mesa_initialize_array_object( GLcontext *ctx,
|
||||
obj->Index.StrideB = 0;
|
||||
obj->Index.Ptr = NULL;
|
||||
obj->Index.Enabled = GL_FALSE;
|
||||
for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
|
||||
for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
|
||||
obj->TexCoord[i].Size = 4;
|
||||
obj->TexCoord[i].Type = GL_FLOAT;
|
||||
obj->TexCoord[i].Stride = 0;
|
||||
@@ -181,7 +181,7 @@ _mesa_initialize_array_object( GLcontext *ctx,
|
||||
obj->SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
|
||||
obj->FogCoord.BufferObj = ctx->Array.NullBufferObj;
|
||||
obj->Index.BufferObj = ctx->Array.NullBufferObj;
|
||||
for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
|
||||
for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
|
||||
obj->TexCoord[i].BufferObj = ctx->Array.NullBufferObj;
|
||||
}
|
||||
obj->EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
|
||||
@@ -335,7 +335,7 @@ _mesa_DeleteVertexArraysAPPLE(GLsizei n, const GLuint *ids)
|
||||
unbind_buffer_object( ctx, obj->SecondaryColor.BufferObj );
|
||||
unbind_buffer_object( ctx, obj->FogCoord.BufferObj );
|
||||
unbind_buffer_object( ctx, obj->Index.BufferObj );
|
||||
for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
|
||||
for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
|
||||
unbind_buffer_object( ctx, obj->TexCoord[i].BufferObj );
|
||||
}
|
||||
unbind_buffer_object( ctx, obj->EdgeFlag.BufferObj );
|
||||
|
@@ -1,8 +1,9 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.2
|
||||
* Version: 7.3
|
||||
*
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 2009 VMware, Inc. All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -224,7 +225,7 @@ _mesa_PushAttrib(GLbitfield mask)
|
||||
attr->SampleAlphaToOne = ctx->Multisample.SampleAlphaToOne;
|
||||
attr->SampleCoverage = ctx->Multisample.SampleCoverage;
|
||||
attr->SampleCoverageInvert = ctx->Multisample.SampleCoverageInvert;
|
||||
for (i=0; i<MAX_TEXTURE_UNITS; i++) {
|
||||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
|
||||
attr->Texture[i] = ctx->Texture.Unit[i].Enabled;
|
||||
attr->TexGen[i] = ctx->Texture.Unit[i].TexGenEnabled;
|
||||
attr->TextureColorTable[i] = ctx->Texture.Unit[i].ColorTableEnabled;
|
||||
|
@@ -801,7 +801,7 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
|
||||
unbind(ctx, &ctx->Array.ArrayObj->FogCoord.BufferObj, bufObj);
|
||||
unbind(ctx, &ctx->Array.ArrayObj->Index.BufferObj, bufObj);
|
||||
unbind(ctx, &ctx->Array.ArrayObj->EdgeFlag.BufferObj, bufObj);
|
||||
for (j = 0; j < MAX_TEXTURE_UNITS; j++) {
|
||||
for (j = 0; j < MAX_TEXTURE_COORD_UNITS; j++) {
|
||||
unbind(ctx, &ctx->Array.ArrayObj->TexCoord[j].BufferObj, bufObj);
|
||||
}
|
||||
for (j = 0; j < VERT_ATTRIB_MAX; j++) {
|
||||
|
@@ -1,13 +1,9 @@
|
||||
/**
|
||||
* \file config.h
|
||||
* Tunable configuration parameters.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.1
|
||||
* Version: 7.3
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 2008 VMware, Inc. All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -27,6 +23,10 @@
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file config.h
|
||||
* Tunable configuration parameters.
|
||||
*/
|
||||
|
||||
#ifndef MESA_CONFIG_H_INCLUDED
|
||||
#define MESA_CONFIG_H_INCLUDED
|
||||
@@ -115,27 +115,28 @@
|
||||
/** Maximum number of layers in a 1D or 2D array texture - GL_MESA_texture_array */
|
||||
#define MAX_ARRAY_TEXTURE_LAYERS 64
|
||||
|
||||
/** Number of texture units - GL_ARB_multitexture
|
||||
* This needs to be the larger of MAX_TEXTURE_COORD_UNITS and
|
||||
* MAX_TEXTURE_IMAGE_UNITS seen below, since MAX_TEXTURE_UNITS is used
|
||||
* to dimension some arrays that store both coord and image data.
|
||||
*/
|
||||
#define MAX_TEXTURE_UNITS 8
|
||||
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
* Max number of texture coordinate units. This mainly just applies to
|
||||
* the fixed-function vertex code. This will be difficult to raise above
|
||||
* eight because of various vertex attribute bitvectors.
|
||||
*/
|
||||
#define MAX_TEXTURE_COORD_UNITS 8
|
||||
|
||||
/**
|
||||
* \name Separate numbers of texture coordinates and texture image units.
|
||||
*
|
||||
* These values will eventually replace most instances of MAX_TEXTURE_UNITS.
|
||||
* We should always have MAX_TEXTURE_COORD_UNITS <= MAX_TEXTURE_IMAGE_UNITS.
|
||||
* And, GL_MAX_TEXTURE_UNITS <= MAX_TEXTURE_COORD_UNITS.
|
||||
* Max number of texture image units. Also determines number of texture
|
||||
* samplers in shaders.
|
||||
*/
|
||||
/*@{*/
|
||||
#define MAX_TEXTURE_COORD_UNITS 8
|
||||
#define MAX_TEXTURE_IMAGE_UNITS 8
|
||||
/*@}*/
|
||||
#define MAX_TEXTURE_IMAGE_UNITS 16
|
||||
|
||||
/**
|
||||
* Larger of MAX_TEXTURE_COORD_UNITS and MAX_TEXTURE_IMAGE_UNITS.
|
||||
* This value is only used for dimensioning arrays.
|
||||
* Either MAX_TEXTURE_COORD_UNITS or MAX_TEXTURE_IMAGE_UNITS (or the
|
||||
* corresponding ctx->Const.MaxTextureCoord/ImageUnits fields) should be
|
||||
* used almost everywhere else.
|
||||
*/
|
||||
#define MAX_TEXTURE_UNITS ((MAX_TEXTURE_COORD_UNITS > MAX_TEXTURE_IMAGE_UNITS) ? MAX_TEXTURE_COORD_UNITS : MAX_TEXTURE_IMAGE_UNITS)
|
||||
|
||||
|
||||
/**
|
||||
* Maximum viewport/image width. Must accomodate all texture sizes too.
|
||||
@@ -192,7 +193,7 @@
|
||||
#define MAX_PROGRAM_ADDRESS_REGS 2
|
||||
#define MAX_UNIFORMS 256 /**< number of vec4 uniforms */
|
||||
#define MAX_VARYING 8 /**< number of float[4] vectors */
|
||||
#define MAX_SAMPLERS 8
|
||||
#define MAX_SAMPLERS MAX_TEXTURE_IMAGE_UNITS
|
||||
#define MAX_PROGRAM_INPUTS 32
|
||||
#define MAX_PROGRAM_OUTPUTS 32
|
||||
/*@}*/
|
||||
@@ -220,8 +221,8 @@
|
||||
/** For GL_ARB_vertex_shader */
|
||||
/*@{*/
|
||||
#define MAX_VERTEX_ATTRIBS 16
|
||||
#define MAX_VERTEX_TEXTURE_IMAGE_UNITS MAX_TEXTURE_UNITS
|
||||
#define MAX_COMBINED_TEXTURE_IMAGE_UNITS (MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS)
|
||||
#define MAX_VERTEX_TEXTURE_IMAGE_UNITS MAX_TEXTURE_IMAGE_UNITS
|
||||
#define MAX_COMBINED_TEXTURE_IMAGE_UNITS MAX_TEXTURE_IMAGE_UNITS
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
@@ -1,14 +1,9 @@
|
||||
/**
|
||||
* \file context.c
|
||||
* Mesa context/visual/framebuffer management functions.
|
||||
* \author Brian Paul
|
||||
*/
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.1
|
||||
* Version: 7.3
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 2008 VMware, Inc. All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -28,6 +23,11 @@
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file context.c
|
||||
* Mesa context/visual/framebuffer management functions.
|
||||
* \author Brian Paul
|
||||
*/
|
||||
|
||||
/**
|
||||
* \mainpage Mesa Main Module
|
||||
@@ -847,9 +847,6 @@ _mesa_init_constants(GLcontext *ctx)
|
||||
assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
|
||||
assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
|
||||
|
||||
assert(MAX_TEXTURE_UNITS >= MAX_TEXTURE_COORD_UNITS);
|
||||
assert(MAX_TEXTURE_UNITS >= MAX_TEXTURE_IMAGE_UNITS);
|
||||
|
||||
/* Constants, may be overriden (usually only reduced) by device drivers */
|
||||
ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
|
||||
ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
|
||||
@@ -963,6 +960,9 @@ check_context_limits(GLcontext *ctx)
|
||||
assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_IMAGE_UNITS);
|
||||
assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_COORD_UNITS);
|
||||
|
||||
/* number of coord units cannot be greater than number of image units */
|
||||
assert(ctx->Const.MaxTextureCoordUnits <= ctx->Const.MaxTextureImageUnits);
|
||||
|
||||
assert(ctx->Const.MaxViewportWidth <= MAX_WIDTH);
|
||||
assert(ctx->Const.MaxViewportHeight <= MAX_WIDTH);
|
||||
|
||||
|
@@ -201,6 +201,26 @@ _mesa_DisableClientState( GLenum cap )
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Return pointer to current texture unit for setting/getting coordinate
|
||||
* state.
|
||||
* Note that we'll set GL_INVALID_OPERATION if the active texture unit is
|
||||
* higher than the number of supported coordinate units. And we'll return NULL.
|
||||
*/
|
||||
static struct gl_texture_unit *
|
||||
get_texcoord_unit(GLcontext *ctx)
|
||||
{
|
||||
if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glEnable/Disable(texcoord unit)");
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
return &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Helper function to enable or disable a texture target.
|
||||
*/
|
||||
@@ -612,54 +632,62 @@ _mesa_set_enable(GLcontext *ctx, GLenum cap, GLboolean state)
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case GL_TEXTURE_GEN_Q: {
|
||||
GLuint unit = ctx->Texture.CurrentUnit;
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
GLuint newenabled = texUnit->TexGenEnabled & ~Q_BIT;
|
||||
if (state)
|
||||
newenabled |= Q_BIT;
|
||||
if (texUnit->TexGenEnabled == newenabled)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
texUnit->TexGenEnabled = newenabled;
|
||||
case GL_TEXTURE_GEN_Q:
|
||||
{
|
||||
struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
|
||||
if (texUnit) {
|
||||
GLuint newenabled = texUnit->TexGenEnabled & ~Q_BIT;
|
||||
if (state)
|
||||
newenabled |= Q_BIT;
|
||||
if (texUnit->TexGenEnabled == newenabled)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
texUnit->TexGenEnabled = newenabled;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GL_TEXTURE_GEN_R: {
|
||||
GLuint unit = ctx->Texture.CurrentUnit;
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
GLuint newenabled = texUnit->TexGenEnabled & ~R_BIT;
|
||||
if (state)
|
||||
newenabled |= R_BIT;
|
||||
if (texUnit->TexGenEnabled == newenabled)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
texUnit->TexGenEnabled = newenabled;
|
||||
case GL_TEXTURE_GEN_R:
|
||||
{
|
||||
struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
|
||||
if (texUnit) {
|
||||
GLuint newenabled = texUnit->TexGenEnabled & ~R_BIT;
|
||||
if (state)
|
||||
newenabled |= R_BIT;
|
||||
if (texUnit->TexGenEnabled == newenabled)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
texUnit->TexGenEnabled = newenabled;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GL_TEXTURE_GEN_S: {
|
||||
GLuint unit = ctx->Texture.CurrentUnit;
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
GLuint newenabled = texUnit->TexGenEnabled & ~S_BIT;
|
||||
if (state)
|
||||
newenabled |= S_BIT;
|
||||
if (texUnit->TexGenEnabled == newenabled)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
texUnit->TexGenEnabled = newenabled;
|
||||
case GL_TEXTURE_GEN_S:
|
||||
{
|
||||
struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
|
||||
if (texUnit) {
|
||||
GLuint newenabled = texUnit->TexGenEnabled & ~S_BIT;
|
||||
if (state)
|
||||
newenabled |= S_BIT;
|
||||
if (texUnit->TexGenEnabled == newenabled)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
texUnit->TexGenEnabled = newenabled;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GL_TEXTURE_GEN_T: {
|
||||
GLuint unit = ctx->Texture.CurrentUnit;
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
GLuint newenabled = texUnit->TexGenEnabled & ~T_BIT;
|
||||
if (state)
|
||||
newenabled |= T_BIT;
|
||||
if (texUnit->TexGenEnabled == newenabled)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
texUnit->TexGenEnabled = newenabled;
|
||||
case GL_TEXTURE_GEN_T:
|
||||
{
|
||||
struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
|
||||
if (texUnit) {
|
||||
GLuint newenabled = texUnit->TexGenEnabled & ~T_BIT;
|
||||
if (state)
|
||||
newenabled |= T_BIT;
|
||||
if (texUnit->TexGenEnabled == newenabled)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
texUnit->TexGenEnabled = newenabled;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* CLIENT STATE!!!
|
||||
@@ -1153,28 +1181,36 @@ _mesa_IsEnabled( GLenum cap )
|
||||
return is_texture_enabled(ctx, TEXTURE_3D_BIT);
|
||||
case GL_TEXTURE_GEN_Q:
|
||||
{
|
||||
const struct gl_texture_unit *texUnit;
|
||||
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
|
||||
return (texUnit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE;
|
||||
const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
|
||||
if (texUnit) {
|
||||
return (texUnit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE;
|
||||
}
|
||||
}
|
||||
return GL_FALSE;
|
||||
case GL_TEXTURE_GEN_R:
|
||||
{
|
||||
const struct gl_texture_unit *texUnit;
|
||||
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
|
||||
return (texUnit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE;
|
||||
const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
|
||||
if (texUnit) {
|
||||
return (texUnit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE;
|
||||
}
|
||||
}
|
||||
return GL_FALSE;
|
||||
case GL_TEXTURE_GEN_S:
|
||||
{
|
||||
const struct gl_texture_unit *texUnit;
|
||||
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
|
||||
return (texUnit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE;
|
||||
const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
|
||||
if (texUnit) {
|
||||
return (texUnit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE;
|
||||
}
|
||||
}
|
||||
return GL_FALSE;
|
||||
case GL_TEXTURE_GEN_T:
|
||||
{
|
||||
const struct gl_texture_unit *texUnit;
|
||||
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
|
||||
return (texUnit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE;
|
||||
const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
|
||||
if (texUnit) {
|
||||
return (texUnit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE;
|
||||
}
|
||||
}
|
||||
return GL_FALSE;
|
||||
|
||||
/*
|
||||
* CLIENT STATE!!!
|
||||
|
@@ -275,7 +275,7 @@ static void make_state_key( GLcontext *ctx, struct state_key *key )
|
||||
ctx->Texture._EnabledUnits)
|
||||
key->texture_enabled_global = 1;
|
||||
|
||||
for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
|
||||
for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
|
||||
|
||||
if (texUnit->_ReallyEnabled)
|
||||
@@ -1451,7 +1451,7 @@ static void build_texture_transform( struct tnl_program *p )
|
||||
{
|
||||
GLuint i, j;
|
||||
|
||||
for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
|
||||
for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
|
||||
|
||||
if (!(p->state->fragprog_inputs_read & FRAG_BIT_TEX(i)))
|
||||
continue;
|
||||
|
@@ -1,15 +1,9 @@
|
||||
/**
|
||||
* \file mtypes.h
|
||||
* Main Mesa data structures.
|
||||
*
|
||||
* Please try to mark derived values with a leading underscore ('_').
|
||||
*/
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.3
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 VMware, Inc. All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -29,7 +23,12 @@
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* \file mtypes.h
|
||||
* Main Mesa data structures.
|
||||
*
|
||||
* Please try to mark derived values with a leading underscore ('_').
|
||||
*/
|
||||
|
||||
#ifndef TYPES_H
|
||||
#define TYPES_H
|
||||
@@ -639,7 +638,7 @@ struct gl_current_attrib
|
||||
GLfloat RasterColor[4];
|
||||
GLfloat RasterSecondaryColor[4];
|
||||
GLfloat RasterIndex;
|
||||
GLfloat RasterTexCoords[MAX_TEXTURE_COORD_UNITS][4];
|
||||
GLfloat RasterTexCoords[MAX_TEXTURE_UNITS][4];
|
||||
GLboolean RasterPosValid;
|
||||
/*@}*/
|
||||
};
|
||||
@@ -723,10 +722,10 @@ struct gl_enable_attrib
|
||||
GLboolean SampleCoverage; /* GL_ARB_multisample */
|
||||
GLboolean SampleCoverageInvert; /* GL_ARB_multisample */
|
||||
GLboolean RasterPositionUnclipped; /* GL_IBM_rasterpos_clip */
|
||||
GLuint Texture[MAX_TEXTURE_IMAGE_UNITS];
|
||||
GLuint TexGen[MAX_TEXTURE_COORD_UNITS];
|
||||
GLuint Texture[MAX_TEXTURE_UNITS];
|
||||
GLuint TexGen[MAX_TEXTURE_UNITS];
|
||||
/* SGI_texture_color_table */
|
||||
GLboolean TextureColorTable[MAX_TEXTURE_IMAGE_UNITS];
|
||||
GLboolean TextureColorTable[MAX_TEXTURE_UNITS];
|
||||
/* GL_ARB_vertex_program / GL_NV_vertex_program */
|
||||
GLboolean VertexProgram;
|
||||
GLboolean VertexProgramPointSize;
|
||||
@@ -1069,7 +1068,7 @@ struct gl_point_attrib
|
||||
GLfloat Threshold; /**< GL_EXT_point_parameters */
|
||||
GLboolean _Attenuated; /**< True if Params != [1, 0, 0] */
|
||||
GLboolean PointSprite; /**< GL_NV/ARB_point_sprite */
|
||||
GLboolean CoordReplace[MAX_TEXTURE_COORD_UNITS]; /**< GL_ARB_point_sprite */
|
||||
GLboolean CoordReplace[MAX_TEXTURE_UNITS]; /**< GL_ARB_point_sprite */
|
||||
GLenum SpriteRMode; /**< GL_NV_point_sprite (only!) */
|
||||
GLenum SpriteOrigin; /**< GL_ARB_point_sprite */
|
||||
};
|
||||
@@ -1557,7 +1556,7 @@ struct gl_texture_attrib
|
||||
* name multitexture
|
||||
*/
|
||||
/**@{*/
|
||||
GLuint CurrentUnit; /**< Active texture unit */
|
||||
GLuint CurrentUnit; /**< Active texture unit [0, MaxTextureImageUnits-1] */
|
||||
GLbitfield _EnabledUnits; /**< one bit set for each really-enabled unit */
|
||||
GLbitfield _EnabledCoordUnits; /**< one bit per enabled coordinate unit */
|
||||
GLbitfield _GenFlags; /**< for texgen */
|
||||
@@ -1875,7 +1874,7 @@ struct gl_program
|
||||
GLbitfield OutputsWritten; /**< Bitmask of which output regs are written to */
|
||||
GLbitfield InputFlags[MAX_PROGRAM_INPUTS]; /**< PROG_PARAM_BIT_x flags */
|
||||
GLbitfield OutputFlags[MAX_PROGRAM_OUTPUTS]; /**< PROG_PARAM_BIT_x flags */
|
||||
GLbitfield TexturesUsed[MAX_TEXTURE_IMAGE_UNITS]; /**< TEXTURE_x_BIT bitmask */
|
||||
GLbitfield TexturesUsed[MAX_TEXTURE_UNITS]; /**< TEXTURE_x_BIT bitmask */
|
||||
GLbitfield SamplersUsed; /**< Bitfield of which samplers are used */
|
||||
GLbitfield ShadowSamplers; /**< Texture units used for shadow sampling. */
|
||||
|
||||
@@ -2469,9 +2468,9 @@ struct gl_constants
|
||||
GLint MaxTextureRectSize; /* GL_NV_texture_rectangle */
|
||||
GLuint MaxTextureCoordUnits;
|
||||
GLuint MaxTextureImageUnits;
|
||||
GLuint MaxTextureUnits; /* = MIN(CoordUnits, ImageUnits) */
|
||||
GLfloat MaxTextureMaxAnisotropy; /* GL_EXT_texture_filter_anisotropic */
|
||||
GLfloat MaxTextureLodBias; /* GL_EXT_texture_lod_bias */
|
||||
GLuint MaxTextureUnits; /**< = MIN(CoordUnits, ImageUnits) */
|
||||
GLfloat MaxTextureMaxAnisotropy; /**< GL_EXT_texture_filter_anisotropic */
|
||||
GLfloat MaxTextureLodBias; /**< GL_EXT_texture_lod_bias */
|
||||
GLuint MaxArrayLockSize;
|
||||
GLint SubPixelBits;
|
||||
GLfloat MinPointSize, MaxPointSize; /* aliased */
|
||||
@@ -2946,7 +2945,7 @@ struct __GLcontextRec
|
||||
struct gl_matrix_stack ModelviewMatrixStack;
|
||||
struct gl_matrix_stack ProjectionMatrixStack;
|
||||
struct gl_matrix_stack ColorMatrixStack;
|
||||
struct gl_matrix_stack TextureMatrixStack[MAX_TEXTURE_COORD_UNITS];
|
||||
struct gl_matrix_stack TextureMatrixStack[MAX_TEXTURE_UNITS];
|
||||
struct gl_matrix_stack ProgramMatrixStack[MAX_PROGRAM_MATRICES];
|
||||
struct gl_matrix_stack *CurrentStack; /**< Points to one of the above stacks */
|
||||
/*@}*/
|
||||
|
@@ -257,7 +257,7 @@ _mesa_init_point(GLcontext *ctx)
|
||||
ctx->Point.PointSprite = GL_FALSE; /* GL_ARB/NV_point_sprite */
|
||||
ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite (only!) */
|
||||
ctx->Point.SpriteOrigin = GL_UPPER_LEFT; /* GL_ARB_point_sprite */
|
||||
for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
|
||||
for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
|
||||
ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_ARB/NV_point_sprite */
|
||||
}
|
||||
}
|
||||
|
@@ -500,7 +500,7 @@ void _mesa_init_rastpos( GLcontext * ctx )
|
||||
ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
|
||||
ASSIGN_4V( ctx->Current.RasterSecondaryColor, 0.0, 0.0, 0.0, 1.0 );
|
||||
ctx->Current.RasterIndex = 1.0;
|
||||
for (i=0; i<MAX_TEXTURE_UNITS; i++)
|
||||
for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
|
||||
ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
|
||||
ctx->Current.RasterPosValid = GL_TRUE;
|
||||
}
|
||||
|
@@ -38,6 +38,21 @@
|
||||
#include "texenvprogram.h"
|
||||
|
||||
|
||||
/*
|
||||
* Note on texture units:
|
||||
*
|
||||
* The number of texture units supported by fixed-function fragment
|
||||
* processing is MAX_TEXTURE_COORD_UNITS, not MAX_TEXTURE_IMAGE_UNITS.
|
||||
* That's because there's a one-to-one correspondence between texture
|
||||
* coordinates and samplers in fixed-function processing.
|
||||
*
|
||||
* Since fixed-function vertex processing is limited to MAX_TEXTURE_COORD_UNITS
|
||||
* sets of texcoords, so is fixed-function fragment processing.
|
||||
*
|
||||
* We can safely use ctx->Const.MaxTextureUnits for loop bounds.
|
||||
*/
|
||||
|
||||
|
||||
struct texenvprog_cache_item
|
||||
{
|
||||
GLuint hash;
|
||||
@@ -52,7 +67,7 @@ struct texenvprog_cache_item
|
||||
* up to four instructions per texture unit (TEX + 3 for combine),
|
||||
* then there's fog and specular add.
|
||||
*/
|
||||
#define MAX_INSTRUCTIONS ((MAX_TEXTURE_UNITS * 4) + 12)
|
||||
#define MAX_INSTRUCTIONS ((MAX_TEXTURE_COORD_UNITS * 4) + 12)
|
||||
|
||||
#define DISASSEM (MESA_VERBOSE & VERBOSE_DISASSEM)
|
||||
|
||||
@@ -211,7 +226,7 @@ static void make_state_key( GLcontext *ctx, struct state_key *key )
|
||||
|
||||
memset(key, 0, sizeof(*key));
|
||||
|
||||
for (i=0;i<MAX_TEXTURE_UNITS;i++) {
|
||||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
|
||||
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
|
||||
GLenum format;
|
||||
|
||||
@@ -306,7 +321,7 @@ struct texenv_fragment_program {
|
||||
GLbitfield temp_in_use; /* Tracks temporary regs which are in use. */
|
||||
GLboolean error;
|
||||
|
||||
struct ureg src_texture[MAX_TEXTURE_UNITS];
|
||||
struct ureg src_texture[MAX_TEXTURE_COORD_UNITS];
|
||||
/* Reg containing each texture unit's sampled texture color,
|
||||
* else undef.
|
||||
*/
|
||||
@@ -1056,7 +1071,7 @@ create_new_program(GLcontext *ctx, struct state_key *key,
|
||||
p.program->Base.InputsRead = 0;
|
||||
p.program->Base.OutputsWritten = 1 << FRAG_RESULT_COLR;
|
||||
|
||||
for (unit = 0; unit < MAX_TEXTURE_UNITS; unit++)
|
||||
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++)
|
||||
p.src_texture[unit] = undef;
|
||||
|
||||
p.src_previous = undef;
|
||||
|
@@ -81,7 +81,7 @@ _mesa_copy_texture_state( const GLcontext *src, GLcontext *dst )
|
||||
dst->Texture.SharedPalette = src->Texture.SharedPalette;
|
||||
|
||||
/* per-unit state */
|
||||
for (i = 0; i < src->Const.MaxTextureUnits; i++) {
|
||||
for (i = 0; i < src->Const.MaxTextureImageUnits; i++) {
|
||||
dst->Texture.Unit[i].Enabled = src->Texture.Unit[i].Enabled;
|
||||
dst->Texture.Unit[i].EnvMode = src->Texture.Unit[i].EnvMode;
|
||||
COPY_4V(dst->Texture.Unit[i].EnvColor, src->Texture.Unit[i].EnvColor);
|
||||
@@ -307,8 +307,7 @@ _mesa_ActiveTextureARB(GLenum texture)
|
||||
_mesa_debug(ctx, "glActiveTexture %s\n",
|
||||
_mesa_lookup_enum_by_nr(texture));
|
||||
|
||||
/* XXX error-check against max(coordunits, imageunits) */
|
||||
if (texUnit >= ctx->Const.MaxTextureUnits) {
|
||||
if (texUnit >= ctx->Const.MaxTextureImageUnits) {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "glActiveTexture(texture)");
|
||||
return;
|
||||
}
|
||||
@@ -369,7 +368,7 @@ update_texture_matrices( GLcontext *ctx )
|
||||
|
||||
ctx->Texture._TexMatEnabled = 0;
|
||||
|
||||
for (i=0; i < ctx->Const.MaxTextureUnits; i++) {
|
||||
for (i=0; i < ctx->Const.MaxTextureCoordUnits; i++) {
|
||||
if (_math_matrix_is_dirty(ctx->TextureMatrixStack[i].Top)) {
|
||||
_math_matrix_analyse( ctx->TextureMatrixStack[i].Top );
|
||||
|
||||
@@ -491,7 +490,7 @@ update_texture_state( GLcontext *ctx )
|
||||
/*
|
||||
* Update texture unit state.
|
||||
*/
|
||||
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
|
||||
for (unit = 0; unit < ctx->Const.MaxTextureImageUnits; unit++) {
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
GLbitfield enableBits;
|
||||
|
||||
@@ -621,7 +620,7 @@ update_texture_state( GLcontext *ctx )
|
||||
}
|
||||
|
||||
/* Setup texgen for those texture coordinate sets that are in use */
|
||||
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
|
||||
for (unit = 0; unit < ctx->Const.MaxTextureCoordUnits; unit++) {
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
|
||||
if (!(ctx->Texture._EnabledCoordUnits & (1 << unit)))
|
||||
|
@@ -391,7 +391,7 @@ _slang_input_index(const char *name, GLenum target, GLuint *swizzleOut)
|
||||
const struct input_info *inputs
|
||||
= (target == GL_VERTEX_PROGRAM_ARB) ? vertInputs : fragInputs;
|
||||
|
||||
ASSERT(MAX_TEXTURE_UNITS == 8); /* if this fails, fix vertInputs above */
|
||||
ASSERT(MAX_TEXTURE_COORD_UNITS == 8); /* if this fails, fix vertInputs above */
|
||||
|
||||
for (i = 0; inputs[i].Name; i++) {
|
||||
if (strcmp(inputs[i].Name, name) == 0) {
|
||||
|
@@ -208,7 +208,8 @@ link_varying_vars(struct gl_shader_program *shProg, struct gl_program *prog)
|
||||
* the vertex and fragment shaders.
|
||||
*/
|
||||
static GLboolean
|
||||
link_uniform_vars(struct gl_shader_program *shProg,
|
||||
link_uniform_vars(GLcontext *ctx,
|
||||
struct gl_shader_program *shProg,
|
||||
struct gl_program *prog,
|
||||
GLuint *numSamplers)
|
||||
{
|
||||
@@ -239,10 +240,10 @@ link_uniform_vars(struct gl_shader_program *shProg,
|
||||
/* Allocate a new sampler index */
|
||||
GLuint sampNum = *numSamplers;
|
||||
GLuint oldSampNum = (GLuint) prog->Parameters->ParameterValues[i][0];
|
||||
if (oldSampNum >= MAX_SAMPLERS) {
|
||||
if (oldSampNum >= ctx->Const.MaxTextureImageUnits) {
|
||||
char s[100];
|
||||
sprintf(s, "Too many texture samplers (%u, max is %u)",
|
||||
oldSampNum + 1, MAX_SAMPLERS);
|
||||
oldSampNum + 1, ctx->Const.MaxTextureImageUnits);
|
||||
link_error(shProg, s);
|
||||
return GL_FALSE;
|
||||
}
|
||||
@@ -568,13 +569,13 @@ _slang_link(GLcontext *ctx,
|
||||
|
||||
/* link uniform vars */
|
||||
if (shProg->VertexProgram) {
|
||||
if (!link_uniform_vars(shProg, &shProg->VertexProgram->Base,
|
||||
if (!link_uniform_vars(ctx, shProg, &shProg->VertexProgram->Base,
|
||||
&numSamplers)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (shProg->FragmentProgram) {
|
||||
if (!link_uniform_vars(shProg, &shProg->FragmentProgram->Base,
|
||||
if (!link_uniform_vars(ctx, shProg, &shProg->FragmentProgram->Base,
|
||||
&numSamplers)) {
|
||||
return;
|
||||
}
|
||||
|
Reference in New Issue
Block a user