| 2384 | } // EffectInstance::tiledRenderingFunctor |
| 2385 | |
| 2386 | EffectInstance::RenderingFunctorRetEnum |
| 2387 | EffectInstance::Implementation::renderHandler(const EffectTLSDataPtr& tls, |
| 2388 | const unsigned int mipMapLevel, |
| 2389 | const bool renderFullScaleThenDownscale, |
| 2390 | const bool isSequentialRender, |
| 2391 | const bool isRenderResponseToUserInteraction, |
| 2392 | const RectI & renderMappedRectToRender, |
| 2393 | const RectI & downscaledRectToRender, |
| 2394 | const bool byPassCache, |
| 2395 | const ImageBitDepthEnum outputClipPrefDepth, |
| 2396 | const ImagePlaneDesc & outputClipPrefsComps, |
| 2397 | const std::bitset<4>& processChannels, |
| 2398 | const ImagePtr & originalInputImage, |
| 2399 | const ImagePtr & maskImage, |
| 2400 | const ImagePremultiplicationEnum originalImagePremultiplication, |
| 2401 | ImagePlanesToRender & planes) |
| 2402 | { |
| 2403 | TimeLapsePtr timeRecorder; |
| 2404 | const ParallelRenderArgsPtr& frameArgs = tls->frameArgs.back(); |
| 2405 | |
| 2406 | if (frameArgs->stats) { |
| 2407 | timeRecorder = std::make_shared<TimeLapse>(); |
| 2408 | } |
| 2409 | |
| 2410 | const EffectInstance::PlaneToRender & firstPlane = planes.planes.begin()->second; |
| 2411 | const double time = tls->currentRenderArgs.time; |
| 2412 | const ViewIdx view = tls->currentRenderArgs.view; |
| 2413 | |
| 2414 | // at this point, it may be unnecessary to call render because it was done a long time ago => check the bitmap here! |
| 2415 | # ifndef NDEBUG |
| 2416 | RectI renderBounds = firstPlane.renderMappedImage->getBounds(); |
| 2417 | assert(renderBounds.x1 <= renderMappedRectToRender.x1 && renderMappedRectToRender.x2 <= renderBounds.x2 && |
| 2418 | renderBounds.y1 <= renderMappedRectToRender.y1 && renderMappedRectToRender.y2 <= renderBounds.y2); |
| 2419 | # endif |
| 2420 | |
| 2421 | RenderActionArgs actionArgs; |
| 2422 | actionArgs.byPassCache = byPassCache; |
| 2423 | actionArgs.processChannels = processChannels; |
| 2424 | actionArgs.mappedScale.x = actionArgs.mappedScale.y = Image::getScaleFromMipMapLevel( firstPlane.renderMappedImage->getMipMapLevel() ); |
| 2425 | assert( !( (_publicInterface->supportsRenderScaleMaybe() == eSupportsNo) && !(actionArgs.mappedScale.x == 1. && actionArgs.mappedScale.y == 1.) ) ); |
| 2426 | actionArgs.originalScale.x = Image::getScaleFromMipMapLevel(mipMapLevel); |
| 2427 | actionArgs.originalScale.y = actionArgs.originalScale.x; |
| 2428 | actionArgs.draftMode = frameArgs->draftMode; |
| 2429 | actionArgs.useOpenGL = planes.useOpenGL; |
| 2430 | |
| 2431 | std::list<std::pair<ImagePlaneDesc, ImagePtr> > tmpPlanes; |
| 2432 | bool multiPlanar = _publicInterface->isMultiPlanar(); |
| 2433 | |
| 2434 | actionArgs.roi = renderMappedRectToRender; |
| 2435 | |
| 2436 | |
| 2437 | // Setup the context when rendering using OpenGL |
| 2438 | OSGLContextPtr glContext; |
| 2439 | std::unique_ptr<OSGLContextAttacher> glContextAttacher; |
| 2440 | if (planes.useOpenGL) { |
| 2441 | // Setup the viewport and the framebuffer |
| 2442 | glContext = frameArgs->openGLContext.lock(); |
| 2443 | AbortableRenderInfoPtr abortInfo = frameArgs->abortInfo.lock(); |
nothing calls this directly
no test coverage detected