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