mesa: point size arrays
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 25 Jun 2008 14:45:14 +0000 (08:45 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 25 Jun 2008 14:45:14 +0000 (08:45 -0600)
src/mesa/main/arrayobj.c
src/mesa/main/enable.c
src/mesa/main/ffvertex_prog.c
src/mesa/main/glheader.h
src/mesa/main/mfeatures.h
src/mesa/main/mtypes.h
src/mesa/main/state.c
src/mesa/main/varray.c
src/mesa/main/varray.h
src/mesa/state_tracker/st_program.c
src/mesa/vbo/vbo_exec_array.c

index f08f99d8e17fb5e62dca9851f1c835d94c435749..d62661e2b52b98d8dc806d93b79ccead6c07a1cf 100644 (file)
@@ -164,6 +164,15 @@ _mesa_initialize_array_object( GLcontext *ctx,
       obj->VertexAttrib[i].Normalized = GL_FALSE;
    }
 
+#if FEATURE_point_size_array
+   obj->PointSize.Type = GL_FLOAT;
+   obj->PointSize.Stride = 0;
+   obj->PointSize.StrideB = 0;
+   obj->PointSize.Ptr = NULL;
+   obj->PointSize.Enabled = GL_FALSE;
+   obj->PointSize.BufferObj = ctx->Array.NullBufferObj;
+#endif
+
 #if FEATURE_ARB_vertex_buffer_object
    /* Vertex array buffers */
    obj->Vertex.BufferObj = ctx->Array.NullBufferObj;
index 6b4ad8eea35406c9a8e35a4acb2308acb9b687fe..9dc55d4e69fd91b88b36b89fc91be7d689543e2f 100644 (file)
@@ -92,6 +92,13 @@ client_state(GLcontext *ctx, GLenum cap, GLboolean state)
          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:
@@ -652,6 +659,7 @@ _mesa_set_enable(GLcontext *ctx, GLenum cap, GLboolean state)
       case GL_EDGE_FLAG_ARRAY:
       case GL_FOG_COORDINATE_ARRAY_EXT:
       case GL_SECONDARY_COLOR_ARRAY_EXT:
+      case GL_POINT_SIZE_ARRAY_OES:
          client_state( ctx, cap, state );
          return;
 
@@ -1174,6 +1182,10 @@ _mesa_IsEnabled( GLenum cap )
       case GL_SECONDARY_COLOR_ARRAY_EXT:
          CHECK_EXTENSION(EXT_secondary_color);
          return (ctx->Array.ArrayObj->SecondaryColor.Enabled != 0);
+#if FEATURE_point_size_array
+      case GL_POINT_SIZE_ARRAY_OES:
+         return (ctx->Array.ArrayObj->PointSize.Enabled != 0);
+#endif
 
       /* GL_EXT_histogram */
       case GL_HISTOGRAM:
index e6c7c1040faf4c2e32d34975f841ea6374ac1f22..2baae77570e509b4a5d87861247c3b52e6fe8cdb 100644 (file)
@@ -63,6 +63,7 @@ struct state_key {
    unsigned separate_specular:1;
    unsigned fog_mode:2;
    unsigned point_attenuated:1;
+   unsigned point_array:1;
    unsigned texture_enabled_global:1;
    unsigned fragprog_inputs_read:12;
 
@@ -264,6 +265,9 @@ static struct state_key *make_state_key( GLcontext *ctx )
    if (ctx->Point._Attenuated)
       key->point_attenuated = 1;
 
+   if (ctx->Array.ArrayObj->PointSize.Enabled)
+      key->point_array = 1;
+
    if (ctx->Texture._TexGenEnabled ||
        ctx->Texture._TexMatEnabled ||
        ctx->Texture._EnabledUnits)
@@ -444,12 +448,18 @@ static void release_temps( struct tnl_program *p )
 
 
 
+/**
+ * \param input  one of VERT_ATTRIB_x tokens.
+ */
 static struct ureg register_input( struct tnl_program *p, GLuint input )
 {
    p->program->Base.InputsRead |= (1<<input);
    return make_ureg(PROGRAM_INPUT, input);
 }
 
+/**
+ * \param input  one of VERT_RESULT_x tokens.
+ */
 static struct ureg register_output( struct tnl_program *p, GLuint output )
 {
    p->program->Base.OutputsWritten |= (1<<output);
@@ -1518,7 +1528,10 @@ static void build_texture_transform( struct tnl_program *p )
 }
 
 
-static void build_pointsize( struct tnl_program *p )
+/**
+ * Point size attenuation computation.
+ */
+static void build_atten_pointsize( struct tnl_program *p )
 {
    struct ureg eye = get_eye_position_z(p);
    struct ureg state_size = register_param1(p, STATE_POINT_SIZE);
@@ -1555,13 +1568,24 @@ static void build_pointsize( struct tnl_program *p )
 /**
  * Emit constant point size.
  */
-static void constant_pointsize( struct tnl_program *p )
+static void build_constant_pointsize( struct tnl_program *p )
 {
    struct ureg state_size = register_param1(p, STATE_POINT_SIZE);
    struct ureg out = register_output(p, VERT_RESULT_PSIZ);
    emit_op1(p, OPCODE_MOV, out, WRITEMASK_X, state_size);
 }
 
+/**
+ * Pass-though per-vertex point size, from user's point size array.
+ */
+static void build_array_pointsize( struct tnl_program *p )
+{
+   struct ureg in = register_input(p, VERT_ATTRIB_POINT_SIZE);
+   struct ureg out = register_output(p, VERT_RESULT_PSIZ);
+   emit_op1(p, OPCODE_MOV, out, WRITEMASK_X, in);
+}
+
+
 static void build_tnl_program( struct tnl_program *p )
 {   /* Emit the program, starting with modelviewproject:
     */
@@ -1589,10 +1613,12 @@ static void build_tnl_program( struct tnl_program *p )
       build_texture_transform(p);
 
    if (p->state->point_attenuated)
-      build_pointsize(p);
+      build_atten_pointsize(p);
+   else if (p->state->point_array)
+      build_array_pointsize(p);
 #if 0
    else
-      constant_pointsize(p);
+      build_constant_pointsize(p);
 #endif
 
    /* Finish up:
index 57d7e60ad3dceedf48ea0596b623c13cebfa03b4..3131a356b86f2fca6d3da226f1c4bd190469fe09 100644 (file)
 #endif
 
 
+#ifndef GL_OES_point_size_array
+#define GL_POINT_SIZE_ARRAY_OES                                 0x8B9C
+#define GL_POINT_SIZE_ARRAY_TYPE_OES                            0x898A
+#define GL_POINT_SIZE_ARRAY_STRIDE_OES                          0x898B
+#define GL_POINT_SIZE_ARRAY_POINTER_OES                         0x898C
+#define GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES                  0x8B9F
+#endif
+
+
+
 #if !defined(CAPI) && defined(WIN32) && !defined(BUILD_FOR_SNAP)
 #define CAPI _cdecl
 #endif
index a305bbd6059f937ffb4d40d53123659ed24c7cd3..c3c337ea904a75e97e7a2921b9f800ccc58608d8 100644 (file)
@@ -49,6 +49,7 @@
 #define FEATURE_fixedpt 0
 #define FEATURE_histogram  _HAVE_FULL_GL
 #define FEATURE_pixel_transfer  _HAVE_FULL_GL
+#define FEATURE_point_size_array 0
 #define FEATURE_texgen  _HAVE_FULL_GL
 #define FEATURE_texture_fxt1  _HAVE_FULL_GL
 #define FEATURE_texture_s3tc  _HAVE_FULL_GL
index 8a6c84368a4a1d29fa22a9ef89a54557fbf3f2e0..dceb7611f252a4f8f2d53b4e388f3d392f32e5e9 100644 (file)
@@ -151,6 +151,7 @@ enum
    VERT_ATTRIB_COLOR1 = 4,
    VERT_ATTRIB_FOG = 5,
    VERT_ATTRIB_COLOR_INDEX = 6,
+   VERT_ATTRIB_POINT_SIZE = 6,  /*alias*/
    VERT_ATTRIB_EDGEFLAG = 7,
    VERT_ATTRIB_TEX0 = 8,
    VERT_ATTRIB_TEX1 = 9,
@@ -1707,6 +1708,7 @@ struct gl_array_object
    struct gl_client_array Index;
    struct gl_client_array EdgeFlag;
    struct gl_client_array TexCoord[MAX_TEXTURE_COORD_UNITS];
+   struct gl_client_array PointSize;
    /*@}*/
 
    /** Generic arrays for vertex programs/shaders */
@@ -2748,6 +2750,7 @@ struct gl_matrix_stack
 #define _NEW_ARRAY_FOGCOORD         VERT_BIT_FOG
 #define _NEW_ARRAY_INDEX            VERT_BIT_COLOR_INDEX
 #define _NEW_ARRAY_EDGEFLAG         VERT_BIT_EDGEFLAG
+#define _NEW_ARRAY_POINT_SIZE       VERT_BIT_COLOR_INDEX  /* aliased */
 #define _NEW_ARRAY_TEXCOORD_0       VERT_BIT_TEX0
 #define _NEW_ARRAY_TEXCOORD_1       VERT_BIT_TEX1
 #define _NEW_ARRAY_TEXCOORD_2       VERT_BIT_TEX2
@@ -2765,6 +2768,7 @@ struct gl_matrix_stack
 /*@}*/
 
 
+
 /**
  * \name A bunch of flags that we think might be useful to drivers.
  * 
index 4d1fdbf47c4339798c16f58a53361ddc1d4c0ae0..315253d90a7faa28c270eebc62aca659ef366409 100644 (file)
@@ -448,7 +448,7 @@ _mesa_update_state_locked( GLcontext *ctx )
       prog_flags |= (_NEW_TEXTURE | _NEW_FOG | _DD_NEW_SEPARATE_SPECULAR);
    }
    if (ctx->VertexProgram._MaintainTnlProgram) {
-      prog_flags |= (_NEW_TEXTURE | _NEW_TEXTURE_MATRIX |
+      prog_flags |= (_NEW_ARRAY | _NEW_TEXTURE | _NEW_TEXTURE_MATRIX |
                      _NEW_TRANSFORM | _NEW_POINT |
                      _NEW_FOG | _NEW_LIGHT |
                      _MESA_NEW_NEED_EYE_COORDS);
index 220db35855f349673a6dba84d6968269fc122bd4..50fe87455636e97e22fd36b95870b91d7a3357a0 100644 (file)
@@ -468,6 +468,37 @@ _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr)
 }
 
 
+void GLAPIENTRY
+_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr)
+{
+   GLsizei elementSize;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   if (stride < 0) {
+      _mesa_error( ctx, GL_INVALID_VALUE, "glPointSizePointer(stride)" );
+      return;
+   }
+
+   switch (type) {
+      case GL_FLOAT:
+         elementSize = sizeof(GLfloat);
+         break;
+#if FEATURE_fixedpt
+      case GL_FIXED:
+         elementSize = sizeof(GLfixed);
+         break;
+#endif
+      default:
+         _mesa_error( ctx, GL_INVALID_ENUM, "glPointSizePointer(type)" );
+         return;
+   }
+
+   update_array(ctx, &ctx->Array.ArrayObj->PointSize, _NEW_ARRAY_POINT_SIZE,
+                elementSize, 1, type, stride, GL_FALSE, ptr);
+}
+
+
 #if FEATURE_NV_vertex_program
 void GLAPIENTRY
 _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
index ba91ecf5f6a81fd6b137d97d6b39b1216372b9a0..f557940738e33ba8760f272e29c8854ca3f5271f 100644 (file)
@@ -111,6 +111,10 @@ _mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
                               GLsizei stride, const GLvoid *ptr);
 
 
+extern void GLAPIENTRY
+_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr);
+
+
 extern void GLAPIENTRY
 _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
                             GLsizei stride, const GLvoid *pointer);
index d450c306947a50da04a5a5c8e110ba87da1a491b..958096f68e67347ccfea80f4ddd8c7993e0ea1a6 100644 (file)
@@ -136,6 +136,10 @@ st_translate_vertex_program(struct st_context *st,
             vs_input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
             vs_input_semantic_index[slot] = 0;
             break;
+         case VERT_ATTRIB_POINT_SIZE:
+            vs_input_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
+            vs_input_semantic_index[slot] = 0;
+            break;
          case VERT_ATTRIB_TEX0:
          case VERT_ATTRIB_TEX1:
          case VERT_ATTRIB_TEX2:
index e3d2fc51cb78952fe2b061d21f0fdf9dba714360..bf97956286a8b92365f84b3def857c8f47d26de9 100644 (file)
@@ -107,6 +107,10 @@ static void bind_array_obj( GLcontext *ctx )
    exec->array.legacy_array[VERT_ATTRIB_COLOR1] = &ctx->Array.ArrayObj->SecondaryColor;
    exec->array.legacy_array[VERT_ATTRIB_FOG] = &ctx->Array.ArrayObj->FogCoord;
    exec->array.legacy_array[VERT_ATTRIB_COLOR_INDEX] = &ctx->Array.ArrayObj->Index;
+   if (ctx->Array.ArrayObj->PointSize.Enabled) {
+      /* this aliases COLOR_INDEX */
+      exec->array.legacy_array[VERT_ATTRIB_POINT_SIZE] = &ctx->Array.ArrayObj->PointSize;
+   }
    exec->array.legacy_array[VERT_ATTRIB_EDGEFLAG] = &ctx->Array.ArrayObj->EdgeFlag;
 
    for (i = 0; i < 8; i++)