|
1 | 1 | #include "slang-ir-vk-invert-y.h"
|
2 | 2 |
|
3 | 3 | #include "slang-ir-insts.h"
|
| 4 | +#include "slang-ir-util.h" |
4 | 5 | #include "slang-ir.h"
|
5 | 6 |
|
6 | 7 | namespace Slang
|
@@ -28,37 +29,45 @@ void invertYOfPositionOutput(IRModule* module)
|
28 | 29 | {
|
29 | 30 | // Find all loads and stores to it.
|
30 | 31 | IRBuilder builder(module);
|
31 |
| - traverseUses( |
32 |
| - globalInst, |
33 |
| - [&](IRUse* use) |
| 32 | + List<IRUse*> useWorkList; |
| 33 | + auto processUse = [&](IRUse* use) |
| 34 | + { |
| 35 | + if (auto store = as<IRStore>(use->getUser())) |
34 | 36 | {
|
35 |
| - if (auto store = as<IRStore>(use->getUser())) |
36 |
| - { |
37 |
| - if (store->getPtr() != globalInst) |
38 |
| - return; |
| 37 | + if (getRootAddr(store->getPtr()) != globalInst) |
| 38 | + return; |
39 | 39 |
|
40 |
| - builder.setInsertBefore(store); |
41 |
| - auto originalVal = store->getVal(); |
42 |
| - auto invertedVal = _invertYOfVector(builder, originalVal); |
43 |
| - builder.replaceOperand(&store->val, invertedVal); |
44 |
| - } |
45 |
| - else if (auto load = as<IRLoad>(use->getUser())) |
46 |
| - { |
47 |
| - // Since we negate the y coordinate before writing |
48 |
| - // to gl_Position, we also need to negate the value after reading from it. |
49 |
| - builder.setInsertAfter(load); |
50 |
| - // Store existing uses of the load that we are going to replace with |
51 |
| - // inverted val later. |
52 |
| - List<IRUse*> oldUses; |
53 |
| - for (auto loadUse = load->firstUse; loadUse; loadUse = loadUse->nextUse) |
54 |
| - oldUses.add(loadUse); |
55 |
| - // Get the inverted vector. |
56 |
| - auto invertedVal = _invertYOfVector(builder, load); |
57 |
| - // Replace original uses with the invertex vector. |
58 |
| - for (auto loadUse : oldUses) |
59 |
| - builder.replaceOperand(loadUse, invertedVal); |
60 |
| - } |
61 |
| - }); |
| 40 | + builder.setInsertBefore(store); |
| 41 | + auto originalVal = store->getVal(); |
| 42 | + auto invertedVal = _invertYOfVector(builder, originalVal); |
| 43 | + builder.replaceOperand(&store->val, invertedVal); |
| 44 | + } |
| 45 | + else if (auto load = as<IRLoad>(use->getUser())) |
| 46 | + { |
| 47 | + // Since we negate the y coordinate before writing |
| 48 | + // to gl_Position, we also need to negate the value after reading from it. |
| 49 | + builder.setInsertAfter(load); |
| 50 | + // Store existing uses of the load that we are going to replace with |
| 51 | + // inverted val later. |
| 52 | + List<IRUse*> oldUses; |
| 53 | + for (auto loadUse = load->firstUse; loadUse; loadUse = loadUse->nextUse) |
| 54 | + oldUses.add(loadUse); |
| 55 | + // Get the inverted vector. |
| 56 | + auto invertedVal = _invertYOfVector(builder, load); |
| 57 | + // Replace original uses with the invertex vector. |
| 58 | + for (auto loadUse : oldUses) |
| 59 | + builder.replaceOperand(loadUse, invertedVal); |
| 60 | + } |
| 61 | + else if (auto getElementPtr = as<IRGetElementPtr>(use->getUser())) |
| 62 | + { |
| 63 | + traverseUses(getElementPtr, [&](IRUse* use) { useWorkList.add(use); }); |
| 64 | + } |
| 65 | + }; |
| 66 | + traverseUses(globalInst, processUse); |
| 67 | + for (Index i = 0; i < useWorkList.getCount(); i++) |
| 68 | + { |
| 69 | + processUse(useWorkList[i]); |
| 70 | + } |
62 | 71 | }
|
63 | 72 | }
|
64 | 73 | }
|
|
0 commit comments