virtual void Run(RenderThread& aRenderThread, WindowId aWindowId) override { aRenderThread.UpdateAndRender(aWindowId); wr_renderer_readback(aRenderThread.GetRenderer(aWindowId)->GetWrRenderer(), mSize.width, mSize.height, mBuffer, mBufferSize); layers::AutoCompleteTask complete(mTask); }
void CanvasContext::invokeFunctor(RenderThread& thread, Functor* functor) { ATRACE_CALL(); DrawGlInfo::Mode mode = DrawGlInfo::kModeProcessNoContext; if (thread.eglManager().hasEglContext()) { mode = DrawGlInfo::kModeProcess; } thread.renderState().invokeFunctor(functor, mode, nullptr); }
void CanvasContext::trimMemory(RenderThread& thread, int level) { // No context means nothing to free if (!thread.eglManager().hasEglContext()) return; thread.eglManager().requireGlContext(); if (level >= TRIM_MEMORY_COMPLETE) { Caches::getInstance().flush(Caches::kFlushMode_Full); thread.eglManager().destroy(); } else if (level >= TRIM_MEMORY_UI_HIDDEN) { Caches::getInstance().flush(Caches::kFlushMode_Moderate); } }
CanvasContext::CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode, IContextFactory* contextFactory) : mRenderThread(thread) , mEglManager(thread.eglManager()) , mOpaque(!translucent) , mAnimationContext(contextFactory->createAnimationContext(mRenderThread.timeLord())) , mRootRenderNode(rootRenderNode) , mJankTracker(thread.timeLord().frameIntervalNanos()) , mProfiler(mFrames) { mRenderThread.renderState().registerCanvasContext(this); mProfiler.setDensity(mRenderThread.mainDisplayInfo().density); }
virtual void Run(RenderThread& aRenderThread, WindowId aWindowId) override { auto renderer = aRenderThread.GetRenderer(aWindowId); if (renderer) { renderer->SetProfilerEnabled(mEnabled); } }
Duint __stdcall RenderThread::HandleRunner(Dvoid* parameter) { RenderThread* thread = (RenderThread*)parameter; Dbool isShutDown = false; while( !isShutDown ) { DWORD dwWaitResult = WaitForMultipleObjects(2, thread->m_arrHandleWorkEvent.data(), FALSE, INFINITE); if( dwWaitResult == WAIT_OBJECT_0 ) thread->Run(); else if( dwWaitResult == (WAIT_OBJECT_0 + 1) ) isShutDown = true; } return 0; }
CanvasContext::CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode, IContextFactory* contextFactory) : mRenderThread(thread) , mEglManager(thread.eglManager()) , mEglSurface(EGL_NO_SURFACE) , mDirtyRegionsEnabled(false) , mOpaque(!translucent) , mCanvas(NULL) , mHaveNewSurface(false) , mRootRenderNode(rootRenderNode) { mAnimationContext = contextFactory->createAnimationContext(mRenderThread.timeLord()); mRenderThread.renderState().registerCanvasContext(this); }
virtual void Run(RenderThread& aRenderThread, WindowId aWindowId) override { layers::AutoCompleteTask complete(mTask); RefPtr<gl::GLContext> gl; if (gfx::gfxVars::UseWebRenderANGLE()) { gl = gl::GLContextProviderEGL::CreateForCompositorWidget(mCompositorWidget, true); if (!gl || !gl->IsANGLE()) { gfxCriticalNote << "Failed ANGLE GL context creation for WebRender: " << gfx::hexa(gl.get()); return; } } if (!gl) { gl = gl::GLContextProvider::CreateForCompositorWidget(mCompositorWidget, true); } if (!gl || !gl->MakeCurrent()) { gfxCriticalNote << "Failed GL context creation for WebRender: " << gfx::hexa(gl.get()); return; } gl->fGetIntegerv(LOCAL_GL_MAX_TEXTURE_SIZE, mMaxTextureSize); *mUseANGLE = gl->IsANGLE(); WrRenderer* wrRenderer = nullptr; if (!wr_window_new(aWindowId, mSize.width, mSize.height, gl.get(), this->mEnableProfiler, mWrApi, &wrRenderer)) { // wr_window_new puts a message into gfxCriticalNote if it returns false return; } MOZ_ASSERT(wrRenderer); RefPtr<RenderThread> thread = &aRenderThread; auto renderer = MakeUnique<RendererOGL>(Move(thread), Move(gl), Move(mCompositorWidget), aWindowId, wrRenderer, mBridge); if (wrRenderer && renderer) { WrExternalImageHandler handler = renderer->GetExternalImageHandler(); wr_renderer_set_external_image_handler(wrRenderer, &handler); } aRenderThread.AddRenderer(aWindowId, Move(renderer)); }
void CanvasContext::setTextureAtlas(RenderThread& thread, const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize) { thread.eglManager().setTextureAtlas(buffer, map, mapSize); }
int RenderServer::Main() { RenderThreadsSet threads; while(1) { SocketStream *stream = m_listenSock->accept(); if (!stream) { fprintf(stderr,"Error accepting connection, aborting\n"); break; } unsigned int clientFlags; if (!stream->readFully(&clientFlags, sizeof(unsigned int))) { fprintf(stderr,"Error reading clientFlags\n"); delete stream; continue; } DBG("\n\n\n\n Got new stream!!!! \n\n\n\n\n"); // check if we have been requested to exit while waiting on accept if ((clientFlags & IOSTREAM_CLIENT_EXIT_SERVER) != 0) { m_exiting = true; break; } RenderThread *rt = RenderThread::create(stream); if (!rt) { fprintf(stderr,"Failed to create RenderThread\n"); delete stream; } if (!rt->start()) { fprintf(stderr,"Failed to start RenderThread\n"); delete stream; delete rt; } // // remove from the threads list threads which are // no longer running // for (RenderThreadsSet::iterator n,t = threads.begin(); t != threads.end(); t = n) { // first find next iterator n = t; n++; // delete and erase the current iterator // if thread is no longer running if ((*t)->isFinished()) { delete (*t); threads.erase(t); } } // insert the added thread to the list threads.insert(rt); DBG("Started new RenderThread\n"); } // // Wait for all threads to finish // for (RenderThreadsSet::iterator t = threads.begin(); t != threads.end(); t++) { int exitStatus; (*t)->wait(&exitStatus); delete (*t); } threads.clear(); // // de-initialize the FrameBuffer object // FrameBuffer::finalize(); return 0; }
virtual void run() override { mRenderThread->dispatchFrameCallbacks(); }
virtual void Run(RenderThread& aRenderThread, WindowId aWindowId) override { *mResult = aRenderThread.Resume(aWindowId); layers::AutoCompleteTask complete(mTask); }
virtual void Run(RenderThread& aRenderThread, WindowId aWindowId) override { aRenderThread.Pause(aWindowId); layers::AutoCompleteTask complete(mTask); }