void StimulusDisplay::addContext(int _context_id){ context_ids.push_back(_context_id); int contextIndex = context_ids.size() - 1; OpenGLContextLock ctxLock = opengl_context_manager->setCurrent(_context_id); getCurrentViewportSize(bufferWidths[contextIndex], bufferHeights[contextIndex]); CVDisplayLinkRef dl; if (kCVReturnSuccess != CVDisplayLinkCreateWithActiveCGDisplays(&dl)) { throw SimpleException("Unable to create display link"); } displayLinks.push_back(dl); displayLinkContexts.emplace_back(new DisplayLinkContext(this, contextIndex)); if (kCVReturnSuccess != CVDisplayLinkSetOutputCallback(dl, &StimulusDisplay::displayLinkCallback, displayLinkContexts.back().get())) { throw SimpleException("Unable to set display link output callback"); } if (kCVReturnSuccess != opengl_context_manager->prepareDisplayLinkForContext(dl, _context_id)) { throw SimpleException("Unable to associate display link with OpenGL context"); } if (0 == contextIndex) { setMainDisplayRefreshRate(); allocateBufferStorage(); } }
BEGIN_NAMESPACE_MW /********************************************************************** * StimulusDisplay Methods **********************************************************************/ StimulusDisplay::StimulusDisplay(bool drawEveryFrame, bool announceIndividualStimuli) : current_context_index(-1), mainDisplayRefreshRate(0.0), currentOutputTimeUS(-1), announceIndividualStimuli(announceIndividualStimuli), announceStimuliOnImplicitUpdates(true), drawEveryFrame(drawEveryFrame) { // defer creation of the display chain until after the stimulus display has been created display_stack = shared_ptr< LinkedList<StimulusNode> >(new LinkedList<StimulusNode>()); setDisplayBounds(); setBackgroundColor(0.5, 0.5, 0.5); opengl_context_manager = OpenGLContextManager::instance(); clock = Clock::instance(); waitingForRefresh = false; needDraw = false; if (kCVReturnSuccess != CVDisplayLinkCreateWithActiveCGDisplays(&displayLink) || kCVReturnSuccess != CVDisplayLinkSetOutputCallback(displayLink, &StimulusDisplay::displayLinkCallback, this)) { throw SimpleException("Unable to create display link"); } stateSystemNotification = shared_ptr<VariableCallbackNotification>(new VariableCallbackNotification(boost::bind(&StimulusDisplay::stateSystemCallback, this, _1, _2))); state_system_mode->addNotification(stateSystemNotification); }