Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ir_swizzle_swizzle.cpp 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Copyright © 2010 Intel Corporation
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the next
  12. * paragraph) shall be included in all copies or substantial portions of the
  13. * Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21. * DEALINGS IN THE SOFTWARE.
  22. */
  23. /**
  24. * \file ir_swizzle_swizzle.cpp
  25. *
  26. * Eliminates the second swizzle in a swizzle chain.
  27. */
  28. #include "ir.h"
  29. #include "ir_visitor.h"
  30. #include "ir_optimization.h"
  31. #include "glsl_types.h"
  32. class ir_swizzle_swizzle_visitor : public ir_hierarchical_visitor {
  33. public:
  34. ir_swizzle_swizzle_visitor()
  35. {
  36. progress = false;
  37. }
  38. virtual ir_visitor_status visit_enter(ir_swizzle *);
  39. bool progress;
  40. };
  41. ir_visitor_status
  42. ir_swizzle_swizzle_visitor::visit_enter(ir_swizzle *ir)
  43. {
  44. int mask2[4];
  45. ir_swizzle *swiz2 = ir->val->as_swizzle();
  46. if (!swiz2)
  47. return visit_continue;
  48. memset(&mask2, 0, sizeof(mask2));
  49. if (swiz2->mask.num_components >= 1)
  50. mask2[0] = swiz2->mask.x;
  51. if (swiz2->mask.num_components >= 2)
  52. mask2[1] = swiz2->mask.y;
  53. if (swiz2->mask.num_components >= 3)
  54. mask2[2] = swiz2->mask.z;
  55. if (swiz2->mask.num_components >= 4)
  56. mask2[3] = swiz2->mask.w;
  57. if (ir->mask.num_components >= 1)
  58. ir->mask.x = mask2[ir->mask.x];
  59. if (ir->mask.num_components >= 2)
  60. ir->mask.y = mask2[ir->mask.y];
  61. if (ir->mask.num_components >= 3)
  62. ir->mask.z = mask2[ir->mask.z];
  63. if (ir->mask.num_components >= 4)
  64. ir->mask.w = mask2[ir->mask.w];
  65. ir->val = swiz2->val;
  66. this->progress = true;
  67. return visit_continue;
  68. }
  69. /**
  70. * Does a copy propagation pass on the code present in the instruction stream.
  71. */
  72. bool
  73. do_swizzle_swizzle(exec_list *instructions)
  74. {
  75. ir_swizzle_swizzle_visitor v;
  76. v.run(instructions);
  77. return v.progress;
  78. }