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