glsl: Make the swizzle-swizzle optimization greedy
If there is a long sequence of swizzled swizzles, compact all of them down to a single swizzle. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: <thomashelland90@gmail.com>
This commit is contained in:
@@ -23,8 +23,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* \file opt_swizzle_swizzle.cpp
|
* \file opt_swizzle_swizzle.cpp
|
||||||
*
|
* Compact a sequence of swizzled swizzles into a single swizzle.
|
||||||
* Eliminates the second swizzle in a swizzle chain.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ir.h"
|
#include "ir.h"
|
||||||
@@ -51,34 +50,34 @@ public:
|
|||||||
ir_visitor_status
|
ir_visitor_status
|
||||||
ir_swizzle_swizzle_visitor::visit_enter(ir_swizzle *ir)
|
ir_swizzle_swizzle_visitor::visit_enter(ir_swizzle *ir)
|
||||||
{
|
{
|
||||||
int mask2[4];
|
ir_swizzle *swiz2;
|
||||||
|
|
||||||
ir_swizzle *swiz2 = ir->val->as_swizzle();
|
while ((swiz2 = ir->val->as_swizzle()) != NULL) {
|
||||||
if (!swiz2)
|
int mask2[4];
|
||||||
return visit_continue;
|
|
||||||
|
|
||||||
memset(&mask2, 0, sizeof(mask2));
|
memset(&mask2, 0, sizeof(mask2));
|
||||||
if (swiz2->mask.num_components >= 1)
|
if (swiz2->mask.num_components >= 1)
|
||||||
mask2[0] = swiz2->mask.x;
|
mask2[0] = swiz2->mask.x;
|
||||||
if (swiz2->mask.num_components >= 2)
|
if (swiz2->mask.num_components >= 2)
|
||||||
mask2[1] = swiz2->mask.y;
|
mask2[1] = swiz2->mask.y;
|
||||||
if (swiz2->mask.num_components >= 3)
|
if (swiz2->mask.num_components >= 3)
|
||||||
mask2[2] = swiz2->mask.z;
|
mask2[2] = swiz2->mask.z;
|
||||||
if (swiz2->mask.num_components >= 4)
|
if (swiz2->mask.num_components >= 4)
|
||||||
mask2[3] = swiz2->mask.w;
|
mask2[3] = swiz2->mask.w;
|
||||||
|
|
||||||
if (ir->mask.num_components >= 1)
|
if (ir->mask.num_components >= 1)
|
||||||
ir->mask.x = mask2[ir->mask.x];
|
ir->mask.x = mask2[ir->mask.x];
|
||||||
if (ir->mask.num_components >= 2)
|
if (ir->mask.num_components >= 2)
|
||||||
ir->mask.y = mask2[ir->mask.y];
|
ir->mask.y = mask2[ir->mask.y];
|
||||||
if (ir->mask.num_components >= 3)
|
if (ir->mask.num_components >= 3)
|
||||||
ir->mask.z = mask2[ir->mask.z];
|
ir->mask.z = mask2[ir->mask.z];
|
||||||
if (ir->mask.num_components >= 4)
|
if (ir->mask.num_components >= 4)
|
||||||
ir->mask.w = mask2[ir->mask.w];
|
ir->mask.w = mask2[ir->mask.w];
|
||||||
|
|
||||||
ir->val = swiz2->val;
|
ir->val = swiz2->val;
|
||||||
|
|
||||||
this->progress = true;
|
this->progress = true;
|
||||||
|
}
|
||||||
|
|
||||||
return visit_continue;
|
return visit_continue;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user