diff options
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_clip.c | 1 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_clip.h | 7 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_clip_line.c | 8 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_clip_tri.c | 12 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_draw_upload.c | 13 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_gs.c | 10 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_gs.h | 7 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_gs_emit.c | 38 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_sf_state.c | 7 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_wm_emit.c | 24 | 
10 files changed, 81 insertions, 46 deletions
| diff --git a/src/mesa/drivers/dri/i965/brw_clip.c b/src/mesa/drivers/dri/i965/brw_clip.c index 20a927cf38..f45dcf8282 100644 --- a/src/mesa/drivers/dri/i965/brw_clip.c +++ b/src/mesa/drivers/dri/i965/brw_clip.c @@ -156,6 +156,7 @@ static void upload_clip_prog(struct brw_context *brw)     key.attrs = brw->vs.prog_data->outputs_written;     /* _NEW_LIGHT */     key.do_flat_shading = (ctx->Light.ShadeModel == GL_FLAT); +   key.pv_first = (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION);     /* _NEW_TRANSFORM */     key.nr_userclip = brw_count_bits(ctx->Transform.ClipPlanesEnabled); diff --git a/src/mesa/drivers/dri/i965/brw_clip.h b/src/mesa/drivers/dri/i965/brw_clip.h index 957df441ab..dc550ac793 100644 --- a/src/mesa/drivers/dri/i965/brw_clip.h +++ b/src/mesa/drivers/dri/i965/brw_clip.h @@ -46,18 +46,17 @@ struct brw_clip_prog_key {     GLuint primitive:4;     GLuint nr_userclip:3;     GLuint do_flat_shading:1; +   GLuint pv_first:1;     GLuint do_unfilled:1;     GLuint fill_cw:2;		/* includes cull information */     GLuint fill_ccw:2;		/* includes cull information */     GLuint offset_cw:1;     GLuint offset_ccw:1; -   GLuint pad0:17; -     GLuint copy_bfc_cw:1;     GLuint copy_bfc_ccw:1;     GLuint clip_mode:3; -   GLuint pad1:27; -    +   GLuint pad0:11; +     GLfloat offset_factor;     GLfloat offset_units;  }; diff --git a/src/mesa/drivers/dri/i965/brw_clip_line.c b/src/mesa/drivers/dri/i965/brw_clip_line.c index 048ca620fa..fa9648f50f 100644 --- a/src/mesa/drivers/dri/i965/brw_clip_line.c +++ b/src/mesa/drivers/dri/i965/brw_clip_line.c @@ -269,8 +269,12 @@ void brw_emit_line_clip( struct brw_clip_compile *c )     brw_clip_line_alloc_regs(c);     brw_clip_init_ff_sync(c); -   if (c->key.do_flat_shading) -      brw_clip_copy_colors(c, 0, 1); +   if (c->key.do_flat_shading) { +      if (c->key.pv_first) +         brw_clip_copy_colors(c, 1, 0); +      else +         brw_clip_copy_colors(c, 0, 1); +   }     clip_and_emit_line(c);  } diff --git a/src/mesa/drivers/dri/i965/brw_clip_tri.c b/src/mesa/drivers/dri/i965/brw_clip_tri.c index 0efd77225e..cf79224be4 100644 --- a/src/mesa/drivers/dri/i965/brw_clip_tri.c +++ b/src/mesa/drivers/dri/i965/brw_clip_tri.c @@ -188,14 +188,20 @@ void brw_clip_tri_flat_shade( struct brw_clip_compile *c )  	   brw_imm_ud(_3DPRIM_POLYGON));     is_poly = brw_IF(p, BRW_EXECUTE_1); -   {    +   {        brw_clip_copy_colors(c, 1, 0);        brw_clip_copy_colors(c, 2, 0);     }     is_poly = brw_ELSE(p, is_poly);     { -      brw_clip_copy_colors(c, 0, 2); -      brw_clip_copy_colors(c, 1, 2); +      if (c->key.pv_first) { +         brw_clip_copy_colors(c, 1, 0); +         brw_clip_copy_colors(c, 2, 0); +      } +      else { +         brw_clip_copy_colors(c, 0, 2); +         brw_clip_copy_colors(c, 1, 2); +      }     }     brw_ENDIF(p, is_poly);  } diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c index 0fefbd9d81..271a88dae0 100644 --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c @@ -536,16 +536,9 @@ static void brw_emit_vertices(struct brw_context *brw)  		I915_GEM_DOMAIN_VERTEX, 0,  		input->offset);        if (BRW_IS_IGDNG(brw)) { -          if (input->stride) { -              OUT_RELOC(input->bo, -                        I915_GEM_DOMAIN_VERTEX, 0, -                        input->offset + input->stride * input->count - 1); -          } else { -              assert(input->count == 1); -              OUT_RELOC(input->bo, -                        I915_GEM_DOMAIN_VERTEX, 0, -                        input->offset + input->element_size - 1); -          } +	 OUT_RELOC(input->bo, +		   I915_GEM_DOMAIN_VERTEX, 0, +		   input->bo->size - 1);        } else            OUT_BATCH(input->stride ? input->count : 0);        OUT_BATCH(0); /* Instance data step rate */ diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c index 48c2b9a41c..610b6c35e2 100644 --- a/src/mesa/drivers/dri/i965/brw_gs.c +++ b/src/mesa/drivers/dri/i965/brw_gs.c @@ -85,10 +85,10 @@ static void compile_gs_prog( struct brw_context *brw,      */     switch (key->primitive) {     case GL_QUADS: -      brw_gs_quads( &c );  +      brw_gs_quads( &c, key );        break;     case GL_QUAD_STRIP: -      brw_gs_quad_strip( &c ); +      brw_gs_quad_strip( &c, key );        break;     case GL_LINE_LOOP:        brw_gs_lines( &c ); @@ -149,6 +149,7 @@ static const GLenum gs_prim[GL_POLYGON+1] = {  static void populate_key( struct brw_context *brw,  			  struct brw_gs_prog_key *key )  { +   GLcontext *ctx = &brw->intel.ctx;     memset(key, 0, sizeof(*key));     /* CACHE_NEW_VS_PROG */ @@ -158,6 +159,9 @@ static void populate_key( struct brw_context *brw,     key->primitive = gs_prim[brw->primitive];     key->hint_gs_always = 0;	/* debug code? */ +    +   /* _NEW_LIGHT */ +   key->pv_first = (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION);     key->need_gs_prog = (key->hint_gs_always ||  			brw->primitive == GL_QUADS || @@ -193,7 +197,7 @@ static void prepare_gs_prog(struct brw_context *brw)  const struct brw_tracked_state brw_gs_prog = {     .dirty = { -      .mesa  = 0, +      .mesa  = _NEW_LIGHT,        .brw   = BRW_NEW_PRIMITIVE,        .cache = CACHE_NEW_VS_PROG     }, diff --git a/src/mesa/drivers/dri/i965/brw_gs.h b/src/mesa/drivers/dri/i965/brw_gs.h index bbb991ea2e..e0cf07256b 100644 --- a/src/mesa/drivers/dri/i965/brw_gs.h +++ b/src/mesa/drivers/dri/i965/brw_gs.h @@ -43,8 +43,9 @@ struct brw_gs_prog_key {     GLuint attrs:32;     GLuint primitive:4;     GLuint hint_gs_always:1; +   GLuint pv_first:1;     GLuint need_gs_prog:1; -   GLuint pad:26; +   GLuint pad:25;  };  struct brw_gs_compile { @@ -67,8 +68,8 @@ struct brw_gs_compile {  #define ATTR_SIZE  (4*4) -void brw_gs_quads( struct brw_gs_compile *c ); -void brw_gs_quad_strip( struct brw_gs_compile *c ); +void brw_gs_quads( struct brw_gs_compile *c, struct brw_gs_prog_key *key ); +void brw_gs_quad_strip( struct brw_gs_compile *c, struct brw_gs_prog_key *key );  void brw_gs_tris( struct brw_gs_compile *c );  void brw_gs_lines( struct brw_gs_compile *c );  void brw_gs_points( struct brw_gs_compile *c ); diff --git a/src/mesa/drivers/dri/i965/brw_gs_emit.c b/src/mesa/drivers/dri/i965/brw_gs_emit.c index a9b2aa2eac..0fc5b02c61 100644 --- a/src/mesa/drivers/dri/i965/brw_gs_emit.c +++ b/src/mesa/drivers/dri/i965/brw_gs_emit.c @@ -120,7 +120,7 @@ static void brw_gs_ff_sync(struct brw_gs_compile *c, int num_prim)  } -void brw_gs_quads( struct brw_gs_compile *c ) +void brw_gs_quads( struct brw_gs_compile *c, struct brw_gs_prog_key *key )  {     brw_gs_alloc_regs(c, 4); @@ -128,23 +128,39 @@ void brw_gs_quads( struct brw_gs_compile *c )      * is the PV for quads, but vertex 0 for polygons:      */     if (c->need_ff_sync) -	   brw_gs_ff_sync(c, 1);     -   brw_gs_emit_vue(c, c->reg.vertex[3], 0, ((_3DPRIM_POLYGON << 2) | R02_PRIM_START)); -   brw_gs_emit_vue(c, c->reg.vertex[0], 0, (_3DPRIM_POLYGON << 2)); -   brw_gs_emit_vue(c, c->reg.vertex[1], 0, (_3DPRIM_POLYGON << 2));  -   brw_gs_emit_vue(c, c->reg.vertex[2], 1, ((_3DPRIM_POLYGON << 2) | R02_PRIM_END)); +	   brw_gs_ff_sync(c, 1); +   if (key->pv_first) { +      brw_gs_emit_vue(c, c->reg.vertex[0], 0, ((_3DPRIM_POLYGON << 2) | R02_PRIM_START)); +      brw_gs_emit_vue(c, c->reg.vertex[1], 0, (_3DPRIM_POLYGON << 2)); +      brw_gs_emit_vue(c, c->reg.vertex[2], 0, (_3DPRIM_POLYGON << 2)); +      brw_gs_emit_vue(c, c->reg.vertex[3], 1, ((_3DPRIM_POLYGON << 2) | R02_PRIM_END)); +   } +   else { +      brw_gs_emit_vue(c, c->reg.vertex[3], 0, ((_3DPRIM_POLYGON << 2) | R02_PRIM_START)); +      brw_gs_emit_vue(c, c->reg.vertex[0], 0, (_3DPRIM_POLYGON << 2)); +      brw_gs_emit_vue(c, c->reg.vertex[1], 0, (_3DPRIM_POLYGON << 2)); +      brw_gs_emit_vue(c, c->reg.vertex[2], 1, ((_3DPRIM_POLYGON << 2) | R02_PRIM_END)); +   }  } -void brw_gs_quad_strip( struct brw_gs_compile *c ) +void brw_gs_quad_strip( struct brw_gs_compile *c, struct brw_gs_prog_key *key )  {     brw_gs_alloc_regs(c, 4);     if (c->need_ff_sync)  	   brw_gs_ff_sync(c, 1);       -   brw_gs_emit_vue(c, c->reg.vertex[2], 0, ((_3DPRIM_POLYGON << 2) | R02_PRIM_START)); -   brw_gs_emit_vue(c, c->reg.vertex[3], 0, (_3DPRIM_POLYGON << 2)); -   brw_gs_emit_vue(c, c->reg.vertex[0], 0, (_3DPRIM_POLYGON << 2));  -   brw_gs_emit_vue(c, c->reg.vertex[1], 1, ((_3DPRIM_POLYGON << 2) | R02_PRIM_END)); +   if (key->pv_first) { +      brw_gs_emit_vue(c, c->reg.vertex[0], 0, ((_3DPRIM_POLYGON << 2) | R02_PRIM_START)); +      brw_gs_emit_vue(c, c->reg.vertex[1], 0, (_3DPRIM_POLYGON << 2)); +      brw_gs_emit_vue(c, c->reg.vertex[2], 0, (_3DPRIM_POLYGON << 2)); +      brw_gs_emit_vue(c, c->reg.vertex[3], 1, ((_3DPRIM_POLYGON << 2) | R02_PRIM_END)); +   } +   else { +      brw_gs_emit_vue(c, c->reg.vertex[2], 0, ((_3DPRIM_POLYGON << 2) | R02_PRIM_START)); +      brw_gs_emit_vue(c, c->reg.vertex[3], 0, (_3DPRIM_POLYGON << 2)); +      brw_gs_emit_vue(c, c->reg.vertex[0], 0, (_3DPRIM_POLYGON << 2)); +      brw_gs_emit_vue(c, c->reg.vertex[1], 1, ((_3DPRIM_POLYGON << 2) | R02_PRIM_END)); +   }  }  void brw_gs_tris( struct brw_gs_compile *c ) diff --git a/src/mesa/drivers/dri/i965/brw_sf_state.c b/src/mesa/drivers/dri/i965/brw_sf_state.c index d6b47b5d8d..bb69435ec0 100644 --- a/src/mesa/drivers/dri/i965/brw_sf_state.c +++ b/src/mesa/drivers/dri/i965/brw_sf_state.c @@ -114,7 +114,8 @@ struct brw_sf_unit_key {     unsigned int nr_urb_entries, urb_size, sfsize; -   GLenum front_face, cull_face, provoking_vertex; +   GLenum front_face, cull_face; +   unsigned pv_first:1;     unsigned scissor:1;     unsigned line_smooth:1;     unsigned point_sprite:1; @@ -155,7 +156,7 @@ sf_unit_populate_key(struct brw_context *brw, struct brw_sf_unit_key *key)     key->point_attenuated = ctx->Point._Attenuated;     /* _NEW_LIGHT */ -   key->provoking_vertex = ctx->Light.ProvokingVertex; +   key->pv_first = (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION);     key->render_to_fbo = brw->intel.ctx.DrawBuffer->Name != 0;  } @@ -288,7 +289,7 @@ sf_unit_create_from_key(struct brw_context *brw, struct brw_sf_unit_key *key,     /* might be BRW_NEW_PRIMITIVE if we have to adjust pv for polygons:      */ -   if (key->provoking_vertex == GL_LAST_VERTEX_CONVENTION) { +   if (!key->pv_first) {        sf.sf7.trifan_pv = 2;        sf.sf7.linestrip_pv = 1;        sf.sf7.tristrip_pv = 2; diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c b/src/mesa/drivers/dri/i965/brw_wm_emit.c index abad5d2692..d91fad0f45 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_emit.c +++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c @@ -855,22 +855,32 @@ static void emit_tex( struct brw_wm_compile *c,        abort();     } -   if (inst->tex_shadow) { -      nr = 4; -      emit |= WRITEMASK_W; -   } +   /* For shadow comparisons, we have to supply u,v,r. */ +   if (inst->tex_shadow) +      nr = 3;     msgLength = 1;     for (i = 0; i < nr; i++) { -      static const GLuint swz[4] = {0,1,2,2}; -      if (emit & (1<<i))  -	 brw_MOV(p, brw_message_reg(msgLength+1), arg[swz[i]]); +      if (emit & (1<<i)) +	 brw_MOV(p, brw_message_reg(msgLength+1), arg[i]);        else  	 brw_MOV(p, brw_message_reg(msgLength+1), brw_imm_f(0));        msgLength += 2;     } +   /* Fill in the cube map array index value. */ +   if (BRW_IS_IGDNG(p->brw) && inst->tex_shadow) { +	 brw_MOV(p, brw_message_reg(msgLength+1), brw_imm_f(0)); +      msgLength += 2; +   } + +   /* Fill in the shadow comparison reference value. */ +   if (inst->tex_shadow) { +      brw_MOV(p, brw_message_reg(msgLength+1), arg[2]); +      msgLength += 2; +   } +     responseLength = 8;		/* always */     if (BRW_IS_IGDNG(p->brw)) { | 
