OpenGLRenderer.cpp位于Framewoks/base/libs/hwui中
1.构造函数:
OpenGLRenderer::OpenGLRenderer(): mCaches(Caches::getInstance()) { mShader = NULL; mColorFilter = NULL; mHasShadow = false; memcpy(mMeshVertices, gMeshVertices, sizeof(gMeshVertices)); mFirstSnapshot = new Snapshot; }
2.设置View_Projection 和 ViewPort
void OpenGLRenderer::setViewport(int width, int height) { glDisable(GL_DITHER); glViewport(0, 0, width, height); mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); mWidth = width; mHeight = height; mFirstSnapshot->height = height; mFirstSnapshot->viewport.set(0, 0, width, height); mDirtyClip = false; }
3.Prepare
void OpenGLRenderer::prepare(bool opaque) { prepareDirty(0.0f, 0.0f, mWidth, mHeight, opaque); } void OpenGLRenderer::prepareDirty(float left, float top, float right, float bottom, bool opaque) { mCaches.clearGarbage(); mSnapshot = new Snapshot(mFirstSnapshot, SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); mSnapshot->fbo = getTargetFbo(); mSaveCount = 1; glViewport(0, 0, mWidth, mHeight); glEnable(GL_SCISSOR_TEST); glScissor(left, mSnapshot->height - bottom, right - left, bottom - top); mSnapshot->setClip(left, top, right, bottom); if (!opaque) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); } }
4.Interrupt
void OpenGLRenderer::interrupt() { if (mCaches.currentProgram) { if (mCaches.currentProgram->isInUse()) { mCaches.currentProgram->remove(); mCaches.currentProgram = NULL; } } mCaches.unbindMeshBuffer(); }
5.Resume
void OpenGLRenderer::resume() {
glViewport(0, 0, mSnapshot->viewport.getWidth(), mSnapshot->viewport.getHeight());
glEnable(GL_SCISSOR_TEST);
dirtyClip();
glDisable(GL_DITHER);
glBindFramebuffer(GL_FRAMEBUFFER, getTargetFbo());
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
mCaches.blend = true;
glEnable(GL_BLEND);
glBlendFunc(mCaches.lastSrcMode, mCaches.lastDstMode);
glBlendEquation(GL_FUNC_ADD);
}
6. Finish
void OpenGLRenderer::finish() { #if DEBUG_OPENGL GLenum status = GL_NO_ERROR; while ((status = glGetError()) != GL_NO_ERROR) { LOGD("GL error from OpenGLRenderer: 0x%x", status); switch (status) { case GL_OUT_OF_MEMORY: LOGE(" OpenGLRenderer is out of memory!"); break; } } #endif #if DEBUG_MEMORY_USAGE mCaches.dumpMemoryUsage(); #else if (mCaches.getDebugLevel() & kDebugMemory) { mCaches.dumpMemoryUsage(); } #endif }