1//
2// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Surface.h: Defines the egl::Surface class, representing a drawing surface
8// such as the client area of a window, including any back buffers.
9// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
10
11#ifndef LIBEGL_SURFACE_H_
12#define LIBEGL_SURFACE_H_
13
14#include <EGL/egl.h>
15
16#include "common/angleutils.h"
17
18namespace gl
19{
20class Texture2D;
21}
22namespace rx
23{
24class Renderer;
25class SwapChain;
26}
27
28namespace egl
29{
30class Display;
31class Config;
32
33class Surface
34{
35  public:
36    Surface(Display *display, const egl::Config *config, HWND window, EGLint fixedSize, EGLint width, EGLint height, EGLint postSubBufferSupported);
37    Surface(Display *display, const egl::Config *config, HANDLE shareHandle, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget);
38
39    virtual ~Surface();
40
41    bool initialize();
42    void release();
43    bool resetSwapChain();
44
45    HWND getWindowHandle();
46    bool swap();
47    bool postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height);
48
49    virtual EGLint isPostSubBufferSupported() const;
50
51    virtual rx::SwapChain *getSwapChain() const;
52
53    void setSwapInterval(EGLint interval);
54    bool checkForOutOfDateSwapChain();   // Returns true if swapchain changed due to resize or interval update
55
56    virtual EGLint getConfigID() const;
57    virtual EGLint getWidth() const;
58    virtual EGLint getHeight() const;
59    virtual EGLint getPixelAspectRatio() const;
60    virtual EGLenum getRenderBuffer() const;
61    virtual EGLenum getSwapBehavior() const;
62    virtual EGLenum getTextureFormat() const;
63    virtual EGLenum getTextureTarget() const;
64    virtual EGLenum getFormat() const;
65
66    virtual void setBoundTexture(gl::Texture2D *texture);
67    virtual gl::Texture2D *getBoundTexture() const;
68
69    EGLint isFixedSize() const;
70
71private:
72    DISALLOW_COPY_AND_ASSIGN(Surface);
73
74    Display *const mDisplay;
75    rx::Renderer *mRenderer;
76
77    HANDLE mShareHandle;
78    rx::SwapChain *mSwapChain;
79
80    void subclassWindow();
81    void unsubclassWindow();
82    bool resizeSwapChain(int backbufferWidth, int backbufferHeight);
83    bool resetSwapChain(int backbufferWidth, int backbufferHeight);
84    bool swapRect(EGLint x, EGLint y, EGLint width, EGLint height);
85
86    const HWND mWindow;            // Window that the surface is created for.
87    bool mWindowSubclassed;        // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking
88    const egl::Config *mConfig;    // EGL config surface was created with
89    EGLint mHeight;                // Height of surface
90    EGLint mWidth;                 // Width of surface
91//  EGLint horizontalResolution;   // Horizontal dot pitch
92//  EGLint verticalResolution;     // Vertical dot pitch
93//  EGLBoolean largestPBuffer;     // If true, create largest pbuffer possible
94//  EGLBoolean mipmapTexture;      // True if texture has mipmaps
95//  EGLint mipmapLevel;            // Mipmap level to render to
96//  EGLenum multisampleResolve;    // Multisample resolve behavior
97    EGLint mPixelAspectRatio;      // Display aspect ratio
98    EGLenum mRenderBuffer;         // Render buffer
99    EGLenum mSwapBehavior;         // Buffer swap behavior
100    EGLenum mTextureFormat;        // Format of texture: RGB, RGBA, or no texture
101    EGLenum mTextureTarget;        // Type of texture: 2D or no texture
102//  EGLenum vgAlphaFormat;         // Alpha format for OpenVG
103//  EGLenum vgColorSpace;          // Color space for OpenVG
104    EGLint mSwapInterval;
105    EGLint mPostSubBufferSupported;
106    EGLint mFixedSize;
107
108    bool mSwapIntervalDirty;
109    gl::Texture2D *mTexture;
110};
111}
112
113#endif   // LIBEGL_SURFACE_H_
114