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

This commit is contained in:
TreeHugger Robot 2018-11-16 19:19:01 +00:00 committed by Android (Google) Code Review
commit 058b705883
5 changed files with 66 additions and 7 deletions

View File

@ -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) {

View File

@ -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,

View File

@ -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();

View File

@ -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
libs/hwui/utils/Result.h Normal file
View File

@ -0,0 +1,54 @@
/*
* 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