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
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.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_util.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_sf.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine the vert_result corresponding to the given half of the given
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * register.  half=0 means the first half of a register, half=1 means the
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * second half.
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int vert_reg_to_vert_result(struct brw_sf_compile *c, GLuint reg,
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          int half)
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int vue_slot = (reg + c->urb_entry_read_offset) * 2 + half;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return c->vue_map.slot_to_vert_result[vue_slot];
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine the register corresponding to the given vert_result.
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct brw_reg get_vert_result(struct brw_sf_compile *c,
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      struct brw_reg vert,
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      GLuint vert_result)
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int vue_slot = c->vue_map.vert_result_to_slot[vert_result];
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert (vue_slot >= c->urb_entry_read_offset);
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint off = vue_slot / 2 - c->urb_entry_read_offset;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint sub = vue_slot % 2;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return brw_vec4_grf(vert.nr + off, sub * 4);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orghave_attr(struct brw_sf_compile *c, GLuint attr)
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (c->key.attrs & BITFIELD64_BIT(attr)) ? 1 : 0;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Twoside lighting
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void copy_bfc( struct brw_sf_compile *c,
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      struct brw_reg vert )
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 2; i++) {
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (have_attr(c, VERT_RESULT_COL0+i) &&
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  have_attr(c, VERT_RESULT_BFC0+i))
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p,
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 get_vert_result(c, vert, VERT_RESULT_COL0+i),
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 get_vert_result(c, vert, VERT_RESULT_BFC0+i));
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void do_twoside_color( struct brw_sf_compile *c )
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint backface_conditional = c->key.frontface_ccw ? BRW_CONDITIONAL_G : BRW_CONDITIONAL_L;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Already done in clip program:
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.primitive == SF_UNFILLED_TRIS)
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX: What happens if BFC isn't present?  This could only happen
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * for user-supplied vertex programs, as t_vp_build.c always does
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * the right thing.
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!(have_attr(c, VERT_RESULT_COL0) && have_attr(c, VERT_RESULT_BFC0)) &&
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !(have_attr(c, VERT_RESULT_COL1) && have_attr(c, VERT_RESULT_BFC1)))
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Need to use BRW_EXECUTE_4 and also do an 4-wide compare in order
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to get all channels active inside the IF.  In the clipping code
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * we run with NoMask, so it's not an option and we can use
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * BRW_EXECUTE_1 for all comparisions.
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_push_insn_state(p);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_CMP(p, vec4(brw_null_reg()), backface_conditional, c->det, brw_imm_f(0));
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_IF(p, BRW_EXECUTE_4);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (c->nr_verts) {
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3: copy_bfc(c, c->vert[2]);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2: copy_bfc(c, c->vert[1]);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1: copy_bfc(c, c->vert[0]);
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_ENDIF(p);
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_pop_insn_state(p);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flat shading
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_RESULT_COLOR_BITS (BITFIELD64_BIT(VERT_RESULT_COL0) | \
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				BITFIELD64_BIT(VERT_RESULT_COL1))
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void copy_colors( struct brw_sf_compile *c,
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     struct brw_reg dst,
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     struct brw_reg src)
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = VERT_RESULT_COL0; i <= VERT_RESULT_COL1; i++) {
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (have_attr(c,i))
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p,
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 get_vert_result(c, dst, i),
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 get_vert_result(c, src, i));
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Need to use a computed jump to copy flatshaded attributes as the
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertices are ordered according to y-coordinate before reaching this
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * point, so the PV could be anywhere.
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void do_flatshade_triangle( struct brw_sf_compile *c )
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &p->brw->intel;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg ip = brw_ip_reg();
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint nr = _mesa_bitcount_64(c->key.attrs & VERT_RESULT_COLOR_BITS);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint jmpi = 1;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!nr)
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Already done in clip program:
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.primitive == SF_UNFILLED_TRIS)
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen == 5)
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       jmpi = 2;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_push_insn_state(p);
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MUL(p, c->pv, c->pv, brw_imm_d(jmpi*(nr*2+1)));
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_JMPI(p, ip, ip, c->pv);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_colors(c, c->vert[1], c->vert[0]);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_colors(c, c->vert[2], c->vert[0]);
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_JMPI(p, ip, ip, brw_imm_d(jmpi*(nr*4+1)));
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_colors(c, c->vert[0], c->vert[1]);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_colors(c, c->vert[2], c->vert[1]);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_JMPI(p, ip, ip, brw_imm_d(jmpi*nr*2));
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_colors(c, c->vert[0], c->vert[2]);
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_colors(c, c->vert[1], c->vert[2]);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_pop_insn_state(p);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void do_flatshade_line( struct brw_sf_compile *c )
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &p->brw->intel;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg ip = brw_ip_reg();
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint nr = _mesa_bitcount_64(c->key.attrs & VERT_RESULT_COLOR_BITS);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint jmpi = 1;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!nr)
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Already done in clip program:
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.primitive == SF_UNFILLED_TRIS)
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen == 5)
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       jmpi = 2;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_push_insn_state(p);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MUL(p, c->pv, c->pv, brw_imm_d(jmpi*(nr+1)));
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_JMPI(p, ip, ip, c->pv);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_colors(c, c->vert[1], c->vert[0]);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_JMPI(p, ip, ip, brw_imm_ud(jmpi*nr));
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_colors(c, c->vert[0], c->vert[1]);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_pop_insn_state(p);
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Triangle setup.
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void alloc_regs( struct brw_sf_compile *c )
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint reg, i;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Values computed by fixed function unit:
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->pv  = retype(brw_vec1_grf(1, 1), BRW_REGISTER_TYPE_D);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->det = brw_vec1_grf(1, 2);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->dx0 = brw_vec1_grf(1, 3);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->dx2 = brw_vec1_grf(1, 4);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->dy0 = brw_vec1_grf(1, 5);
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->dy2 = brw_vec1_grf(1, 6);
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* z and 1/w passed in seperately:
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->z[0]     = brw_vec1_grf(2, 0);
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->inv_w[0] = brw_vec1_grf(2, 1);
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->z[1]     = brw_vec1_grf(2, 2);
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->inv_w[1] = brw_vec1_grf(2, 3);
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->z[2]     = brw_vec1_grf(2, 4);
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->inv_w[2] = brw_vec1_grf(2, 5);
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The vertices:
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   reg = 3;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < c->nr_verts; i++) {
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->vert[i] = brw_vec8_grf(reg, 0);
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reg += c->nr_attr_regs;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Temporaries, allocated after last vertex reg.
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->inv_det = brw_vec1_grf(reg, 0);  reg++;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->a1_sub_a0 = brw_vec8_grf(reg, 0);  reg++;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->a2_sub_a0 = brw_vec8_grf(reg, 0);  reg++;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->tmp = brw_vec8_grf(reg, 0);  reg++;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note grf allocation:
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->prog_data.total_grf = reg;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Outputs of this program - interpolation coefficients for
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * rasterization:
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->m1Cx = brw_vec8_reg(BRW_MESSAGE_REGISTER_FILE, 1, 0);
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->m2Cy = brw_vec8_reg(BRW_MESSAGE_REGISTER_FILE, 2, 0);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->m3C0 = brw_vec8_reg(BRW_MESSAGE_REGISTER_FILE, 3, 0);
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void copy_z_inv_w( struct brw_sf_compile *c )
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_push_insn_state(p);
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Copy both scalars with a single MOV:
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < c->nr_verts; i++)
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_MOV(p, vec2(suboffset(c->vert[i], 2)), vec2(c->z[i]));
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_pop_insn_state(p);
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void invert_det( struct brw_sf_compile *c)
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Looks like we invert all 8 elements just to get 1/det in
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * position 2 !?!
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_math(&c->func,
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    c->inv_det,
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    BRW_MATH_FUNCTION_INV,
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    0,
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    c->det,
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    BRW_MATH_DATA_SCALAR,
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    BRW_MATH_PRECISION_FULL);
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcalculate_masks(struct brw_sf_compile *c,
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	        GLuint reg,
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		GLushort *pc,
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		GLushort *pc_persp,
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		GLushort *pc_linear)
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool is_last_attr = (reg == c->nr_setup_regs - 1);
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield64 persp_mask;
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield64 linear_mask;
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.do_flat_shading)
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      persp_mask = c->key.attrs & ~(BITFIELD64_BIT(VERT_RESULT_HPOS) |
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    BITFIELD64_BIT(VERT_RESULT_COL0) |
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    BITFIELD64_BIT(VERT_RESULT_COL1));
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      persp_mask = c->key.attrs & ~(BITFIELD64_BIT(VERT_RESULT_HPOS));
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.do_flat_shading)
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      linear_mask = c->key.attrs & ~(BITFIELD64_BIT(VERT_RESULT_COL0) |
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     BITFIELD64_BIT(VERT_RESULT_COL1));
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      linear_mask = c->key.attrs;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *pc_persp = 0;
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *pc_linear = 0;
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *pc = 0xf;
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (persp_mask & BITFIELD64_BIT(vert_reg_to_vert_result(c, reg, 0)))
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *pc_persp = 0xf;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (linear_mask & BITFIELD64_BIT(vert_reg_to_vert_result(c, reg, 0)))
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *pc_linear = 0xf;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Maybe only processs one attribute on the final round:
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vert_reg_to_vert_result(c, reg, 1) != BRW_VERT_RESULT_MAX) {
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *pc |= 0xf0;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (persp_mask & BITFIELD64_BIT(vert_reg_to_vert_result(c, reg, 1)))
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *pc_persp |= 0xf0;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (linear_mask & BITFIELD64_BIT(vert_reg_to_vert_result(c, reg, 1)))
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *pc_linear |= 0xf0;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return is_last_attr;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Calculates the predicate control for which channels of a reg
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (containing 2 attrs) to do point sprite coordinate replacement on.
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint16_t
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcalculate_point_sprite_mask(struct brw_sf_compile *c, GLuint reg)
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int vert_result1, vert_result2;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint16_t pc = 0;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vert_result1 = vert_reg_to_vert_result(c, reg, 0);
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vert_result1 >= VERT_RESULT_TEX0 && vert_result1 <= VERT_RESULT_TEX7) {
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (c->key.point_sprite_coord_replace & (1 << (vert_result1 - VERT_RESULT_TEX0)))
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 pc |= 0x0f;
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vert_result1 == BRW_VERT_RESULT_PNTC)
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pc |= 0x0f;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vert_result2 = vert_reg_to_vert_result(c, reg, 1);
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vert_result2 >= VERT_RESULT_TEX0 && vert_result2 <= VERT_RESULT_TEX7) {
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (c->key.point_sprite_coord_replace & (1 << (vert_result2 -
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     VERT_RESULT_TEX0)))
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pc |= 0xf0;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vert_result2 == BRW_VERT_RESULT_PNTC)
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pc |= 0xf0;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return pc;
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_emit_tri_setup(struct brw_sf_compile *c, bool allocate)
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->nr_verts = 3;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (allocate)
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      alloc_regs(c);
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   invert_det(c);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_z_inv_w(c);
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.do_twoside_color)
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      do_twoside_color(c);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.do_flat_shading)
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      do_flatshade_triangle(c);
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < c->nr_setup_regs; i++)
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Pair of incoming attributes:
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_reg a0 = offset(c->vert[0], i);
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_reg a1 = offset(c->vert[1], i);
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_reg a2 = offset(c->vert[2], i);
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLushort pc, pc_persp, pc_linear;
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear);
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pc_persp)
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc_persp);
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, a0, a0, c->inv_w[0]);
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, a1, a1, c->inv_w[1]);
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, a2, a2, c->inv_w[2]);
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Calculate coefficients for interpolated values:
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pc_linear)
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc_linear);
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_ADD(p, c->a1_sub_a0, a1, negate(a0));
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_ADD(p, c->a2_sub_a0, a2, negate(a0));
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* calculate dA/dx
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, brw_null_reg(), c->a1_sub_a0, c->dy2);
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MAC(p, c->tmp, c->a2_sub_a0, negate(c->dy0));
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, c->m1Cx, c->tmp, c->inv_det);
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* calculate dA/dy
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, brw_null_reg(), c->a2_sub_a0, c->dx0);
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MAC(p, c->tmp, c->a1_sub_a0, negate(c->dx2));
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, c->m2Cy, c->tmp, c->inv_det);
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc);
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* start point for interpolation
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, c->m3C0, a0);
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Copy m0..m3 to URB.  m0 is implicitly copied from r0 in
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * the send instruction:
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_urb_WRITE(p,
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       brw_null_reg(),
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       0,
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       brw_vec8_grf(0, 0), /* r0, will be copied to m0 */
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       0, 	/* allocate */
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       1,	/* used */
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       4, 	/* msg len */
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       0,	/* response len */
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       last,	/* eot */
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       last, 	/* writes complete */
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       i*4,	/* offset */
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       BRW_URB_SWIZZLE_TRANSPOSE); /* XXX: Swizzle control "SF to windower" */
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_emit_line_setup(struct brw_sf_compile *c, bool allocate)
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->nr_verts = 2;
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (allocate)
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      alloc_regs(c);
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   invert_det(c);
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_z_inv_w(c);
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.do_flat_shading)
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      do_flatshade_line(c);
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < c->nr_setup_regs; i++)
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Pair of incoming attributes:
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_reg a0 = offset(c->vert[0], i);
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_reg a1 = offset(c->vert[1], i);
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLushort pc, pc_persp, pc_linear;
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear);
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pc_persp)
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc_persp);
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, a0, a0, c->inv_w[0]);
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, a1, a1, c->inv_w[1]);
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Calculate coefficients for position, color:
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pc_linear) {
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc_linear);
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_ADD(p, c->a1_sub_a0, a1, negate(a0));
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 	 brw_MUL(p, c->tmp, c->a1_sub_a0, c->dx0);
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, c->m1Cx, c->tmp, c->inv_det);
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, c->tmp, c->a1_sub_a0, c->dy0);
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, c->m2Cy, c->tmp, c->inv_det);
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc);
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* start point for interpolation
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, c->m3C0, a0);
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Copy m0..m3 to URB.
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_urb_WRITE(p,
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       brw_null_reg(),
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       0,
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       brw_vec8_grf(0, 0),
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       0, 	/* allocate */
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       1, 	/* used */
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       4, 	/* msg len */
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       0,	/* response len */
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       last, 	/* eot */
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       last, 	/* writes complete */
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       i*4,	/* urb destination offset */
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       BRW_URB_SWIZZLE_TRANSPOSE);
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_emit_point_sprite_setup(struct brw_sf_compile *c, bool allocate)
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->nr_verts = 1;
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (allocate)
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      alloc_regs(c);
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_z_inv_w(c);
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < c->nr_setup_regs; i++)
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_reg a0 = offset(c->vert[0], i);
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLushort pc, pc_persp, pc_linear, pc_coord_replace;
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear);
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pc_coord_replace = calculate_point_sprite_mask(c, i);
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pc_persp &= ~pc_coord_replace;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pc_persp) {
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc_persp);
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, a0, a0, c->inv_w[0]);
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Point sprite coordinate replacement: A texcoord with this
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * enabled gets replaced with the value (x, y, 0, 1) where x and
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * y vary from 0 to 1 across the horizontal and vertical of the
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * point.
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pc_coord_replace) {
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc_coord_replace);
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Caculate 1.0/PointWidth */
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_math(&c->func,
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  c->tmp,
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  BRW_MATH_FUNCTION_INV,
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  0,
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  c->dx0,
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  BRW_MATH_DATA_SCALAR,
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  BRW_MATH_PRECISION_FULL);
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_access_mode(p, BRW_ALIGN_16);
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* dA/dx, dA/dy */
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, c->m1Cx, brw_imm_f(0.0));
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, c->m2Cy, brw_imm_f(0.0));
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, brw_writemask(c->m1Cx, WRITEMASK_X), c->tmp);
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (c->key.sprite_origin_lower_left) {
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    brw_MOV(p, brw_writemask(c->m2Cy, WRITEMASK_Y), negate(c->tmp));
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else {
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    brw_MOV(p, brw_writemask(c->m2Cy, WRITEMASK_Y), c->tmp);
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* attribute constant offset */
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, c->m3C0, brw_imm_f(0.0));
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (c->key.sprite_origin_lower_left) {
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    brw_MOV(p, brw_writemask(c->m3C0, WRITEMASK_YW), brw_imm_f(1.0));
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else {
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    brw_MOV(p, brw_writemask(c->m3C0, WRITEMASK_W), brw_imm_f(1.0));
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_access_mode(p, BRW_ALIGN_1);
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pc & ~pc_coord_replace) {
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc & ~pc_coord_replace);
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, c->m1Cx, brw_imm_ud(0));
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, c->m2Cy, brw_imm_ud(0));
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, c->m3C0, a0); /* constant value */
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_set_predicate_control_flag_value(p, pc);
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Copy m0..m3 to URB. */
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_urb_WRITE(p,
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    brw_null_reg(),
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    0,
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    brw_vec8_grf(0, 0),
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    0, 	/* allocate */
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    1,	/* used */
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    4, 	/* msg len */
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    0,	/* response len */
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    last, 	/* eot */
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    last, 	/* writes complete */
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    i*4,	/* urb destination offset */
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    BRW_URB_SWIZZLE_TRANSPOSE);
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Points setup - several simplifications as all attributes are
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * constant across the face of the point (point sprites excluded!)
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_emit_point_setup(struct brw_sf_compile *c, bool allocate)
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->nr_verts = 1;
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (allocate)
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      alloc_regs(c);
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   copy_z_inv_w(c);
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, c->m1Cx, brw_imm_ud(0)); /* zero - move out of loop */
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, c->m2Cy, brw_imm_ud(0)); /* zero - move out of loop */
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < c->nr_setup_regs; i++)
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_reg a0 = offset(c->vert[0], i);
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLushort pc, pc_persp, pc_linear;
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear);
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pc_persp)
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* This seems odd as the values are all constant, but the
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * fragment shader will be expecting it:
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc_persp);
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MUL(p, a0, a0, c->inv_w[0]);
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The delta values are always zero, just send the starting
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * coordinate.  Again, this is to fit in with the interpolation
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * code in the fragment shader.
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_set_predicate_control_flag_value(p, pc);
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_MOV(p, c->m3C0, a0); /* constant value */
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Copy m0..m3 to URB.
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 brw_urb_WRITE(p,
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       brw_null_reg(),
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       0,
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       brw_vec8_grf(0, 0),
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       0, 	/* allocate */
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       1,	/* used */
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       4, 	/* msg len */
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       0,	/* response len */
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       last, 	/* eot */
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       last, 	/* writes complete */
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       i*4,	/* urb destination offset */
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       BRW_URB_SWIZZLE_TRANSPOSE);
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_emit_anyprim_setup( struct brw_sf_compile *c )
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_compile *p = &c->func;
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg ip = brw_ip_reg();
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg payload_prim = brw_uw1_reg(BRW_GENERAL_REGISTER_FILE, 1, 0);
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg payload_attr = get_element_ud(brw_vec1_reg(BRW_GENERAL_REGISTER_FILE, 1, 0), 0);
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg primmask;
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int jmp;
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_reg v1_null_ud = vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_UD));
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint saveflag;
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->nr_verts = 3;
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   alloc_regs(c);
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   primmask = retype(get_element(c->tmp, 0), BRW_REGISTER_TYPE_UD);
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_MOV(p, primmask, brw_imm_ud(1));
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_SHL(p, primmask, primmask, payload_prim);
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_set_conditionalmod(p, BRW_CONDITIONAL_Z);
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_AND(p, v1_null_ud, primmask, brw_imm_ud((1<<_3DPRIM_TRILIST) |
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_TRISTRIP) |
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_TRIFAN) |
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_TRISTRIP_REVERSE) |
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_POLYGON) |
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_RECTLIST) |
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_TRIFAN_NOSTIPPLE)));
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   jmp = brw_JMPI(p, ip, ip, brw_imm_d(0)) - p->store;
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      saveflag = p->flag_value;
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_push_insn_state(p);
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_emit_tri_setup( c, false );
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_pop_insn_state(p);
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->flag_value = saveflag;
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* note - thread killed in subroutine, so must
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * restore the flag which is changed when building
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * the subroutine. fix #13240
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_land_fwd_jump(p, jmp);
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_set_conditionalmod(p, BRW_CONDITIONAL_Z);
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_AND(p, v1_null_ud, primmask, brw_imm_ud((1<<_3DPRIM_LINELIST) |
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_LINESTRIP) |
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_LINELOOP) |
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_LINESTRIP_CONT) |
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_LINESTRIP_BF) |
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       (1<<_3DPRIM_LINESTRIP_CONT_BF)));
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   jmp = brw_JMPI(p, ip, ip, brw_imm_d(0)) - p->store;
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      saveflag = p->flag_value;
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_push_insn_state(p);
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_emit_line_setup( c, false );
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_pop_insn_state(p);
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->flag_value = saveflag;
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* note - thread killed in subroutine */
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_land_fwd_jump(p, jmp);
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_set_conditionalmod(p, BRW_CONDITIONAL_Z);
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_AND(p, v1_null_ud, payload_attr, brw_imm_ud(1<<BRW_SPRITE_POINT_ENABLE));
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   jmp = brw_JMPI(p, ip, ip, brw_imm_d(0)) - p->store;
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      saveflag = p->flag_value;
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_push_insn_state(p);
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_emit_point_sprite_setup( c, false );
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_pop_insn_state(p);
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->flag_value = saveflag;
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_land_fwd_jump(p, jmp);
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_emit_point_setup( c, false );
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
793