diff --git a/external/android-emugl/host/libs/libOpenglRender/CMakeLists.txt b/external/android-emugl/host/libs/libOpenglRender/CMakeLists.txt index bbf5b9a..701ea8c 100644 --- a/external/android-emugl/host/libs/libOpenglRender/CMakeLists.txt +++ b/external/android-emugl/host/libs/libOpenglRender/CMakeLists.txt @@ -1,8 +1,10 @@ set(SOURCES ColorBuffer.cpp + DisplayManager.cpp FbConfig.cpp FrameBuffer.cpp LayerManager.cpp + NativeSubWindow.h NativeSubWindow_delegate.cpp ReadBuffer.cpp RenderContext.cpp diff --git a/external/android-emugl/host/libs/libOpenglRender/DisplayManager.cpp b/external/android-emugl/host/libs/libOpenglRender/DisplayManager.cpp new file mode 100644 index 0000000..2e26a81 --- /dev/null +++ b/external/android-emugl/host/libs/libOpenglRender/DisplayManager.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2016 Simon Fels + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + * + */ + +#include "DisplayManager.h" + +namespace { +std::shared_ptr display_mgr; + +class NullDisplayManager : public DisplayManager { +public: + DisplayInfo display_info() const override { + return {1280, 720}; + } +}; +} + +DisplayManager::~DisplayManager() { +} + +std::shared_ptr DisplayManager::get() { + if (!display_mgr) + display_mgr = std::make_shared(); + return display_mgr; +} + +void registerDisplayManager(const std::shared_ptr &mgr) { + display_mgr = mgr; +} diff --git a/external/android-emugl/host/libs/libOpenglRender/DisplayManager.h b/external/android-emugl/host/libs/libOpenglRender/DisplayManager.h new file mode 100644 index 0000000..beb678a --- /dev/null +++ b/external/android-emugl/host/libs/libOpenglRender/DisplayManager.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2016 Simon Fels + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + * + */ + +#ifndef DISPLAY_MANAGER_H_ +#define DISPLAY_MANAGER_H_ + +#include + +class DisplayManager { +public: + virtual ~DisplayManager(); + + struct DisplayInfo { + int horizontal_resolution; + int vertical_resolution; + }; + + virtual DisplayInfo display_info() const = 0; + + static std::shared_ptr get(); +}; + +void registerDisplayManager(const std::shared_ptr &mgr); + +#endif diff --git a/external/android-emugl/host/libs/libOpenglRender/RenderControl.cpp b/external/android-emugl/host/libs/libOpenglRender/RenderControl.cpp index c36769a..618f454 100644 --- a/external/android-emugl/host/libs/libOpenglRender/RenderControl.cpp +++ b/external/android-emugl/host/libs/libOpenglRender/RenderControl.cpp @@ -21,6 +21,7 @@ #include "RenderThreadInfo.h" #include "ChecksumCalculatorThreadInfo.h" #include "LayerManager.h" +#include "DisplayManager.h" #include "OpenGLESDispatch/EGLDispatch.h" @@ -160,12 +161,10 @@ static EGLint rcGetFBParam(EGLint param) switch(param) { case FB_WIDTH: - // FIXME DISPLAY MANAGER!! - ret = 1920; + ret = DisplayManager::get()->display_info().horizontal_resolution; break; case FB_HEIGHT: - // FIXME DISPLAY MANAGER!! - ret = 1080; + ret = DisplayManager::get()->display_info().vertical_resolution; break; case FB_XDPI: ret = 72; // XXX: should be implemented @@ -404,12 +403,12 @@ int rcGetNumDisplays() { int rcGetDisplayWidth(uint32_t display_id) { printf("%s: display_id=%d\n", __func__, display_id); - return 1920; + return DisplayManager::get()->display_info().horizontal_resolution; } int rcGetDisplayHeight(uint32_t display_id) { printf("%s: display_id=%d\n", __func__, display_id); - return 1080; + return DisplayManager::get()->display_info().vertical_resolution; } int rcGetDisplayDpiX(uint32_t display_id) { diff --git a/src/anbox/graphics/gl_renderer_server.cpp b/src/anbox/graphics/gl_renderer_server.cpp index 3b6d3af..3d02370 100644 --- a/src/anbox/graphics/gl_renderer_server.cpp +++ b/src/anbox/graphics/gl_renderer_server.cpp @@ -46,6 +46,7 @@ GLRendererServer::GLRendererServer(const std::shared_ptr &window_ BOOST_THROW_EXCEPTION(std::runtime_error("Failed to initialize OpenGL renderer")); registerSubWindowHandler(window_creator_); + registerDisplayManager(window_creator_); } GLRendererServer::~GLRendererServer() { @@ -81,14 +82,6 @@ void GLRendererServer::start() { BOOST_THROW_EXCEPTION(std::runtime_error("Failed to setup OpenGL renderer")); socket_path_ = server_addr; - -#if 0 - // Create the window we use for rendering the output we get from the - // Android container. This will internally construct a Mir surface - // and use the host EGL/GLES libraries for rendering. - if (!showOpenGLSubwindow(0, 0, 0, width, height, width, height, 1.0f, 0)) - BOOST_THROW_EXCEPTION(std::runtime_error("Failed to setup GL based window")); -#endif } std::string GLRendererServer::socket_path() const { diff --git a/src/anbox/graphics/window_creator.h b/src/anbox/graphics/window_creator.h index 00cd8be..66d3c23 100644 --- a/src/anbox/graphics/window_creator.h +++ b/src/anbox/graphics/window_creator.h @@ -19,23 +19,19 @@ #define ANBOX_GRAPHICS_WINDOW_CREATOR_H_ #include "external/android-emugl/host/libs/libOpenglRender/NativeSubWindow.h" +#include "external/android-emugl/host/libs/libOpenglRender/DisplayManager.h" namespace anbox { namespace input { class Manager; } // namespace input namespace graphics { -class WindowCreator : public SubWindowHandler { +class WindowCreator : public SubWindowHandler, + public DisplayManager { public: WindowCreator(const std::shared_ptr &input_manager); virtual ~WindowCreator(); - struct DisplayInfo { - int horizontal_resolution; - int vertical_resolution; - }; - - virtual DisplayInfo display_info() const = 0; virtual EGLNativeDisplayType native_display() const = 0; protected: