Loading libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading libs/hwui/renderthread/EglManager.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -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 && Loading Loading @@ -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, Loading libs/hwui/renderthread/EglManager.h +2 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <ui/GraphicBuffer.h> #include <utils/StrongPointer.h> #include "IRenderPipeline.h" #include "utils/Result.h" namespace android { namespace uirenderer { Loading @@ -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(); Loading libs/hwui/tests/unit/RenderNodeTests.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading libs/hwui/utils/Result.h 0 → 100644 +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 Loading
libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading
libs/hwui/renderthread/EglManager.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -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 && Loading Loading @@ -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, Loading
libs/hwui/renderthread/EglManager.h +2 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <ui/GraphicBuffer.h> #include <utils/StrongPointer.h> #include "IRenderPipeline.h" #include "utils/Result.h" namespace android { namespace uirenderer { Loading @@ -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(); Loading
libs/hwui/tests/unit/RenderNodeTests.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading
libs/hwui/utils/Result.h 0 → 100644 +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