cogl: Fix checks of the number of available texture units

We were checking the number of texture units against the GL enum that is
used in glGetInteger() to query that number. Let's abstract this in a
little function.

Took the opportunity to dig a bit on the usage of GL limits for the
number of texture (image) units and document our use of them. We'll need
something finer grained if we want to fully exploit texture image units
with a programmable pipeline.
This commit is contained in:
Damien Lespiau 2010-01-26 18:47:25 +00:00
parent 84a438be55
commit 9d45e9641c
3 changed files with 34 additions and 8 deletions

View File

@ -101,6 +101,8 @@ CoglTextureUnit *
_cogl_get_texture_unit (int index_); _cogl_get_texture_unit (int index_);
void void
_cogl_destroy_texture_units (void); _cogl_destroy_texture_units (void);
guint
_cogl_get_max_texture_image_units (void);
void void
_cogl_flush_face_winding (void); _cogl_flush_face_winding (void);

View File

@ -48,12 +48,6 @@
#include "../gles/cogl-gles2-wrapper.h" #include "../gles/cogl-gles2-wrapper.h"
#endif #endif
#ifdef HAVE_COGL_GLES
#define COGL_MATERIAL_MAX_TEXTURE_UNITS GL_MAX_TEXTURE_UNITS
#else
#define COGL_MATERIAL_MAX_TEXTURE_UNITS GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
#endif
#ifdef HAVE_COGL_GL #ifdef HAVE_COGL_GL
#define glActiveTexture ctx->drv.pf_glActiveTexture #define glActiveTexture ctx->drv.pf_glActiveTexture
#define glClientActiveTexture ctx->drv.pf_glClientActiveTexture #define glClientActiveTexture ctx->drv.pf_glClientActiveTexture
@ -828,7 +822,7 @@ cogl_material_set_layer (CoglHandle material_handle,
_cogl_material_pre_change_notify (material, FALSE, NULL); _cogl_material_pre_change_notify (material, FALSE, NULL);
material->n_layers = g_list_length (material->layers); material->n_layers = g_list_length (material->layers);
if (material->n_layers >= COGL_MATERIAL_MAX_TEXTURE_UNITS) if (material->n_layers >= _cogl_get_max_texture_image_units ())
{ {
if (!(material->flags & COGL_MATERIAL_FLAG_SHOWN_SAMPLER_WARNING)) if (!(material->flags & COGL_MATERIAL_FLAG_SHOWN_SAMPLER_WARNING))
{ {
@ -1537,7 +1531,7 @@ _cogl_material_flush_layers_gl_state (CoglMaterial *material,
layer->flags &= ~COGL_MATERIAL_LAYER_FLAG_DIRTY; layer->flags &= ~COGL_MATERIAL_LAYER_FLAG_DIRTY;
if ((i+1) >= COGL_MATERIAL_MAX_TEXTURE_UNITS) if ((i+1) >= _cogl_get_max_texture_image_units ())
break; break;
} }

View File

@ -788,6 +788,36 @@ _cogl_destroy_texture_units (void)
g_list_free (ctx->texture_units); g_list_free (ctx->texture_units);
} }
/*
* This is more complicated than that, another pass needs to be done when
* cogl have a neat way of saying if we are using the fixed function pipeline
* or not (for the GL case):
* MAX_TEXTURE_UNITS: fixed function pipeline, a texture unit has both a
* sampler and a set of texture coordinates
* MAX_TEXTURE_IMAGE_UNITS: number of samplers one can use from a fragment
* program/shader (ARBfp1.0 asm/GLSL)
* MAX_VERTEX_TEXTURE_UNITS: number of samplers one can use from a vertex
* program/shader (can be 0)
* MAX_COMBINED_TEXTURE_IMAGE_UNITS: Maximum samplers one can use, counting both
* the vertex and fragment shaders
*
* If both the vertex shader and the fragment processing stage access the same
* texture image unit, then that counts as using two texture image units
* against the latter limit: http://www.opengl.org/sdk/docs/man/xhtml/glGet.xml
*
* Note that, for now, we use GL_MAX_TEXTURE_UNITS as we are exposing the
* fixed function pipeline.
*/
guint
_cogl_get_max_texture_image_units (void)
{
GLint nb_texture_image_units;
GE( glGetIntegerv(GL_MAX_TEXTURE_UNITS, &nb_texture_image_units) );
return nb_texture_image_units;
}
void void
cogl_push_matrix (void) cogl_push_matrix (void)
{ {