14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
23501c1656da784620c067410404fe9f67ff03998Nicolas Capens// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file.
54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Surface.h: Defines the egl::Surface class, representing a drawing surface
84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// such as the client area of a window, including any back buffers.
94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
113c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com#ifndef LIBEGL_SURFACE_H_
123c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com#define LIBEGL_SURFACE_H_
134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#include <EGL/egl.h>
154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
16ea0e1af4c3db538081d776e4ec1a588ca82cb9d9alokp@chromium.org#include "common/angleutils.h"
174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
18ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.orgnamespace gl
19ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org{
20ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.orgclass Texture2D;
21ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org}
2276d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.comnamespace rx
233c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{
24b9bb27938fae86822453d7cba1bba6c704000a8adaniel@transgaming.comclass Renderer;
253c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.comclass SwapChain;
263c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com}
27ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comnamespace egl
294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
30ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.comclass Display;
31b6bd727d23c16a4b1c96634d65b3c1548ecb5baedaniel@transgaming.comclass Config;
32ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com
334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comclass Surface
344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com  public:
363dc300a592756d292225141eded4a3a61bd511daJohn Bauman    Surface(Display *display, const egl::Config *config, HWND window, EGLint fixedSize, EGLint width, EGLint height, EGLint postSubBufferSupported);
374e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org    Surface(Display *display, const egl::Config *config, HANDLE shareHandle, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget);
384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
39a4de2657518728cdd1919bbbc21d04b502aa31c5Geoff Lang    virtual ~Surface();
404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
414e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org    bool initialize();
42d36c6a0a2674ded25b28b92f4b9fc22191d8ab61daniel@transgaming.com    void release();
434e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org    bool resetSwapChain();
44d36c6a0a2674ded25b28b92f4b9fc22191d8ab61daniel@transgaming.com
454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    HWND getWindowHandle();
46c6c6f0272dd81ae040d87e604894c6e81c7c6e1ddaniel@transgaming.com    bool swap();
47f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    bool postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height);
484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
49f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    virtual EGLint isPostSubBufferSupported() const;
50f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org
5176d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.com    virtual rx::SwapChain *getSwapChain() const;
52721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com
530db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org    void setSwapInterval(EGLint interval);
54beb2a2737f7d184f484d4a4c740e3081a801a7addaniel@transgaming.com    bool checkForOutOfDateSwapChain();   // Returns true if swapchain changed due to resize or interval update
55beb2a2737f7d184f484d4a4c740e3081a801a7addaniel@transgaming.com
563501c1656da784620c067410404fe9f67ff03998Nicolas Capens    virtual EGLint getConfigID() const;
573501c1656da784620c067410404fe9f67ff03998Nicolas Capens    virtual EGLint getWidth() const;
583501c1656da784620c067410404fe9f67ff03998Nicolas Capens    virtual EGLint getHeight() const;
593501c1656da784620c067410404fe9f67ff03998Nicolas Capens    virtual EGLint getPixelAspectRatio() const;
603501c1656da784620c067410404fe9f67ff03998Nicolas Capens    virtual EGLenum getRenderBuffer() const;
613501c1656da784620c067410404fe9f67ff03998Nicolas Capens    virtual EGLenum getSwapBehavior() const;
62ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org    virtual EGLenum getTextureFormat() const;
63ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org    virtual EGLenum getTextureTarget() const;
64106e1f7b67f042d008dd6616f73ff03492bf1d5adaniel@transgaming.com    virtual EGLenum getFormat() const;
65ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
66ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org    virtual void setBoundTexture(gl::Texture2D *texture);
67ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org    virtual gl::Texture2D *getBoundTexture() const;
68ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org
693dc300a592756d292225141eded4a3a61bd511daJohn Bauman    EGLint isFixedSize() const;
703dc300a592756d292225141eded4a3a61bd511daJohn Bauman
71a6e31e58bbb301d8e89a375a3a0c0f44cc557be3nduca@chromium.orgprivate:
724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    DISALLOW_COPY_AND_ASSIGN(Surface);
73db1afef67a8eee06523895471bb86a6945ac7a32daniel@transgaming.com
74ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com    Display *const mDisplay;
75b9bb27938fae86822453d7cba1bba6c704000a8adaniel@transgaming.com    rx::Renderer *mRenderer;
76721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com
77721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com    HANDLE mShareHandle;
7876d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.com    rx::SwapChain *mSwapChain;
79db1afef67a8eee06523895471bb86a6945ac7a32daniel@transgaming.com
80a6e31e58bbb301d8e89a375a3a0c0f44cc557be3nduca@chromium.org    void subclassWindow();
81a6e31e58bbb301d8e89a375a3a0c0f44cc557be3nduca@chromium.org    void unsubclassWindow();
82c71ca75ad647335876ed6961ebf461203df4caddshannon.woods@transgaming.com    bool resizeSwapChain(int backbufferWidth, int backbufferHeight);
834e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org    bool resetSwapChain(int backbufferWidth, int backbufferHeight);
849616e583e97db8b84232418eb94dcb188de41bfaapatrick@chromium.org    bool swapRect(EGLint x, EGLint y, EGLint width, EGLint height);
85da6e263cede2f850a62f6b4e250fc5b13518da24daniel@transgaming.com
86da6e263cede2f850a62f6b4e250fc5b13518da24daniel@transgaming.com    const HWND mWindow;            // Window that the surface is created for.
87a6e31e58bbb301d8e89a375a3a0c0f44cc557be3nduca@chromium.org    bool mWindowSubclassed;        // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking
88b6bd727d23c16a4b1c96634d65b3c1548ecb5baedaniel@transgaming.com    const egl::Config *mConfig;    // EGL config surface was created with
89ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com    EGLint mHeight;                // Height of surface
90ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com    EGLint mWidth;                 // Width of surface
91ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com//  EGLint horizontalResolution;   // Horizontal dot pitch
92ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com//  EGLint verticalResolution;     // Vertical dot pitch
93ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com//  EGLBoolean largestPBuffer;     // If true, create largest pbuffer possible
94ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com//  EGLBoolean mipmapTexture;      // True if texture has mipmaps
95ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com//  EGLint mipmapLevel;            // Mipmap level to render to
96ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com//  EGLenum multisampleResolve;    // Multisample resolve behavior
97ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com    EGLint mPixelAspectRatio;      // Display aspect ratio
98ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com    EGLenum mRenderBuffer;         // Render buffer
99ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com    EGLenum mSwapBehavior;         // Buffer swap behavior
100ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org    EGLenum mTextureFormat;        // Format of texture: RGB, RGBA, or no texture
101ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org    EGLenum mTextureTarget;        // Type of texture: 2D or no texture
102ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com//  EGLenum vgAlphaFormat;         // Alpha format for OpenVG
103ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com//  EGLenum vgColorSpace;          // Color space for OpenVG
1040db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org    EGLint mSwapInterval;
105f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org    EGLint mPostSubBufferSupported;
1063dc300a592756d292225141eded4a3a61bd511daJohn Bauman    EGLint mFixedSize;
1077bf0c8670ac46356ccc8d40fb0ab6af5def1f4beJamie Madill
1083c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com    bool mSwapIntervalDirty;
109ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org    gl::Texture2D *mTexture;
1104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com};
1114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
1124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1133c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com#endif   // LIBEGL_SURFACE_H_
114