25 #include <ospray/SDK/fb/FrameBuffer.h>
27 #include <platform/engines/ospray/Utils.h>
31 std::future<bool> make_ready_future()
33 std::promise<bool> promise;
34 promise.set_value(
true);
35 return promise.get_future();
38 #pragma omp declare simd
39 inline unsigned char clampCvt(
float f)
45 return f * 255.f + .5f;
48 const size_t ALIGNMENT = 64;
63 if (!_parent._deflectStream)
65 const size_t numTiles = fb->getTotalTiles();
66 if (_pixels.size() < numTiles)
68 _pixels.resize(numTiles);
70 for (
auto& i : _pixels)
75 i.reset((
unsigned char*)_mm_malloc(TILE_SIZE * TILE_SIZE * 4, ALIGNMENT));
76 memset(i.get(), 255, TILE_SIZE * TILE_SIZE * 4);
83 if (!_parent._deflectStream)
86 auto sharedFuture = _parent._deflectStream->finishFrame().share();
87 for (
auto& i : _parent._finishFutures)
88 i.second = sharedFuture;
93 if (!_parent._deflectStream)
96 const auto& fbSize = fb->getNumPixels();
97 ::ospray::vec2i tileSize{TILE_SIZE, TILE_SIZE};
99 if (tile.region.lower.x + TILE_SIZE > fbSize.x)
100 tileSize.x = fbSize.x % TILE_SIZE;
101 if (tile.region.lower.y + TILE_SIZE > fbSize.y)
102 tileSize.y = fbSize.y % TILE_SIZE;
104 deflect::ImageWrapper image(_copyPixels(tile, tileSize), tileSize.x, tileSize.y, deflect::RGBA, tile.region.lower.x,
105 tile.region.lower.y);
106 image.compressionPolicy = _parent._params.getCompression() ? deflect::COMPRESSION_ON : deflect::COMPRESSION_OFF;
107 image.compressionQuality = _parent._params.getQuality();
108 image.subsampling = _parent._params.getChromaSubsampling();
109 image.rowOrder = _parent._params.isTopDown() ? deflect::RowOrder::top_down : deflect::RowOrder::bottom_up;
111 const auto name = fb->getParamString(
"name");
117 auto i = _parent._finishFutures.find(pthread_self());
118 if (i == _parent._finishFutures.end())
121 std::lock_guard<std::mutex> _lock(_parent._mutex);
122 _parent._finishFutures.insert({pthread_self(), make_ready_future()});
127 _parent._deflectStream->send(image).get();
129 catch (
const std::exception& exc)
131 std::cerr <<
"Encountered error during sendImage: " << exc.what() << std::endl;
135 unsigned char* DeflectPixelOp::Instance::_copyPixels(::ospray::Tile& tile, const ::ospray::vec2i& tileSize)
137 const size_t tileID = tile.region.lower.y / TILE_SIZE * fb->getNumTiles().x + tile.region.lower.x / TILE_SIZE;
140 unsigned char* __restrict__ pixels = (
unsigned char*)__builtin_assume_aligned(_pixels[tileID].get(), ALIGNMENT);
142 unsigned char* __restrict__ pixels = _pixels[tileID].get();
144 float* __restrict__ red = tile.r;
145 float* __restrict__ green = tile.g;
146 float* __restrict__ blue = tile.b;
148 if (tileSize.x < TILE_SIZE)
151 for (
int i = 0; i < tileSize.y; ++i)
153 for (
int j = 0; j < tileSize.x; ++j)
155 pixels[index + 0] = clampCvt(red[i * TILE_SIZE + j]);
156 pixels[index + 1] = clampCvt(green[i * TILE_SIZE + j]);
157 pixels[index + 2] = clampCvt(blue[i * TILE_SIZE + j]);
186 #ifdef __INTEL_COMPILER
187 #pragma vector aligned
190 for (
int i = 0; i < TILE_SIZE * TILE_SIZE; ++i)
192 pixels[i * 4 + 0] = clampCvt(red[i]);
193 pixels[i * 4 + 1] = clampCvt(green[i]);
194 pixels[i * 4 + 2] = clampCvt(blue[i]);
205 _deflectStream.reset();
214 catch (
const std::runtime_error& ex)
216 std::cerr <<
"Deflect failed to initialize. " << ex.what() << std::endl;
227 void DeflectPixelOp::_finish()
229 for (
auto& i : _finishFutures)
231 _finishFutures.clear();
std::string getHostname() const
const PropertyMap & getPropertyMap() const
std::string getId() const
void setEnabled(const bool enabled)
::ospray::PixelOp::Instance * createInstance(::ospray::FrameBuffer *fb, PixelOp::Instance *prev) final
void fromOSPRayProperties(PropertyMap &object, ::ospray::ManagedObject &ospObject)
deflect::View getView(const std::string &name)
uint8_t getChannel(const std::string &name)
bool needsReset(const deflect::Observer &stream, const DeflectParameters ¶ms)
OSP_REGISTER_PIXEL_OP(core::DeflectPixelOp, deflectPixelOp)
Instance(::ospray::FrameBuffer *fb_, DeflectPixelOp &parent)
void postAccum(::ospray::Tile &tile) final