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