Skip to content

Commit dbe6c6f

Browse files
committed
first-light of anari_tsd device
1 parent 6fd64e2 commit dbe6c6f

25 files changed

+1578
-48
lines changed

tsd/src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
## Copyright 2024-2025 NVIDIA Corporation
22
## SPDX-License-Identifier: Apache-2.0
33

4+
add_subdirectory(anari_tsd)
45
add_subdirectory(tsd)

tsd/src/anari_tsd/Array.cpp

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
// Copyright 2026 NVIDIA Corporation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#include "Array.h"
5+
#include "Object.h"
6+
7+
namespace tsd_device {
8+
9+
Array::Array(DeviceGlobalState *state, Array1DMemoryDescriptor desc)
10+
: helium::BaseArray(ANARI_ARRAY1D, state),
11+
m_appMemory(desc.appMemory),
12+
m_deleter(desc.deleter),
13+
m_deleterPtr(desc.deleterPtr)
14+
{
15+
m_array = state->scene.createArray(desc.elementType, desc.numItems);
16+
syncSharedData();
17+
}
18+
19+
Array::Array(DeviceGlobalState *state, Array2DMemoryDescriptor desc)
20+
: helium::BaseArray(ANARI_ARRAY2D, state),
21+
m_appMemory(desc.appMemory),
22+
m_deleter(desc.deleter),
23+
m_deleterPtr(desc.deleterPtr)
24+
{
25+
m_array = state->scene.createArray(
26+
desc.elementType, desc.numItems1, desc.numItems2);
27+
syncSharedData();
28+
}
29+
30+
Array::Array(DeviceGlobalState *state, Array3DMemoryDescriptor desc)
31+
: helium::BaseArray(ANARI_ARRAY3D, state),
32+
m_appMemory(desc.appMemory),
33+
m_deleter(desc.deleter),
34+
m_deleterPtr(desc.deleterPtr)
35+
{
36+
m_array = state->scene.createArray(
37+
desc.elementType, desc.numItems1, desc.numItems2, desc.numItems3);
38+
syncSharedData();
39+
}
40+
41+
Array::~Array()
42+
{
43+
freeAppMemory();
44+
}
45+
46+
bool Array::isShared() const
47+
{
48+
return m_appMemory != nullptr;
49+
}
50+
51+
void *Array::map()
52+
{
53+
return const_cast<void *>(isShared() ? m_appMemory : m_array->map());
54+
}
55+
56+
void Array::unmap()
57+
{
58+
syncSharedData();
59+
if (!isShared())
60+
m_array->unmap();
61+
}
62+
63+
void Array::privatize()
64+
{
65+
freeAppMemory();
66+
}
67+
68+
void Array::commitParameters()
69+
{
70+
auto *object = tsdObject();
71+
std::for_each(params_begin(), params_end(), [&](auto &p) {
72+
if (anari::isObject(p.second.type())) {
73+
if (anari::isArray(p.second.type())) {
74+
auto *arr = p.second.template getObject<Array>();
75+
if (arr) {
76+
object->setParameterObject(
77+
tsd::core::Token(p.first), *arr->tsdObject());
78+
}
79+
} else {
80+
auto *obj = p.second.template getObject<TSDObject>();
81+
if (obj && obj->tsdObject() != nullptr) {
82+
object->setParameterObject(
83+
tsd::core::Token(p.first), *obj->tsdObject());
84+
}
85+
}
86+
} else if (p.second.type() != ANARI_UNKNOWN) {
87+
object->setParameter(
88+
tsd::core::Token(p.first), p.second.type(), p.second.data());
89+
} else {
90+
reportMessage(ANARI_SEVERITY_WARNING,
91+
"skip setting parameter '%s' of unknown type",
92+
p.first.c_str());
93+
}
94+
});
95+
}
96+
97+
void Array::finalize()
98+
{
99+
// no-op
100+
}
101+
102+
bool Array::getProperty(const std::string_view &name,
103+
ANARIDataType type,
104+
void *ptr,
105+
uint64_t size,
106+
uint32_t flags)
107+
{
108+
// no-op
109+
return 0;
110+
}
111+
112+
tsd::core::Object *Array::tsdObject() const
113+
{
114+
return m_array.data();
115+
}
116+
117+
DeviceGlobalState *Array::deviceState() const
118+
{
119+
return (DeviceGlobalState *)m_state;
120+
}
121+
122+
void Array::syncSharedData()
123+
{
124+
if (isShared())
125+
m_array->setData(m_appMemory);
126+
}
127+
128+
void Array::freeAppMemory()
129+
{
130+
if (isShared() && m_deleter != nullptr)
131+
m_deleter(m_deleterPtr, m_appMemory);
132+
133+
m_appMemory = nullptr;
134+
m_deleter = nullptr;
135+
m_deleterPtr = nullptr;
136+
}
137+
138+
} // namespace tsd_device
139+
140+
TSD_DEVICE_ANARI_TYPEFOR_DEFINITION(tsd_device::Array *);

tsd/src/anari_tsd/Array.h

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright 2026 NVIDIA Corporation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include "DeviceGlobalState.h"
7+
// helium
8+
#include "helium/array/Array1D.h"
9+
#include "helium/array/Array2D.h"
10+
#include "helium/array/Array3D.h"
11+
#include "helium/array/ObjectArray.h"
12+
// tsd_core
13+
#include "tsd/core/scene/objects/Array.hpp"
14+
15+
namespace tsd_device {
16+
17+
using Array1DMemoryDescriptor = helium::Array1DMemoryDescriptor;
18+
using Array2DMemoryDescriptor = helium::Array2DMemoryDescriptor;
19+
using Array3DMemoryDescriptor = helium::Array3DMemoryDescriptor;
20+
using ObjectArray = helium::ObjectArray;
21+
22+
struct Array : public helium::BaseArray
23+
{
24+
Array(DeviceGlobalState *state, Array1DMemoryDescriptor desc);
25+
Array(DeviceGlobalState *state, Array2DMemoryDescriptor desc);
26+
Array(DeviceGlobalState *state, Array3DMemoryDescriptor desc);
27+
~Array() override;
28+
29+
bool isShared() const;
30+
31+
void *map() override;
32+
void unmap() override;
33+
void privatize() override;
34+
35+
void commitParameters() override;
36+
void finalize() override;
37+
38+
bool getProperty(const std::string_view &name,
39+
ANARIDataType type,
40+
void *ptr,
41+
uint64_t size,
42+
uint32_t flags) override;
43+
44+
tsd::core::Object *tsdObject() const;
45+
DeviceGlobalState *deviceState() const;
46+
47+
private:
48+
void syncSharedData();
49+
void freeAppMemory();
50+
51+
mutable tsd::core::ArrayRef m_array;
52+
const void *m_appMemory{nullptr};
53+
ANARIMemoryDeleter m_deleter{};
54+
const void *m_deleterPtr{nullptr};
55+
};
56+
57+
} // namespace tsd_device
58+
59+
TSD_DEVICE_ANARI_TYPEFOR_SPECIALIZATION(tsd_device::Array *, ANARI_ARRAY);

tsd/src/anari_tsd/CMakeLists.txt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
## Copyright 2026 NVIDIA Corporation
2+
## SPDX-License-Identifier: Apache-2.0
3+
4+
project(anari_library_tsd LANGUAGES CXX)
5+
6+
project_add_library(SHARED
7+
Array.cpp
8+
Device.cpp
9+
DeviceGlobalState.cpp
10+
Frame.cpp
11+
Group.cpp
12+
Instance.cpp
13+
Library.cpp
14+
Object.cpp
15+
World.cpp
16+
)
17+
project_link_libraries(PRIVATE tsd_app tsd_io anari::helium)
18+
project_compile_definitions(PRIVATE "anari_library_tsd_EXPORTS")
19+
project_include_directories(
20+
PRIVATE
21+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
22+
)
23+
24+
## Generated code ##
25+
26+
include(GenerateExportHeader)
27+
generate_export_header(${PROJECT_NAME} EXPORT_MACRO_NAME "ANARI_TSD_EXPORT")
28+
29+
anari_generate_queries(
30+
DEVICE_TARGET ${PROJECT_NAME}
31+
CPP_NAMESPACE tsd_device
32+
JSON_DEFINITIONS_FILE ${ANARI_CODE_GEN_ROOT}/devices/experimental_device.json
33+
)
34+
35+
## Install ##
36+
37+
install(TARGETS ${PROJECT_NAME}
38+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
39+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
40+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
41+
)

0 commit comments

Comments
 (0)