mesa: Changes to 'ubuntu'
debian/changelog | 9
debian/patches/110_fix_intel_965_atunnel_rendering_glitch.diff | 204 ++++++++++
debian/patches/series | 1
3 files changed, 214 insertions(+)
New commits:
commit 41730903cb66f975dd2332bc45ee665cf4872c8d
Author: Bryce Harrington <bryce@bryceharrington.org>
Date: Thu Mar 12 19:26:05 2009 -0700
Patch from mnemo for atunnel screensaver
diff --git a/debian/changelog b/debian/changelog
index 7971869..bcecb10 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+mesa (7.3-1ubuntu4) jaunty; urgency=low
+
+ * debian/patches/110_fix_intel_965_atunnel_rendering_glitch.diff: fix rendering defects
+ in atunnel screensaver (from rss-glx package). Patch originally comes from
+ upstream mesa master at cgit.freedesktop.org (26th Feb by Haihao Xiang
+ as commit 68915fd6fac44dd000080298e3afb0669e8754aa). (LP: #330476)
+
+ -- Martin Olsson <martin@minimum.se> Mon, 02 Mar 2009 13:30:47 +0100
+
mesa (7.3-1ubuntu3) jaunty; urgency=low
* Add 103_rs600_support.patch: Adds support for the RS600 chip and sets
diff --git a/debian/patches/110_fix_intel_965_atunnel_rendering_glitch.diff b/debian/patches/110_fix_intel_965_atunnel_rendering_glitch.diff
new file mode 100644
index 0000000..7cf590c
--- /dev/null
+++ b/debian/patches/110_fix_intel_965_atunnel_rendering_glitch.diff
@@ -0,0 +1,204 @@
+Index: mesa-7.3/src/mesa/drivers/dri/i965/brw_clip_line.c
+===================================================================
+--- mesa-7.3.orig/src/mesa/drivers/dri/i965/brw_clip_line.c 2009-03-02 13:29:37.000000000 +0100
++++ mesa-7.3/src/mesa/drivers/dri/i965/brw_clip_line.c 2009-03-02 13:30:22.000000000 +0100
+@@ -181,34 +181,54 @@
+ brw_DP4(p, vec4(c->reg.dp1), deref_4f(vtx1, c->offset[VERT_RESULT_HPOS]), c->reg.plane_equation);
+ is_negative = brw_IF(p, BRW_EXECUTE_1);
+ {
+- brw_ADD(p, c->reg.t, c->reg.dp1, negate(c->reg.dp0));
+- brw_math_invert(p, c->reg.t, c->reg.t);
+- brw_MUL(p, c->reg.t, c->reg.t, c->reg.dp1);
+-
+- brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_G, c->reg.t, c->reg.t1 );
+- brw_MOV(p, c->reg.t1, c->reg.t);
+- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
++ /*
++ * Both can be negative on GM965/G965 due to RHW workaround
++ * if so, this object should be rejected.
++ */
++ if (!BRW_IS_G4X(p->brw)) {
++ brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_LE, c->reg.dp0, brw_imm_f(0.0));
++ is_neg2 = brw_IF(p, BRW_EXECUTE_1);
++ {
++ brw_clip_kill_thread(c);
++ }
++ brw_ENDIF(p, is_neg2);
++ }
++
++ brw_ADD(p, c->reg.t, c->reg.dp1, negate(c->reg.dp0));
++ brw_math_invert(p, c->reg.t, c->reg.t);
++ brw_MUL(p, c->reg.t, c->reg.t, c->reg.dp1);
++
++ brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_G, c->reg.t, c->reg.t1 );
++ brw_MOV(p, c->reg.t1, c->reg.t);
++ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+ }
+ is_negative = brw_ELSE(p, is_negative);
+ {
+- /* Coming back in. We know that both cannot be negative
+- * because the line would have been culled in that case.
+- */
+-
+- /* If both are positive, do nothing */
+- brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_L, c->reg.dp0, brw_imm_f(0.0));
+- is_neg2 = brw_IF(p, BRW_EXECUTE_1);
++ /* Coming back in. We know that both cannot be negative
++ * because the line would have been culled in that case.
++ */
++
++ /* If both are positive, do nothing */
++ /* Only on GM965/G965 */
++ if (!BRW_IS_G4X(p->brw)) {
++ brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_L, c->reg.dp0, brw_imm_f(0.0));
++ is_neg2 = brw_IF(p, BRW_EXECUTE_1);
++ }
++
+ {
+- brw_ADD(p, c->reg.t, c->reg.dp0, negate(c->reg.dp1));
+- brw_math_invert(p, c->reg.t, c->reg.t);
+- brw_MUL(p, c->reg.t, c->reg.t, c->reg.dp0);
+-
+- brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_G, c->reg.t, c->reg.t0 );
+- brw_MOV(p, c->reg.t0, c->reg.t);
+- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+- }
+- brw_ENDIF(p, is_neg2);
+- }
++ brw_ADD(p, c->reg.t, c->reg.dp0, negate(c->reg.dp1));
++ brw_math_invert(p, c->reg.t, c->reg.t);
++ brw_MUL(p, c->reg.t, c->reg.t, c->reg.dp0);
++
++ brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_G, c->reg.t, c->reg.t0 );
++ brw_MOV(p, c->reg.t0, c->reg.t);
++ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
++ }
++
++ if (!BRW_IS_G4X(p->brw)) {
++ brw_ENDIF(p, is_neg2);
++ }
++ }
+ brw_ENDIF(p, is_negative);
+ }
+ brw_ENDIF(p, plane_active);
+Index: mesa-7.3/src/mesa/drivers/dri/i965/brw_clip_tri.c
+===================================================================
+--- mesa-7.3.orig/src/mesa/drivers/dri/i965/brw_clip_tri.c 2009-03-02 13:29:41.000000000 +0100
++++ mesa-7.3/src/mesa/drivers/dri/i965/brw_clip_tri.c 2009-03-02 13:30:22.000000000 +0100
+@@ -455,6 +455,8 @@
+ struct brw_indirect vt2 = brw_indirect(2, 0);
+
+ struct brw_compile *p = &c->func;
++ struct brw_instruction *is_outside;
++ struct brw_reg tmp0 = c->reg.loopcount; /* handy temporary */
+
+ brw_MOV(p, get_addr_reg(vt0), brw_address(c->reg.vertex[0]));
+ brw_MOV(p, get_addr_reg(vt1), brw_address(c->reg.vertex[1]));
+@@ -462,53 +464,87 @@
+ brw_MOV(p, v0, deref_4f(vt0, c->offset[VERT_RESULT_HPOS]));
+ brw_MOV(p, v1, deref_4f(vt1, c->offset[VERT_RESULT_HPOS]));
+ brw_MOV(p, v2, deref_4f(vt2, c->offset[VERT_RESULT_HPOS]));
++ brw_AND(p, c->reg.planemask, c->reg.planemask, brw_imm_ud(~0x3f));
+
+ /* test nearz, xmin, ymin plane */
+- brw_CMP(p, t1, BRW_CONDITIONAL_LE, negate(v0), get_element(v0, 3));
++ /* clip.xyz < -clip.w */
++ brw_CMP(p, t1, BRW_CONDITIONAL_L, v0, negate(get_element(v0, 3)));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+- brw_CMP(p, t2, BRW_CONDITIONAL_LE, negate(v1), get_element(v1, 3));
++ brw_CMP(p, t2, BRW_CONDITIONAL_L, v1, negate(get_element(v1, 3)));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+- brw_CMP(p, t3, BRW_CONDITIONAL_LE, negate(v2), get_element(v2, 3));
++ brw_CMP(p, t3, BRW_CONDITIONAL_L, v2, negate(get_element(v2, 3)));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
++
++ /* All vertices are outside of a plane, rejected */
++ brw_AND(p, t, t1, t2);
++ brw_AND(p, t, t, t3);
++ brw_OR(p, tmp0, get_element(t, 0), get_element(t, 1));
++ brw_OR(p, tmp0, tmp0, get_element(t, 2));
++ brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
++ brw_AND(p, brw_null_reg(), tmp0, brw_imm_ud(0x1));
++ is_outside = brw_IF(p, BRW_EXECUTE_1);
++ {
++ brw_clip_kill_thread(c);
++ }
++ brw_ENDIF(p, is_outside);
++ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
++
++ /* some vertices are inside a plane, some are outside,need to clip */
+ brw_XOR(p, t, t1, t2);
+ brw_XOR(p, t1, t2, t3);
+ brw_OR(p, t, t, t1);
+-
+- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
+- get_element(t, 0), brw_imm_ud(0));
++ brw_AND(p, t, t, brw_imm_ud(0x1));
++ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
++ get_element(t, 0), brw_imm_ud(0));
+ brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<5)));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
+- get_element(t, 1), brw_imm_ud(0));
++ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
++ get_element(t, 1), brw_imm_ud(0));
+ brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<3)));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
+- get_element(t, 2), brw_imm_ud(0));
++ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
++ get_element(t, 2), brw_imm_ud(0));
+ brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<1)));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+
+ /* test farz, xmax, ymax plane */
+- brw_CMP(p, t1, BRW_CONDITIONAL_L, v0, get_element(v0, 3));
++ /* clip.xyz > clip.w */
++ brw_CMP(p, t1, BRW_CONDITIONAL_G, v0, get_element(v0, 3));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+- brw_CMP(p, t2, BRW_CONDITIONAL_L, v1, get_element(v1, 3));
++ brw_CMP(p, t2, BRW_CONDITIONAL_G, v1, get_element(v1, 3));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+- brw_CMP(p, t3, BRW_CONDITIONAL_L, v2, get_element(v2, 3));
++ brw_CMP(p, t3, BRW_CONDITIONAL_G, v2, get_element(v2, 3));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+
++ /* All vertices are outside of a plane, rejected */
++ brw_AND(p, t, t1, t2);
++ brw_AND(p, t, t, t3);
++ brw_OR(p, tmp0, get_element(t, 0), get_element(t, 1));
++ brw_OR(p, tmp0, tmp0, get_element(t, 2));
++ brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
++ brw_AND(p, brw_null_reg(), tmp0, brw_imm_ud(0x1));
++ is_outside = brw_IF(p, BRW_EXECUTE_1);
++ {
++ brw_clip_kill_thread(c);
++ }
++ brw_ENDIF(p, is_outside);
++ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
++
++ /* some vertices are inside a plane, some are outside,need to clip */
+ brw_XOR(p, t, t1, t2);
+ brw_XOR(p, t1, t2, t3);
+ brw_OR(p, t, t, t1);
+-
+- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
+- get_element(t, 0), brw_imm_ud(0));
++ brw_AND(p, t, t, brw_imm_ud(0x1));
++ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
++ get_element(t, 0), brw_imm_ud(0));
+ brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<4)));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
+- get_element(t, 1), brw_imm_ud(0));
++ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
++ get_element(t, 1), brw_imm_ud(0));
+ brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<2)));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
+- get_element(t, 2), brw_imm_ud(0));
++ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
++ get_element(t, 2), brw_imm_ud(0));
+ brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<0)));
+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+
diff --git a/debian/patches/series b/debian/patches/series
index 40f7d3a..74e7488 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -3,4 +3,5 @@
04_osmesa_version.diff
101_ubuntu_hidden_glname.patch
102_dont_vblank.diff
+110_fix_intel_965_atunnel_rendering_glitch.diff
103_rs600_support.patch
Reply to: