EglWindow.h revision 587c6fefcd3c1d05c608ff511cf3534bc765256e
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
47587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Creates an EGL pbuffer surface.
48587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    status_t createPbuffer(int width, int height);
49587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
50441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Return width and height values (obtained from IGBP).
51441e847feb0e055ecb004802802cea07782ab228Andy McFadden    int getWidth() const { return mWidth; }
52441e847feb0e055ecb004802802cea07782ab228Andy McFadden    int getHeight() const { return mHeight; }
53441e847feb0e055ecb004802802cea07782ab228Andy McFadden
54441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Release anything we created.
55441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void release() { eglRelease(); }
56441e847feb0e055ecb004802802cea07782ab228Andy McFadden
57441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Make this context current.
58441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t makeCurrent() const;
59441e847feb0e055ecb004802802cea07782ab228Andy McFadden
60441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Sets the presentation time on the current EGL buffer.
61441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void presentationTime(nsecs_t whenNsec) const;
62441e847feb0e055ecb004802802cea07782ab228Andy McFadden
63441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Swaps the EGL buffer.
64441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void swapBuffers() const;
65441e847feb0e055ecb004802802cea07782ab228Andy McFadden
66441e847feb0e055ecb004802802cea07782ab228Andy McFaddenprivate:
67441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EglWindow(const EglWindow&);
68441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EglWindow& operator=(const EglWindow&);
69441e847feb0e055ecb004802802cea07782ab228Andy McFadden
70441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Init display, create config and context.
71587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    status_t eglSetupContext(bool forPbuffer);
72441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void eglRelease();
73441e847feb0e055ecb004802802cea07782ab228Andy McFadden
74441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Basic EGL goodies.
75441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EGLDisplay mEglDisplay;
76441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EGLContext mEglContext;
77441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EGLSurface mEglSurface;
78441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EGLConfig mEglConfig;
79441e847feb0e055ecb004802802cea07782ab228Andy McFadden
80441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Surface dimensions.
81441e847feb0e055ecb004802802cea07782ab228Andy McFadden    int mWidth;
82441e847feb0e055ecb004802802cea07782ab228Andy McFadden    int mHeight;
83441e847feb0e055ecb004802802cea07782ab228Andy McFadden};
84441e847feb0e055ecb004802802cea07782ab228Andy McFadden
85441e847feb0e055ecb004802802cea07782ab228Andy McFadden}; // namespace android
86441e847feb0e055ecb004802802cea07782ab228Andy McFadden
87441e847feb0e055ecb004802802cea07782ab228Andy McFadden#endif /*SCREENRECORD_EGL_WINDOW_H*/
88