X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_clip_unfilled.c;h=d333d10d2998ae6234499c7b5b97acc83c1197e6;hb=ac08bc8ac220f22333536a9f881fde1e5607148e;hp=3b643f122770f992d011f5c6b1927ee3b75d2e8d;hpb=4e9c79c847c81701300b5b0d97d85dcfad32239a;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_clip_unfilled.c b/src/mesa/drivers/dri/i965/brw_clip_unfilled.c index 3b643f12277..d333d10d299 100644 --- a/src/mesa/drivers/dri/i965/brw_clip_unfilled.c +++ b/src/mesa/drivers/dri/i965/brw_clip_unfilled.c @@ -29,7 +29,6 @@ * Keith Whitwell */ -#include "main/glheader.h" #include "main/macros.h" #include "main/enums.h" #include "program/program.h" @@ -49,7 +48,7 @@ BZZZT! */ static void compute_tri_direction( struct brw_clip_compile *c ) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; struct brw_reg e = c->reg.tmp0; struct brw_reg f = c->reg.tmp1; GLuint hpos_offset = brw_varying_to_offset(&c->vue_map, VARYING_SLOT_POS); @@ -86,8 +85,10 @@ static void compute_tri_direction( struct brw_clip_compile *c ) /* Take their crossproduct: */ brw_set_default_access_mode(p, BRW_ALIGN_16); - brw_MUL(p, vec4(brw_null_reg()), brw_swizzle(e, 1,2,0,3), brw_swizzle(f,2,0,1,3)); - brw_MAC(p, vec4(e), negate(brw_swizzle(e, 2,0,1,3)), brw_swizzle(f,1,2,0,3)); + brw_MUL(p, vec4(brw_null_reg()), brw_swizzle(e, BRW_SWIZZLE_YZXW), + brw_swizzle(f, BRW_SWIZZLE_ZXYW)); + brw_MAC(p, vec4(e), negate(brw_swizzle(e, BRW_SWIZZLE_ZXYW)), + brw_swizzle(f, BRW_SWIZZLE_YZXW)); brw_set_default_access_mode(p, BRW_ALIGN_1); brw_MUL(p, c->reg.dir, c->reg.dir, vec4(e)); @@ -96,7 +97,7 @@ static void compute_tri_direction( struct brw_clip_compile *c ) static void cull_direction( struct brw_clip_compile *c ) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; GLuint conditional; assert (!(c->key.fill_ccw == CLIP_CULL && @@ -124,7 +125,7 @@ static void cull_direction( struct brw_clip_compile *c ) static void copy_bfc( struct brw_clip_compile *c ) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; GLuint conditional; /* Do we have any colors to copy? @@ -135,9 +136,9 @@ static void copy_bfc( struct brw_clip_compile *c ) brw_clip_have_varying(c, VARYING_SLOT_BFC1))) return; - /* In some wierd degnerate cases we can end up testing the + /* In some weird degenerate cases we can end up testing the * direction twice, once for culling and once for bfc copying. Oh - * well, that's what you get for setting wierd GL state. + * well, that's what you get for setting weird GL state. */ if (c->key.copy_bfc_ccw) conditional = BRW_CONDITIONAL_GE; @@ -188,11 +189,17 @@ static void copy_bfc( struct brw_clip_compile *c ) GLfloat bc = dir.y * iz; offset = ctx->Polygon.OffsetUnits * DEPTH_SCALE; offset += MAX2( abs(ac), abs(bc) ) * ctx->Polygon.OffsetFactor; + if (ctx->Polygon.OffsetClamp && isfinite(ctx->Polygon.OffsetClamp)) { + if (ctx->Polygon.OffsetClamp < 0) + offset = MAX2( offset, ctx->Polygon.OffsetClamp ); + else + offset = MIN2( offset, ctx->Polygon.OffsetClamp ); + } offset *= MRD; */ static void compute_offset( struct brw_clip_compile *c ) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; struct brw_reg off = c->reg.offset; struct brw_reg dir = c->reg.dir; @@ -211,12 +218,20 @@ static void compute_offset( struct brw_clip_compile *c ) brw_MUL(p, vec1(off), vec1(off), brw_imm_f(c->key.offset_factor)); brw_ADD(p, vec1(off), vec1(off), brw_imm_f(c->key.offset_units)); + if (c->key.offset_clamp && isfinite(c->key.offset_clamp)) { + brw_CMP(p, + vec1(brw_null_reg()), + c->key.offset_clamp < 0 ? BRW_CONDITIONAL_GE : BRW_CONDITIONAL_L, + vec1(off), + brw_imm_f(c->key.offset_clamp)); + brw_SEL(p, vec1(off), vec1(off), brw_imm_f(c->key.offset_clamp)); + } } static void merge_edgeflags( struct brw_clip_compile *c ) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; struct brw_reg tmp0 = get_element_ud(c->reg.tmp0, 0); brw_AND(p, tmp0, get_element_ud(c->reg.R0, 2), brw_imm_ud(PRIM_MASK)); @@ -255,7 +270,7 @@ static void merge_edgeflags( struct brw_clip_compile *c ) static void apply_one_offset( struct brw_clip_compile *c, struct brw_indirect vert ) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; GLuint ndc_offset = brw_varying_to_offset(&c->vue_map, BRW_VARYING_SLOT_NDC); struct brw_reg z = deref_1f(vert, ndc_offset + @@ -272,13 +287,13 @@ static void apply_one_offset( struct brw_clip_compile *c, static void emit_lines(struct brw_clip_compile *c, bool do_offset) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; struct brw_indirect v0 = brw_indirect(0, 0); struct brw_indirect v1 = brw_indirect(1, 0); struct brw_indirect v0ptr = brw_indirect(2, 0); struct brw_indirect v1ptr = brw_indirect(3, 0); - /* Need a seperate loop for offset: + /* Need a separate loop for offset: */ if (do_offset) { brw_MOV(p, c->reg.loopcount, c->reg.nr_verts); @@ -288,9 +303,9 @@ static void emit_lines(struct brw_clip_compile *c, { brw_MOV(p, get_addr_reg(v0), deref_1uw(v0ptr, 0)); brw_ADD(p, get_addr_reg(v0ptr), get_addr_reg(v0ptr), brw_imm_uw(2)); - + apply_one_offset(c, v0); - + brw_ADD(p, c->reg.loopcount, c->reg.loopcount, brw_imm_d(-1)); brw_inst_set_cond_modifier(p->devinfo, brw_last_inst, BRW_CONDITIONAL_G); } @@ -342,7 +357,7 @@ static void emit_lines(struct brw_clip_compile *c, static void emit_points(struct brw_clip_compile *c, bool do_offset ) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; struct brw_indirect v0 = brw_indirect(0, 0); struct brw_indirect v0ptr = brw_indirect(2, 0); @@ -412,7 +427,7 @@ static void emit_primitives( struct brw_clip_compile *c, static void emit_unfilled_primitives( struct brw_clip_compile *c ) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; /* Direction culling has already been done. */ @@ -449,7 +464,7 @@ static void emit_unfilled_primitives( struct brw_clip_compile *c ) static void check_nr_verts( struct brw_clip_compile *c ) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_L, c->reg.nr_verts, brw_imm_d(3)); brw_IF(p, BRW_EXECUTE_1); @@ -462,7 +477,7 @@ static void check_nr_verts( struct brw_clip_compile *c ) void brw_emit_unfilled_clip( struct brw_clip_compile *c ) { - struct brw_compile *p = &c->func; + struct brw_codegen *p = &c->func; c->need_direction = ((c->key.offset_ccw || c->key.offset_cw) || (c->key.fill_ccw != c->key.fill_cw) || @@ -520,6 +535,3 @@ void brw_emit_unfilled_clip( struct brw_clip_compile *c ) emit_unfilled_primitives(c); brw_clip_kill_thread(c); } - - -