diff options
| author | Sai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com> | 2024-11-08 13:03:42 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-08 13:03:42 -0500 |
| commit | f66b046e2767cd7a38acec8c0f988e5937f062e7 (patch) | |
| tree | 178b745cea2479675a368cb67526833aad554630 /source | |
| parent | 0f46ce82998b2b1cb68f04bef3a097ea850ad453 (diff) | |
[WGSL] [WASM] Add reflection endpoints + Fix bit manipulation operations (#5499)
* Add key reflection endpoints for WASM
* Fix WGSL output around bit-manipulation operators
* format code
* Fix pointer ownership
* fix formatting
---------
Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang-wasm/slang-wasm-bindings.cpp | 33 | ||||
| -rw-r--r-- | source/slang-wasm/slang-wasm.cpp | 43 | ||||
| -rw-r--r-- | source/slang-wasm/slang-wasm.h | 36 | ||||
| -rw-r--r-- | source/slang/slang-emit-c-like.cpp | 7 | ||||
| -rw-r--r-- | source/slang/slang-emit-wgsl.cpp | 66 |
5 files changed, 170 insertions, 15 deletions
diff --git a/source/slang-wasm/slang-wasm-bindings.cpp b/source/slang-wasm/slang-wasm-bindings.cpp index 326ef9ff2..e980cd608 100644 --- a/source/slang-wasm/slang-wasm-bindings.cpp +++ b/source/slang-wasm/slang-wasm-bindings.cpp @@ -43,11 +43,44 @@ EMSCRIPTEN_BINDINGS(slang) .function("getEntryPointCodeBlob", &slang::wgsl::ComponentType::getEntryPointCodeBlob) .function("getTargetCodeBlob", &slang::wgsl::ComponentType::getTargetCodeBlob) .function("getTargetCode", &slang::wgsl::ComponentType::getTargetCode) + .function("getLayout", &slang::wgsl::ComponentType::getLayout, allow_raw_pointers()) .function( "loadStrings", &slang::wgsl::ComponentType::loadStrings, return_value_policy::take_ownership()); + class_<slang::wgsl::TypeLayoutReflection>("TypeLayoutReflection") + .function( + "getDescriptorSetDescriptorRangeType", + &slang::wgsl::TypeLayoutReflection::getDescriptorSetDescriptorRangeType); + + class_<slang::wgsl::VariableLayoutReflection>("VariableLayoutReflection") + .function("getName", &slang::wgsl::VariableLayoutReflection::getName) + .function( + "getTypeLayout", + &slang::wgsl::VariableLayoutReflection::getTypeLayout, + allow_raw_pointers()) + .function("getBindingIndex", &slang::wgsl::VariableLayoutReflection::getBindingIndex); + + class_<slang::wgsl::ProgramLayout>("ProgramLayout") + .function("getParameterCount", &slang::wgsl::ProgramLayout::getParameterCount) + .function( + "getParameterByIndex", + &slang::wgsl::ProgramLayout::getParameterByIndex, + allow_raw_pointers()) + .function( + "getGlobalParamsTypeLayout", + &slang::wgsl::ProgramLayout::getGlobalParamsTypeLayout, + allow_raw_pointers()); + + enum_<slang::BindingType>("BindingType") + .value("Unknown", slang::BindingType::Unknown) + .value("Texture", slang::BindingType::Texture) + .value("ConstantBuffer", slang::BindingType::ConstantBuffer) + .value("MutableRawBuffer", slang::BindingType::MutableRawBuffer) + .value("MutableTypedBuffer", slang::BindingType::MutableTypedBuffer) + .value("MutableTexture", slang::BindingType::MutableTexture); + class_<slang::wgsl::Module, base<slang::wgsl::ComponentType>>("Module") .function( "findEntryPointByName", diff --git a/source/slang-wasm/slang-wasm.cpp b/source/slang-wasm/slang-wasm.cpp index be30f8394..f73e70ba0 100644 --- a/source/slang-wasm/slang-wasm.cpp +++ b/source/slang-wasm/slang-wasm.cpp @@ -386,6 +386,49 @@ HashedString* ComponentType::loadStrings() return hashedStrings; } +ProgramLayout* ComponentType::getLayout(unsigned int targetIndex) +{ + return (slang::wgsl::ProgramLayout*)interface()->getLayout(targetIndex); +} + +unsigned int ProgramLayout::getParameterCount() +{ + return interface()->getParameterCount(); +} + +VariableLayoutReflection* ProgramLayout::getParameterByIndex(unsigned int index) +{ + return (slang::wgsl::VariableLayoutReflection*)(interface()->getParameterByIndex(index)); +} + +TypeLayoutReflection* ProgramLayout::getGlobalParamsTypeLayout() +{ + return (slang::wgsl::TypeLayoutReflection*)(interface()->getGlobalParamsTypeLayout()); +} + +BindingType TypeLayoutReflection::getDescriptorSetDescriptorRangeType( + unsigned int setIndex, + unsigned int rangeIndex) +{ + return interface()->getDescriptorSetDescriptorRangeType(setIndex, rangeIndex); +} + +std::string VariableLayoutReflection::getName() +{ + return interface()->getName(); +} + +TypeLayoutReflection* VariableLayoutReflection::getTypeLayout() +{ + return (slang::wgsl::TypeLayoutReflection*)(interface()->getTypeLayout()); +} + +unsigned int VariableLayoutReflection::getBindingIndex() +{ + return interface()->getBindingIndex(); +} + + namespace lsp { Position translate(Slang::LanguageServerProtocol::Position p) diff --git a/source/slang-wasm/slang-wasm.h b/source/slang-wasm/slang-wasm.h index c82976659..9e1e023a9 100644 --- a/source/slang-wasm/slang-wasm.h +++ b/source/slang-wasm/slang-wasm.h @@ -50,6 +50,40 @@ private: CompileTargets* getCompileTargets(); + +class TypeLayoutReflection +{ +public: + BindingType getDescriptorSetDescriptorRangeType(unsigned int setIndex, unsigned int rangeIndex); + + slang::TypeLayoutReflection* interface() const { return (slang::TypeLayoutReflection*)this; } +}; + +class VariableLayoutReflection +{ +public: + std::string getName(); + slang::wgsl::TypeLayoutReflection* getTypeLayout(); + unsigned int getBindingIndex(); + + slang::VariableLayoutReflection* interface() const + { + return (slang::VariableLayoutReflection*)this; + } +}; + + +class ProgramLayout +{ +public: + unsigned int getParameterCount(); + slang::wgsl::VariableLayoutReflection* getParameterByIndex(unsigned int index); + + slang::wgsl::TypeLayoutReflection* getGlobalParamsTypeLayout(); + + slang::ProgramLayout* interface() const { return (slang::ProgramLayout*)this; } +}; + class ComponentType { public: @@ -65,6 +99,8 @@ public: std::string getTargetCode(int targetIndex); emscripten::val getTargetCodeBlob(int targetIndex); + slang::wgsl::ProgramLayout* getLayout(unsigned int targetIndex); + slang::IComponentType* interface() const { return m_interface; } HashedString* loadStrings(); diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index 020c31fdc..790162c5b 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -693,6 +693,13 @@ bool CLikeSourceEmitter::maybeEmitParens(EmitOpInfo& outerPrec, const EmitOpInfo { needParens = true; } + // a ^ b * c => (a ^ b) * c + else if ( + prec.rightPrecedence == EPrecedence::kEPrecedence_BitXor_Right && + outerPrec.rightPrecedence == EPrecedence::kEPrecedence_Multiplicative_Left) + { + needParens = true; + } if (needParens) { diff --git a/source/slang/slang-emit-wgsl.cpp b/source/slang/slang-emit-wgsl.cpp index ca51f7e15..5df94f561 100644 --- a/source/slang/slang-emit-wgsl.cpp +++ b/source/slang/slang-emit-wgsl.cpp @@ -1304,28 +1304,64 @@ bool WGSLSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOu // https://www.w3.org/TR/WGSL/#bit-expr IRInst* const shiftAmount = inst->getOperand(1); IRType* const shiftAmountType = shiftAmount->getDataType(); - if (shiftAmountType->getOp() == kIROp_IntType) - { - // Dawn complains about "mixing '<<' and '|' requires parenthesis", so let's - // add parenthesis. - m_writer->emit("("); - const auto emitOp = getEmitOpForOp(inst->getOp()); - const auto info = getInfo(emitOp); + // Dawn complains about mixing '<<' and '|', '^' and a bunch of other bit operators + // without a paranthesis, so we'll always emit paranthesis around the shift amount. + // - const bool needClose = maybeEmitParens(outerPrec, info); - emitOperand(inst->getOperand(0), leftSide(outerPrec, info)); - m_writer->emit(" "); - m_writer->emit(info.op); - m_writer->emit(" "); + m_writer->emit("("); + + const auto emitOp = getEmitOpForOp(inst->getOp()); + const auto info = getInfo(emitOp); + + const bool needClose = maybeEmitParens(outerPrec, info); + emitOperand(inst->getOperand(0), leftSide(outerPrec, info)); + m_writer->emit(" "); + m_writer->emit(info.op); + m_writer->emit(" "); + + if (shiftAmountType->getOp() == kIROp_IntType) + { m_writer->emit("bitcast<u32>("); emitOperand(inst->getOperand(1), rightSide(outerPrec, info)); m_writer->emit(")"); - maybeCloseParens(needClose); - + } + else + { + m_writer->emit("("); + emitOperand(inst->getOperand(1), rightSide(outerPrec, info)); m_writer->emit(")"); - return true; } + + maybeCloseParens(needClose); + + m_writer->emit(")"); + + return true; + } + case kIROp_BitXor: + case kIROp_BitOr: + { + // Emit bitwise operators with paranthesis to avoid precedence issues + const auto emitOp = getEmitOpForOp(inst->getOp()); + const auto info = getInfo(emitOp); + + m_writer->emit("("); + + const bool needClose = maybeEmitParens(outerPrec, info); + emitOperand(inst->getOperand(0), leftSide(outerPrec, info)); + m_writer->emit(" "); + + m_writer->emit(info.op); + + m_writer->emit(" ("); + emitOperand(inst->getOperand(1), rightSide(outerPrec, info)); + m_writer->emit(")"); + + maybeCloseParens(needClose); + + m_writer->emit(")"); + return true; } break; |
