Skip to content

Commit 16d7899

Browse files
authored
Merge pull request #62 from jpola-amd/jpola/dev/unroll-O2W
hiprtPointObjectToWorld and hiprtVectorObjectToWorld unroll
2 parents 178995f + a463141 commit 16d7899

1 file changed

Lines changed: 30 additions & 20 deletions

File tree

hiprt/impl/hiprt_device_impl.h

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1823,24 +1823,29 @@ HIPRT_DEVICE float3 hiprtPointObjectToWorld(
18231823
hiprt::SceneHeader* sceneHeader = reinterpret_cast<hiprt::SceneHeader*>( scene );
18241824
float3 p = point;
18251825

1826-
uint32_t depth;
1826+
uint32_t depth = 0;
18271827
#pragma unroll
1828-
for ( depth = 1; depth < hiprtMaxInstanceLevels; ++depth )
1828+
for ( uint32_t i = 0; i < hiprtMaxInstanceLevels; ++i )
18291829
{
1830-
sceneHeaders[depth - 1] = sceneHeader;
1831-
const auto& instance = sceneHeader->m_instances[instanceIDs[depth - 1]];
1830+
sceneHeaders[i] = sceneHeader;
1831+
const auto& instance = sceneHeader->m_instances[instanceIDs[i]];
1832+
++depth;
18321833
if ( instance.m_type != hiprtInstanceTypeScene ) break;
18331834
sceneHeader = instance.m_scene;
18341835
}
18351836

18361837
#pragma unroll
1837-
for ( int32_t i = depth - 1; i >= 0; --i )
1838+
for ( uint32_t i = 0; i < hiprtMaxInstanceLevels; ++i )
18381839
{
1839-
sceneHeader = sceneHeaders[i];
1840-
const auto& instance = sceneHeader->m_instances[instanceIDs[i]];
1841-
hiprt::Transform tr = hiprt::Transform( sceneHeader->m_frames, instance.m_frameIndex, instance.m_frameCount );
1842-
hiprt::Frame frame = tr.interpolateFrames( time );
1843-
p = frame.transform( p );
1840+
int32_t j = depth - 1 - i;
1841+
if ( j >= 0 )
1842+
{
1843+
sceneHeader = sceneHeaders[j];
1844+
const auto& instance = sceneHeader->m_instances[instanceIDs[j]];
1845+
hiprt::Transform tr = hiprt::Transform( sceneHeader->m_frames, instance.m_frameIndex, instance.m_frameCount );
1846+
hiprt::Frame frame = tr.interpolateFrames( time );
1847+
p = frame.transform( p );
1848+
}
18441849
}
18451850

18461851
return p;
@@ -1873,24 +1878,29 @@ HIPRT_DEVICE float3 hiprtVectorObjectToWorld(
18731878
hiprt::SceneHeader* sceneHeader = reinterpret_cast<hiprt::SceneHeader*>( scene );
18741879
float3 v = vector;
18751880

1876-
uint32_t depth;
1881+
uint32_t depth = 0;
18771882
#pragma unroll
1878-
for ( depth = 1; depth < hiprtMaxInstanceLevels; ++depth )
1883+
for ( uint32_t i = 0; i < hiprtMaxInstanceLevels; ++i )
18791884
{
1880-
sceneHeaders[depth - 1] = sceneHeader;
1881-
const auto& instance = sceneHeader->m_instances[instanceIDs[depth - 1]];
1885+
sceneHeaders[i] = sceneHeader;
1886+
const auto& instance = sceneHeader->m_instances[instanceIDs[i]];
1887+
++depth;
18821888
if ( instance.m_type != hiprtInstanceTypeScene ) break;
18831889
sceneHeader = instance.m_scene;
18841890
}
18851891

18861892
#pragma unroll
1887-
for ( int32_t i = depth - 1; i >= 0; --i )
1893+
for ( uint32_t i = 0; i < hiprtMaxInstanceLevels; ++i )
18881894
{
1889-
sceneHeader = sceneHeaders[i];
1890-
const auto& instance = sceneHeader->m_instances[instanceIDs[i]];
1891-
hiprt::Transform tr = hiprt::Transform( sceneHeader->m_frames, instance.m_frameIndex, instance.m_frameCount );
1892-
hiprt::Frame frame = tr.interpolateFrames( time );
1893-
v = frame.transformVector( v );
1895+
int32_t j = depth - 1 - i;
1896+
if ( j >= 0 )
1897+
{
1898+
sceneHeader = sceneHeaders[j];
1899+
const auto& instance = sceneHeader->m_instances[instanceIDs[j]];
1900+
hiprt::Transform tr = hiprt::Transform( sceneHeader->m_frames, instance.m_frameIndex, instance.m_frameCount );
1901+
hiprt::Frame frame = tr.interpolateFrames( time );
1902+
v = frame.transformVector( v );
1903+
}
18941904
}
18951905

18961906
return v;

0 commit comments

Comments
 (0)