Skip to content

Commit f7c193d

Browse files
committed
WIP: render real frames with TSD device
1 parent 7a25770 commit f7c193d

File tree

7 files changed

+140
-16
lines changed

7 files changed

+140
-16
lines changed

tsd/src/anari_tsd/Device.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ void Device::initDevice()
228228
"created ANARI device (%p) from library '%s'",
229229
(void *)state->device,
230230
libraryName.c_str());
231+
232+
state->scene.setUpdateDelegate(&state->anari.getUpdateDelegate());
231233
}
232234

233235
m_initialized = true;

tsd/src/anari_tsd/Frame.cpp

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,25 @@
66
#include <helium/helium_math.h>
77
// tsd_io
88
#include "tsd/io/serialization.hpp"
9+
// std
10+
#include <algorithm>
911

1012
namespace tsd_device {
1113

12-
Frame::Frame(DeviceGlobalState *s) : helium::BaseFrame(s) {}
14+
Frame::Frame(DeviceGlobalState *s) : helium::BaseFrame(s)
15+
{
16+
m_anariFrame = anari::newObject<anari::Frame>(s->device);
17+
}
1318

1419
Frame::~Frame()
1520
{
1621
wait();
22+
anari::release(deviceState()->device, m_anariFrame);
1723
}
1824

1925
bool Frame::isValid() const
2026
{
21-
return m_world && m_world->isValid();
27+
return m_world && m_world->isValid() && m_renderer && m_camera;
2228
}
2329

2430
DeviceGlobalState *Frame::deviceState() const
@@ -49,6 +55,41 @@ void Frame::finalize()
4955
reportMessage(
5056
ANARI_SEVERITY_WARNING, "missing required parameter 'camera' on frame");
5157
}
58+
59+
if (!(m_world && m_renderer && m_camera))
60+
return;
61+
62+
auto *state = deviceState();
63+
auto d = state->device;
64+
anari::unsetAllParameters(d, m_anariFrame);
65+
std::for_each(params_begin(), params_end(), [&](auto &p) {
66+
if (anari::isObject(p.second.type())) {
67+
reportMessage(ANARI_SEVERITY_WARNING,
68+
"skip forwarding object parameter '%s' on ANARIFrame",
69+
p.first.c_str());
70+
} else if (p.first == "name" && p.second.type() == ANARI_STRING) {
71+
anari::setParameter(
72+
d, m_anariFrame, p.first.c_str(), p.second.getString());
73+
} else if (p.second.type() != ANARI_UNKNOWN) {
74+
anari::setParameter(
75+
d, m_anariFrame, p.first.c_str(), p.second.type(), p.second.data());
76+
} else {
77+
reportMessage(ANARI_SEVERITY_WARNING,
78+
"skip setting parameter '%s' of unknown type on ANARIFrame",
79+
p.first.c_str());
80+
}
81+
});
82+
83+
anari::setParameter(
84+
d, m_anariFrame, "camera", (anari::Camera)m_camera->anariHandle());
85+
anari::setParameter(
86+
d, m_anariFrame, "renderer", (anari::Renderer)m_renderer->anariHandle());
87+
anari::setParameter(d,
88+
m_anariFrame,
89+
"world",
90+
(anari::World)m_world->getRenderIndex()->world());
91+
92+
anari::commitParameters(d, m_anariFrame);
5293
}
5394

5495
bool Frame::getProperty(const std::string_view &name,
@@ -57,7 +98,14 @@ bool Frame::getProperty(const std::string_view &name,
5798
uint64_t size,
5899
uint32_t flags)
59100
{
60-
return 0;
101+
std::string nameStr(name);
102+
return anariGetProperty(deviceState()->device,
103+
m_anariFrame,
104+
nameStr.c_str(),
105+
type,
106+
ptr,
107+
size,
108+
flags);
61109
}
62110

63111
void Frame::renderFrame()
@@ -67,23 +115,29 @@ void Frame::renderFrame()
67115
reportMessage(
68116
ANARI_SEVERITY_INFO, "exporting scene to 'tsd_device_export.tsd'");
69117
tsd::io::save_Scene(state->scene, "tsd_device_export.tsd");
118+
anari::render(state->device, m_anariFrame);
70119
}
71120

72121
void *Frame::map(std::string_view channel,
73122
uint32_t *width,
74123
uint32_t *height,
75124
ANARIDataType *pixelType)
76125
{
77-
wait();
78-
*width = 0;
79-
*height = 0;
80-
*pixelType = ANARI_UNKNOWN;
81-
return nullptr;
126+
auto *state = deviceState();
127+
std::string channelStr(channel);
128+
return (void *)anariMapFrame(state->device,
129+
m_anariFrame,
130+
channelStr.c_str(),
131+
width,
132+
height,
133+
pixelType);
82134
}
83135

84136
void Frame::unmap(std::string_view channel)
85137
{
86-
// no-op
138+
auto *state = deviceState();
139+
std::string channelStr(channel);
140+
anari::unmap(state->device, m_anariFrame, channelStr.c_str());
87141
}
88142

89143
int Frame::frameReady(ANARIWaitMask m)
@@ -98,17 +152,17 @@ int Frame::frameReady(ANARIWaitMask m)
98152

99153
void Frame::discard()
100154
{
101-
// no-op
155+
anari::discard(deviceState()->device, m_anariFrame);
102156
}
103157

104158
bool Frame::ready() const
105159
{
106-
return true;
160+
return anari::isReady(deviceState()->device, m_anariFrame);
107161
}
108162

109163
void Frame::wait() const
110164
{
111-
// no-op
165+
anari::wait(deviceState()->device, m_anariFrame);
112166
}
113167

114168
} // namespace tsd_device

tsd/src/anari_tsd/Frame.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ struct Frame : public helium::BaseFrame
4646
helium::IntrusivePtr<World> m_world;
4747
helium::IntrusivePtr<TSDObject> m_renderer;
4848
helium::IntrusivePtr<TSDObject> m_camera;
49+
50+
anari::Frame m_anariFrame{nullptr};
4951
};
5052

5153
} // namespace tsd_device

tsd/src/anari_tsd/Object.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ TSDObject::TSDObject(
5757
case ANARI_CAMERA:
5858
obj = s->scene.createObject<tsd::core::Camera>(subtype).data();
5959
name = "camera" + std::to_string(s->cameraCount++);
60+
m_liveHandle =
61+
anari::newObject<anari::Renderer>(s->device, subtype.c_str());
6062
break;
6163
case ANARI_SURFACE:
6264
obj = s->scene.createObject<tsd::core::Surface>().data();
@@ -89,6 +91,8 @@ TSDObject::TSDObject(
8991
case ANARI_RENDERER:
9092
obj = new tsd::core::Object(ANARI_RENDERER, subtype);
9193
name = "renderer" + std::to_string(s->rendererCount++);
94+
m_liveHandle =
95+
anari::newObject<anari::Renderer>(s->device, subtype.c_str());
9296
break;
9397
default:
9498
break;
@@ -107,6 +111,15 @@ TSDObject::TSDObject(
107111
obj->setName(name.c_str());
108112
}
109113

114+
TSDObject::~TSDObject()
115+
{
116+
auto *s = deviceState();
117+
if (m_liveHandle) {
118+
anari::release(s->device, m_liveHandle);
119+
m_liveHandle = nullptr;
120+
}
121+
}
122+
110123
void TSDObject::commitParameters()
111124
{
112125
auto *object = tsdObject();
@@ -145,11 +158,23 @@ void TSDObject::commitParameters()
145158
p.first.c_str());
146159
}
147160
});
161+
162+
if (m_liveHandle) {
163+
auto *state = deviceState();
164+
tsdObject()->updateAllANARIParameters(state->device, m_liveHandle);
165+
anari::commitParameters(state->device, m_liveHandle);
166+
}
148167
}
149168

150169
tsd::core::Object *TSDObject::tsdObject() const
151170
{
152-
return deviceState()->scene.getObject(m_object);
171+
return m_rendererObject ? m_rendererObject.get()
172+
: deviceState()->scene.getObject(m_object);
173+
}
174+
175+
anari::Object TSDObject::anariHandle() const
176+
{
177+
return m_liveHandle;
153178
}
154179

155180
} // namespace tsd_device

tsd/src/anari_tsd/Object.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,21 @@ struct TSDObject : public Object
3535
TSDObject(anari::DataType type,
3636
DeviceGlobalState *s,
3737
tsd::core::Token subtype = tsd::core::tokens::none);
38-
virtual ~TSDObject() = default;
38+
virtual ~TSDObject();
3939

4040
virtual void commitParameters() override;
4141

4242
tsd::core::Object *tsdObject() const;
43+
anari::Object anariHandle() const;
4344

4445
private:
4546
tsd::core::Any m_object; // scene ref for non-renderer objects
4647
std::unique_ptr<tsd::core::Object> m_rendererObject; // only if ANARI_RENDERER
48+
49+
// Renderers + cameras track a live ANARI object to be used by the Frame, all
50+
// other objects are created + managed via a render index to populate the
51+
// World.
52+
anari::Object m_liveHandle{nullptr};
4753
};
4854

4955
} // namespace tsd_device

tsd/src/anari_tsd/World.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ World::World(DeviceGlobalState *s)
1313
m_instanceData(this)
1414
{
1515
m_layerName = "world" + std::to_string(s->worldCount++);
16-
s->scene.addLayer(m_layerName);
16+
auto *l = s->scene.addLayer(m_layerName);
17+
m_renderIndex =
18+
(tsd::rendering::RenderIndexAllLayers *)s->anari.acquireRenderIndex(
19+
s->scene, s->device);
1720
}
1821

1922
World::~World()
@@ -22,6 +25,22 @@ World::~World()
2225
s->scene.removeLayer(m_layerName);
2326
}
2427

28+
bool World::getProperty(const std::string_view &name,
29+
ANARIDataType type,
30+
void *ptr,
31+
uint64_t size,
32+
uint32_t flags)
33+
{
34+
std::string nameStr(name);
35+
return anariGetProperty(deviceState()->device,
36+
m_renderIndex->world(),
37+
nameStr.c_str(),
38+
type,
39+
ptr,
40+
size,
41+
flags);
42+
}
43+
2544
void World::commitParameters()
2645
{
2746
m_zeroSurfaceData = getParamObject<helium::ObjectArray>("surface");
@@ -36,6 +55,11 @@ void World::finalize()
3655
updateLayer();
3756
}
3857

58+
const tsd::rendering::RenderIndexAllLayers *World::getRenderIndex() const
59+
{
60+
return m_renderIndex;
61+
}
62+
3963
tsd::core::Layer *World::layer() const
4064
{
4165
auto *s = deviceState();

tsd/src/anari_tsd/World.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,27 @@
66
#include "Instance.h"
77
// std
88
#include <vector>
9+
// tsd_rendering
10+
#include "tsd/rendering/index/RenderIndexAllLayers.hpp"
911

1012
namespace tsd_device {
1113

1214
struct World : public Object
1315
{
1416
World(DeviceGlobalState *s);
15-
~World() override;
17+
~World() override;
18+
19+
bool getProperty(const std::string_view &name,
20+
ANARIDataType type,
21+
void *ptr,
22+
uint64_t size,
23+
uint32_t flags) override;
1624

1725
void commitParameters() override;
1826
void finalize() override;
1927

28+
const tsd::rendering::RenderIndexAllLayers *getRenderIndex() const;
29+
2030
private:
2131
tsd::core::Layer *layer() const;
2232

@@ -34,6 +44,7 @@ struct World : public Object
3444
std::vector<TSDObject *> m_zeroLights;
3545

3646
tsd::core::Token m_layerName;
47+
tsd::rendering::RenderIndexAllLayers *m_renderIndex{nullptr};
3748
};
3849

3950
} // namespace tsd_device

0 commit comments

Comments
 (0)