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