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

Commit 0c0ec263 authored by Chris Craik's avatar Chris Craik
Browse files

Simplify projection matrix management.

Store in and use from snapshot, and remove the kFlagOrthoDirty flag,
as it's redundant with kFlagIsFboLayer.

Change-Id: I2bd380192d50117f4ce1fd2058213669a886f406
parent f9920667
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -57,9 +57,6 @@ DisplayListData* DisplayListRenderer::finishRecording() {
}

void DisplayListRenderer::setViewport(int width, int height) {
    // TODO: DisplayListRenderer shouldn't have a projection matrix, as it should never be used
    mProjectionMatrix.loadOrtho(0, width, height, 0, -1, 1);

    initializeViewport(width, height);
}

+13 −15
Original line number Diff line number Diff line
@@ -171,7 +171,7 @@ void OpenGLRenderer::setViewport(int width, int height) {
}

void OpenGLRenderer::initViewport(int width, int height) {
    mProjectionMatrix.loadOrtho(0, width, height, 0, -1, 1);
    mSnapshot->orthoMatrix.loadOrtho(0, width, height, 0, -1, 1);

    initializeViewport(width, height);
}
@@ -621,14 +621,13 @@ void OpenGLRenderer::flushLayerUpdates() {
///////////////////////////////////////////////////////////////////////////////

void OpenGLRenderer::onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) {
    bool restoreOrtho = removed.flags & Snapshot::kFlagDirtyOrtho;
    bool restoreViewport = removed.flags & Snapshot::kFlagIsFboLayer;
    bool restoreClip = removed.flags & Snapshot::kFlagClipSet;
    bool restoreLayer = removed.flags & Snapshot::kFlagIsLayer;

    if (restoreOrtho) {
    if (restoreViewport) {
        const Rect& r = restored.viewport;
        glViewport(r.left, r.top, r.right, r.bottom);
        mProjectionMatrix.load(removed.orthoMatrix); // TODO: should ortho be stored in 'restored'?
    }

    if (restoreClip) {
@@ -847,14 +846,12 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip) {
    layer->setFbo(mCaches.fboCache.get());

    mSnapshot->region = &mSnapshot->layer->region;
    mSnapshot->flags |= Snapshot::kFlagFboTarget | Snapshot::kFlagIsFboLayer |
            Snapshot::kFlagDirtyOrtho;
    mSnapshot->flags |= Snapshot::kFlagFboTarget | Snapshot::kFlagIsFboLayer;
    mSnapshot->fbo = layer->getFbo();
    mSnapshot->resetTransform(-bounds.left, -bounds.top, 0.0f);
    mSnapshot->resetClip(clip.left, clip.top, clip.right, clip.bottom);
    mSnapshot->viewport.set(0.0f, 0.0f, bounds.getWidth(), bounds.getHeight());
    mSnapshot->height = bounds.getHeight();
    mSnapshot->orthoMatrix.load(mProjectionMatrix);

    endTiling();
    debugOverdraw(false, false);
@@ -883,8 +880,7 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip) {

    // Change the ortho projection
    glViewport(0, 0, bounds.getWidth(), bounds.getHeight());

    mProjectionMatrix.loadOrtho(0.0f, bounds.getWidth(), bounds.getHeight(), 0.0f, -1.0f, 1.0f);
    mSnapshot->orthoMatrix.loadOrtho(0.0f, bounds.getWidth(), bounds.getHeight(), 0.0f, -1.0f, 1.0f);

    return true;
}
@@ -1694,12 +1690,14 @@ void OpenGLRenderer::setupDrawModelView(ModelViewMode mode, bool offset,
    }

    bool dirty = right - left > 0.0f && bottom - top > 0.0f;
    const Matrix4& transformMatrix = ignoreTransform ? Matrix4::identity() : *currentTransform();
    mCaches.currentProgram->set(mSnapshot->orthoMatrix, mModelViewMatrix, transformMatrix, offset);
    if (dirty && mTrackDirtyRegions) {
        if (!ignoreTransform) {
        mCaches.currentProgram->set(mProjectionMatrix, mModelViewMatrix, *currentTransform(), offset);
        if (dirty && mTrackDirtyRegions) dirtyLayer(left, top, right, bottom, *currentTransform());
            dirtyLayer(left, top, right, bottom, *currentTransform());
        } else {
        mCaches.currentProgram->set(mProjectionMatrix, mModelViewMatrix, mat4::identity(), offset);
        if (dirty && mTrackDirtyRegions) dirtyLayer(left, top, right, bottom);
            dirtyLayer(left, top, right, bottom);
        }
    }
}

+0 −3
Original line number Diff line number Diff line
@@ -930,9 +930,6 @@ private:
     */
    Texture* getTexture(const SkBitmap* bitmap);

    // Ortho matrix used for projection in shaders
    mat4 mProjectionMatrix;

    /**
     * Model-view matrix used to position/size objects
     *
+1 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ Snapshot::Snapshot(const sp<Snapshot>& s, int saveFlags)
        , empty(false)
        , viewport(s->viewport)
        , height(s->height)
        , orthoMatrix(s->orthoMatrix)
        , alpha(s->alpha) {

    if (saveFlags & SkCanvas::kMatrix_SaveFlag) {
+5 −6
Original line number Diff line number Diff line
@@ -65,17 +65,16 @@ public:
         * Indicates that this snapshot is a special type of layer
         * backed by an FBO. This flag only makes sense when the
         * flag kFlagIsLayer is also set.
         *
         * Viewport has been modified to fit the new Fbo, and must be
         * restored when this snapshot is restored.
         */
        kFlagIsFboLayer = 0x4,
        /**
         * Indicates that this snapshot has changed the ortho matrix.
         */
        kFlagDirtyOrtho = 0x8,
        /**
         * Indicates that this snapshot or an ancestor snapshot is
         * an FBO layer.
         */
        kFlagFboTarget = 0x10
        kFlagFboTarget = 0x8,
    };

    /**
@@ -183,7 +182,7 @@ public:
    int height;

    /**
     * Contains the previous ortho matrix.
     * Contains the current orthographic, projection matrix.
     */
    mat4 orthoMatrix;