diff options
| author | Yong He <yonghe@outlook.com> | 2023-09-26 23:56:06 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-27 14:56:06 +0800 |
| commit | ebe8ddefc48478307d5f206cd3e40c41d28a36e3 (patch) | |
| tree | 8e13977979909a26394eea532d8b95cd5ad0f6d1 /source/slang/slang-ir-lower-buffer-element-type.cpp | |
| parent | c5c8cfbb360d9a763f549df48636effde839eacd (diff) | |
Various SPIRV fixes. (#3231)
* Various SPIRV fixes.
- Geometry shader support (WIP).
- Fix texture get dimension and load.
- Fold global GetElement(MakeArray/MakeVector) insts.
- Call spvopt to inline all functions.
- Translate OpImageSubscript.
- Emit struct member names and global variable names.
- Fix lowering of OpBitNot -> OpNot, instead of OpBitReverse.
* Fix test.
* Fix geometry shader.
* Fix geometry shader emit.
* Add atomic Image access test.
* Fix tests.
* don't fail if spirv-opt fails.
* Update comments.
* Fix test.
* Cleanups.
* indentation
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir-lower-buffer-element-type.cpp')
| -rw-r--r-- | source/slang/slang-ir-lower-buffer-element-type.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/source/slang/slang-ir-lower-buffer-element-type.cpp b/source/slang/slang-ir-lower-buffer-element-type.cpp index 1c02af82a..a5227ed68 100644 --- a/source/slang/slang-ir-lower-buffer-element-type.cpp +++ b/source/slang/slang-ir-lower-buffer-element-type.cpp @@ -184,7 +184,7 @@ namespace Slang IRBuilder builder(structType); builder.setInsertAfter(structType); auto func = builder.createFunc(); - auto funcType = builder.getFuncType(1, (IRType**)&structType, arrayType); + auto funcType = builder.getFuncType(1, (IRType**)&arrayType, structType); func->setFullType(funcType); builder.addNameHintDecoration(func, UnownedStringSlice("packStorage")); builder.setInsertInto(func); @@ -638,6 +638,23 @@ namespace Slang break; case kIROp_StructuredBufferGetDimensions: break; + case kIROp_Call: + { + // If we are calling a function with an l-value pointer from buffer access, + // we need to materialize the object as a local variable, and pass the address + // of the local variable to the function. + builder.setInsertBefore(user); + auto newLoad = builder.emitLoad(loweredElementTypeInfo.loweredType, ptrVal); + auto unpackedVal = builder.emitCallInst((IRType*)originalElementType, loweredElementTypeInfo.convertLoweredToOriginal, 1, &newLoad); + auto var = builder.emitVar((IRType*)originalElementType); + builder.emitStore(var, unpackedVal); + use->set(var); + builder.setInsertAfter(user); + auto newVal = builder.emitLoad(var); + auto packedVal = builder.emitCallInst((IRType*)loweredElementTypeInfo.loweredType, loweredElementTypeInfo.convertOriginalToLowered, 1, &newVal); + builder.emitStore(ptrVal, packedVal); + } + break; default: SLANG_UNREACHABLE("unhandled inst of a buffer/pointer value that needs storage lowering."); break; |
