void _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); if (size<3 || size>4) { gl_error( ctx, GL_INVALID_VALUE, "glColorPointer(size)" ); return; } if (stride<0) { gl_error( ctx, GL_INVALID_VALUE, "glColorPointer(stride)" ); return; } if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) fprintf(stderr, "glColorPointer( sz %d type %s stride %d )\n", size, gl_lookup_enum_by_nr( type ), stride); ctx->Array.Color.StrideB = stride; if (!stride) { switch (type) { case GL_BYTE: ctx->Array.Color.StrideB = size*sizeof(GLbyte); break; case GL_UNSIGNED_BYTE: ctx->Array.Color.StrideB = size*sizeof(GLubyte); break; case GL_SHORT: ctx->Array.Color.StrideB = size*sizeof(GLshort); break; case GL_UNSIGNED_SHORT: ctx->Array.Color.StrideB = size*sizeof(GLushort); break; case GL_INT: ctx->Array.Color.StrideB = size*sizeof(GLint); break; case GL_UNSIGNED_INT: ctx->Array.Color.StrideB = size*sizeof(GLuint); break; case GL_FLOAT: ctx->Array.Color.StrideB = size*sizeof(GLfloat); break; case GL_DOUBLE: ctx->Array.Color.StrideB = size*sizeof(GLdouble); break; default: gl_error( ctx, GL_INVALID_ENUM, "glColorPointer(type)" ); return; } } ctx->Array.Color.Size = size; ctx->Array.Color.Type = type; ctx->Array.Color.Stride = stride; ctx->Array.Color.Ptr = (void *) ptr; ctx->Array.ColorFunc = gl_trans_4ub_tab[size][TYPE_IDX(type)]; ctx->Array.ColorEltFunc = gl_trans_elt_4ub_tab[size][TYPE_IDX(type)]; ctx->Array.NewArrayState |= VERT_RGBA; ctx->NewState |= NEW_CLIENT_STATE; }
void _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); GLuint texUnit; texUnit = ctx->Array.ActiveTexture; if (size<1 || size>4) { gl_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(size)" ); return; } if (stride<0) { gl_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(stride)" ); return; } if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) fprintf(stderr, "glTexCoordPointer( unit %u sz %d type %s stride %d )\n", texUnit, size, gl_lookup_enum_by_nr( type ), stride); ctx->Array.TexCoord[texUnit].StrideB = stride; if (!stride) { switch (type) { case GL_SHORT: ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLshort); break; case GL_INT: ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLint); break; case GL_FLOAT: ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLfloat); break; case GL_DOUBLE: ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLdouble); break; default: gl_error( ctx, GL_INVALID_ENUM, "glTexCoordPointer(type)" ); return; } } ctx->Array.TexCoord[texUnit].Size = size; ctx->Array.TexCoord[texUnit].Type = type; ctx->Array.TexCoord[texUnit].Stride = stride; ctx->Array.TexCoord[texUnit].Ptr = (void *) ptr; ctx->Array.TexCoordFunc[texUnit] = gl_trans_4f_tab[size][TYPE_IDX(type)]; ctx->Array.TexCoordEltFunc[texUnit] = gl_trans_elt_4f_tab[size][TYPE_IDX(type)]; ctx->Array.NewArrayState |= PIPE_TEX(texUnit); ctx->NewState |= NEW_CLIENT_STATE; }
void _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) { GET_CURRENT_CONTEXT(ctx); if (stride<0) { gl_error( ctx, GL_INVALID_VALUE, "glNormalPointer(stride)" ); return; } if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) fprintf(stderr, "glNormalPointer( type %s stride %d )\n", gl_lookup_enum_by_nr( type ), stride); ctx->Array.Normal.StrideB = stride; if (!stride) { switch (type) { case GL_BYTE: ctx->Array.Normal.StrideB = 3*sizeof(GLbyte); break; case GL_SHORT: ctx->Array.Normal.StrideB = 3*sizeof(GLshort); break; case GL_INT: ctx->Array.Normal.StrideB = 3*sizeof(GLint); break; case GL_FLOAT: ctx->Array.Normal.StrideB = 3*sizeof(GLfloat); break; case GL_DOUBLE: ctx->Array.Normal.StrideB = 3*sizeof(GLdouble); break; default: gl_error( ctx, GL_INVALID_ENUM, "glNormalPointer(type)" ); return; } } ctx->Array.Normal.Type = type; ctx->Array.Normal.Stride = stride; ctx->Array.Normal.Ptr = (void *) ptr; ctx->Array.NormalFunc = gl_trans_3f_tab[TYPE_IDX(type)]; ctx->Array.NormalEltFunc = gl_trans_elt_3f_tab[TYPE_IDX(type)]; ctx->Array.NewArrayState |= VERT_NORM; ctx->NewState |= NEW_CLIENT_STATE; }
/* * NOTE: this function can't be put in a display list. */ GLint _mesa_RenderMode( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); GLint result; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, "glRenderMode", 0); if (MESA_VERBOSE & VERBOSE_API) fprintf(stderr, "glRenderMode %s\n", gl_lookup_enum_by_nr(mode)); ctx->TriangleCaps &= ~(DD_FEEDBACK|DD_SELECT); switch (ctx->RenderMode) { case GL_RENDER: result = 0; break; case GL_SELECT: if (ctx->Select.HitFlag) { write_hit_record( ctx ); } if (ctx->Select.BufferCount > ctx->Select.BufferSize) { /* overflow */ #ifdef DEBUG gl_warning(ctx, "Feedback buffer overflow"); #endif result = -1; } else { result = ctx->Select.Hits; } ctx->Select.BufferCount = 0; ctx->Select.Hits = 0; ctx->Select.NameStackDepth = 0; break; case GL_FEEDBACK: if (ctx->Feedback.Count > ctx->Feedback.BufferSize) { /* overflow */ result = -1; } else { result = ctx->Feedback.Count; } ctx->Feedback.Count = 0; break; default: gl_error( ctx, GL_INVALID_ENUM, "glRenderMode" ); return 0; } switch (mode) { case GL_RENDER: break; case GL_SELECT: ctx->TriangleCaps |= DD_SELECT; if (ctx->Select.BufferSize==0) { /* haven't called glSelectBuffer yet */ gl_error( ctx, GL_INVALID_OPERATION, "glRenderMode" ); } break; case GL_FEEDBACK: ctx->TriangleCaps |= DD_FEEDBACK; if (ctx->Feedback.BufferSize==0) { /* haven't called glFeedbackBuffer yet */ gl_error( ctx, GL_INVALID_OPERATION, "glRenderMode" ); } break; default: gl_error( ctx, GL_INVALID_ENUM, "glRenderMode" ); return 0; } ctx->RenderMode = mode; ctx->NewState |= NEW_ALL; return result; }
static inline const char * gl_lookup_error_by_nr(int error) { const int size = tableSize(_ErrorCode_enum_); return gl_lookup_enum_by_nr(error, _ErrorCode_enum_, size); }