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