From 1df0964af5a31bfeed380caca302d019daf398f2 Mon Sep 17 00:00:00 2001 From: fpemud Date: Fri, 10 Nov 2017 12:40:02 +0800 Subject: [PATCH 1/7] fix --- scripts/gen-emugl-entries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/gen-emugl-entries.py b/scripts/gen-emugl-entries.py index a122ef7..23dcd61 100755 --- a/scripts/gen-emugl-entries.py +++ b/scripts/gen-emugl-entries.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 # Copyright 2015 The Android Open Source Project # From 2e632eb41c553448ec2e0d3b4cbbd45960aaea23 Mon Sep 17 00:00:00 2001 From: MatthiasSchuster Date: Sat, 9 Dec 2017 23:36:57 +0100 Subject: [PATCH 2/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a1a54f0..9639b5a 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ $ anbox-installer This will guide you through the installation process. -**NOTE:** Anbox is currently in a **pre-alpha development state**. Don't expect a +**NOTE:** Anbox is currently in a **alpha development state**. Don't expect a fully working system for a production system with all features you need. You will for sure see bugs and crashes. If you do so, please don't hestitate and report them! From 785136fd3697c0b236d58b3d12fee429cb81ea1a Mon Sep 17 00:00:00 2001 From: Gianfranco Costamagna Date: Mon, 19 Mar 2018 11:46:59 +0100 Subject: [PATCH 3/7] GLESv2Imp: fix bad return statement android-emugl: add formatting strings to fprintf output, fixing possible security issue --- .../libs/Translator/GLES_V2/.GLESv2Imp.cpp.swp | Bin 16384 -> 0 bytes .../host/libs/Translator/GLES_V2/GLESv2Imp.cpp | 2 ++ .../android-emugl/host/tools/emugen/ApiGen.cpp | 3 +-- .../host/tools/emugen/EntryPoint.cpp | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) delete mode 100644 external/android-emugl/host/libs/Translator/GLES_V2/.GLESv2Imp.cpp.swp diff --git a/external/android-emugl/host/libs/Translator/GLES_V2/.GLESv2Imp.cpp.swp b/external/android-emugl/host/libs/Translator/GLES_V2/.GLESv2Imp.cpp.swp deleted file mode 100644 index 8102470c466227658d4ea2ddf8c32b58a732f10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 LIglGetIntegerv(pname,params)) { if (destroyCtx) + { deleteGLESContext(ctx); return; + } } bool es2 = ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY; diff --git a/external/android-emugl/host/tools/emugen/ApiGen.cpp b/external/android-emugl/host/tools/emugen/ApiGen.cpp index fc6c031..f912cb5 100644 --- a/external/android-emugl/host/tools/emugen/ApiGen.cpp +++ b/external/android-emugl/host/tools/emugen/ApiGen.cpp @@ -1158,8 +1158,7 @@ int ApiGen::genDecoderImpl(const std::string &filename) varoffset.c_str(), varoffset.c_str(), varoffset.c_str(), - classname.c_str(), - e->name().c_str() + classname.c_str() ); varoffset += " + 4"; diff --git a/external/android-emugl/host/tools/emugen/EntryPoint.cpp b/external/android-emugl/host/tools/emugen/EntryPoint.cpp index cc3bef1..8f91c83 100644 --- a/external/android-emugl/host/tools/emugen/EntryPoint.cpp +++ b/external/android-emugl/host/tools/emugen/EntryPoint.cpp @@ -99,7 +99,7 @@ bool EntryPoint::parse(unsigned int lc, const std::string & str) std::string vartype, varname; if (!parseParameterDeclaration(field, &vartype, &varname, &error)) { fprintf(stderr, - "line: %d: Parsing error in field <%s>\n", + "line: %d: Parsing error in field <%s>, error: %s\n", lc, field.c_str(), error.c_str()); From a02f2ab47c5dc331fe592cad20ee0c3afebda817 Mon Sep 17 00:00:00 2001 From: Gianfranco Costamagna Date: Mon, 19 Mar 2018 11:55:06 +0100 Subject: [PATCH 4/7] Add verbosity to build --- scripts/clean-build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/clean-build.sh b/scripts/clean-build.sh index d1041a4..fb05249 100755 --- a/scripts/clean-build.sh +++ b/scripts/clean-build.sh @@ -55,9 +55,9 @@ cleanup mkdir build || rm -rf build/* cd build -cmake .. -make -j10 -make test +cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo +VERBOSE=1 make -j10 +VERBOSE=1 make test cd .. cleanup From df143a08f9ce5f94f680227d97fe95e803722ef4 Mon Sep 17 00:00:00 2001 From: Gianfranco Costamagna Date: Mon, 19 Mar 2018 11:55:43 +0100 Subject: [PATCH 5/7] Bump compat level to 9 and std-version to 4.1.3 --- debian/compat | 2 +- debian/control | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/debian/compat b/debian/compat index 7f8f011..ec63514 100644 --- a/debian/compat +++ b/debian/compat @@ -1 +1 @@ -7 +9 diff --git a/debian/control b/debian/control index 8696f8e..72e3872 100644 --- a/debian/control +++ b/debian/control @@ -2,8 +2,8 @@ Source: anbox Section: misc Priority: optional Maintainer: Simon Fels -Build-Depends: debhelper (>= 7), dkms, dh-systemd -Standards-Version: 3.9.7 +Build-Depends: debhelper (>= 9), dkms, dh-systemd +Standards-Version: 4.1.3 Homepage: http://anbox.io Vcs-Browser: https://github.com/anbox/anbox Vcs-Git: https://github.com/anbox/anbox.git From cfb336e17496561c86e591489712c2a60d6d1ea7 Mon Sep 17 00:00:00 2001 From: Gianfranco Costamagna Date: Mon, 14 May 2018 11:58:43 +0200 Subject: [PATCH 6/7] CMakeLists.txt: Default build type to RelWithDebInfo if none is defined --- CMakeLists.txt | 4 ++-- scripts/clean-build.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3901428..df9d6fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,8 +5,8 @@ include(CTest) include(GNUInstallDirs) if (NOT CMAKE_BUILD_TYPE) - message(STATUS "No build type selected, default to release") - set(CMAKE_BUILD_TYPE "release") + message(STATUS "No build type selected, default to RelWithDebInfo") + set(CMAKE_BUILD_TYPE "RelWithDebInfo") endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) diff --git a/scripts/clean-build.sh b/scripts/clean-build.sh index fb05249..3e1e766 100755 --- a/scripts/clean-build.sh +++ b/scripts/clean-build.sh @@ -55,7 +55,7 @@ cleanup mkdir build || rm -rf build/* cd build -cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo +cmake .. VERBOSE=1 make -j10 VERBOSE=1 make test cd .. From ceae29b2d2d126f2a6d38223face8ecae55b87d0 Mon Sep 17 00:00:00 2001 From: Simon Fels Date: Mon, 14 May 2018 06:09:13 +0200 Subject: [PATCH 7/7] emugl: limit set of extensions we expose to Android If we expose too many extensions we don't support ourself yet (like EGL_ANDROID_native_fence_sync) then we get unexpected corruption or missing screen updates in our rendered output. Fixes #635, #457, #692, #582 (and a few more duplicates) --- src/anbox/graphics/emugl/RenderControl.cpp | 98 +++++++++++++--------- 1 file changed, 58 insertions(+), 40 deletions(-) diff --git a/src/anbox/graphics/emugl/RenderControl.cpp b/src/anbox/graphics/emugl/RenderControl.cpp index 26e9559..2a2c453 100644 --- a/src/anbox/graphics/emugl/RenderControl.cpp +++ b/src/anbox/graphics/emugl/RenderControl.cpp @@ -26,9 +26,9 @@ #include "external/android-emugl/shared/OpenglCodecCommon/ChecksumCalculatorThreadInfo.h" #include "external/android-emugl/host/include/OpenGLESDispatch/EGLDispatch.h" - #include #include +#include static const GLint rendererVersion = 1; static std::shared_ptr composer; @@ -55,53 +55,61 @@ static EGLint rcGetEGLVersion(EGLint *major, EGLint *minor) { return EGL_TRUE; } -static EGLint rcQueryEGLString(EGLenum name, void *buffer, EGLint bufferSize) { +static std::string filter_extensions(const std::string& extensions, const std::vector& whitelist) { + std::stringstream approved_extensions; + auto extension_list = anbox::utils::string_split(extensions, ' '); + for (const auto& ext : extension_list) { + if (std::find(whitelist.begin(), whitelist.end(), ext) == whitelist.end()) + continue; + + if (approved_extensions.tellp() > 0) + approved_extensions << " "; + + approved_extensions << ext; + } + return approved_extensions.str(); +} + +static EGLint rcQueryEGLString(EGLenum name, void* buffer, EGLint bufferSize) { if (!renderer) return 0; - auto result = s_egl.eglQueryString(renderer->getDisplay(), name); - if (!result) + std::string result = s_egl.eglQueryString(renderer->getDisplay(), name); + if (result.empty()) return 0; - std::string approved_result = result; - - // We need to drop a few extensions from the list reported by the driver - // as not all are well enough support by our EGL/GLES stack. if (name == EGL_EXTENSIONS) { - std::vector common_unsupported_extensions = { - // Leads to crashes on the Android side when SurfaceFlinger initializes - // EGL/GLES and it queries surfaces for available attributes. - "EGL_EXT_buffer_age" + // We need to drop a few extensions from the list reported by the driver + // as not all are well enough support by our EGL implementation. + std::vector whitelisted_extensions = { + "EGL_KHR_image_base", + "EGL_KHR_gl_texture_2D_image", }; - - for (const auto &extension : common_unsupported_extensions) { - size_t start_pos = approved_result.find(extension); - if (start_pos == std::string::npos) continue; - approved_result.replace(start_pos, extension.length(), ""); - } + result = filter_extensions(result, whitelisted_extensions); } - int len = approved_result.length() + 1; + int len = result.length() + 1; if (!buffer || len > bufferSize) { return -len; } - strcpy(static_cast(buffer), approved_result.c_str()); + strcpy(static_cast(buffer), result.c_str()); return len; } -static EGLint rcGetGLString(EGLenum name, void *buffer, EGLint bufferSize) { - RenderThreadInfo *tInfo = RenderThreadInfo::get(); +static EGLint rcGetGLString(EGLenum name, void* buffer, EGLint bufferSize) { + RenderThreadInfo* tInfo = RenderThreadInfo::get(); std::string result; if (tInfo && tInfo->currContext) { - const char *str = nullptr; + const char* str = nullptr; if (tInfo->currContext->isGL2()) - str = reinterpret_cast(s_gles2.glGetString(name)); + str = reinterpret_cast(s_gles2.glGetString(name)); else - str = reinterpret_cast(s_gles1.glGetString(name)); + str = reinterpret_cast(s_gles1.glGetString(name)); - if (str) result += str; + if (str) + result += str; } // We're forcing version 2.0 no matter what the host provides as @@ -113,27 +121,37 @@ static EGLint rcGetGLString(EGLenum name, void *buffer, EGLint bufferSize) { if (name == GL_VERSION) result = "OpenGL ES 2.0"; else if (name == GL_EXTENSIONS) { - std::string approved_extensions = result; - std::vector unsupported_extensions = { - // Leaving this enabled gives crippeled text rendering when - // using the host mesa GLES drivers. - "GL_EXT_unpack_subimage", + // We need to drop a few extensions from the list reported by the driver + // as not all are well enough support by our GL implementation. + std::vector whitelisted_extensions = { + "GL_OES_EGL_image", + "GL_OES_EGL_image_external", + "GL_OES_depth24", + "GL_OES_depth32", + "GL_OES_element_index_uint", + "GL_OES_texture_float", + "GL_OES_texture_float_linear", + "GL_OES_compressed_paletted_texture", + "GL_OES_compressed_ETC1_RGB8_texture", + "GL_OES_depth_texture", + "GL_OES_texture_half_float", + "GL_OES_texture_half_float_linear", + "GL_OES_packed_depth_stencil", + "GL_OES_vertex_half_float", + "GL_OES_standard_derivatives", + "GL_OES_texture_npot", + "GL_OES_rgb8_rgba8", }; - for (const auto &extension : unsupported_extensions) { - size_t start_pos = approved_extensions.find(extension); - if (start_pos == std::string::npos) continue; - approved_extensions.replace(start_pos, extension.length(), ""); - } - - result = approved_extensions; + result = filter_extensions(result, whitelisted_extensions); } int nextBufferSize = result.size() + 1; - if (!buffer || nextBufferSize > bufferSize) return -nextBufferSize; + if (!buffer || nextBufferSize > bufferSize) + return -nextBufferSize; - snprintf(static_cast(buffer), nextBufferSize, "%s", result.c_str()); + snprintf(static_cast(buffer), nextBufferSize, "%s", result.c_str()); return nextBufferSize; }