brw_clip_tri.c

Go to the documentation of this file.
00001 /*
00002  Copyright (C) Intel Corp.  2006.  All Rights Reserved.
00003  Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
00004  develop this 3D driver.
00005 
00006  Permission is hereby granted, free of charge, to any person obtaining
00007  a copy of this software and associated documentation files (the
00008  "Software"), to deal in the Software without restriction, including
00009  without limitation the rights to use, copy, modify, merge, publish,
00010  distribute, sublicense, and/or sell copies of the Software, and to
00011  permit persons to whom the Software is furnished to do so, subject to
00012  the following conditions:
00013 
00014  The above copyright notice and this permission notice (including the
00015  next paragraph) shall be included in all copies or substantial
00016  portions of the Software.
00017 
00018  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00019  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00020  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
00021  IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
00022  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00023  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00024  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00025 
00026  **********************************************************************/
00027  /*
00028   * Authors:
00029   *   Keith Whitwell <keith@tungstengraphics.com>
00030   */
00031 
00032 #include "brw_defines.h"
00033 #include "brw_context.h"
00034 #include "brw_eu.h"
00035 #include "brw_util.h"
00036 #include "brw_clip.h"
00037 
00038 static struct brw_reg get_tmp( struct brw_clip_compile *c )
00039 {
00040    struct brw_reg tmp = brw_vec4_grf(c->last_tmp, 0);
00041 
00042    if (++c->last_tmp > c->prog_data.total_grf)
00043       c->prog_data.total_grf = c->last_tmp;
00044 
00045    return tmp;
00046 }
00047 
00048 static void release_tmps( struct brw_clip_compile *c )
00049 {
00050    c->last_tmp = c->first_tmp;
00051 }
00052 
00053 
00054 void brw_clip_tri_alloc_regs( struct brw_clip_compile *c,
00055                               unsigned nr_verts )
00056 {
00057    unsigned i = 0,j;
00058 
00059    /* Register usage is static, precompute here:
00060     */
00061    c->reg.R0 = retype(brw_vec8_grf(i, 0), BRW_REGISTER_TYPE_UD); i++;
00062 
00063    if (c->key.nr_userclip) {
00064       c->reg.fixed_planes = brw_vec4_grf(i, 0);
00065       i += (6 + c->key.nr_userclip + 1) / 2;
00066 
00067       c->prog_data.curb_read_length = (6 + c->key.nr_userclip + 1) / 2;
00068    }
00069    else
00070       c->prog_data.curb_read_length = 0;
00071 
00072 
00073    /* Payload vertices plus space for more generated vertices:
00074     */
00075    for (j = 0; j < nr_verts; j++) {
00076       c->reg.vertex[j] = brw_vec4_grf(i, 0);
00077       i += c->nr_regs;
00078    }
00079 
00080    if (c->nr_attrs & 1) {
00081       for (j = 0; j < 3; j++) {
00082          unsigned delta = c->nr_attrs*16 + 32;
00083          brw_MOV(&c->func, byte_offset(c->reg.vertex[j], delta), brw_imm_f(0));
00084       }
00085    }
00086 
00087    c->reg.t          = brw_vec1_grf(i, 0);
00088    c->reg.loopcount  = retype(brw_vec1_grf(i, 1), BRW_REGISTER_TYPE_UD);
00089    c->reg.nr_verts   = retype(brw_vec1_grf(i, 2), BRW_REGISTER_TYPE_UD);
00090    c->reg.planemask  = retype(brw_vec1_grf(i, 3), BRW_REGISTER_TYPE_UD);
00091    c->reg.plane_equation = brw_vec4_grf(i, 4);
00092    i++;
00093 
00094    c->reg.dpPrev     = brw_vec1_grf(i, 0); /* fixme - dp4 will clobber r.1,2,3 */
00095    c->reg.dp         = brw_vec1_grf(i, 4);
00096    i++;
00097 
00098    c->reg.inlist     = brw_uw16_reg(BRW_GENERAL_REGISTER_FILE, i, 0);
00099    i++;
00100 
00101    c->reg.outlist    = brw_uw16_reg(BRW_GENERAL_REGISTER_FILE, i, 0);
00102    i++;
00103 
00104    c->reg.freelist   = brw_uw16_reg(BRW_GENERAL_REGISTER_FILE, i, 0);
00105    i++;
00106 
00107    if (!c->key.nr_userclip) {
00108       c->reg.fixed_planes = brw_vec8_grf(i, 0);
00109       i++;
00110    }
00111 
00112    if (c->key.do_unfilled) {
00113       c->reg.dir     = brw_vec4_grf(i, 0);
00114       c->reg.offset  = brw_vec4_grf(i, 4);
00115       i++;
00116       c->reg.tmp0    = brw_vec4_grf(i, 0);
00117       c->reg.tmp1    = brw_vec4_grf(i, 4);
00118       i++;
00119    }
00120 
00121    c->first_tmp = i;
00122    c->last_tmp = i;
00123 
00124    c->prog_data.urb_read_length = c->nr_regs; /* ? */
00125    c->prog_data.total_grf = i;
00126 }
00127 
00128 
00129 
00130 void brw_clip_tri_init_vertices( struct brw_clip_compile *c )
00131 {
00132    struct brw_compile *p = &c->func;
00133    struct brw_reg tmp0 = c->reg.loopcount; /* handy temporary */
00134    struct brw_instruction *is_rev;
00135 
00136    /* Initial list of indices for incoming vertexes:
00137     */
00138    brw_AND(p, tmp0, get_element_ud(c->reg.R0, 2), brw_imm_ud(PRIM_MASK));
00139    brw_CMP(p,
00140            vec1(brw_null_reg()),
00141            BRW_CONDITIONAL_EQ,
00142            tmp0,
00143            brw_imm_ud(_3DPRIM_TRISTRIP_REVERSE));
00144 
00145    /* XXX: Is there an easier way to do this?  Need to reverse every
00146     * second tristrip element:  Can ignore sometimes?
00147     */
00148    is_rev = brw_IF(p, BRW_EXECUTE_1);
00149    {
00150       brw_MOV(p, get_element(c->reg.inlist, 0),  brw_address(c->reg.vertex[1]) );
00151       brw_MOV(p, get_element(c->reg.inlist, 1),  brw_address(c->reg.vertex[0]) );
00152       if (c->need_direction)
00153          brw_MOV(p, c->reg.dir, brw_imm_f(-1));
00154    }
00155    is_rev = brw_ELSE(p, is_rev);
00156    {
00157       brw_MOV(p, get_element(c->reg.inlist, 0),  brw_address(c->reg.vertex[0]) );
00158       brw_MOV(p, get_element(c->reg.inlist, 1),  brw_address(c->reg.vertex[1]) );
00159       if (c->need_direction)
00160          brw_MOV(p, c->reg.dir, brw_imm_f(1));
00161    }
00162    brw_ENDIF(p, is_rev);
00163 
00164    brw_MOV(p, get_element(c->reg.inlist, 2),  brw_address(c->reg.vertex[2]) );
00165    brw_MOV(p, brw_vec8_grf(c->reg.outlist.nr, 0), brw_imm_f(0));
00166    brw_MOV(p, c->reg.nr_verts, brw_imm_ud(3));
00167 }
00168 
00169 
00170 
00171 void brw_clip_tri_flat_shade( struct brw_clip_compile *c )
00172 {
00173    struct brw_compile *p = &c->func;
00174    struct brw_instruction *is_poly;
00175    struct brw_reg tmp0 = c->reg.loopcount; /* handy temporary */
00176 
00177    brw_AND(p, tmp0, get_element_ud(c->reg.R0, 2), brw_imm_ud(PRIM_MASK));
00178    brw_CMP(p,
00179            vec1(brw_null_reg()),
00180            BRW_CONDITIONAL_EQ,
00181            tmp0,
00182            brw_imm_ud(_3DPRIM_POLYGON));
00183 
00184    is_poly = brw_IF(p, BRW_EXECUTE_1);
00185    {
00186       brw_clip_copy_colors(c, 1, 0);
00187       brw_clip_copy_colors(c, 2, 0);
00188    }
00189    is_poly = brw_ELSE(p, is_poly);
00190    {
00191       brw_clip_copy_colors(c, 0, 2);
00192       brw_clip_copy_colors(c, 1, 2);
00193    }
00194    brw_ENDIF(p, is_poly);
00195 }
00196 
00197 
00198 
00199 /* Use mesa's clipping algorithms, translated to GEN4 assembly.
00200  */
00201 void brw_clip_tri( struct brw_clip_compile *c )
00202 {
00203 #if 0
00204    struct brw_compile *p = &c->func;
00205    struct brw_indirect vtx = brw_indirect(0, 0);
00206    struct brw_indirect vtxPrev = brw_indirect(1, 0);
00207    struct brw_indirect vtxOut = brw_indirect(2, 0);
00208    struct brw_indirect plane_ptr = brw_indirect(3, 0);
00209    struct brw_indirect inlist_ptr = brw_indirect(4, 0);
00210    struct brw_indirect outlist_ptr = brw_indirect(5, 0);
00211    struct brw_indirect freelist_ptr = brw_indirect(6, 0);
00212    struct brw_instruction *plane_loop;
00213    struct brw_instruction *plane_active;
00214    struct brw_instruction *vertex_loop;
00215    struct brw_instruction *next_test;
00216    struct brw_instruction *prev_test;
00217 
00218    brw_MOV(p, get_addr_reg(vtxPrev),     brw_address(c->reg.vertex[2]) );
00219    brw_MOV(p, get_addr_reg(plane_ptr),   brw_clip_plane0_address(c));
00220    brw_MOV(p, get_addr_reg(inlist_ptr),  brw_address(c->reg.inlist));
00221    brw_MOV(p, get_addr_reg(outlist_ptr), brw_address(c->reg.outlist));
00222 
00223    brw_MOV(p, get_addr_reg(freelist_ptr), brw_address(c->reg.vertex[3]) );
00224 
00225    plane_loop = brw_DO(p, BRW_EXECUTE_1);
00226    {
00227       /* if (planemask & 1)
00228        */
00229       brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
00230       brw_AND(p, vec1(brw_null_reg()), c->reg.planemask, brw_imm_ud(1));
00231 
00232       plane_active = brw_IF(p, BRW_EXECUTE_1);
00233       {
00234          /* vtxOut = freelist_ptr++
00235           */
00236          brw_MOV(p, get_addr_reg(vtxOut),       get_addr_reg(freelist_ptr) );
00237          brw_ADD(p, get_addr_reg(freelist_ptr), get_addr_reg(freelist_ptr), brw_imm_uw(c->nr_regs * REG_SIZE));
00238 
00239          if (c->key.nr_userclip)
00240             brw_MOV(p, c->reg.plane_equation, deref_4f(plane_ptr, 0));
00241          else
00242             brw_MOV(p, c->reg.plane_equation, deref_4b(plane_ptr, 0));
00243 
00244          brw_MOV(p, c->reg.loopcount, c->reg.nr_verts);
00245          brw_MOV(p, c->reg.nr_verts, brw_imm_ud(0));
00246 
00247          vertex_loop = brw_DO(p, BRW_EXECUTE_1);
00248          {
00249             /* vtx = *input_ptr;
00250              */
00251             brw_MOV(p, get_addr_reg(vtx), deref_1uw(inlist_ptr, 0));
00252 
00253             /* IS_NEGATIVE(prev) */
00254             brw_set_conditionalmod(p, BRW_CONDITIONAL_L);
00255             brw_DP4(p, vec4(c->reg.dpPrev), deref_4f(vtxPrev, c->offset[VERT_RESULT_HPOS]), c->reg.plane_equation);
00256             prev_test = brw_IF(p, BRW_EXECUTE_1);
00257             {
00258                /* IS_POSITIVE(next)
00259                 */
00260                brw_set_conditionalmod(p, BRW_CONDITIONAL_GE);
00261                brw_DP4(p, vec4(c->reg.dp), deref_4f(vtx, c->offset[VERT_RESULT_HPOS]), c->reg.plane_equation);
00262                next_test = brw_IF(p, BRW_EXECUTE_1);
00263                {
00264 
00265                   /* Coming back in.
00266                    */
00267                   brw_ADD(p, c->reg.t, c->reg.dpPrev, negate(c->reg.dp));
00268                   brw_math_invert(p, c->reg.t, c->reg.t);
00269                   brw_MUL(p, c->reg.t, c->reg.t, c->reg.dpPrev);
00270 
00271                   /* If (vtxOut == 0) vtxOut = vtxPrev
00272                    */
00273                   brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_EQ, get_addr_reg(vtxOut), brw_imm_uw(0) );
00274                   brw_MOV(p, get_addr_reg(vtxOut), get_addr_reg(vtxPrev) );
00275                   brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00276 
00277                   brw_clip_interp_vertex(c, vtxOut, vtxPrev, vtx, c->reg.t, FALSE);
00278 
00279                   /* *outlist_ptr++ = vtxOut;
00280                    * nr_verts++;
00281                    * vtxOut = 0;
00282                    */
00283                   brw_MOV(p, deref_1uw(outlist_ptr, 0), get_addr_reg(vtxOut));
00284                   brw_ADD(p, get_addr_reg(outlist_ptr), get_addr_reg(outlist_ptr), brw_imm_uw(sizeof(short)));
00285                   brw_ADD(p, c->reg.nr_verts, c->reg.nr_verts, brw_imm_ud(1));
00286                   brw_MOV(p, get_addr_reg(vtxOut), brw_imm_uw(0) );
00287                }
00288                brw_ENDIF(p, next_test);
00289 
00290             }
00291             prev_test = brw_ELSE(p, prev_test);
00292             {
00293                /* *outlist_ptr++ = vtxPrev;
00294                 * nr_verts++;
00295                 */
00296                brw_MOV(p, deref_1uw(outlist_ptr, 0), get_addr_reg(vtxPrev));
00297                brw_ADD(p, get_addr_reg(outlist_ptr), get_addr_reg(outlist_ptr), brw_imm_uw(sizeof(short)));
00298                brw_ADD(p, c->reg.nr_verts, c->reg.nr_verts, brw_imm_ud(1));
00299 
00300                /* IS_NEGATIVE(next)
00301                 */
00302                brw_set_conditionalmod(p, BRW_CONDITIONAL_L);
00303                brw_DP4(p, vec4(c->reg.dp), deref_4f(vtx, c->offset[VERT_RESULT_HPOS]), c->reg.plane_equation);
00304                next_test = brw_IF(p, BRW_EXECUTE_1);
00305                {
00306                   /* Going out of bounds.  Avoid division by zero as we
00307                    * know dp != dpPrev from DIFFERENT_SIGNS, above.
00308                    */
00309                   brw_ADD(p, c->reg.t, c->reg.dp, negate(c->reg.dpPrev));
00310                   brw_math_invert(p, c->reg.t, c->reg.t);
00311                   brw_MUL(p, c->reg.t, c->reg.t, c->reg.dp);
00312 
00313                   /* If (vtxOut == 0) vtxOut = vtx
00314                    */
00315                   brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_EQ, get_addr_reg(vtxOut), brw_imm_uw(0) );
00316                   brw_MOV(p, get_addr_reg(vtxOut), get_addr_reg(vtx) );
00317                   brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00318 
00319                   brw_clip_interp_vertex(c, vtxOut, vtx, vtxPrev, c->reg.t, TRUE);
00320 
00321                   /* *outlist_ptr++ = vtxOut;
00322                    * nr_verts++;
00323                    * vtxOut = 0;
00324                    */
00325                   brw_MOV(p, deref_1uw(outlist_ptr, 0), get_addr_reg(vtxOut));
00326                   brw_ADD(p, get_addr_reg(outlist_ptr), get_addr_reg(outlist_ptr), brw_imm_uw(sizeof(short)));
00327                   brw_ADD(p, c->reg.nr_verts, c->reg.nr_verts, brw_imm_ud(1));
00328                   brw_MOV(p, get_addr_reg(vtxOut), brw_imm_uw(0) );
00329                }
00330                brw_ENDIF(p, next_test);
00331             }
00332             brw_ENDIF(p, prev_test);
00333 
00334             /* vtxPrev = vtx;
00335              * inlist_ptr++;
00336              */
00337             brw_MOV(p, get_addr_reg(vtxPrev), get_addr_reg(vtx));
00338             brw_ADD(p, get_addr_reg(inlist_ptr), get_addr_reg(inlist_ptr), brw_imm_uw(sizeof(short)));
00339 
00340             /* while (--loopcount != 0)
00341              */
00342             brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
00343             brw_ADD(p, c->reg.loopcount, c->reg.loopcount, brw_imm_d(-1));
00344          }
00345          brw_WHILE(p, vertex_loop);
00346 
00347          /* vtxPrev = *(outlist_ptr-1)  OR: outlist[nr_verts-1]
00348           * inlist = outlist
00349           * inlist_ptr = &inlist[0]
00350           * outlist_ptr = &outlist[0]
00351           */
00352          brw_ADD(p, get_addr_reg(outlist_ptr), get_addr_reg(outlist_ptr), brw_imm_w(-2));
00353          brw_MOV(p, get_addr_reg(vtxPrev), deref_1uw(outlist_ptr, 0));
00354          brw_MOV(p, brw_vec8_grf(c->reg.inlist.nr, 0), brw_vec8_grf(c->reg.outlist.nr, 0));
00355          brw_MOV(p, get_addr_reg(inlist_ptr), brw_address(c->reg.inlist));
00356          brw_MOV(p, get_addr_reg(outlist_ptr), brw_address(c->reg.outlist));
00357       }
00358       brw_ENDIF(p, plane_active);
00359 
00360       /* plane_ptr++;
00361        */
00362       brw_ADD(p, get_addr_reg(plane_ptr), get_addr_reg(plane_ptr), brw_clip_plane_stride(c));
00363 
00364       /* nr_verts >= 3
00365        */
00366       brw_CMP(p,
00367               vec1(brw_null_reg()),
00368               BRW_CONDITIONAL_GE,
00369               c->reg.nr_verts,
00370               brw_imm_ud(3));
00371 
00372       /* && (planemask>>=1) != 0
00373        */
00374       brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
00375       brw_SHR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud(1));
00376    }
00377    brw_WHILE(p, plane_loop);
00378 #else
00379          #warning "disabled"
00380 #endif
00381 }
00382 
00383 
00384 
00385 void brw_clip_tri_emit_polygon(struct brw_clip_compile *c)
00386 {
00387    struct brw_compile *p = &c->func;
00388    struct brw_instruction *loop, *if_insn;
00389 
00390    /* for (loopcount = nr_verts-2; loopcount > 0; loopcount--)
00391     */
00392    brw_set_conditionalmod(p, BRW_CONDITIONAL_G);
00393    brw_ADD(p,
00394            c->reg.loopcount,
00395            c->reg.nr_verts,
00396            brw_imm_d(-2));
00397 
00398    if_insn = brw_IF(p, BRW_EXECUTE_1);
00399    {
00400       struct brw_indirect v0 = brw_indirect(0, 0);
00401       struct brw_indirect vptr = brw_indirect(1, 0);
00402 
00403       brw_MOV(p, get_addr_reg(vptr), brw_address(c->reg.inlist));
00404       brw_MOV(p, get_addr_reg(v0), deref_1uw(vptr, 0));
00405 
00406       brw_clip_emit_vue(c, v0, 1, 0, ((_3DPRIM_TRIFAN << 2) | R02_PRIM_START));
00407 
00408       brw_ADD(p, get_addr_reg(vptr), get_addr_reg(vptr), brw_imm_uw(2));
00409       brw_MOV(p, get_addr_reg(v0), deref_1uw(vptr, 0));
00410 
00411       loop = brw_DO(p, BRW_EXECUTE_1);
00412       {
00413          brw_clip_emit_vue(c, v0, 1, 0, (_3DPRIM_TRIFAN << 2));
00414 
00415          brw_ADD(p, get_addr_reg(vptr), get_addr_reg(vptr), brw_imm_uw(2));
00416          brw_MOV(p, get_addr_reg(v0), deref_1uw(vptr, 0));
00417 
00418          brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
00419          brw_ADD(p, c->reg.loopcount, c->reg.loopcount, brw_imm_d(-1));
00420       }
00421       brw_WHILE(p, loop);
00422 
00423       brw_clip_emit_vue(c, v0, 0, 1, ((_3DPRIM_TRIFAN << 2) | R02_PRIM_END));
00424    }
00425    brw_ENDIF(p, if_insn);
00426 }
00427 
00428 static void do_clip_tri( struct brw_clip_compile *c )
00429 {
00430    brw_clip_init_planes(c);
00431 
00432    brw_clip_tri(c);
00433 }
00434 
00435 
00436 static void maybe_do_clip_tri( struct brw_clip_compile *c )
00437 {
00438    struct brw_compile *p = &c->func;
00439    struct brw_instruction *do_clip;
00440 
00441    brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_NZ, c->reg.planemask, brw_imm_ud(0));
00442    do_clip = brw_IF(p, BRW_EXECUTE_1);
00443    {
00444       do_clip_tri(c);
00445    }
00446    brw_ENDIF(p, do_clip);
00447 }
00448 
00449 static void brw_clip_test( struct brw_clip_compile *c )
00450 {
00451 #if 0
00452     struct brw_reg t = retype(get_tmp(c), BRW_REGISTER_TYPE_UD);
00453     struct brw_reg t1 = retype(get_tmp(c), BRW_REGISTER_TYPE_UD);
00454     struct brw_reg t2 = retype(get_tmp(c), BRW_REGISTER_TYPE_UD);
00455     struct brw_reg t3 = retype(get_tmp(c), BRW_REGISTER_TYPE_UD);
00456 
00457     struct brw_reg v0 = get_tmp(c);
00458     struct brw_reg v1 = get_tmp(c);
00459     struct brw_reg v2 = get_tmp(c);
00460 
00461     struct brw_indirect vt0 = brw_indirect(0, 0);
00462     struct brw_indirect vt1 = brw_indirect(1, 0);
00463     struct brw_indirect vt2 = brw_indirect(2, 0);
00464 
00465     struct brw_compile *p = &c->func;
00466 
00467     brw_MOV(p, get_addr_reg(vt0), brw_address(c->reg.vertex[0]));
00468     brw_MOV(p, get_addr_reg(vt1), brw_address(c->reg.vertex[1]));
00469     brw_MOV(p, get_addr_reg(vt2), brw_address(c->reg.vertex[2]));
00470     brw_MOV(p, v0, deref_4f(vt0, c->offset[VERT_RESULT_HPOS]));
00471     brw_MOV(p, v1, deref_4f(vt1, c->offset[VERT_RESULT_HPOS]));
00472     brw_MOV(p, v2, deref_4f(vt2, c->offset[VERT_RESULT_HPOS]));
00473 
00474     /* test nearz, xmin, ymin plane */
00475     brw_CMP(p, t1, BRW_CONDITIONAL_LE, negate(v0), get_element(v0, 3));
00476     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00477     brw_CMP(p, t2, BRW_CONDITIONAL_LE, negate(v1), get_element(v1, 3));
00478     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00479     brw_CMP(p, t3, BRW_CONDITIONAL_LE, negate(v2), get_element(v2, 3));
00480     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00481     brw_XOR(p, t, t1, t2);
00482     brw_XOR(p, t1, t2, t3);
00483     brw_OR(p, t, t, t1);
00484 
00485     brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
00486             get_element(t, 0), brw_imm_ud(0));
00487     brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<5)));
00488     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00489     brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
00490             get_element(t, 1), brw_imm_ud(0));
00491     brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<3)));
00492     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00493     brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
00494             get_element(t, 2), brw_imm_ud(0));
00495     brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<1)));
00496     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00497 
00498     /* test farz, xmax, ymax plane */
00499     brw_CMP(p, t1, BRW_CONDITIONAL_L, v0, get_element(v0, 3));
00500     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00501     brw_CMP(p, t2, BRW_CONDITIONAL_L, v1, get_element(v1, 3));
00502     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00503     brw_CMP(p, t3, BRW_CONDITIONAL_L, v2, get_element(v2, 3));
00504     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00505 
00506     brw_XOR(p, t, t1, t2);
00507     brw_XOR(p, t1, t2, t3);
00508     brw_OR(p, t, t, t1);
00509 
00510     brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
00511             get_element(t, 0), brw_imm_ud(0));
00512     brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<4)));
00513     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00514     brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
00515             get_element(t, 1), brw_imm_ud(0));
00516     brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<2)));
00517     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00518     brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
00519             get_element(t, 2), brw_imm_ud(0));
00520     brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<0)));
00521     brw_set_predicate_control(p, BRW_PREDICATE_NONE);
00522 
00523     release_tmps(c);
00524 #else
00525          #warning "disabled"
00526 #endif
00527 }
00528 
00529 
00530 void brw_emit_tri_clip( struct brw_clip_compile *c )
00531 {
00532    struct brw_instruction *neg_rhw;
00533    struct brw_compile *p = &c->func;
00534    brw_clip_tri_alloc_regs(c, 3 + c->key.nr_userclip + 6);
00535    brw_clip_tri_init_vertices(c);
00536    brw_clip_init_clipmask(c);
00537 
00538    /* if -ve rhw workaround bit is set,
00539       do cliptest */
00540    brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
00541    brw_AND(p, brw_null_reg(), get_element_ud(c->reg.R0, 2),
00542            brw_imm_ud(1<<20));
00543    neg_rhw = brw_IF(p, BRW_EXECUTE_1);
00544    {
00545        brw_clip_test(c);
00546    }
00547    brw_ENDIF(p, neg_rhw);
00548 
00549    /* Can't push into do_clip_tri because with polygon (or quad)
00550     * flatshading, need to apply the flatshade here because we don't
00551     * respect the PV when converting to trifan for emit:
00552     */
00553    if (c->key.do_flat_shading)
00554       brw_clip_tri_flat_shade(c);
00555 
00556    if (c->key.clip_mode == BRW_CLIPMODE_NORMAL)
00557       do_clip_tri(c);
00558    else
00559       maybe_do_clip_tri(c);
00560 
00561    brw_clip_tri_emit_polygon(c);
00562 
00563    /* Send an empty message to kill the thread:
00564     */
00565    brw_clip_kill_thread(c);
00566 }

Generated on Tue Sep 29 06:25:16 2009 for Gallium3D by  doxygen 1.5.4