Beispiel #1
0
void GLAPIENTRY
_mesa_EnableVertexAttribArrayARB(GLuint index)
{
   GET_CURRENT_CONTEXT(ctx);
   ASSERT_OUTSIDE_BEGIN_END(ctx);

   if (index >= ctx->Const.MaxVertexProgramAttribs) {
      _mesa_error(ctx, GL_INVALID_VALUE,
                  "glEnableVertexAttribArrayARB(index)");
      return;
   }

   FLUSH_VERTICES(ctx, _NEW_ARRAY);
   ctx->Array.VertexAttrib[index].Enabled = GL_TRUE;
   ctx->Array._Enabled |= _NEW_ARRAY_ATTRIB(index);
   ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
}
Beispiel #2
0
void GLAPIENTRY
_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
                            GLsizei stride, const GLvoid *ptr)
{
    GLsizei elementSize;
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);

    if (index >= VERT_ATTRIB_MAX) {
        _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)");
        return;
    }

    if (size < 1 || size > 4) {
        _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size)");
        return;
    }

    if (stride < 0) {
        _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(stride)");
        return;
    }

    if (type == GL_UNSIGNED_BYTE && size != 4) {
        _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)");
        return;
    }

    /* check for valid 'type' and compute StrideB right away */
    switch (type) {
    case GL_UNSIGNED_BYTE:
        elementSize = size * sizeof(GLubyte);
        break;
    case GL_SHORT:
        elementSize = size * sizeof(GLshort);
        break;
    case GL_FLOAT:
        elementSize = size * sizeof(GLfloat);
        break;
    case GL_DOUBLE:
        elementSize = size * sizeof(GLdouble);
        break;
    default:
        _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerNV(type)" );
        return;
    }

    update_array(ctx, &ctx->Array.VertexAttrib[index], _NEW_ARRAY_ATTRIB(index),
                 elementSize, size, type, stride, GL_FALSE, ptr);

    if (ctx->Driver.VertexAttribPointer)
        ctx->Driver.VertexAttribPointer( ctx, index, size, type, stride, ptr );
}
Beispiel #3
0
void GLAPIENTRY
_mesa_DisableVertexAttribArrayARB(GLuint index)
{
   GET_CURRENT_CONTEXT(ctx);
   ASSERT_OUTSIDE_BEGIN_END(ctx);

   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
      _mesa_error(ctx, GL_INVALID_VALUE,
                  "glEnableVertexAttribArrayARB(index)");
      return;
   }

   ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib));

   FLUSH_VERTICES(ctx, _NEW_ARRAY);
   ctx->Array.ArrayObj->VertexAttrib[index].Enabled = GL_FALSE;
   ctx->Array.ArrayObj->_Enabled &= ~_NEW_ARRAY_ATTRIB(index);
   ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
}
Beispiel #4
0
/**
 * Helper to enable/disable client-side state.
 */
static void
client_state(GLcontext *ctx, GLenum cap, GLboolean state)
{
   GLuint flag;
   GLboolean *var;

   switch (cap) {
      case GL_VERTEX_ARRAY:
         var = &ctx->Array.ArrayObj->Vertex.Enabled;
         flag = _NEW_ARRAY_VERTEX;
         break;
      case GL_NORMAL_ARRAY:
         var = &ctx->Array.ArrayObj->Normal.Enabled;
         flag = _NEW_ARRAY_NORMAL;
         break;
      case GL_COLOR_ARRAY:
         var = &ctx->Array.ArrayObj->Color.Enabled;
         flag = _NEW_ARRAY_COLOR0;
         break;
      case GL_INDEX_ARRAY:
         var = &ctx->Array.ArrayObj->Index.Enabled;
         flag = _NEW_ARRAY_INDEX;
         break;
      case GL_TEXTURE_COORD_ARRAY:
         var = &ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled;
         flag = _NEW_ARRAY_TEXCOORD(ctx->Array.ActiveTexture);
         break;
      case GL_EDGE_FLAG_ARRAY:
         var = &ctx->Array.ArrayObj->EdgeFlag.Enabled;
         flag = _NEW_ARRAY_EDGEFLAG;
         break;
      case GL_FOG_COORDINATE_ARRAY_EXT:
         var = &ctx->Array.ArrayObj->FogCoord.Enabled;
         flag = _NEW_ARRAY_FOGCOORD;
         break;
      case GL_SECONDARY_COLOR_ARRAY_EXT:
         var = &ctx->Array.ArrayObj->SecondaryColor.Enabled;
         flag = _NEW_ARRAY_COLOR1;
         break;

#if FEATURE_point_size_array
      case GL_POINT_SIZE_ARRAY_OES:
         var = &ctx->Array.ArrayObj->PointSize.Enabled;
         flag = _NEW_ARRAY_POINT_SIZE;
         break;
#endif

#if FEATURE_NV_vertex_program
      case GL_VERTEX_ATTRIB_ARRAY0_NV:
      case GL_VERTEX_ATTRIB_ARRAY1_NV:
      case GL_VERTEX_ATTRIB_ARRAY2_NV:
      case GL_VERTEX_ATTRIB_ARRAY3_NV:
      case GL_VERTEX_ATTRIB_ARRAY4_NV:
      case GL_VERTEX_ATTRIB_ARRAY5_NV:
      case GL_VERTEX_ATTRIB_ARRAY6_NV:
      case GL_VERTEX_ATTRIB_ARRAY7_NV:
      case GL_VERTEX_ATTRIB_ARRAY8_NV:
      case GL_VERTEX_ATTRIB_ARRAY9_NV:
      case GL_VERTEX_ATTRIB_ARRAY10_NV:
      case GL_VERTEX_ATTRIB_ARRAY11_NV:
      case GL_VERTEX_ATTRIB_ARRAY12_NV:
      case GL_VERTEX_ATTRIB_ARRAY13_NV:
      case GL_VERTEX_ATTRIB_ARRAY14_NV:
      case GL_VERTEX_ATTRIB_ARRAY15_NV:
         CHECK_EXTENSION(NV_vertex_program, cap);
         {
            GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV;
            var = &ctx->Array.ArrayObj->VertexAttrib[n].Enabled;
            flag = _NEW_ARRAY_ATTRIB(n);
         }
         break;
#endif /* FEATURE_NV_vertex_program */

      default:
         _mesa_error( ctx, GL_INVALID_ENUM,
                      "glEnable/DisableClientState(0x%x)", cap);
         return;
   }

   if (*var == state)
      return;

   FLUSH_VERTICES(ctx, _NEW_ARRAY);
   ctx->Array.NewState |= flag;

   _ae_invalidate_state(ctx, _NEW_ARRAY);

   *var = state;

   if (state)
      ctx->Array.ArrayObj->_Enabled |= flag;
   else
      ctx->Array.ArrayObj->_Enabled &= ~flag;

   if (ctx->Driver.Enable) {
      ctx->Driver.Enable( ctx, cap, state );
   }
}
Beispiel #5
0
void GLAPIENTRY
_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type,
                             GLboolean normalized,
                             GLsizei stride, const GLvoid *ptr)
{
    GLsizei elementSize;
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);

    if (index >= ctx->Const.MaxVertexProgramAttribs) {
        _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)");
        return;
    }

    if (size < 1 || size > 4) {
        _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(size)");
        return;
    }

    if (stride < 0) {
        _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(stride)");
        return;
    }

    if (type == GL_UNSIGNED_BYTE && size != 4) {
        _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(size!=4)");
        return;
    }

    /* check for valid 'type' and compute StrideB right away */
    /* NOTE: more types are supported here than in the NV extension */
    switch (type) {
    case GL_BYTE:
        elementSize = size * sizeof(GLbyte);
        break;
    case GL_UNSIGNED_BYTE:
        elementSize = size * sizeof(GLubyte);
        break;
    case GL_SHORT:
        elementSize = size * sizeof(GLshort);
        break;
    case GL_UNSIGNED_SHORT:
        elementSize = size * sizeof(GLushort);
        break;
    case GL_INT:
        elementSize = size * sizeof(GLint);
        break;
    case GL_UNSIGNED_INT:
        elementSize = size * sizeof(GLuint);
        break;
    case GL_FLOAT:
        elementSize = size * sizeof(GLfloat);
        break;
    case GL_DOUBLE:
        elementSize = size * sizeof(GLdouble);
        break;
    default:
        _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerARB(type)" );
        return;
    }

    update_array(ctx, &ctx->Array.VertexAttrib[index], _NEW_ARRAY_ATTRIB(index),
                 elementSize, size, type, stride, normalized, ptr);

    /* XXX fix
    if (ctx->Driver.VertexAttribPointer)
       ctx->Driver.VertexAttribPointer( ctx, index, size, type, stride, ptr );
    */
}