diff options
| author | Yong He <yonghe@outlook.com> | 2022-08-20 01:03:06 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-20 01:03:06 -0700 |
| commit | af70651a4843b16dd24e14b5cedffe399ebeb862 (patch) | |
| tree | a6aefd5db94a048114b9a8d7ed3f826533105fab /source/slang/slang-ir-dll-import.cpp | |
| parent | 6412c4913b6a063438bb11863f2c154d3ae42dfe (diff) | |
Call `gfx` in slang program. (#2370)
Diffstat (limited to 'source/slang/slang-ir-dll-import.cpp')
| -rw-r--r-- | source/slang/slang-ir-dll-import.cpp | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/source/slang/slang-ir-dll-import.cpp b/source/slang/slang-ir-dll-import.cpp index 01e1241ff..bfd384f70 100644 --- a/source/slang/slang-ir-dll-import.cpp +++ b/source/slang/slang-ir-dll-import.cpp @@ -4,6 +4,7 @@ #include "slang-ir.h" #include "slang-ir-insts.h" #include "slang-ir-marshal-native-call.h" +#include "slang-ir-layout.h" namespace Slang { @@ -12,6 +13,7 @@ struct DllImportContext { IRModule* module; DiagnosticSink* diagnosticSink; + TargetRequest* targetReq; SharedIRBuilder sharedBuilder; @@ -56,12 +58,13 @@ struct DllImportContext builder.setInsertInto(module->getModuleInst()); IRType* stringType = builder.getStringType(); - IRType* paramTypes[] = {builder.getPtrType(builder.getVoidType()), stringType}; + IRType* uintType = builder.getUIntType(); + IRType* paramTypes[] = {builder.getPtrType(builder.getVoidType()), stringType, uintType }; loadFuncPtrFunc = createBuiltinIntrinsicFunc( - 2, + 3, paramTypes, builder.getPtrType(builder.getVoidType()), - UnownedStringSlice("_slang_rt_load_dll_func($0, $1)")); + UnownedStringSlice("_slang_rt_load_dll_func($0, $1, $2)")); } return loadFuncPtrFunc; } @@ -84,6 +87,17 @@ struct DllImportContext return stringGetBufferFunc; } + uint32_t getStdCallArgumentSize(IRFunc* func) + { + uint32_t result = 0; + for (auto param : func->getParams()) + { + IRSizeAndAlignment sizeAndAlignment; + getNaturalSizeAndAlignment(targetReq, param->getDataType(), &sizeAndAlignment); + result += (uint32_t)align(sizeAndAlignment.size, 4); + } + return result; + } void processFunc(IRFunc* func, IRDllImportDecoration* dllImportDecoration) { @@ -136,10 +150,11 @@ struct DllImportContext getLoadDllFunc(), builder.getStringValue(dllImportDecoration->getLibraryName())); } + auto argumentSize = builder.getIntValue(builder.getUIntType(), getStdCallArgumentSize(func)); IRInst* loadDllFuncArgs[] = { - modulePtr, builder.getStringValue(dllImportDecoration->getFunctionName())}; + modulePtr, builder.getStringValue(dllImportDecoration->getFunctionName()), argumentSize}; auto loadedNativeFuncPtr = builder.emitCallInst( - builder.getPtrType(builder.getVoidType()), getLoadFuncPtrFunc(), 2, loadDllFuncArgs); + builder.getPtrType(builder.getVoidType()), getLoadFuncPtrFunc(), 3, loadDllFuncArgs); builder.emitStore( funcPtr, builder.emitBitCast(nativeType, loadedNativeFuncPtr)); builder.emitBranch(afterBlock); @@ -175,10 +190,11 @@ struct DllImportContext } }; -void generateDllImportFuncs(IRModule* module, DiagnosticSink* sink) +void generateDllImportFuncs(TargetRequest* targetReq, IRModule* module, DiagnosticSink* sink) { DllImportContext context; context.module = module; + context.targetReq = targetReq; context.diagnosticSink = sink; context.sharedBuilder.init(module); return context.processModule(); |
