Skip to content

Commit 90c02c3

Browse files
areidmeyerswahtz
andauthored
Bugfix for GridHandle::read(). (#2237)
* Bugfix for GridHandle::read(). Signed-off-by: Andrew Reidmeyer <areidmeyer@nvidia.com> * Simplify. Signed-off-by: Andrew Reidmeyer <areidmeyer@nvidia.com> * Adding pendingchanges file. Signed-off-by: Andrew Reidmeyer <areidmeyer@nvidia.com> * Tweak wording. Signed-off-by: Andrew Reidmeyer <areidmeyer@nvidia.com> * Add a test Signed-off-by: Jonathan Swartz <jonathan@jswartz.info> * Requested change. Signed-off-by: Andrew Reidmeyer <areidmeyer@nvidia.com> --------- Signed-off-by: Andrew Reidmeyer <areidmeyer@nvidia.com> Signed-off-by: Jonathan Swartz <jonathan@jswartz.info> Co-authored-by: Jonathan Swartz <jonathan@jswartz.info>
1 parent 63a052f commit 90c02c3

3 files changed

Lines changed: 37 additions & 1 deletion

File tree

nanovdb/nanovdb/GridHandle.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ GridHandle<BufferT>::deviceGrid(uint32_t n) const
400400
template<typename BufferT>
401401
void GridHandle<BufferT>::read(std::istream& is, const BufferT& pool)
402402
{
403+
const std::streampos start = is.tellg();// remember where the raw buffer begins
403404
GridData data;
404405
is.read((char*)&data, sizeof(GridData));
405406
if (data.isValid()) {
@@ -410,7 +411,7 @@ void GridHandle<BufferT>::read(std::istream& is, const BufferT& pool)
410411
sum += data.mGridSize;
411412
}
412413
auto buffer = BufferT::create(size + sum, &pool);
413-
is.seekg(-int64_t(sum + sizeof(GridData)), std::ios::cur);// rewind to start
414+
is.seekg(start);// rewind to the start of the raw buffer
414415
is.read((char*)(buffer.data()), buffer.size());
415416
*this = GridHandle(std::move(buffer));
416417
} else {

nanovdb/nanovdb/unittest/TestNanoVDB.cc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8386,6 +8386,38 @@ TEST_F(TestNanoVDB, CustomStreamGridHandleIO)
83868386
}
83878387
}// CustomStreamGridHandleIO
83888388

8389+
// make -j testNanoVDB && ./unittest/testNanoVDB --gtest_filter="*GridHandleReadMultiGridRawBuffer"
8390+
TEST_F(TestNanoVDB, GridHandleReadMultiGridRawBuffer)
8391+
{
8392+
std::vector<nanovdb::GridHandle<>> handles;
8393+
handles.emplace_back(nanovdb::tools::createLevelSetSphere<float>(20.0));
8394+
handles.emplace_back(nanovdb::tools::createLevelSetSphere<float>(40.0));
8395+
ASSERT_EQ(2u, handles.size());
8396+
ASSERT_NE(handles[0].bufferSize(), handles[1].bufferSize());
8397+
8398+
auto mergedHandle = nanovdb::mergeGrids<nanovdb::HostBuffer, std::vector>(handles);
8399+
ASSERT_EQ(2u, mergedHandle.gridCount());
8400+
8401+
std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
8402+
mergedHandle.write(stream);
8403+
stream.seekg(0);
8404+
8405+
nanovdb::GridHandle<> handle;
8406+
handle.read(stream);
8407+
8408+
EXPECT_EQ(mergedHandle.bufferSize(), handle.bufferSize());
8409+
EXPECT_EQ(2u, handle.gridCount());
8410+
for (uint32_t i = 0; i < handle.gridCount(); ++i) {
8411+
const auto* grid = handle.grid<float>(i);
8412+
ASSERT_TRUE(grid);
8413+
EXPECT_EQ(i, grid->gridIndex());
8414+
EXPECT_EQ(2u, grid->gridCount());
8415+
EXPECT_EQ(handles[i].bufferSize(), grid->gridSize());
8416+
EXPECT_TRUE(nanovdb::tools::validateChecksum(grid));
8417+
EXPECT_TRUE(nanovdb::tools::validateChecksum(grid, nanovdb::CheckMode::Full));
8418+
}
8419+
}// GridHandleReadMultiGridRawBuffer
8420+
83898421
// make -j testNanoVDB && ./unittest/testNanoVDB --gtest_filter="*strcpy"
83908422
TEST_F(TestNanoVDB, strcpy)
83918423
{
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
NanoVDB:
2+
Bug Fixes:
3+
- Fixed seek offset over-counting in NanoVDB GridHandle read for cases with multiple grids per handle.

0 commit comments

Comments
 (0)