summaryrefslogtreecommitdiffstats
path: root/tools/slang-unit-test/unit-test-ptr-layout.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-12-09 04:47:35 -0800
committerGitHub <noreply@github.com>2024-12-09 20:47:35 +0800
commit71e90a7ba78d0566e3b7da54df48f9af598e4cbb (patch)
treefe41a0a632de4948b584cfa30ff739a24c28cf67 /tools/slang-unit-test/unit-test-ptr-layout.cpp
parent525412c67ceea9f52a26e42044e99b349ebc2535 (diff)
Fix reflection for pointer element types. (#5797)
* Fix reflection for pointer element types. * Fix. --------- Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
Diffstat (limited to 'tools/slang-unit-test/unit-test-ptr-layout.cpp')
-rw-r--r--tools/slang-unit-test/unit-test-ptr-layout.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/tools/slang-unit-test/unit-test-ptr-layout.cpp b/tools/slang-unit-test/unit-test-ptr-layout.cpp
new file mode 100644
index 000000000..3eb8de10f
--- /dev/null
+++ b/tools/slang-unit-test/unit-test-ptr-layout.cpp
@@ -0,0 +1,54 @@
+// unit-test-ptr-layout.cpp
+
+#include "slang-com-ptr.h"
+#include "slang.h"
+#include "unit-test/slang-unit-test.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+using namespace Slang;
+
+SLANG_UNIT_TEST(pointerTypeLayout)
+{
+ const char* testSource = "struct TestStruct {"
+ " int3 member0;"
+ " float member1;"
+ "};";
+
+ ComPtr<slang::IGlobalSession> globalSession;
+ SLANG_CHECK(slang_createGlobalSession(SLANG_API_VERSION, globalSession.writeRef()) == SLANG_OK);
+ slang::TargetDesc targetDesc = {};
+ targetDesc.format = SLANG_SPIRV;
+ targetDesc.profile = globalSession->findProfile("spirv_1_5");
+ slang::SessionDesc sessionDesc = {};
+ sessionDesc.targetCount = 1;
+ sessionDesc.targets = &targetDesc;
+ sessionDesc.compilerOptionEntryCount = 1;
+ slang::CompilerOptionEntry compilerOptionEntry = {};
+ compilerOptionEntry.name = slang::CompilerOptionName::EmitSpirvViaGLSL;
+ compilerOptionEntry.value.kind = slang::CompilerOptionValueKind::Int;
+ compilerOptionEntry.value.intValue0 = 1;
+ sessionDesc.compilerOptionEntries = &compilerOptionEntry;
+
+ ComPtr<slang::ISession> session;
+ SLANG_CHECK(globalSession->createSession(sessionDesc, session.writeRef()) == SLANG_OK);
+
+ ComPtr<slang::IBlob> diagnosticBlob;
+ auto module =
+ session->loadModuleFromSourceString("m", "m.slang", testSource, diagnosticBlob.writeRef());
+ SLANG_CHECK(module != nullptr);
+
+
+ auto testBody = [&]()
+ {
+ auto reflection = module->getLayout();
+ auto testStruct = reflection->findTypeByName("Ptr<TestStruct>");
+ auto ptrLayout = reflection->getTypeLayout(testStruct);
+ auto valueLayout = ptrLayout->getElementTypeLayout();
+ SLANG_CHECK_ABORT(valueLayout->getFieldCount() == 2);
+ SLANG_CHECK_ABORT(valueLayout->getFieldByIndex(1)->getOffset() == 12);
+ };
+
+ testBody();
+}