Home | History | Annotate | Download | only in libEGL
      1 //
      2 // Copyright (c) 2002-2012 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 #define EGLAPI
     15 #include <EGL/egl.h>
     16 
     17 #include "common/angleutils.h"
     18 
     19 namespace gl
     20 {
     21 class Texture2D;
     22 }
     23 namespace rx
     24 {
     25 class Renderer;
     26 class SwapChain;
     27 }
     28 
     29 namespace egl
     30 {
     31 class Display;
     32 class Config;
     33 
     34 class Surface
     35 {
     36   public:
     37     Surface(Display *display, const egl::Config *config, HWND window, EGLint postSubBufferSupported);
     38     Surface(Display *display, const egl::Config *config, HANDLE shareHandle, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget);
     39 
     40     ~Surface();
     41 
     42     bool initialize();
     43     void release();
     44     bool resetSwapChain();
     45 
     46     HWND getWindowHandle();
     47     bool swap();
     48     bool postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height);
     49 
     50     virtual EGLint getWidth() const;
     51     virtual EGLint getHeight() const;
     52 
     53     virtual EGLint isPostSubBufferSupported() const;
     54 
     55     virtual rx::SwapChain *getSwapChain() const;
     56 
     57     void setSwapInterval(EGLint interval);
     58     bool checkForOutOfDateSwapChain();   // Returns true if swapchain changed due to resize or interval update
     59 
     60     virtual EGLenum getTextureFormat() const;
     61     virtual EGLenum getTextureTarget() const;
     62     virtual EGLenum getFormat() const;
     63 
     64     virtual void setBoundTexture(gl::Texture2D *texture);
     65     virtual gl::Texture2D *getBoundTexture() const;
     66 
     67 private:
     68     DISALLOW_COPY_AND_ASSIGN(Surface);
     69 
     70     Display *const mDisplay;
     71     rx::Renderer *mRenderer;
     72 
     73     HANDLE mShareHandle;
     74     rx::SwapChain *mSwapChain;
     75 
     76     void subclassWindow();
     77     void unsubclassWindow();
     78     bool resizeSwapChain(int backbufferWidth, int backbufferHeight);
     79     bool resetSwapChain(int backbufferWidth, int backbufferHeight);
     80     bool swapRect(EGLint x, EGLint y, EGLint width, EGLint height);
     81 
     82     const HWND mWindow;            // Window that the surface is created for.
     83     bool mWindowSubclassed;        // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking
     84     const egl::Config *mConfig;    // EGL config surface was created with
     85     EGLint mHeight;                // Height of surface
     86     EGLint mWidth;                 // Width of surface
     87 //  EGLint horizontalResolution;   // Horizontal dot pitch
     88 //  EGLint verticalResolution;     // Vertical dot pitch
     89 //  EGLBoolean largestPBuffer;     // If true, create largest pbuffer possible
     90 //  EGLBoolean mipmapTexture;      // True if texture has mipmaps
     91 //  EGLint mipmapLevel;            // Mipmap level to render to
     92 //  EGLenum multisampleResolve;    // Multisample resolve behavior
     93     EGLint mPixelAspectRatio;      // Display aspect ratio
     94     EGLenum mRenderBuffer;         // Render buffer
     95     EGLenum mSwapBehavior;         // Buffer swap behavior
     96     EGLenum mTextureFormat;        // Format of texture: RGB, RGBA, or no texture
     97     EGLenum mTextureTarget;        // Type of texture: 2D or no texture
     98 //  EGLenum vgAlphaFormat;         // Alpha format for OpenVG
     99 //  EGLenum vgColorSpace;          // Color space for OpenVG
    100     EGLint mSwapInterval;
    101     EGLint mPostSubBufferSupported;
    102 
    103     bool mSwapIntervalDirty;
    104     gl::Texture2D *mTexture;
    105 };
    106 }
    107 
    108 #endif   // LIBEGL_SURFACE_H_
    109