ARB sprite point support on i965
authorZou Nan hai <nanhai.zou@intel.com>
Mon, 30 Jul 2007 02:18:11 +0000 (10:18 +0800)
committerZou Nan hai <nanhai.zou@intel.com>
Mon, 30 Jul 2007 02:18:11 +0000 (10:18 +0800)
src/mesa/drivers/dri/i965/brw_sf.c
src/mesa/drivers/dri/i965/brw_sf.h
src/mesa/drivers/dri/i965/brw_sf_emit.c
src/mesa/drivers/dri/i965/intel_context.c

index d5175399d6c71907184f9be624b919d5000a8e67..73232b3c7c86419c8da668a5298d6dfade28cbd5 100644 (file)
@@ -74,6 +74,11 @@ static void compile_sf_prog( struct brw_context *brw,
       if (c.key.attrs & (1<<i)) {
         c.attr_to_idx[i] = idx;
         c.idx_to_attr[idx] = i;
+        if (i >= VERT_RESULT_TEX0 && i <= VERT_RESULT_TEX7) {
+                c.point_attrs[i].CoordReplace = 
+                       brw->attribs.Point->CoordReplace[i - VERT_RESULT_TEX0];
+        } else
+                c.point_attrs[i].CoordReplace = GL_FALSE;
         idx++;
       }
    
@@ -90,7 +95,10 @@ static void compile_sf_prog( struct brw_context *brw,
       break;
    case SF_POINTS:
       c.nr_verts = 1;
-      brw_emit_point_setup( &c );
+      if (key->do_point_sprite)
+         brw_emit_point_sprite_setup( &c );
+      else
+         brw_emit_point_setup( &c );
       break;
    case SF_UNFILLED_TRIS:
       c.nr_verts = 3;
@@ -162,7 +170,8 @@ static void upload_sf_prog( struct brw_context *brw )
       break;
    }
 
-
+   key.do_point_sprite = brw->attribs.Point->PointSprite;
+   key.SpriteOrigin = brw->attribs.Point->SpriteOrigin;
    /* _NEW_LIGHT */
    key.do_flat_shading = (brw->attribs.Light->ShadeModel == GL_FLAT);
    key.do_twoside_color = (brw->attribs.Light->Enabled && brw->attribs.Light->Model.TwoSide);
@@ -179,7 +188,7 @@ static void upload_sf_prog( struct brw_context *brw )
 
 const struct brw_tracked_state brw_sf_prog = {
    .dirty = {
-      .mesa  = (_NEW_LIGHT|_NEW_POLYGON),
+      .mesa  = (_NEW_LIGHT|_NEW_POLYGON|_NEW_POINT),
       .brw   = (BRW_NEW_REDUCED_PRIMITIVE),
       .cache = CACHE_NEW_VS_PROG
    },
index fb72b84ba8a7344b2fd9523dfba8cbe6a792232f..e374e372bb062ce2e4589647c00bc294d882a419 100644 (file)
@@ -50,9 +50,14 @@ struct brw_sf_prog_key {
    GLuint do_flat_shading:1;
    GLuint attrs:16;
    GLuint frontface_ccw:1;
-   GLuint pad:11;
+   GLuint do_point_sprite:1;
+   GLuint pad:10;
+   GLenum SpriteOrigin;
 };
 
+struct brw_sf_point_tex {
+       GLboolean CoordReplace; 
+};
 
 struct brw_sf_compile {
    struct brw_compile func;
@@ -94,12 +99,14 @@ struct brw_sf_compile {
 
    GLubyte attr_to_idx[VERT_RESULT_MAX];   
    GLubyte idx_to_attr[VERT_RESULT_MAX];   
+   struct brw_sf_point_tex point_attrs[VERT_RESULT_MAX];
 };
 
  
 void brw_emit_tri_setup( struct brw_sf_compile *c );
 void brw_emit_line_setup( struct brw_sf_compile *c );
 void brw_emit_point_setup( struct brw_sf_compile *c );
+void brw_emit_point_sprite_setup( struct brw_sf_compile *c );
 void brw_emit_anyprim_setup( struct brw_sf_compile *c );
 
 #endif
index cbaf018c44a868a4e6ba42f7fd4731306ffbdb6b..7ecf9bb560d515a14915b0567deef1d1e1d84b01 100644 (file)
@@ -497,6 +497,86 @@ void brw_emit_line_setup( struct brw_sf_compile *c )
    } 
 }
 
+void brw_emit_point_sprite_setup( struct brw_sf_compile *c )
+{
+   struct brw_compile *p = &c->func;
+   GLuint i;
+
+   c->nr_verts = 1;
+   alloc_regs(c);
+   copy_z_inv_w(c);
+   for (i = 0; i < c->nr_setup_regs; i++)
+   {
+      struct brw_sf_point_tex *tex = &c->point_attrs[c->idx_to_attr[2*i]];
+      struct brw_reg a0 = offset(c->vert[0], i);
+      GLushort pc, pc_persp, pc_linear;
+      GLboolean last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear);
+            
+      if (pc_persp)
+      {                                
+         if (!tex->CoordReplace) {
+             brw_set_predicate_control_flag_value(p, pc_persp);
+             brw_MUL(p, a0, a0, c->inv_w[0]);
+         }
+      }
+
+      if (tex->CoordReplace) {
+         /* Caculate 1.0/PointWidth */
+         brw_math(&c->func,
+                 c->tmp,
+                 BRW_MATH_FUNCTION_INV,
+                 BRW_MATH_SATURATE_NONE,
+                 0,
+                 c->dx0,
+                 BRW_MATH_DATA_SCALAR,
+                 BRW_MATH_PRECISION_FULL);
+
+         if (c->key.SpriteOrigin == GL_UPPER_LEFT) {
+               brw_MUL(p, c->m1Cx, c->tmp, c->inv_w[0]);
+               brw_MOV(p, vec1(suboffset(c->m1Cx, 1)), brw_imm_f(0.0));
+               brw_MUL(p, c->m2Cy, c->tmp, negate(c->inv_w[0]));
+               brw_MOV(p, vec1(suboffset(c->m2Cy, 0)), brw_imm_f(0.0));
+         } else {
+               brw_MUL(p, c->m1Cx, c->tmp, c->inv_w[0]);
+               brw_MOV(p, vec1(suboffset(c->m1Cx, 1)), brw_imm_f(0.0));
+               brw_MUL(p, c->m2Cy, c->tmp, c->inv_w[0]);
+               brw_MOV(p, vec1(suboffset(c->m2Cy, 0)), brw_imm_f(0.0));
+         }
+      } else {
+         brw_MOV(p, c->m1Cx, brw_imm_ud(0));
+         brw_MOV(p, c->m2Cy, brw_imm_ud(0));
+      }
+
+      {
+        brw_set_predicate_control_flag_value(p, pc); 
+        if (tex->CoordReplace) {
+            if (c->key.SpriteOrigin == GL_UPPER_LEFT) {
+                brw_MUL(p, c->m3C0, c->inv_w[0], brw_imm_f(1.0));
+                brw_MOV(p, vec1(suboffset(c->m3C0, 0)), brw_imm_f(0.0));
+            }
+            else
+                brw_MOV(p, c->m3C0, brw_imm_f(0.0));
+        } else {
+               brw_MOV(p, c->m3C0, a0); /* constant value */
+        }
+
+        /* Copy m0..m3 to URB. 
+         */
+        brw_urb_WRITE(p, 
+                      brw_null_reg(),
+                      0,
+                      brw_vec8_grf(0, 0),
+                      0,       /* allocate */
+                      1,       /* used */
+                      4,       /* msg len */
+                      0,       /* response len */
+                      last,    /* eot */
+                      last,    /* writes complete */
+                      i*4,     /* urb destination offset */
+                      BRW_URB_SWIZZLE_TRANSPOSE);
+      }
+   }
+}
 
 /* Points setup - several simplifications as all attributes are
  * constant across the face of the point (point sprites excluded!)
index 4f51fefe0f64ddabe661e0ef78a0c54b862caaba..a8204ee4b81e73e4bb7e8c9c4bb5e0c57ed0fbcd 100644 (file)
@@ -66,6 +66,7 @@
 int INTEL_DEBUG = (0);
 #endif
 
+#define need_GL_NV_point_sprite
 #define need_GL_ARB_multisample
 #define need_GL_ARB_point_parameters
 #define need_GL_ARB_texture_compression
@@ -81,6 +82,7 @@ int INTEL_DEBUG = (0);
 #define need_GL_EXT_fog_coord
 #define need_GL_EXT_multi_draw_arrays
 #define need_GL_EXT_secondary_color
+#define need_GL_EXT_point_parameters
 #include "extension_helper.h"
 
 #ifndef VERBOSE
@@ -146,6 +148,7 @@ const struct dri_extension card_extensions[] =
     { "GL_ARB_multisample",                GL_ARB_multisample_functions },
     { "GL_ARB_multitexture",               NULL },
     { "GL_ARB_point_parameters",           GL_ARB_point_parameters_functions },
+    { "GL_NV_point_sprite",                GL_NV_point_sprite_functions },
     { "GL_ARB_texture_border_clamp",       NULL },
     { "GL_ARB_texture_compression",        GL_ARB_texture_compression_functions },
     { "GL_ARB_texture_cube_map",           NULL },
@@ -158,6 +161,8 @@ const struct dri_extension card_extensions[] =
     { "GL_NV_texture_rectangle",           NULL },
     { "GL_EXT_texture_rectangle",          NULL },
     { "GL_ARB_texture_rectangle",          NULL },
+    { "GL_ARB_point_sprite",               NULL},
+    { "GL_ARB_point_parameters",          NULL }, 
     { "GL_ARB_vertex_buffer_object",       GL_ARB_vertex_buffer_object_functions },
     { "GL_ARB_vertex_program",             GL_ARB_vertex_program_functions },
     { "GL_ARB_window_pos",                 GL_ARB_window_pos_functions },