#include "slang-ir-legalize-uniform-buffer-load.h" namespace Slang { void legalizeUniformBufferLoad(IRModule* module) { List workList; for (auto globalInst : module->getGlobalInsts()) { if (auto func = as(globalInst)) { for (auto block : func->getBlocks()) { for (auto inst : block->getChildren()) { if (auto load = as(inst)) { auto uniformBufferType = as(load->getPtr()->getDataType()); if (!uniformBufferType) continue; workList.add(load); } } } } } IRBuilder builder(module); for (auto load : workList) { auto uniformBufferType = as(load->getPtr()->getDataType()); SLANG_ASSERT(uniformBufferType); auto structType = as(uniformBufferType->getElementType()); if (!structType) continue; builder.setInsertBefore(load); List fieldLoads; for (auto field : structType->getFields()) { auto fieldAddr = builder.emitFieldAddress( builder.getPtrType(field->getFieldType()), load->getPtr(), field->getKey()); auto fieldLoad = builder.emitLoad(fieldAddr); fieldLoads.add(fieldLoad); } auto makeStruct = builder.emitMakeStruct(structType, fieldLoads); load->replaceUsesWith(makeStruct); } } } // namespace Slang