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