EglWindow.h revision 441e847feb0e055ecb004802802cea07782ab228
1441e847feb0e055ecb004802802cea07782ab228Andy McFadden/*
2441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Copyright 2013 The Android Open Source Project
3441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
4441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
5441e847feb0e055ecb004802802cea07782ab228Andy McFadden * you may not use this file except in compliance with the License.
6441e847feb0e055ecb004802802cea07782ab228Andy McFadden * You may obtain a copy of the License at
7441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
8441e847feb0e055ecb004802802cea07782ab228Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
9441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
10441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Unless required by applicable law or agreed to in writing, software
11441e847feb0e055ecb004802802cea07782ab228Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
12441e847feb0e055ecb004802802cea07782ab228Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13441e847feb0e055ecb004802802cea07782ab228Andy McFadden * See the License for the specific language governing permissions and
14441e847feb0e055ecb004802802cea07782ab228Andy McFadden * limitations under the License.
15441e847feb0e055ecb004802802cea07782ab228Andy McFadden */
16441e847feb0e055ecb004802802cea07782ab228Andy McFadden
17441e847feb0e055ecb004802802cea07782ab228Andy McFadden#ifndef SCREENRECORD_EGL_WINDOW_H
18441e847feb0e055ecb004802802cea07782ab228Andy McFadden#define SCREENRECORD_EGL_WINDOW_H
19441e847feb0e055ecb004802802cea07782ab228Andy McFadden
20441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <gui/BufferQueue.h>
21441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <utils/Errors.h>
22441e847feb0e055ecb004802802cea07782ab228Andy McFadden
23441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <EGL/egl.h>
24441e847feb0e055ecb004802802cea07782ab228Andy McFadden
25441e847feb0e055ecb004802802cea07782ab228Andy McFaddennamespace android {
26441e847feb0e055ecb004802802cea07782ab228Andy McFadden
27441e847feb0e055ecb004802802cea07782ab228Andy McFadden/*
28441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Wraps EGL display, context, surface, config for a window surface.
29441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
30441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Not thread safe.
31441e847feb0e055ecb004802802cea07782ab228Andy McFadden */
32441e847feb0e055ecb004802802cea07782ab228Andy McFaddenclass EglWindow {
33441e847feb0e055ecb004802802cea07782ab228Andy McFaddenpublic:
34441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EglWindow() :
35441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mEglDisplay(EGL_NO_DISPLAY),
36441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mEglContext(EGL_NO_CONTEXT),
37441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mEglSurface(EGL_NO_SURFACE),
38441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mEglConfig(NULL),
39441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mWidth(0),
40441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mHeight(0)
41441e847feb0e055ecb004802802cea07782ab228Andy McFadden        {}
42441e847feb0e055ecb004802802cea07782ab228Andy McFadden    ~EglWindow() { eglRelease(); }
43441e847feb0e055ecb004802802cea07782ab228Andy McFadden
44441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Creates an EGL window for the supplied surface.
45441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t createWindow(const sp<IGraphicBufferProducer>& surface);
46441e847feb0e055ecb004802802cea07782ab228Andy McFadden
47441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Return width and height values (obtained from IGBP).
48441e847feb0e055ecb004802802cea07782ab228Andy McFadden    int getWidth() const { return mWidth; }
49441e847feb0e055ecb004802802cea07782ab228Andy McFadden    int getHeight() const { return mHeight; }
50441e847feb0e055ecb004802802cea07782ab228Andy McFadden
51441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Release anything we created.
52441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void release() { eglRelease(); }
53441e847feb0e055ecb004802802cea07782ab228Andy McFadden
54441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Make this context current.
55441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t makeCurrent() const;
56441e847feb0e055ecb004802802cea07782ab228Andy McFadden
57441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Sets the presentation time on the current EGL buffer.
58441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void presentationTime(nsecs_t whenNsec) const;
59441e847feb0e055ecb004802802cea07782ab228Andy McFadden
60441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Swaps the EGL buffer.
61441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void swapBuffers() const;
62441e847feb0e055ecb004802802cea07782ab228Andy McFadden
63441e847feb0e055ecb004802802cea07782ab228Andy McFaddenprivate:
64441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EglWindow(const EglWindow&);
65441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EglWindow& operator=(const EglWindow&);
66441e847feb0e055ecb004802802cea07782ab228Andy McFadden
67441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Init display, create config and context.
68441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t eglSetupContext();
69441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void eglRelease();
70441e847feb0e055ecb004802802cea07782ab228Andy McFadden
71441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Basic EGL goodies.
72441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EGLDisplay mEglDisplay;
73441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EGLContext mEglContext;
74441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EGLSurface mEglSurface;
75441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EGLConfig mEglConfig;
76441e847feb0e055ecb004802802cea07782ab228Andy McFadden
77441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Surface dimensions.
78441e847feb0e055ecb004802802cea07782ab228Andy McFadden    int mWidth;
79441e847feb0e055ecb004802802cea07782ab228Andy McFadden    int mHeight;
80441e847feb0e055ecb004802802cea07782ab228Andy McFadden};
81441e847feb0e055ecb004802802cea07782ab228Andy McFadden
82441e847feb0e055ecb004802802cea07782ab228Andy McFadden}; // namespace android
83441e847feb0e055ecb004802802cea07782ab228Andy McFadden
84441e847feb0e055ecb004802802cea07782ab228Andy McFadden#endif /*SCREENRECORD_EGL_WINDOW_H*/
85