From b05b8bae8bb1c26fca8e4d3b1ffa382e1dda09ab Mon Sep 17 00:00:00 2001 From: Simon Fels Date: Tue, 8 Nov 2016 18:07:00 +0100 Subject: [PATCH] Implement quick&dirty approach to update window size and position --- .../host/libs/libOpenglRender/FrameBuffer.cpp | 7 ++++++ .../host/libs/libOpenglRender/FrameBuffer.h | 1 + .../libs/libOpenglRender/LayerManager.cpp | 22 ++++++++++++------- .../libs/libOpenglRender/NativeSubWindow.h | 3 +++ .../NativeSubWindow_delegate.cpp | 7 ++++++ src/anbox/ubuntu/window.cpp | 8 +++++++ src/anbox/ubuntu/window.h | 3 +++ src/anbox/ubuntu/window_creator.cpp | 9 ++++++++ src/anbox/ubuntu/window_creator.h | 1 + 9 files changed, 53 insertions(+), 8 deletions(-) diff --git a/external/android-emugl/host/libs/libOpenglRender/FrameBuffer.cpp b/external/android-emugl/host/libs/libOpenglRender/FrameBuffer.cpp index 0d47b68..fc304ac 100644 --- a/external/android-emugl/host/libs/libOpenglRender/FrameBuffer.cpp +++ b/external/android-emugl/host/libs/libOpenglRender/FrameBuffer.cpp @@ -497,6 +497,13 @@ FrameBufferWindow* FrameBuffer::createWindow(int x, int y, int width, int height return window; } +void FrameBuffer::updateWindow(FrameBufferWindow *window, int x, int y, int width, int height) { + if (!window) + return; + + updateSubWindow(window->native_window, x, y, width, height); +} + void FrameBuffer::destroyWindow(FrameBufferWindow *window) { if (!window) return; diff --git a/external/android-emugl/host/libs/libOpenglRender/FrameBuffer.h b/external/android-emugl/host/libs/libOpenglRender/FrameBuffer.h index 5eb9c60..1a4808d 100644 --- a/external/android-emugl/host/libs/libOpenglRender/FrameBuffer.h +++ b/external/android-emugl/host/libs/libOpenglRender/FrameBuffer.h @@ -79,6 +79,7 @@ public: static bool initialize(EGLNativeDisplayType nativeDisplay); FrameBufferWindow* createWindow(int x, int y, int width, int height); + void updateWindow(FrameBufferWindow *window, int x, int y, int width, int height); void destroyWindow(FrameBufferWindow *window); // Finalize the instance. diff --git a/external/android-emugl/host/libs/libOpenglRender/LayerManager.cpp b/external/android-emugl/host/libs/libOpenglRender/LayerManager.cpp index e5e65fb..ee62a72 100644 --- a/external/android-emugl/host/libs/libOpenglRender/LayerManager.cpp +++ b/external/android-emugl/host/libs/libOpenglRender/LayerManager.cpp @@ -82,13 +82,16 @@ void LayerManager::post_layer(const LayerInfo &layer) { l.second.updated = true; } } - else { - printf("New layer '%s' {%d,%d,%d,%d}\n", layer.name.c_str()); - window = FrameBuffer::getFB()->createWindow( - layer.display_frame.left, - layer.display_frame.top, - layer.display_frame.right, - layer.display_frame.bottom); + + auto width = layer.display_frame.right - layer.display_frame.left; + auto height = layer.display_frame.bottom - layer.display_frame.top; + + if (!window) { + auto buffer = FrameBuffer::getFB()->getColorBufferFromHandle(layer.buffer_handle); + + window = FrameBuffer::getFB()->createWindow(layer.display_frame.left, + layer.display_frame.top, + width, height); if (!window) { printf("Failed to create window for layer '%s'\n", layer.name.c_str()); return; @@ -97,7 +100,10 @@ void LayerManager::post_layer(const LayerInfo &layer) { } printf("%s: window %p buffer %d\n", __func__, window, layer.buffer_handle); - + FrameBuffer::getFB()->updateWindow(window, + layer.display_frame.left, + layer.display_frame.top, + width, height); FrameBuffer::getFB()->post(window, layer.buffer_handle); } diff --git a/external/android-emugl/host/libs/libOpenglRender/NativeSubWindow.h b/external/android-emugl/host/libs/libOpenglRender/NativeSubWindow.h index 21a379c..bc3540c 100644 --- a/external/android-emugl/host/libs/libOpenglRender/NativeSubWindow.h +++ b/external/android-emugl/host/libs/libOpenglRender/NativeSubWindow.h @@ -30,6 +30,7 @@ class SubWindowHandler { public: virtual ~SubWindowHandler() { } virtual EGLNativeWindowType create_window(int x, int y, int width, int height) = 0; + virtual void update_window(EGLNativeWindowType win, int x, int y, int width, int height) = 0; virtual void destroy_window(EGLNativeWindowType win) = 0; }; @@ -55,6 +56,8 @@ EGLNativeWindowType createSubWindow(FBNativeWindowType p_window, int width, int height); +void updateSubWindow(EGLNativeWindowType win, int x, int y, int width, int height); + // Destroy a sub-window previously created through createSubWindow() above. void destroySubWindow(EGLNativeWindowType win); diff --git a/external/android-emugl/host/libs/libOpenglRender/NativeSubWindow_delegate.cpp b/external/android-emugl/host/libs/libOpenglRender/NativeSubWindow_delegate.cpp index 1eab521..172e3da 100644 --- a/external/android-emugl/host/libs/libOpenglRender/NativeSubWindow_delegate.cpp +++ b/external/android-emugl/host/libs/libOpenglRender/NativeSubWindow_delegate.cpp @@ -44,6 +44,13 @@ EGLNativeWindowType createSubWindow(FBNativeWindowType p_window, return current_handler->create_window(x, y, width, height); } +void updateSubWindow(EGLNativeWindowType win, int x, int y, int width, int height) { + if (!current_handler) + return; + + return current_handler->update_window(win, x, y, width, height); +} + void destroySubWindow(EGLNativeWindowType win) { if (!current_handler) return; diff --git a/src/anbox/ubuntu/window.cpp b/src/anbox/ubuntu/window.cpp index e5c59c0..53b67ed 100644 --- a/src/anbox/ubuntu/window.cpp +++ b/src/anbox/ubuntu/window.cpp @@ -62,6 +62,14 @@ Window::~Window() { SDL_DestroyWindow(window_); } +void Window::resize(int width, int height) { + SDL_SetWindowSize(window_, width, height); +} + +int Window::update_position(int x, int y) { + SDL_SetWindowPosition(window_, x, y); +} + EGLNativeWindowType Window::native_window() const { return native_window_; } diff --git a/src/anbox/ubuntu/window.h b/src/anbox/ubuntu/window.h index 7911082..a0ef3f7 100644 --- a/src/anbox/ubuntu/window.h +++ b/src/anbox/ubuntu/window.h @@ -32,6 +32,9 @@ public: Window(int x, int y, int width, int height); ~Window(); + void resize(int width, int height); + int update_position(int x, int y); + EGLNativeWindowType native_window() const; private: diff --git a/src/anbox/ubuntu/window_creator.cpp b/src/anbox/ubuntu/window_creator.cpp index 80522ae..6bd21f1 100644 --- a/src/anbox/ubuntu/window_creator.cpp +++ b/src/anbox/ubuntu/window_creator.cpp @@ -91,6 +91,15 @@ catch (std::exception &err) { return 0; } +void WindowCreator::update_window(EGLNativeWindowType win, int x, int y, int width, int height) { + auto iter = windows_.find(win); + if (iter == windows_.end()) + return; + + iter->second->resize(width, height); + iter->second->update_position(x, y); +} + void WindowCreator::destroy_window(EGLNativeWindowType win) { auto iter = windows_.find(win); if (iter == windows_.end()) diff --git a/src/anbox/ubuntu/window_creator.h b/src/anbox/ubuntu/window_creator.h index b8e827e..3f35394 100644 --- a/src/anbox/ubuntu/window_creator.h +++ b/src/anbox/ubuntu/window_creator.h @@ -39,6 +39,7 @@ public: ~WindowCreator(); EGLNativeWindowType create_window(int x, int y, int width, int height) override; + void update_window(EGLNativeWindowType win, int x, int y, int width, int height) override; void destroy_window(EGLNativeWindowType win) override; DisplayInfo display_info() const override;