X-Git-Url: https://gerrit.akraino.org/r/gitweb?a=blobdiff_plain;f=src%2Ftype3_AndroidCloud%2Fanbox-master%2Fsrc%2Fanbox%2Fgraphics%2Femugl%2FWindowSurface.h;fp=src%2Ftype3_AndroidCloud%2Fanbox-master%2Fsrc%2Fanbox%2Fgraphics%2Femugl%2FWindowSurface.h;h=4b35ddb7a6bfb8b4e5cb61a9b934c92dc54a2a1d;hb=e26c1ec581be598521517829adba8c8dd23a768f;hp=0000000000000000000000000000000000000000;hpb=6699c1aea74eeb0eb400e6299079f0c7576f716f;p=iec.git diff --git a/src/type3_AndroidCloud/anbox-master/src/anbox/graphics/emugl/WindowSurface.h b/src/type3_AndroidCloud/anbox-master/src/anbox/graphics/emugl/WindowSurface.h new file mode 100644 index 0000000..4b35ddb --- /dev/null +++ b/src/type3_AndroidCloud/anbox-master/src/anbox/graphics/emugl/WindowSurface.h @@ -0,0 +1,97 @@ +/* +* Copyright (C) 2011 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. +*/ +#ifndef _LIBRENDER_WINDOW_SURFACE_H +#define _LIBRENDER_WINDOW_SURFACE_H + +#include "anbox/graphics/emugl/ColorBuffer.h" +#include "anbox/graphics/emugl/RenderContext.h" + +#include +#include + +// A class used to model a guest-side window surface. The implementation +// uses a host Pbuffer to act as the EGL rendering surface instead. +class WindowSurface { + public: + // Create a new WindowSurface instance. + // |display| is the host EGLDisplay value. + // |config| is the host EGLConfig value. + // |width| and |height| are the initial size of the Pbuffer. + // Return a new WindowSurface instance on success, or NULL on failure. + static WindowSurface* create(EGLDisplay display, EGLConfig config, int width, + int height); + + // Destructor. + ~WindowSurface(); + + // Retrieve the host EGLSurface of the WindowSurface's Pbuffer. + EGLSurface getEGLSurface() const { return mSurface; } + + // Attach a ColorBuffer to this WindowSurface. + // Once attached, calling flushColorBuffer() will copy the Pbuffer's + // pixels to the color buffer. + // + // IMPORTANT: This automatically resizes the Pbuffer's to the ColorBuffer's + // dimensions. Potentially losing pixel values in the process. + void setColorBuffer(ColorBufferPtr p_colorBuffer); + + // Copy the Pbuffer's pixels to the attached color buffer. + // Returns true on success, or false on error (e.g. if there is no + // attached color buffer). + bool flushColorBuffer(); + + // Used by bind() below. + enum BindType { BIND_READ, + BIND_DRAW, + BIND_READDRAW }; + + // TODO(digit): What is this used for exactly? For example, the + // mReadContext is never used by this class. The mDrawContext is only + // used temporarily during flushColorBuffer() operation, and could be + // passed as a parameter to the function instead. Maybe this is only used + // to increment reference counts on the smart pointers. + // + // Bind a context to the WindowSurface (huh? Normally you would bind a + // surface to the context, not the other way around) + // + // |p_ctx| is a RenderContext pointer. + // |p_bindType| is the type of bind. For BIND_READ, this assigns |p_ctx| + // to mReadContext, for BIND_DRAW, it assigns it to mDrawContext, and for + // for BIND_READDRAW, it assigns it to both. + void bind(RenderContextPtr p_ctx, BindType p_bindType); + + private: + WindowSurface(); + WindowSurface(const WindowSurface& other); + + explicit WindowSurface(EGLDisplay display, EGLConfig config); + + bool resize(unsigned int p_width, unsigned int p_height); + + private: + EGLSurface mSurface; + ColorBufferPtr mAttachedColorBuffer; + RenderContextPtr mReadContext; + RenderContextPtr mDrawContext; + GLuint mWidth; + GLuint mHeight; + EGLConfig mConfig; + EGLDisplay mDisplay; +}; + +typedef std::shared_ptr WindowSurfacePtr; + +#endif // _LIBRENDER_WINDOW_SURFACE_H