1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
// Copyright 2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#include "MultiDeviceLoadBalancer.h"
#include "MultiDevice.h"
#include "fb/LocalFB.h"
#include "fb/SparseFB.h"
#include <rkcommon/utility/ArrayView.h>
namespace ospray {
MultiDeviceLoadBalancer::MultiDeviceLoadBalancer(
const std::vector<std::shared_ptr<TiledLoadBalancer>> &loadBalancers)
: loadBalancers(loadBalancers)
{}
void MultiDeviceLoadBalancer::renderFrame(
api::MultiDeviceFrameBuffer *framebuffer,
api::MultiDeviceObject *renderer,
api::MultiDeviceObject *camera,
api::MultiDeviceObject *world)
{
framebuffer->rowmajorFb->beginFrame();
// Schedule rendering on all devices
std::vector<std::pair<devicert::AsyncEvent, devicert::AsyncEvent>> events(
framebuffer->objects.size());
for (uint32_t i = 0; i < framebuffer->objects.size(); i++) {
SparseFrameBuffer *fbi = (SparseFrameBuffer *)framebuffer->objects[i];
Renderer *ri = (Renderer *)renderer->objects[i];
Camera *ci = (Camera *)camera->objects[i];
World *wi = (World *)world->objects[i];
if (fbi->getTileIDs().size() != 0)
events[i] = loadBalancers[i]->renderFrame(fbi, ri, ci, wi);
}
// Wait for all devices to finish
for (uint32_t i = 0; i < framebuffer->objects.size(); i++) {
events[i].first.wait();
events[i].second.wait();
SparseFrameBuffer *fbi = (SparseFrameBuffer *)framebuffer->objects[i];
framebuffer->rowmajorFb->writeTiles(fbi);
}
framebuffer->rowmajorFb->setCompletedEvent(OSP_WORLD_RENDERED);
// We need to call post-processing operations on fully compositioned
// (rowmajorFb) frame buffer and wait for it to finish
devicert::AsyncEvent event = framebuffer->rowmajorFb->postProcess();
event.wait();
for (uint32_t i = 0; i < framebuffer->objects.size(); i++) {
SparseFrameBuffer *fbi = (SparseFrameBuffer *)framebuffer->objects[i];
fbi->setCompletedEvent(OSP_FRAME_FINISHED);
}
framebuffer->rowmajorFb->setCompletedEvent(OSP_FRAME_FINISHED);
}
std::string MultiDeviceLoadBalancer::toString() const
{
return "ospray::MultiDeviceLoadBalancer";
}
} // namespace ospray
|