1 // Copyright 2009-2021 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #pragma once
5 
6 #include <unordered_set>
7 #include <vector>
8 #include "api/ISPCDevice.h"
9 #include "MultiDeviceLoadBalancer.h"
10 #include "MultiDeviceObject.h"
11 #include "MultiDeviceRenderTask.h"
12 
13 // MultiDevice.h Implements the a multiplexor for other OSPRay devices which
14 // this simply farms work out to in an image parallel fashion.
15 
16 namespace ospray {
17 namespace api {
18 
19 struct MultiDevice : public Device
20 {
21   MultiDevice() = default;
22 
23   /////////////////////////////////////////////////////////////////////////
24   // ManagedObject Implementation /////////////////////////////////////////
25   /////////////////////////////////////////////////////////////////////////
26 
27   void commit() override;
28 
29   /////////////////////////////////////////////////////////////////////////
30   // Device Implementation ////////////////////////////////////////////////
31   /////////////////////////////////////////////////////////////////////////
32 
33   int loadModule(const char *name) override;
34 
35   // OSPRay Data Arrays ///////////////////////////////////////////////////
36 
37   OSPData newSharedData(const void *sharedData,
38       OSPDataType,
39       const vec3ul &numItems,
40       const vec3l &byteStride) override;
41 
42   OSPData newData(OSPDataType, const vec3ul &numItems) override;
43 
44   void copyData(const OSPData source,
45       OSPData destination,
46       const vec3ul &destinationIndex) override;
47 
48   // Renderable Objects ///////////////////////////////////////////////////
49 
50   OSPLight newLight(const char *type) override;
51 
52   OSPCamera newCamera(const char *type) override;
53 
54   OSPGeometry newGeometry(const char *type) override;
55   OSPVolume newVolume(const char *type) override;
56 
57   OSPGeometricModel newGeometricModel(OSPGeometry geom) override;
58   OSPVolumetricModel newVolumetricModel(OSPVolume volume) override;
59 
60   // Model Meta-Data //////////////////////////////////////////////////////
61 
62   OSPMaterial newMaterial(
63       const char * /*ignored*/, const char *material_type) override;
64 
65   OSPTransferFunction newTransferFunction(const char *type) override;
66 
67   OSPTexture newTexture(const char *type) override;
68 
69   // Instancing ///////////////////////////////////////////////////////////
70 
71   OSPGroup newGroup() override;
72   OSPInstance newInstance(OSPGroup group) override;
73 
74   // Top-level Worlds /////////////////////////////////////////////////////
75 
76   OSPWorld newWorld() override;
77   box3f getBounds(OSPObject) override;
78 
79   // Object + Parameter Lifetime Management ///////////////////////////////
80 
81   void setObjectParam(OSPObject object,
82       const char *name,
83       OSPDataType type,
84       const void *mem) override;
85 
86   void removeObjectParam(OSPObject object, const char *name) override;
87 
88   void commit(OSPObject object) override;
89   void release(OSPObject _obj) override;
90   void retain(OSPObject _obj) override;
91 
92   // FrameBuffer Manipulation /////////////////////////////////////////////
93 
94   OSPFrameBuffer frameBufferCreate(const vec2i &size,
95       const OSPFrameBufferFormat mode,
96       const uint32 channels) override;
97 
98   OSPImageOperation newImageOp(const char *type) override;
99 
100   const void *frameBufferMap(
101       OSPFrameBuffer fb, const OSPFrameBufferChannel) override;
102 
103   void frameBufferUnmap(const void *mapped, OSPFrameBuffer fb) override;
104 
105   float getVariance(OSPFrameBuffer) override;
106 
107   void resetAccumulation(OSPFrameBuffer _fb) override;
108 
109   // Frame Rendering //////////////////////////////////////////////////////
110 
111   OSPRenderer newRenderer(const char *type) override;
112 
113   OSPFuture renderFrame(
114       OSPFrameBuffer, OSPRenderer, OSPCamera, OSPWorld) override;
115 
116   int isReady(OSPFuture, OSPSyncEvent) override;
117   void wait(OSPFuture, OSPSyncEvent) override;
118   void cancel(OSPFuture) override;
119   float getProgress(OSPFuture) override;
120   float getTaskDuration(OSPFuture) override;
121 
122   OSPPickResult pick(
123       OSPFrameBuffer, OSPRenderer, OSPCamera, OSPWorld, const vec2f &) override;
124 
125  private:
126   std::unique_ptr<MultiDeviceLoadBalancer> loadBalancer;
127   std::vector<std::unique_ptr<ISPCDevice>> subdevices;
128 };
129 
130 extern "C" OSPError OSPRAY_DLLEXPORT ospray_module_init_multi(
131     int16_t versionMajor, int16_t versionMinor, int16_t /*versionPatch*/);
132 
133 } // namespace api
134 } // namespace ospray
135