149a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt/*
249a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * Copyright © 2010 Intel Corporation
349a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt *
449a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
549a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * copy of this software and associated documentation files (the "Software"),
649a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * to deal in the Software without restriction, including without limitation
749a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense,
849a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * and/or sell copies of the Software, and to permit persons to whom the
949a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * Software is furnished to do so, subject to the following conditions:
1049a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt *
1149a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * The above copyright notice and this permission notice (including the next
1249a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * paragraph) shall be included in all copies or substantial portions of the
1349a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * Software.
1449a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt *
1549a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1649a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1749a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1849a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1949a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2049a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2149a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * DEALINGS IN THE SOFTWARE.
2249a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt */
2349a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
2449a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt/**
25df883eb1575a740bf91e01cbe2eaa4dbc1f9f154Chad Versace * \file opt_swizzle_swizzle.cpp
2649a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt *
2749a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * Eliminates the second swizzle in a swizzle chain.
2849a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt */
2949a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
3049a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt#include "ir.h"
3149a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt#include "ir_visitor.h"
3249a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt#include "ir_optimization.h"
3349a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt#include "glsl_types.h"
3449a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
35337d9c955b070224f7278524af54ddacd8bb0f17Eric Anholtnamespace {
36337d9c955b070224f7278524af54ddacd8bb0f17Eric Anholt
3749a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholtclass ir_swizzle_swizzle_visitor : public ir_hierarchical_visitor {
3849a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholtpublic:
3949a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   ir_swizzle_swizzle_visitor()
4049a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   {
4149a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt      progress = false;
4249a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   }
4349a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
4449a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   virtual ir_visitor_status visit_enter(ir_swizzle *);
4549a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
4649a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   bool progress;
4749a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt};
4849a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
49337d9c955b070224f7278524af54ddacd8bb0f17Eric Anholt} /* unnamed namespace */
50337d9c955b070224f7278524af54ddacd8bb0f17Eric Anholt
5149a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholtir_visitor_status
5249a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholtir_swizzle_swizzle_visitor::visit_enter(ir_swizzle *ir)
5349a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt{
5449a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   int mask2[4];
5549a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
5649a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   ir_swizzle *swiz2 = ir->val->as_swizzle();
5749a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   if (!swiz2)
5849a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt      return visit_continue;
5949a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
6049a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   memset(&mask2, 0, sizeof(mask2));
6149a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   if (swiz2->mask.num_components >= 1)
6249a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt      mask2[0] = swiz2->mask.x;
6349a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   if (swiz2->mask.num_components >= 2)
6449a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt      mask2[1] = swiz2->mask.y;
6549a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   if (swiz2->mask.num_components >= 3)
6649a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt      mask2[2] = swiz2->mask.z;
6749a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   if (swiz2->mask.num_components >= 4)
6849a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt      mask2[3] = swiz2->mask.w;
6949a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
7049a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   if (ir->mask.num_components >= 1)
7149a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt      ir->mask.x = mask2[ir->mask.x];
7249a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   if (ir->mask.num_components >= 2)
7349a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt      ir->mask.y = mask2[ir->mask.y];
7449a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   if (ir->mask.num_components >= 3)
7549a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt      ir->mask.z = mask2[ir->mask.z];
7649a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   if (ir->mask.num_components >= 4)
7749a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt      ir->mask.w = mask2[ir->mask.w];
7849a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
7949a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   ir->val = swiz2->val;
8049a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
8149a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   this->progress = true;
8249a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
8349a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   return visit_continue;
8449a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt}
8549a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
8649a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt/**
8749a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt * Does a copy propagation pass on the code present in the instruction stream.
8849a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt */
8949a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholtbool
9049a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholtdo_swizzle_swizzle(exec_list *instructions)
9149a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt{
9249a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   ir_swizzle_swizzle_visitor v;
9349a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
9449a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   v.run(instructions);
9549a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt
9649a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt   return v.progress;
9749a5d5c4f5bf6e8d6ba344e8496d1d1fa0b4586dEric Anholt}
98