Merge "Add a sprinkle of speculative anti-crash dust"
This commit is contained in:
commit
058b705883
@ -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) {
|
||||
|
@ -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,
|
||||
|
@ -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();
|
||||
|
@ -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
54
libs/hwui/utils/Result.h
Normal 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
|
Loading…
x
Reference in New Issue
Block a user