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

Commit 058b7058 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add a sprinkle of speculative anti-crash dust"

parents 0426d968 8e539ca1
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -164,7 +164,11 @@ bool SkiaOpenGLPipeline::setSurface(Surface* surface, SwapBehavior swapBehavior,

    if (surface) {
        mRenderThread.requireGlContext();
        mEglSurface = mEglManager.createSurface(surface, colorMode);
        auto newSurface = mEglManager.createSurface(surface, colorMode);
        if (!newSurface) {
            return false;
        }
        mEglSurface = newSurface.unwrap();
    }

    if (colorMode == ColorMode::SRGB) {
+4 −4
Original line number Diff line number Diff line
@@ -261,7 +261,7 @@ void EglManager::createPBufferSurface() {
    }
}

EGLSurface EglManager::createSurface(EGLNativeWindowType window, ColorMode colorMode) {
Result<EGLSurface, EGLint> EglManager::createSurface(EGLNativeWindowType window, ColorMode colorMode) {
    LOG_ALWAYS_FATAL_IF(!hasEglContext(), "Not initialized");

    bool wideColorGamut = colorMode == ColorMode::WideColorGamut && EglExtensions.glColorSpace &&
@@ -311,9 +311,9 @@ EGLSurface EglManager::createSurface(EGLNativeWindowType window, ColorMode color

    EGLSurface surface = eglCreateWindowSurface(
            mEglDisplay, wideColorGamut ? mEglConfigWideGamut : mEglConfig, window, attribs);
    LOG_ALWAYS_FATAL_IF(surface == EGL_NO_SURFACE,
                        "Failed to create EGLSurface for window %p, eglErr = %s", (void*)window,
                        eglErrorString());
    if (surface == EGL_NO_SURFACE) {
        return Error<EGLint> { eglGetError() };
    }

    if (mSwapBehavior != SwapBehavior::Preserved) {
        LOG_ALWAYS_FATAL_IF(eglSurfaceAttrib(mEglDisplay, surface, EGL_SWAP_BEHAVIOR,
+2 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <ui/GraphicBuffer.h>
#include <utils/StrongPointer.h>
#include "IRenderPipeline.h"
#include "utils/Result.h"

namespace android {
namespace uirenderer {
@@ -47,7 +48,7 @@ public:

    bool hasEglContext();

    EGLSurface createSurface(EGLNativeWindowType window, ColorMode colorMode);
    Result<EGLSurface, EGLint> createSurface(EGLNativeWindowType window, ColorMode colorMode);
    void destroySurface(EGLSurface surface);

    void destroy();
+1 −1
Original line number Diff line number Diff line
@@ -321,7 +321,7 @@ RENDERTHREAD_TEST(RenderNode, prepareTree_HwLayer_AVD_enqueueDamage) {
    // Check that the VD is in the dislay list, and the layer update queue contains the correct
    // damage rect.
    EXPECT_TRUE(rootNode->getDisplayList()->hasVectorDrawables());
    EXPECT_FALSE(info.layerUpdateQueue->entries().empty());
    ASSERT_FALSE(info.layerUpdateQueue->entries().empty());
    EXPECT_EQ(rootNode.get(), info.layerUpdateQueue->entries().at(0).renderNode.get());
    EXPECT_EQ(uirenderer::Rect(0, 0, 200, 400), info.layerUpdateQueue->entries().at(0).damage);
    canvasContext->destroy();
+54 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <variant>
#include <log/log.h>

namespace android::uirenderer {

template <typename E>
struct Error {
    E error;
};

template <typename R, typename E>
class Result {
public:
    Result(const R& r) : result(std::forward<R>(r)) {}
    Result(R&& r) : result(std::forward<R>(r)) {}
    Result(Error<E>&& error) : result(std::forward<Error<E>>(error)) {}

    operator bool() const {
        return result.index() == 0;
    }

    R unwrap() const {
        LOG_ALWAYS_FATAL_IF(result.index() == 1, "unwrap called on error value!");
        return std::get<R>(result);
    }

    E error() const {
        LOG_ALWAYS_FATAL_IF(result.index() == 0, "No error to get from Result");
        return std::get<Error<E>>(result).error;
    }

private:
    std::variant<R, Error<E>> result;
};

}; // namespace android::uirenderer