1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org develop this 3D driver.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Permission is hereby granted, free of charge, to any person obtaining
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org distribute, sublicense, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next paragraph) shall be included in all copies or substantial
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  * Authors:
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  *   Keith Whitwell <keith@tungstengraphics.com>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/program.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_batchbuffer.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_defines.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_eu.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_clip.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This is performed against the original triangles, so no indirection
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * required:
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBZZZT!
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void compute_tri_direction( struct brw_clip_compile *c )
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg e = c->reg.tmp0;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg f = c->reg.tmp1;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint hpos_offset = brw_vert_result_to_offset(&c->vue_map,
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                  VERT_RESULT_HPOS);
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg v0 = byte_offset(c->reg.vertex[0], hpos_offset);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg v1 = byte_offset(c->reg.vertex[1], hpos_offset);
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg v2 = byte_offset(c->reg.vertex[2], hpos_offset);
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg v0n = get_tmp(c);
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg v1n = get_tmp(c);
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg v2n = get_tmp(c);
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Convert to NDC.
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * NOTE: We can't modify the original vertex coordinates,
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * as it may impact further operations.
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * So, we have to keep normalized coordinates in temp registers.
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * TBD-KC
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Try to optimize unnecessary MOV's.
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, v0n, v0);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, v1n, v1);
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, v2n, v2);
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_clip_project_position(c, v0n);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_clip_project_position(c, v1n);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_clip_project_position(c, v2n);
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Calculate the vectors of two edges of the triangle:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ADD(p, e, v0n, negate(v2n));
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ADD(p, f, v1n, negate(v2n));
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Take their crossproduct:
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_set_access_mode(p, BRW_ALIGN_16);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MUL(p, vec4(brw_null_reg()), brw_swizzle(e, 1,2,0,3),  brw_swizzle(f,2,0,1,3));
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MAC(p, vec4(e),  negate(brw_swizzle(e, 2,0,1,3)), brw_swizzle(f,1,2,0,3));
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_set_access_mode(p, BRW_ALIGN_1);
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MUL(p, c->reg.dir, c->reg.dir, vec4(e));
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void cull_direction( struct brw_clip_compile *c )
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint conditional;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert (!(c->key.fill_ccw == CLIP_CULL &&
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     c->key.fill_cw == CLIP_CULL));
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.fill_ccw == CLIP_CULL)
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      conditional = BRW_CONDITIONAL_GE;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      conditional = BRW_CONDITIONAL_L;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_CMP(p,
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   vec1(brw_null_reg()),
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   conditional,
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   get_element(c->reg.dir, 2),
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   brw_imm_f(0));
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_IF(p, BRW_EXECUTE_1);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_clip_kill_thread(c);
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ENDIF(p);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void copy_bfc( struct brw_clip_compile *c )
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint conditional;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Do we have any colors to copy?
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!(brw_clip_have_vert_result(c, VERT_RESULT_COL0) &&
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         brw_clip_have_vert_result(c, VERT_RESULT_BFC0)) &&
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !(brw_clip_have_vert_result(c, VERT_RESULT_COL1) &&
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         brw_clip_have_vert_result(c, VERT_RESULT_BFC1)))
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* In some wierd degnerate cases we can end up testing the
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * direction twice, once for culling and once for bfc copying.  Oh
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * well, that's what you get for setting wierd GL state.
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.copy_bfc_ccw)
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      conditional = BRW_CONDITIONAL_GE;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      conditional = BRW_CONDITIONAL_L;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_CMP(p,
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   vec1(brw_null_reg()),
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   conditional,
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   get_element(c->reg.dir, 2),
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   brw_imm_f(0));
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_IF(p, BRW_EXECUTE_1);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < 3; i++) {
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (brw_clip_have_vert_result(c, VERT_RESULT_COL0) &&
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             brw_clip_have_vert_result(c, VERT_RESULT_BFC0))
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    brw_MOV(p,
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    byte_offset(c->reg.vertex[i],
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                brw_vert_result_to_offset(&c->vue_map,
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                          VERT_RESULT_COL0)),
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    byte_offset(c->reg.vertex[i],
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                brw_vert_result_to_offset(&c->vue_map,
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                          VERT_RESULT_BFC0)));
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (brw_clip_have_vert_result(c, VERT_RESULT_COL1) &&
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             brw_clip_have_vert_result(c, VERT_RESULT_BFC1))
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    brw_MOV(p,
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    byte_offset(c->reg.vertex[i],
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                brw_vert_result_to_offset(&c->vue_map,
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                          VERT_RESULT_COL1)),
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    byte_offset(c->reg.vertex[i],
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                brw_vert_result_to_offset(&c->vue_map,
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                          VERT_RESULT_BFC1)));
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ENDIF(p);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GLfloat iz	= 1.0 / dir.z;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GLfloat ac	= dir.x * iz;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GLfloat bc	= dir.y * iz;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  offset = ctx->Polygon.OffsetUnits * DEPTH_SCALE;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  offset += MAX2( abs(ac), abs(bc) ) * ctx->Polygon.OffsetFactor;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  offset *= MRD;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void compute_offset( struct brw_clip_compile *c )
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg off = c->reg.offset;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg dir = c->reg.dir;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_math_invert(p, get_element(off, 2), get_element(dir, 2));
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MUL(p, vec2(off), dir, get_element(off, 2));
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_CMP(p,
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   vec1(brw_null_reg()),
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   BRW_CONDITIONAL_GE,
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   brw_abs(get_element(off, 0)),
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   brw_abs(get_element(off, 1)));
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_SEL(p, vec1(off), brw_abs(get_element(off, 0)), brw_abs(get_element(off, 1)));
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_set_predicate_control(p, BRW_PREDICATE_NONE);
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MUL(p, vec1(off), off, brw_imm_f(c->key.offset_factor));
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ADD(p, vec1(off), off, brw_imm_f(c->key.offset_units));
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void merge_edgeflags( struct brw_clip_compile *c )
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg tmp0 = get_element_ud(c->reg.tmp0, 0);
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_AND(p, tmp0, get_element_ud(c->reg.R0, 2), brw_imm_ud(PRIM_MASK));
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_CMP(p,
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   vec1(brw_null_reg()),
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   BRW_CONDITIONAL_EQ,
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   tmp0,
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   brw_imm_ud(_3DPRIM_POLYGON));
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Get away with using reg.vertex because we know that this is not
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * a _3DPRIM_TRISTRIP_REVERSE:
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_IF(p, BRW_EXECUTE_1);
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_set_conditionalmod(p, BRW_CONDITIONAL_EQ);
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_AND(p, vec1(brw_null_reg()), get_element_ud(c->reg.R0, 2), brw_imm_ud(1<<8));
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_MOV(p, byte_offset(c->reg.vertex[0],
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             brw_vert_result_to_offset(&c->vue_map,
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                       VERT_RESULT_EDGE)),
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              brw_imm_f(0));
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_set_predicate_control(p, BRW_PREDICATE_NONE);
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_set_conditionalmod(p, BRW_CONDITIONAL_EQ);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_AND(p, vec1(brw_null_reg()), get_element_ud(c->reg.R0, 2), brw_imm_ud(1<<9));
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_MOV(p, byte_offset(c->reg.vertex[2],
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             brw_vert_result_to_offset(&c->vue_map,
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                       VERT_RESULT_EDGE)),
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              brw_imm_f(0));
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_set_predicate_control(p, BRW_PREDICATE_NONE);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ENDIF(p);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void apply_one_offset( struct brw_clip_compile *c,
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  struct brw_indirect vert )
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint ndc_offset = brw_vert_result_to_offset(&c->vue_map,
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 BRW_VERT_RESULT_NDC);
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg z = deref_1f(vert, ndc_offset +
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       2 * type_sz(BRW_REGISTER_TYPE_F));
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ADD(p, z, z, vec1(c->reg.offset));
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output clipped polygon as an unfilled primitive:
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_lines(struct brw_clip_compile *c,
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       bool do_offset)
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_indirect v0 = brw_indirect(0, 0);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_indirect v1 = brw_indirect(1, 0);
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_indirect v0ptr = brw_indirect(2, 0);
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_indirect v1ptr = brw_indirect(3, 0);
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Need a seperate loop for offset:
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (do_offset) {
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_MOV(p, c->reg.loopcount, c->reg.nr_verts);
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_MOV(p, get_addr_reg(v0ptr), brw_address(c->reg.inlist));
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_DO(p, BRW_EXECUTE_1);
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, get_addr_reg(v0), deref_1uw(v0ptr, 0));
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_ADD(p, get_addr_reg(v0ptr), get_addr_reg(v0ptr), brw_imm_uw(2));
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 apply_one_offset(c, v0);
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_conditionalmod(p, BRW_CONDITIONAL_G);
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_ADD(p, c->reg.loopcount, c->reg.loopcount, brw_imm_d(-1));
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_WHILE(p);
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* v1ptr = &inlist[nr_verts]
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * *v1ptr = v0
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, c->reg.loopcount, c->reg.nr_verts);
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, get_addr_reg(v0ptr), brw_address(c->reg.inlist));
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ADD(p, get_addr_reg(v1ptr), get_addr_reg(v0ptr), retype(c->reg.nr_verts, BRW_REGISTER_TYPE_UW));
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ADD(p, get_addr_reg(v1ptr), get_addr_reg(v1ptr), retype(c->reg.nr_verts, BRW_REGISTER_TYPE_UW));
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, deref_1uw(v1ptr, 0), deref_1uw(v0ptr, 0));
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_DO(p, BRW_EXECUTE_1);
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_MOV(p, get_addr_reg(v0), deref_1uw(v0ptr, 0));
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_MOV(p, get_addr_reg(v1), deref_1uw(v0ptr, 2));
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_ADD(p, get_addr_reg(v0ptr), get_addr_reg(v0ptr), brw_imm_uw(2));
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* draw edge if edgeflag != 0 */
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_CMP(p,
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      vec1(brw_null_reg()), BRW_CONDITIONAL_NZ,
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      deref_1f(v0, brw_vert_result_to_offset(&c->vue_map,
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     VERT_RESULT_EDGE)),
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      brw_imm_f(0));
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_IF(p, BRW_EXECUTE_1);
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_clip_emit_vue(c, v0, 1, 0,
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           (_3DPRIM_LINESTRIP << URB_WRITE_PRIM_TYPE_SHIFT)
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           | URB_WRITE_PRIM_START);
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_clip_emit_vue(c, v1, 1, 0,
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           (_3DPRIM_LINESTRIP << URB_WRITE_PRIM_TYPE_SHIFT)
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           | URB_WRITE_PRIM_END);
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_ENDIF(p);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_ADD(p, c->reg.loopcount, c->reg.loopcount, brw_imm_d(-1));
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_WHILE(p);
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_points(struct brw_clip_compile *c,
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bool do_offset )
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_indirect v0 = brw_indirect(0, 0);
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_indirect v0ptr = brw_indirect(2, 0);
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, c->reg.loopcount, c->reg.nr_verts);
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, get_addr_reg(v0ptr), brw_address(c->reg.inlist));
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_DO(p, BRW_EXECUTE_1);
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_MOV(p, get_addr_reg(v0), deref_1uw(v0ptr, 0));
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_ADD(p, get_addr_reg(v0ptr), get_addr_reg(v0ptr), brw_imm_uw(2));
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* draw if edgeflag != 0
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_CMP(p,
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      vec1(brw_null_reg()), BRW_CONDITIONAL_NZ,
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      deref_1f(v0, brw_vert_result_to_offset(&c->vue_map,
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     VERT_RESULT_EDGE)),
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      brw_imm_f(0));
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_IF(p, BRW_EXECUTE_1);
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (do_offset)
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    apply_one_offset(c, v0);
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_clip_emit_vue(c, v0, 1, 0,
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           (_3DPRIM_POINTLIST << URB_WRITE_PRIM_TYPE_SHIFT)
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           | URB_WRITE_PRIM_START | URB_WRITE_PRIM_END);
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_ENDIF(p);
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_ADD(p, c->reg.loopcount, c->reg.loopcount, brw_imm_d(-1));
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_WHILE(p);
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_primitives( struct brw_clip_compile *c,
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     GLuint mode,
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     bool do_offset )
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode) {
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CLIP_FILL:
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_clip_tri_emit_polygon(c);
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CLIP_LINE:
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_lines(c, do_offset);
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CLIP_POINT:
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_points(c, do_offset);
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CLIP_CULL:
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_unfilled_primitives( struct brw_clip_compile *c )
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Direction culling has already been done.
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.fill_ccw != c->key.fill_cw &&
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       c->key.fill_ccw != CLIP_CULL &&
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       c->key.fill_cw != CLIP_CULL)
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_CMP(p,
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      vec1(brw_null_reg()),
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      BRW_CONDITIONAL_GE,
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      get_element(c->reg.dir, 2),
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      brw_imm_f(0));
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_IF(p, BRW_EXECUTE_1);
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 emit_primitives(c, c->key.fill_ccw, c->key.offset_ccw);
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_ELSE(p);
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 emit_primitives(c, c->key.fill_cw, c->key.offset_cw);
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_ENDIF(p);
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (c->key.fill_cw != CLIP_CULL) {
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_primitives(c, c->key.fill_cw, c->key.offset_cw);
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (c->key.fill_ccw != CLIP_CULL) {
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_primitives(c, c->key.fill_ccw, c->key.offset_ccw);
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void check_nr_verts( struct brw_clip_compile *c )
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_L, c->reg.nr_verts, brw_imm_d(3));
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_IF(p, BRW_EXECUTE_1);
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_clip_kill_thread(c);
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ENDIF(p);
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_emit_unfilled_clip( struct brw_clip_compile *c )
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->need_direction = ((c->key.offset_ccw || c->key.offset_cw) ||
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			(c->key.fill_ccw != c->key.fill_cw) ||
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			c->key.fill_ccw == CLIP_CULL ||
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			c->key.fill_cw == CLIP_CULL ||
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			c->key.copy_bfc_cw ||
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			c->key.copy_bfc_ccw);
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_clip_tri_alloc_regs(c, 3 + c->key.nr_userclip + 6);
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_clip_tri_init_vertices(c);
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_clip_init_ff_sync(c);
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(brw_clip_have_vert_result(c, VERT_RESULT_EDGE));
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.fill_ccw == CLIP_CULL &&
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       c->key.fill_cw == CLIP_CULL) {
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_clip_kill_thread(c);
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   merge_edgeflags(c);
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Need to use the inlist indirection here:
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->need_direction)
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      compute_tri_direction(c);
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.fill_ccw == CLIP_CULL ||
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       c->key.fill_cw == CLIP_CULL)
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cull_direction(c);
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.offset_ccw ||
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       c->key.offset_cw)
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      compute_offset(c);
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.copy_bfc_ccw ||
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       c->key.copy_bfc_cw)
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      copy_bfc(c);
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Need to do this whether we clip or not:
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.do_flat_shading)
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_clip_tri_flat_shade(c);
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_clip_init_clipmask(c);
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_NZ, c->reg.planemask, brw_imm_ud(0));
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_IF(p, BRW_EXECUTE_1);
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_clip_init_planes(c);
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_clip_tri(c);
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      check_nr_verts(c);
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ENDIF(p);
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_unfilled_primitives(c);
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_clip_kill_thread(c);
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
524