Index: media-libs/mesa/files/7.9-glsl-vector-compare.patch |
diff --git a/media-libs/mesa/files/7.9-glsl-vector-compare.patch b/media-libs/mesa/files/7.9-glsl-vector-compare.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9b30e45c5ecdb361dbcf887d3d7baf8b3656c60f |
--- /dev/null |
+++ b/media-libs/mesa/files/7.9-glsl-vector-compare.patch |
@@ -0,0 +1,150 @@ |
+From e16c9d5d03a4606b37cbeb84358925913086d6eb Mon Sep 17 00:00:00 2001 |
+From: Kenneth Graunke <kenneth@whitecape.org> |
+Date: Wed, 17 Nov 2010 18:40:28 +0000 |
+Subject: glsl: Fix constant expression handling for <, >, <=, >= on vectors. |
+ |
+ir_binop_less, ir_binop_greater, ir_binop_lequal, and ir_binop_gequal |
+are defined to work on vectors as well as scalars, as long as the two |
+operands have the same type. |
+ |
+This is evident from both ir_validate.cpp and our use of these opcodes |
+in the GLSL lessThan, greaterThan, lessThanEqual, greaterThanEqual |
+built-in functions. |
+ |
+Found by code inspection. Not known to fix any bugs. Presumably, our |
+tests for the built-in comparison functions must pass because C.E. |
+handling is done on the ir_call of "greaterThan" rather than the inlined |
+opcode. The C.E. handling of the built-in function calls is correct. |
+ |
+NOTE: This is a candidate for the 7.9 branch. |
+--- |
+diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp |
+index a6713e5..7402468 100644 |
+--- a/src/glsl/ir_constant_expression.cpp |
++++ b/src/glsl/ir_constant_expression.cpp |
+@@ -581,63 +581,75 @@ ir_expression::constant_expression_value() |
+ break; |
+ |
+ case ir_binop_less: |
+- switch (op[0]->type->base_type) { |
+- case GLSL_TYPE_UINT: |
+- data.b[0] = op[0]->value.u[0] < op[1]->value.u[0]; |
+- break; |
+- case GLSL_TYPE_INT: |
+- data.b[0] = op[0]->value.i[0] < op[1]->value.i[0]; |
+- break; |
+- case GLSL_TYPE_FLOAT: |
+- data.b[0] = op[0]->value.f[0] < op[1]->value.f[0]; |
+- break; |
+- default: |
+- assert(0); |
++ assert(op[0]->type == op[1]->type); |
++ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
++ switch (op[0]->type->base_type) { |
++ case GLSL_TYPE_UINT: |
++ data.b[0] = op[0]->value.u[0] < op[1]->value.u[0]; |
++ break; |
++ case GLSL_TYPE_INT: |
++ data.b[0] = op[0]->value.i[0] < op[1]->value.i[0]; |
++ break; |
++ case GLSL_TYPE_FLOAT: |
++ data.b[0] = op[0]->value.f[0] < op[1]->value.f[0]; |
++ break; |
++ default: |
++ assert(0); |
++ } |
+ } |
+ break; |
+ case ir_binop_greater: |
+- switch (op[0]->type->base_type) { |
+- case GLSL_TYPE_UINT: |
+- data.b[0] = op[0]->value.u[0] > op[1]->value.u[0]; |
+- break; |
+- case GLSL_TYPE_INT: |
+- data.b[0] = op[0]->value.i[0] > op[1]->value.i[0]; |
+- break; |
+- case GLSL_TYPE_FLOAT: |
+- data.b[0] = op[0]->value.f[0] > op[1]->value.f[0]; |
+- break; |
+- default: |
+- assert(0); |
++ assert(op[0]->type == op[1]->type); |
++ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
++ switch (op[0]->type->base_type) { |
++ case GLSL_TYPE_UINT: |
++ data.b[c] = op[0]->value.u[c] > op[1]->value.u[c]; |
++ break; |
++ case GLSL_TYPE_INT: |
++ data.b[c] = op[0]->value.i[c] > op[1]->value.i[c]; |
++ break; |
++ case GLSL_TYPE_FLOAT: |
++ data.b[c] = op[0]->value.f[c] > op[1]->value.f[c]; |
++ break; |
++ default: |
++ assert(0); |
++ } |
+ } |
+ break; |
+ case ir_binop_lequal: |
+- switch (op[0]->type->base_type) { |
+- case GLSL_TYPE_UINT: |
+- data.b[0] = op[0]->value.u[0] <= op[1]->value.u[0]; |
+- break; |
+- case GLSL_TYPE_INT: |
+- data.b[0] = op[0]->value.i[0] <= op[1]->value.i[0]; |
+- break; |
+- case GLSL_TYPE_FLOAT: |
+- data.b[0] = op[0]->value.f[0] <= op[1]->value.f[0]; |
+- break; |
+- default: |
+- assert(0); |
++ assert(op[0]->type == op[1]->type); |
++ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
++ switch (op[0]->type->base_type) { |
++ case GLSL_TYPE_UINT: |
++ data.b[0] = op[0]->value.u[0] <= op[1]->value.u[0]; |
++ break; |
++ case GLSL_TYPE_INT: |
++ data.b[0] = op[0]->value.i[0] <= op[1]->value.i[0]; |
++ break; |
++ case GLSL_TYPE_FLOAT: |
++ data.b[0] = op[0]->value.f[0] <= op[1]->value.f[0]; |
++ break; |
++ default: |
++ assert(0); |
++ } |
+ } |
+ break; |
+ case ir_binop_gequal: |
+- switch (op[0]->type->base_type) { |
+- case GLSL_TYPE_UINT: |
+- data.b[0] = op[0]->value.u[0] >= op[1]->value.u[0]; |
+- break; |
+- case GLSL_TYPE_INT: |
+- data.b[0] = op[0]->value.i[0] >= op[1]->value.i[0]; |
+- break; |
+- case GLSL_TYPE_FLOAT: |
+- data.b[0] = op[0]->value.f[0] >= op[1]->value.f[0]; |
+- break; |
+- default: |
+- assert(0); |
++ assert(op[0]->type == op[1]->type); |
++ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
++ switch (op[0]->type->base_type) { |
++ case GLSL_TYPE_UINT: |
++ data.b[0] = op[0]->value.u[0] >= op[1]->value.u[0]; |
++ break; |
++ case GLSL_TYPE_INT: |
++ data.b[0] = op[0]->value.i[0] >= op[1]->value.i[0]; |
++ break; |
++ case GLSL_TYPE_FLOAT: |
++ data.b[0] = op[0]->value.f[0] >= op[1]->value.f[0]; |
++ break; |
++ default: |
++ assert(0); |
++ } |
+ } |
+ break; |
+ case ir_binop_equal: |
+-- |
+cgit v0.8.3-6-g21f6 |