VTK  9.2.6
OSPRayBackend.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <ospray/ospray_util.h>
4 
5 #include "../Backend.h"
6 
7 #include <cstring>
8 #include <sstream>
9 #include <stdexcept>
10 #include <stdlib.h>
11 #include <vector>
12 #include <iostream>
13 
14 namespace RTW
15 {
16 
17  OSPFrameBufferFormat convert(RTWFrameBufferFormat format)
18  {
19  switch (format)
20  {
21  case RTW_FB_RGBA8:
22  return OSP_FB_RGBA8;
23  case RTW_FB_SRGBA:
24  return OSP_FB_SRGBA;
25  case RTW_FB_RGBA32F:
26  return OSP_FB_RGBA32F;
27  default:
28  return OSP_FB_NONE;
29  }
30  }
31 
33  {
34  switch (format)
35  {
36  case RTW_TEXTURE_RGBA8:
37  return OSP_TEXTURE_RGBA8;
38  case RTW_TEXTURE_SRGBA:
39  return OSP_TEXTURE_SRGBA;
41  return OSP_TEXTURE_RGBA32F;
42  case RTW_TEXTURE_RGB8:
43  return OSP_TEXTURE_RGB8;
44  case RTW_TEXTURE_SRGB:
45  return OSP_TEXTURE_SRGB;
46  case RTW_TEXTURE_RGB32F:
47  return OSP_TEXTURE_RGB32F;
48  case RTW_TEXTURE_R8:
49  return OSP_TEXTURE_R8;
50  case RTW_TEXTURE_R32F:
51  return OSP_TEXTURE_R32F;
52  case RTW_TEXTURE_L8:
53  return OSP_TEXTURE_L8;
54  case RTW_TEXTURE_RA8:
55  return OSP_TEXTURE_RA8;
56  case RTW_TEXTURE_LA8:
57  return OSP_TEXTURE_LA8;
59  default:
60  return OSP_TEXTURE_FORMAT_INVALID;
61  }
62  }
63 
64 
65 
66 
67  /*
68  * Simple pass-through backend for OSPRay.
69  */
70  class OSPRayBackend : public Backend
71  {
72  public:
73  RTWError Init() override
74  {
75  static bool once = false;
76  RTWError ret = RTW_NO_ERROR;
77  if (!once) {
78  ret = static_cast<RTWError>(ospInit(nullptr, nullptr));
79  OSPDevice device = ospGetCurrentDevice();
80  if (!device)
81  {
82  std::runtime_error("OSPRay device could not be fetched!");
83  }
84 #if OSPRAY_VERSION_MINOR > 1
85  ospDeviceSetErrorCallback(device, [](void *, OSPError, const char *errorDetails) {
86  std::cerr << "OSPRay ERROR: " << errorDetails << std::endl;
87  }, nullptr);
88 #else
89  ospDeviceSetErrorFunc(device, [](OSPError, const char *errorDetails) {
90  std::cerr << "OSPRay ERROR: " << errorDetails << std::endl;
91  });
92 #endif
93  once = true;
94  }
95  return ret;
96  }
97 
98  void Shutdown() override
99  {
100  //do nothing here. Since OSPRay 2
101  }
102 
103  bool IsSupported(RTWFeature feature) const override
104  {
105  switch (feature)
106  {
108  return false;
109  case RTW_OPENGL_INTEROP:
110  return false;
112  return false;
113  case RTW_INSTANCING:
114  return true;
115  case RTW_DENOISER:
116  return false; // OpenImageDenoise is an external lib outside of the backend
118  return true;
119  }
120  return false;
121  }
122 
123  RTWData NewCopyData1D(const void *source, RTWDataType dataType, size_t numElements) override
124  {
125  OSPData data = ospNewData1D(static_cast<OSPDataType>(dataType), numElements);
126  ospCommit(data);
127  OSPData shared = ospNewSharedData1D(source, static_cast<OSPDataType>(dataType), numElements);
128  ospCommit(shared);
129  ospCopyData1D(shared, data, 0);
130  ospCommit(data);
131  ospRelease(shared);
132  return reinterpret_cast<RTWData>(data);
133  }
134  RTWData NewCopyData2D(const void *source, RTWDataType dataType, size_t numElements, size_t numElements2) override
135  {
136  OSPData data = ospNewData2D(static_cast<OSPDataType>(dataType), numElements, numElements2);
137  ospCommit(data);
138  OSPData shared = ospNewSharedData2D(source, static_cast<OSPDataType>(dataType), numElements, numElements2);
139  ospCommit(shared);
140  ospCopyData2D(shared, data, 0, 0);
141  ospCommit(data);
142  ospRelease(shared);
143  return reinterpret_cast<RTWData>(data);
144  }
145  RTWData NewCopyData3D(const void *source, RTWDataType dataType, size_t numElements, size_t numElements2, size_t numElements3) override
146  {
147  OSPData data = ospNewData(static_cast<OSPDataType>(dataType), numElements, numElements2, numElements3);
148  ospCommit(data);
149  OSPData shared = ospNewSharedData3D(source, static_cast<OSPDataType>(dataType), numElements, numElements2, numElements3);
150  ospCommit(shared);
151  ospCopyData(shared, data, 0, 0, 0);
152  ospCommit(data);
153  ospRelease(shared);
154  return reinterpret_cast<RTWData>(data);
155  }
156 
157  RTWData NewData(RTWDataType dataType, size_t numElements) override
158  {
159  return reinterpret_cast<RTWData>(ospNewData(static_cast<OSPDataType>(dataType), numElements));
160  }
161 
162  RTWGeometry NewGeometry(const char *type) override
163  {
164  return reinterpret_cast<RTWGeometry>(ospNewGeometry(type));
165  }
166 
167  RTWGroup NewGroup() override
168  {
169  return reinterpret_cast<RTWGroup>(ospNewGroup());
170  }
171 
172  RTWData NewSharedData1D(const void* sharedData, RTWDataType type, uint32_t numItems1) override
173  {
174  return reinterpret_cast<RTWData>(ospNewSharedData1D(sharedData, (OSPDataType)((int)type), numItems1));
175  }
176 
177  RTWData NewSharedData2D(const void* sharedData, RTWDataType type, uint32_t numItems1, uint32_t numItems2) override
178  {
179  return reinterpret_cast<RTWData>(ospNewSharedData2D(sharedData, (OSPDataType)((int)type), numItems1, numItems2));
180  }
181 
182  RTWData NewSharedData3D(const void* sharedData, RTWDataType type, uint32_t numItems1, uint32_t numItems2,
183  uint32_t numItems3) override
184  {
185  return reinterpret_cast<RTWData>(ospNewSharedData3D(sharedData, (OSPDataType)((int)type),
186  numItems1, numItems2, numItems3));
187  }
188 
189  RTWTexture NewTexture(const char* type) override
190  {
191  return reinterpret_cast<RTWTexture>(ospNewTexture(type));
192  }
193 
194  RTWLight NewLight(const char *light_type) override
195  {
196  return reinterpret_cast<RTWLight>(ospNewLight(light_type));
197  }
198 
199  RTWMaterial NewMaterial(const char *renderer_type, const char *material_type) override
200  {
201  return reinterpret_cast<RTWMaterial>(ospNewMaterial(renderer_type, material_type));
202  }
203 
204  RTWVolume NewVolume(const char *type) override
205  {
206  return reinterpret_cast<RTWVolume>(ospNewVolume(type));
207  }
208 
210  {
211  return reinterpret_cast<RTWTransferFunction>(ospNewTransferFunction(type));
212  }
213 
214  RTWRenderer NewRenderer(const char *type) override
215  {
216  return reinterpret_cast<RTWRenderer>(ospNewRenderer(type));
217  }
218 
219  RTWCamera NewCamera(const char *type) override
220  {
221  return reinterpret_cast<RTWCamera>(ospNewCamera(type));
222  }
223 
225  {
226  return reinterpret_cast<RTWGeometricModel>(ospNewGeometricModel(reinterpret_cast<OSPGeometry>(geometry)));
227  }
228 
230  {
231  return reinterpret_cast<RTWVolumetricModel>(ospNewVolumetricModel(reinterpret_cast<OSPVolume>(volume)));
232  }
233 
234  RTWWorld NewWorld() override
235  {
236  return reinterpret_cast<RTWWorld>(ospNewWorld());
237  }
238 
239  RTWInstance NewInstance(RTWGroup geometry) override
240  {
241  return reinterpret_cast<RTWInstance>(ospNewInstance(reinterpret_cast<OSPGroup>(geometry)));
242  }
243 
244  RTWFrameBuffer NewFrameBuffer(const rtw::vec2i &size, const RTWFrameBufferFormat format, const uint32_t frameBufferChannels) override
245  {
246  return reinterpret_cast<RTWFrameBuffer>(ospNewFrameBuffer(size.x, size.y, convert(format), frameBufferChannels));
247  }
248 
249  void Release(RTWObject object) override
250  {
251  ospRelease(reinterpret_cast<OSPObject>(object));
252  }
253 
254  void SetString(RTWObject object, const char *id, const char *s) override
255  {
256  ospSetString(reinterpret_cast<OSPObject>(object), id, s);
257  }
258 
259  void SetObject(RTWObject object, const char *id, RTWObject other) override
260  {
261  ospSetObject(reinterpret_cast<OSPObject>(object), id, reinterpret_cast<OSPObject>(other));
262  }
263 
264  void SetObjectAsData(RTWObject target, const char *id, RTWDataType type, RTWObject obj) override{
265  ospSetObjectAsData(reinterpret_cast<OSPObject>(target), id, (OSPDataType)type,
266  reinterpret_cast<OSPObject>(obj));
267  }
268 
269  void SetParam(RTWObject object, const char *id, RTWDataType dataType, const void* mem) override
270  {
271  ospSetParam(reinterpret_cast<OSPObject>(object), id, static_cast<OSPDataType>(dataType),
272  mem);
273  }
274 
275  void SetInt(RTWObject object, const char *id, int32_t x) override
276  {
277  ospSetInt(reinterpret_cast<OSPObject>(object), id, x);
278  }
279 
280  void SetBool(RTWObject object, const char *id, bool x) override
281  {
282  ospSetBool(reinterpret_cast<OSPObject>(object), id, x);
283  }
284 
285  void SetFloat(RTWObject object, const char *id, float x) override
286  {
287  ospSetFloat(reinterpret_cast<OSPObject>(object), id, x);
288  }
289 
290  void SetVec2f(RTWObject object, const char *id, float x, float y) override
291  {
292  ospSetVec2f(reinterpret_cast<OSPObject>(object), id, x, y);
293  }
294 
295  void SetVec2i(RTWObject object, const char *id, int x, int y) override
296  {
297  ospSetVec2i(reinterpret_cast<OSPObject>(object), id, x, y);
298  }
299 
300  void SetVec3i(RTWObject object, const char *id, int x, int y, int z) override
301  {
302  ospSetVec3i(reinterpret_cast<OSPObject>(object), id, x, y, z);
303  }
304 
305  void SetVec3f(RTWObject object, const char *id, float x, float y, float z) override
306  {
307  ospSetVec3f(reinterpret_cast<OSPObject>(object), id, x, y, z);
308  }
309 
310  void SetVec4f(RTWObject object, const char *id, float x, float y, float z, float w) override
311  {
312  ospSetVec4f(reinterpret_cast<OSPObject>(object), id, x, y, z, w);
313  }
314 
315  void RemoveParam(RTWObject object, const char *id) override
316  {
317  ospRemoveParam(reinterpret_cast<OSPObject>(object), id);
318  }
319 
320  void Commit(RTWObject object) override
321  {
322  ospCommit(reinterpret_cast<OSPObject>(object));
323  }
324 
325  float RenderFrame(RTWFrameBuffer frameBuffer, RTWRenderer renderer, RTWCamera camera, RTWWorld world) override
326  {
327  return ospRenderFrameBlocking(reinterpret_cast<OSPFrameBuffer>(frameBuffer), reinterpret_cast<OSPRenderer>(renderer),
328  reinterpret_cast<OSPCamera>(camera), reinterpret_cast<OSPWorld>(world));
329  }
330 
331  void FrameBufferClear(RTWFrameBuffer frameBuffer) override
332  {
333  ospResetAccumulation(reinterpret_cast<OSPFrameBuffer>(frameBuffer));
334  }
335 
336  const void* MapFrameBuffer(RTWFrameBuffer frameBuffer, const RTWFrameBufferChannel channel) override
337  {
338  return ospMapFrameBuffer(reinterpret_cast<OSPFrameBuffer>(frameBuffer), static_cast<OSPFrameBufferChannel>(channel));
339  }
340 
341  void UnmapFrameBuffer(const void *mapped, RTWFrameBuffer frameBuffer) override
342  {
343  ospUnmapFrameBuffer(mapped, reinterpret_cast<OSPFrameBuffer>(frameBuffer));
344  }
345 
346  void SetDepthNormalizationGL(RTWFrameBuffer /*frameBuffer*/, float /*clipMin*/, float /*clipMax*/) override
347  {
348  // not supported
349  }
350 
351  int GetColorTextureGL(RTWFrameBuffer /*frameBuffer*/) override
352  {
353  // not supported
354  return 0;
355  }
356 
357  int GetDepthTextureGL(RTWFrameBuffer /*frameBuffer*/) override
358  {
359  // not supported
360  return 0;
361  }
362  };
363 }
struct RTWHandle * RTWObject
Definition: Types.h:220
#define ospNewData
Definition: RTWrapper.h:156
RTWData NewSharedData3D(const void *sharedData, RTWDataType type, uint32_t numItems1, uint32_t numItems2, uint32_t numItems3) override
float RenderFrame(RTWFrameBuffer frameBuffer, RTWRenderer renderer, RTWCamera camera, RTWWorld world) override
#define ospNewMaterial
Definition: RTWrapper.h:167
void SetDepthNormalizationGL(RTWFrameBuffer, float, float) override
void SetString(RTWObject object, const char *id, const char *s) override
#define OSP_TEXTURE_RGBA32F
Definition: RTWrapper.h:103
RTWGroup NewGroup() override
RTWVolume NewVolume(const char *type) override
#define OSPTextureFormat
Definition: RTWrapper.h:25
#define ospNewSharedData1D
Definition: RTWrapper.h:160
void FrameBufferClear(RTWFrameBuffer frameBuffer) override
#define ospSetObject
Definition: RTWrapper.h:148
#define OSP_TEXTURE_RGB8
Definition: RTWrapper.h:105
#define OSP_TEXTURE_RGB32F
Definition: RTWrapper.h:102
#define ospNewWorld
Definition: RTWrapper.h:174
#define ospNewLight
Definition: RTWrapper.h:165
void SetFloat(RTWObject object, const char *id, float x) override
RTWData NewCopyData2D(const void *source, RTWDataType dataType, size_t numElements, size_t numElements2) override
void SetVec3i(RTWObject object, const char *id, int x, int y, int z) override
#define ospCommit
Definition: RTWrapper.h:153
#define ospSetObjectAsData
Definition: RTWrapper.h:149
bool IsSupported(RTWFeature feature) const override
struct RTWHandle * RTWInstance
Definition: Types.h:220
int GetColorTextureGL(RTWFrameBuffer) override
#define ospSetVec2f
Definition: RTWrapper.h:143
#define ospNewGeometry
Definition: RTWrapper.h:170
RTWError Init() override
Definition: OSPRayBackend.h:73
void UnmapFrameBuffer(const void *mapped, RTWFrameBuffer frameBuffer) override
struct RTWHandle * RTWRenderer
Definition: Types.h:220
RTWData NewSharedData1D(const void *sharedData, RTWDataType type, uint32_t numItems1) override
RTWRenderer NewRenderer(const char *type) override
void SetVec2f(RTWObject object, const char *id, float x, float y) override
void SetVec3f(RTWObject object, const char *id, float x, float y, float z) override
#define ospNewGeometricModel
Definition: RTWrapper.h:172
struct RTWHandle * RTWVolumetricModel
Definition: Types.h:220
#define ospNewVolumetricModel
Definition: RTWrapper.h:173
RTWMaterial NewMaterial(const char *renderer_type, const char *material_type) override
#define OSPDataType
Definition: RTWrapper.h:32
void SetInt(RTWObject object, const char *id, int32_t x) override
RTWFrameBuffer NewFrameBuffer(const rtw::vec2i &size, const RTWFrameBufferFormat format, const uint32_t frameBufferChannels) override
#define ospRelease
Definition: RTWrapper.h:154
#define ospMapFrameBuffer
Definition: RTWrapper.h:180
RTWWorld NewWorld() override
struct RTWHandle * RTWCamera
Definition: Types.h:220
#define ospSetVec3f
Definition: RTWrapper.h:144
void SetVec4f(RTWObject object, const char *id, float x, float y, float z, float w) override
RTWFrameBufferChannel
Definition: Types.h:25
RTWCamera NewCamera(const char *type) override
#define ospSetVec2i
Definition: RTWrapper.h:141
#define ospNewVolume
Definition: RTWrapper.h:169
RTWGeometricModel NewGeometricModel(RTWGeometry geometry) override
struct RTWHandle * RTWGeometry
Definition: Types.h:220
void SetObject(RTWObject object, const char *id, RTWObject other) override
RTWTransferFunction NewTransferFunction(const char *type) override
void Release(RTWObject object) override
RTWFrameBufferFormat
Definition: Types.h:17
struct RTWHandle * RTWData
Definition: Types.h:220
#define ospNewInstance
Definition: RTWrapper.h:175
RTWTextureFormat
Definition: Types.h:93
RTWFeature
Definition: Types.h:240
boost::graph_traits< vtkGraph * >::vertex_descriptor target(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
#define OSP_TEXTURE_R8
Definition: RTWrapper.h:104
#define OSP_TEXTURE_R32F
Definition: RTWrapper.h:101
RTWData NewCopyData1D(const void *source, RTWDataType dataType, size_t numElements) override
#define OSP_TEXTURE_SRGBA
Definition: RTWrapper.h:110
#define ospNewSharedData2D
Definition: RTWrapper.h:161
#define ospSetVec4f
Definition: RTWrapper.h:145
#define ospSetString
Definition: RTWrapper.h:146
#define ospSetInt
Definition: RTWrapper.h:140
void SetObjectAsData(RTWObject target, const char *id, RTWDataType type, RTWObject obj) override
#define OSP_TEXTURE_LA8
Definition: RTWrapper.h:108
void Commit(RTWObject object) override
const void * MapFrameBuffer(RTWFrameBuffer frameBuffer, const RTWFrameBufferChannel channel) override
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
struct RTWHandle * RTWGeometricModel
Definition: Types.h:220
struct RTWHandle * RTWFrameBuffer
Definition: Types.h:220
void SetParam(RTWObject object, const char *id, RTWDataType dataType, const void *mem) override
#define ospRemoveParam
Definition: RTWrapper.h:151
#define ospNewSharedData3D
Definition: RTWrapper.h:162
int GetDepthTextureGL(RTWFrameBuffer) override
#define ospSetVec3i
Definition: RTWrapper.h:142
#define ospSetFloat
Definition: RTWrapper.h:138
RTWDataType
Definition: Types.h:119
int y
Definition: Types.h:209
struct RTWHandle * RTWWorld
Definition: Types.h:220
int x
Definition: Types.h:209
struct RTWHandle * RTWGroup
Definition: Types.h:220
Definition: Backend.h:5
#define ospSetBool
Definition: RTWrapper.h:139
#define ospNewTexture
Definition: RTWrapper.h:166
struct RTWHandle * RTWTransferFunction
Definition: Types.h:220
RTWVolumetricModel NewVolumetricModel(RTWVolume volume) override
struct RTWHandle * RTWMaterial
Definition: Types.h:220
RTWData NewSharedData2D(const void *sharedData, RTWDataType type, uint32_t numItems1, uint32_t numItems2) override
#define ospNewTransferFunction
Definition: RTWrapper.h:168
void RemoveParam(RTWObject object, const char *id) override
void Shutdown() override
Definition: OSPRayBackend.h:98
#define ospNewCamera
Definition: RTWrapper.h:164
#define ospUnmapFrameBuffer
Definition: RTWrapper.h:181
struct RTWHandle * RTWTexture
Definition: Types.h:220
RTWLight NewLight(const char *light_type) override
#define OSPData
Definition: RTWrapper.h:20
#define OSP_FB_RGBA32F
Definition: RTWrapper.h:112
#define OSP_FB_RGBA8
Definition: RTWrapper.h:113
#define ospNewGroup
Definition: RTWrapper.h:163
OSPFrameBufferFormat convert(RTWFrameBufferFormat format)
Definition: OSPRayBackend.h:17
#define OSP_FB_SRGBA
Definition: RTWrapper.h:114
RTWTexture NewTexture(const char *type) override
RTWData NewData(RTWDataType dataType, size_t numElements) override
#define ospNewRenderer
Definition: RTWrapper.h:177
#define OSP_TEXTURE_RGBA8
Definition: RTWrapper.h:106
#define ospNewFrameBuffer
Definition: RTWrapper.h:176
void SetVec2i(RTWObject object, const char *id, int x, int y) override
struct RTWHandle * RTWVolume
Definition: Types.h:220
RTWData NewCopyData3D(const void *source, RTWDataType dataType, size_t numElements, size_t numElements2, size_t numElements3) override
void SetBool(RTWObject object, const char *id, bool x) override
struct RTWHandle * RTWLight
Definition: Types.h:220
#define OSP_TEXTURE_L8
Definition: RTWrapper.h:107
#define OSP_TEXTURE_SRGB
Definition: RTWrapper.h:109
RTWGeometry NewGeometry(const char *type) override
#define ospSetParam
Definition: RTWrapper.h:147
RTWError
Definition: Types.h:6
RTWInstance NewInstance(RTWGroup geometry) override