Skip to content

Commit

Permalink
Fix reflection for pointer element types.
Browse files Browse the repository at this point in the history
  • Loading branch information
csyonghe committed Dec 7, 2024
1 parent 0d5636c commit a3ec188
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 1 deletion.
11 changes: 10 additions & 1 deletion source/slang/slang-type-layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4763,7 +4763,16 @@ static TypeLayoutResult _createTypeLayout(TypeLayoutContext& context, Type* type

ptrLayout->addResourceUsage(info.kind, info.size);

const auto valueTypeLayout = _createTypeLayout(context, ptrType->getValueType());
TypeLayoutResult valueTypeLayout;
if (context.rules != &kScalarLayoutRulesImpl_)
{
valueTypeLayout =
_createTypeLayout(context.with(&kScalarLayoutRulesImpl_), ptrType->getValueType());
}
else
{
valueTypeLayout = _createTypeLayout(context, ptrType->getValueType());
}

ptrLayout->valueTypeLayout = valueTypeLayout.layout;

Expand Down
54 changes: 54 additions & 0 deletions tools/slang-unit-test/unit-test-ptr-layout.cpp
Original file line number Diff line number Diff line change
@@ -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();
}

0 comments on commit a3ec188

Please sign in to comment.