Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit deea2df0 authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Fix OpenGL errors in various places."

parents 95ee9628 29d8997b
Loading
Loading
Loading
Loading
+11 −5
Original line number Original line Diff line number Diff line
@@ -1584,11 +1584,7 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn
        mAttachInfo.mRootView = null;
        mAttachInfo.mRootView = null;
        mAttachInfo.mSurface = null;
        mAttachInfo.mSurface = null;


        if (mHwRenderer != null) {
        destroyHardwareRenderer();
            mHwRenderer.destroy(true);
            mHwRenderer = null;
            mAttachInfo.mHardwareAccelerated = false;
        }


        mSurface.release();
        mSurface.release();


@@ -2542,6 +2538,8 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn
        if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface);
        if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface);
        synchronized (this) {
        synchronized (this) {
            if (mAdded && !mFirst) {
            if (mAdded && !mFirst) {
                destroyHardwareRenderer();

                int viewVisibility = mView.getVisibility();
                int viewVisibility = mView.getVisibility();
                boolean viewVisibilityChanged = mViewVisibility != viewVisibility;
                boolean viewVisibilityChanged = mViewVisibility != viewVisibility;
                if (mWindowAttributesChanged || viewVisibilityChanged) {
                if (mWindowAttributesChanged || viewVisibilityChanged) {
@@ -2566,6 +2564,14 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn
        }
        }
    }
    }


    private void destroyHardwareRenderer() {
        if (mHwRenderer != null) {
            mHwRenderer.destroy(true);
            mHwRenderer = null;
            mAttachInfo.mHardwareAccelerated = false;
        }
    }

    public void dispatchFinishedEvent(int seq, boolean handled) {
    public void dispatchFinishedEvent(int seq, boolean handled) {
        Message msg = obtainMessage(FINISHED_EVENT);
        Message msg = obtainMessage(FINISHED_EVENT);
        msg.arg1 = seq;
        msg.arg1 = seq;
+3 −0
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@
#include "ProgramCache.h"
#include "ProgramCache.h"
#include "PathCache.h"
#include "PathCache.h"
#include "TextDropShadowCache.h"
#include "TextDropShadowCache.h"
#include "Line.h"


namespace android {
namespace android {
namespace uirenderer {
namespace uirenderer {
@@ -64,6 +65,8 @@ public:
    PatchCache patchCache;
    PatchCache patchCache;
    TextDropShadowCache dropShadowCache;
    TextDropShadowCache dropShadowCache;
    GammaFontRenderer fontRenderer;
    GammaFontRenderer fontRenderer;

    Line line;
}; // class Caches
}; // class Caches


}; // namespace uirenderer
}; // namespace uirenderer
+11 −6
Original line number Original line Diff line number Diff line
@@ -133,6 +133,8 @@ OpenGLRenderer::OpenGLRenderer(): mCaches(Caches::getInstance()) {


OpenGLRenderer::~OpenGLRenderer() {
OpenGLRenderer::~OpenGLRenderer() {
    LOGD("Destroy OpenGLRenderer");
    LOGD("Destroy OpenGLRenderer");
    // The context has already been destroyed at this point, do not call
    // GL APIs. All GL state should be kept in Caches.h
}
}


///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
@@ -615,14 +617,14 @@ void OpenGLRenderer::drawLines(float* points, int count, const SkPaint* paint) {
    const bool isAA = paint->isAntiAlias();
    const bool isAA = paint->isAntiAlias();
    if (isAA) {
    if (isAA) {
        GLuint textureUnit = 0;
        GLuint textureUnit = 0;
        setupTextureAlpha8(mLine.getTexture(), 0, 0, textureUnit, 0.0f, 0.0f, r, g, b, a,
        setupTextureAlpha8(mCaches.line.getTexture(), 0, 0, textureUnit, 0.0f, 0.0f, r, g, b, a,
                mode, false, true, mLine.getVertices(), mLine.getTexCoords());
                mode, false, true, mCaches.line.getVertices(), mCaches.line.getTexCoords());
    } else {
    } else {
        setupColorRect(0.0f, 0.0f, 1.0f, 1.0f, r, g, b, a, mode, false);
        setupColorRect(0.0f, 0.0f, 1.0f, 1.0f, r, g, b, a, mode, false);
    }
    }


    const float strokeWidth = paint->getStrokeWidth();
    const float strokeWidth = paint->getStrokeWidth();
    const GLsizei elementsCount = isAA ? mLine.getElementsCount() : gMeshCount;
    const GLsizei elementsCount = isAA ? mCaches.line.getElementsCount() : gMeshCount;
    const GLenum drawMode = isAA ? GL_TRIANGLES : GL_TRIANGLE_STRIP;
    const GLenum drawMode = isAA ? GL_TRIANGLES : GL_TRIANGLE_STRIP;


    for (int i = 0; i < count; i += 4) {
    for (int i = 0; i < count; i += 4) {
@@ -630,7 +632,7 @@ void OpenGLRenderer::drawLines(float* points, int count, const SkPaint* paint) {
        float ty = 0.0f;
        float ty = 0.0f;


        if (isAA) {
        if (isAA) {
            mLine.update(points[i], points[i + 1], points[i + 2], points[i + 3],
            mCaches.line.update(points[i], points[i + 1], points[i + 2], points[i + 3],
                    strokeWidth, tx, ty);
                    strokeWidth, tx, ty);
        } else {
        } else {
            ty = strokeWidth <= 1.0f ? 0.0f : -strokeWidth * 0.5f;
            ty = strokeWidth <= 1.0f ? 0.0f : -strokeWidth * 0.5f;
@@ -647,7 +649,8 @@ void OpenGLRenderer::drawLines(float* points, int count, const SkPaint* paint) {
        }
        }
        mModelView.translate(tx, ty, 0.0f);
        mModelView.translate(tx, ty, 0.0f);
        if (!isAA) {
        if (!isAA) {
            float length = mLine.getLength(points[i], points[i + 1], points[i + 2], points[i + 3]);
            float length = mCaches.line.getLength(points[i], points[i + 1],
                    points[i + 2], points[i + 3]);
            mModelView.scale(length, strokeWidth, 1.0f);
            mModelView.scale(length, strokeWidth, 1.0f);
        }
        }
        mCaches.currentProgram->set(mOrthoMatrix, mModelView, *mSnapshot->transform);
        mCaches.currentProgram->set(mOrthoMatrix, mModelView, *mSnapshot->transform);
@@ -659,8 +662,10 @@ void OpenGLRenderer::drawLines(float* points, int count, const SkPaint* paint) {
        glDrawArrays(drawMode, 0, elementsCount);
        glDrawArrays(drawMode, 0, elementsCount);
    }
    }


    if (isAA) {
        glDisableVertexAttribArray(mCaches.currentProgram->getAttrib("texCoords"));
        glDisableVertexAttribArray(mCaches.currentProgram->getAttrib("texCoords"));
    }
    }
}


void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) {
void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) {
    const Rect& clip = *mSnapshot->clipRect;
    const Rect& clip = *mSnapshot->clipRect;
+0 −4
Original line number Original line Diff line number Diff line
@@ -40,7 +40,6 @@
#include "SkiaShader.h"
#include "SkiaShader.h"
#include "SkiaColorFilter.h"
#include "SkiaColorFilter.h"
#include "Caches.h"
#include "Caches.h"
#include "Line.h"


namespace android {
namespace android {
namespace uirenderer {
namespace uirenderer {
@@ -420,9 +419,6 @@ private:
    // List of rectangles to clear due to calls to saveLayer()
    // List of rectangles to clear due to calls to saveLayer()
    Vector<Rect*> mLayers;
    Vector<Rect*> mLayers;


    // Single object used to draw lines
    Line mLine;

    // Misc
    // Misc
    GLint mMaxTextureSize;
    GLint mMaxTextureSize;


+6 −1
Original line number Original line Diff line number Diff line
@@ -94,6 +94,11 @@ void SkiaBitmapShader::describe(ProgramDescription& description, const Extension
        description.isBitmapNpot = true;
        description.isBitmapNpot = true;
        description.bitmapWrapS = gTileModes[mTileX];
        description.bitmapWrapS = gTileModes[mTileX];
        description.bitmapWrapT = gTileModes[mTileY];
        description.bitmapWrapT = gTileModes[mTileY];
        mWrapS = GL_CLAMP_TO_EDGE;
        mWrapT = GL_CLAMP_TO_EDGE;
    } else {
        mWrapS = gTileModes[mTileX];
        mWrapT = gTileModes[mTileY];
    }
    }
}
}


@@ -121,7 +126,7 @@ void SkiaBitmapShader::setupProgram(Program* program, const mat4& modelView,
    }
    }


    // Uniforms
    // Uniforms
    bindTexture(texture->id, gTileModes[mTileX], gTileModes[mTileY], textureSlot);
    bindTexture(texture->id, mWrapS, mWrapT, textureSlot);
    glUniform1i(program->getUniform("bitmapSampler"), textureSlot);
    glUniform1i(program->getUniform("bitmapSampler"), textureSlot);
    glUniformMatrix4fv(program->getUniform("textureTransform"), 1,
    glUniformMatrix4fv(program->getUniform("textureTransform"), 1,
            GL_FALSE, &textureTransform.data[0]);
            GL_FALSE, &textureTransform.data[0]);
Loading