OpenGL硬件加速指南

xiaoxiao2021-02-28  47

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 }

 

转载请注明原文地址: https://www.6miu.com/read-77326.html

最新回复(0)