From fecfb36e61c3bdb133b57713c2b6d27ff7924a9b Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 28 Aug 2019 10:26:48 -0400 Subject: Use getElementStride in toIndex. (#1039) Make toIndex and toField methods of Location. --- tools/render-test/cpu-memory-binding.cpp | 56 +++++++++++++------------------- tools/render-test/cpu-memory-binding.h | 19 ++++++++--- tools/render-test/render-test-main.cpp | 8 ++--- 3 files changed, 42 insertions(+), 41 deletions(-) (limited to 'tools') diff --git a/tools/render-test/cpu-memory-binding.cpp b/tools/render-test/cpu-memory-binding.cpp index 157716b60..0c54ac651 100644 --- a/tools/render-test/cpu-memory-binding.cpp +++ b/tools/render-test/cpu-memory-binding.cpp @@ -168,23 +168,18 @@ CPUMemoryBinding::Location CPUMemoryBinding::find(const char* name) { return Location(); } - - Location location; - location.m_cur = m_rootBuffer.m_data + varLayout->getOffset(); - location.m_typeLayout = varLayout->getTypeLayout(); - - return location; + return Location::make(varLayout->getTypeLayout(), m_rootBuffer.m_data + varLayout->getOffset()); } -CPUMemoryBinding::Location CPUMemoryBinding::toField(const Location& location, const char* name) +CPUMemoryBinding::Location CPUMemoryBinding::Location::toField(const char* name) const { - if (!location.isValid()) + if (!isValid()) { - return location; + return *this; } - auto typeLayout = location.m_typeLayout; - uint8_t* cur = location.m_cur; + auto typeLayout = m_typeLayout; + uint8_t* cur = m_cur; // Strip constantBuffer wrapping { @@ -208,10 +203,7 @@ CPUMemoryBinding::Location CPUMemoryBinding::toField(const Location& location, c auto field = typeLayout->getFieldByIndex(ff); if (strcmp(field->getName(), name) == 0) { - Location newLocation; - newLocation.m_cur = cur + field->getOffset(); - newLocation.m_typeLayout = field->getTypeLayout(); - return newLocation; + return make(field->getTypeLayout(), cur + field->getOffset()); } } } @@ -220,15 +212,15 @@ CPUMemoryBinding::Location CPUMemoryBinding::toField(const Location& location, c return Location(); } -CPUMemoryBinding::Location CPUMemoryBinding::toIndex(const Location& location, int index) +CPUMemoryBinding::Location CPUMemoryBinding::Location::toIndex(int index) const { - if (!location.isValid()) + if (!isValid()) { - return location; + return *this; } - auto typeLayout = location.m_typeLayout; - uint8_t* cur = location.m_cur; + auto typeLayout = m_typeLayout; + uint8_t* cur = m_cur; const auto kind = typeLayout->getKind(); switch (kind) @@ -236,7 +228,8 @@ CPUMemoryBinding::Location CPUMemoryBinding::toIndex(const Location& location, i case slang::TypeReflection::Kind::Array: { auto elementTypeLayout = typeLayout->getElementTypeLayout(); - auto elementCount = int(typeLayout->getElementCount()); + const auto elementCount = int(typeLayout->getElementCount()); + const auto elementStride = typeLayout->getElementStride(SLANG_PARAMETER_CATEGORY_UNIFORM); if (index < 0 || index >= elementCount) { @@ -244,10 +237,7 @@ CPUMemoryBinding::Location CPUMemoryBinding::toIndex(const Location& location, i return Location(); } - Location newLocation; - newLocation.m_typeLayout = elementTypeLayout; - newLocation.m_cur = cur + elementTypeLayout->getSize() * index; - return newLocation; + return Location::make(elementTypeLayout, cur + elementStride * index); } default: break; } @@ -263,8 +253,8 @@ SlangResult CPUMemoryBinding::setBufferContents(const Location& location, const return SLANG_FAIL; } - auto typeLayout = location.m_typeLayout; - uint8_t* cur = location.m_cur; + auto typeLayout = location.getTypeLayout(); + uint8_t* cur = location.getPtr(); const auto kind = typeLayout->getKind(); switch (kind) @@ -292,8 +282,8 @@ SlangResult CPUMemoryBinding::setNewBuffer(const Location& location, const void* return SLANG_FAIL; } - auto typeLayout = location.m_typeLayout; - uint8_t* cur = location.m_cur; + auto typeLayout = location.getTypeLayout(); + uint8_t* cur = location.getPtr(); const auto kind = typeLayout->getKind(); switch (kind) @@ -357,8 +347,8 @@ SlangResult CPUMemoryBinding::setObject(const Location& location, void* object) return SLANG_FAIL; } - auto typeLayout = location.m_typeLayout; - uint8_t* cur = location.m_cur; + auto typeLayout = location.getTypeLayout(); + uint8_t* cur = location.getPtr(); const auto kind = typeLayout->getKind(); switch (kind) @@ -441,9 +431,9 @@ SlangResult CPUMemoryBinding::setInplace(const Location& location, const void* d return SLANG_FAIL; } - size_t dstSize = location.m_typeLayout->getSize(); + size_t dstSize = location.getTypeLayout()->getSize(); sizeInBytes = (sizeInBytes > dstSize) ? dstSize : sizeInBytes; - memcpy(location.m_cur, data, sizeInBytes); + memcpy(location.getPtr(), data, sizeInBytes); return SLANG_OK; } diff --git a/tools/render-test/cpu-memory-binding.h b/tools/render-test/cpu-memory-binding.h index 4ca9091b8..9501c1d13 100644 --- a/tools/render-test/cpu-memory-binding.h +++ b/tools/render-test/cpu-memory-binding.h @@ -21,8 +21,23 @@ struct CPUMemoryBinding bool isValid() const { return m_cur != nullptr; } bool isInvalid() const { return m_cur == nullptr; } + Location toField(const char* name) const; + Location toIndex(int index) const; + + slang::TypeLayoutReflection* getTypeLayout() const { return m_typeLayout; } + uint8_t* getPtr() const { return m_cur; } + Location():m_cur(nullptr) {} + static Location make(slang::TypeLayoutReflection* typeLayout, uint8_t* ptr) + { + Location loc; + loc.m_typeLayout = typeLayout; + loc.m_cur = ptr; + return loc; + } + + protected: slang::TypeLayoutReflection* m_typeLayout; uint8_t* m_cur; }; @@ -31,14 +46,10 @@ struct CPUMemoryBinding Location find(const char* name); - Location toField(const Location& location, const char* name); - Location toIndex(const Location& location, int index); - SlangResult setBufferContents(const Location& location, const void* initialData, size_t sizeInBytes); SlangResult setNewBuffer(const Location& location, const void* initialData, size_t sizeInBytes, Buffer& outBuffer); SlangResult setObject(const Location& location, void* object); SlangResult setInplace(const Location& location, const void* data, size_t sizeInBytes); - SlangResult init(slang::ShaderReflection* reflection); CPUMemoryBinding(); diff --git a/tools/render-test/render-test-main.cpp b/tools/render-test/render-test-main.cpp index a1768cdb2..ef3613240 100644 --- a/tools/render-test/render-test-main.cpp +++ b/tools/render-test/render-test-main.cpp @@ -496,7 +496,7 @@ static SlangResult _doCPUCompute(SlangSession* session, const String& sourcePath int index = parser.ReadInt(); SLANG_ASSERT(index >= 0); - location = binding.toIndex(location, index); + location = location.toIndex(index); if (location.isInvalid()) { outStream.print("Unable to find entry in '%d' in '%s'\n", index, entry.name.getBuffer()); @@ -509,7 +509,7 @@ static SlangResult _doCPUCompute(SlangSession* session, const String& sourcePath parser.ReadToken(); Token identifierToken = parser.ReadMatchingToken(TokenType::Identifier); - location = binding.toField(location, identifierToken.Content.getBuffer()); + location = location.toField(identifierToken.Content.getBuffer()); if (location.isInvalid()) { outStream.print("Unable to find field '%s' in '%s'\n", identifierToken.Content.getBuffer(), entry.name.getBuffer()); @@ -529,7 +529,7 @@ static SlangResult _doCPUCompute(SlangSession* session, const String& sourcePath auto& srcEntry = layout.entries[entryIndex]; - auto typeLayout = location.m_typeLayout; + auto typeLayout = location.getTypeLayout(); const auto kind = typeLayout->getKind(); switch (kind) { @@ -593,7 +593,7 @@ static SlangResult _doCPUCompute(SlangSession* session, const String& sourcePath break; case SLANG_TEXTURE_2D: { - slang::TypeReflection* typeReflection = location.m_typeLayout->getResourceResultType(); + slang::TypeReflection* typeReflection = location.getTypeLayout()->getResourceResultType(); int count = 1; if (typeReflection->getKind() == slang::TypeReflection::Kind::Vector) -- cgit v1.2.3