예제 #1
0
void Window::_updateSwap( const uint32_t frameNumber )
{
    if( _maxFPS < std::numeric_limits< float >::max( ))
    {
        WindowThrottleFramerate packetThrottle;
        packetThrottle.minFrameTime = 1000.0f / _maxFPS;
        
        send( packetThrottle );
        EQLOG( LOG_TASKS ) << "TASK Throttle framerate  " 
                               << &packetThrottle << std::endl;

        _maxFPS = std::numeric_limits< float >::max();
    }
    
    for( std::vector<co::Barrier*>::iterator i = _swapBarriers.begin();
         i != _swapBarriers.end(); ++i )
    {
        const co::Barrier* barrier = *i;

        if( barrier->getHeight() <= 1 )
        {
            EQINFO << "Ignoring swap barrier of height " << barrier->getHeight()
                   << std::endl;
            continue;
        }

        WindowBarrierPacket packet;
        packet.barrier = barrier;
        send( packet );

        EQLOG( LOG_TASKS ) << "TASK barrier  " << &packet << std::endl;
    }

    if( _nvNetBarrier )
    {
        if( _nvNetBarrier->getHeight() <= 1 )
        {
            EQWARN << "Ignoring NV swap barrier of height "
                   << _nvNetBarrier->getHeight() << std::endl;
        }
        else
        {
            EQASSERT( _nvSwapBarrier );
            EQASSERT( _nvSwapBarrier->isNvSwapBarrier( ));
            // Entering the NV_swap_group. The _nvNetBarrier is also part of
            // _swapBarriers, which means that the pre-join was already sync'ed
            // with a barrier.

            // Now enter the swap group and post-sync with the barrier again.
            WindowNVBarrierPacket packet;
            packet.barrier = _nvSwapBarrier->getNVSwapBarrier();
            packet.group   = _nvSwapBarrier->getNVSwapGroup();
            packet.netBarrier = _nvNetBarrier;
            send( packet );
        }
    }

    _resetSwapBarriers();

    if( _swap )
    {
        WindowSwapPacket packet;

        send( packet );
        EQLOG( LOG_TASKS ) << "TASK swap  " << &packet << std::endl;
    }
}
예제 #2
0
void Window::_updateSwap( const uint32_t frameNumber )
{
    if( _swapFinish )
    {
        send( fabric::CMD_WINDOW_FINISH );
        LBLOG( LOG_TASKS ) << "TASK finish " << frameNumber << std::endl;
        _swapFinish = false;
    }

    if( _maxFPS < std::numeric_limits< float >::max( ))
    {
        const float minFrameTime = 1000.0f / _maxFPS;
        send( fabric::CMD_WINDOW_THROTTLE_FRAMERATE ) << minFrameTime;
        LBLOG( LOG_TASKS ) << "TASK Throttle framerate  "
                               << minFrameTime << std::endl;

        _maxFPS = std::numeric_limits< float >::max();
    }

    for( co::BarriersCIter i = _swapBarriers.begin();
         i != _swapBarriers.end(); ++i )
    {
        const co::Barrier* barrier = *i;
        if( barrier->getHeight() <= 1 )
        {
            LBVERB << "Ignoring swap barrier of height " << barrier->getHeight()
                   << std::endl;
            continue;
        }

        send( fabric::CMD_WINDOW_BARRIER ) << co::ObjectVersion( barrier );
        LBLOG( LOG_TASKS ) << "TASK barrier  barrier "
                           << co::ObjectVersion( barrier ) << std::endl;
    }

    if( _nvNetBarrier )
    {
        if( _nvNetBarrier->getHeight() <= 1 )
        {
            LBWARN << "Ignoring NV swap barrier of height "
                   << _nvNetBarrier->getHeight() << std::endl;
        }
        else
        {
            LBASSERT( _nvSwapBarrier );
            LBASSERT( _nvSwapBarrier->isNvSwapBarrier( ));
            // Entering the NV_swap_group. The _nvNetBarrier is also part of
            // _swapBarriers, which means that the pre-join was already sync'ed
            // with a barrier.

            // Now enter the swap group and post-sync with the barrier again.
            send( fabric::CMD_WINDOW_NV_BARRIER )
                    << co::ObjectVersion( _nvNetBarrier )
                    << _nvSwapBarrier->getNVSwapGroup()
                    << _nvSwapBarrier->getNVSwapBarrier();
        }
    }

    _resetSwapBarriers();

    if( _swap )
    {
        send( fabric::CMD_WINDOW_SWAP );
        LBLOG( LOG_TASKS ) << "TASK swap  " << frameNumber << std::endl;
    }
}