14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 23c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// Copyright (c) 2002-2012 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#define EGLAPI 154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#include <EGL/egl.h> 164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 17ea0e1af4c3db538081d776e4ec1a588ca82cb9d9alokp@chromium.org#include "common/angleutils.h" 184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 19ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.orgnamespace gl 20ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org{ 21ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.orgclass Texture2D; 22ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org} 2376d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.comnamespace rx 243c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 25b9bb27938fae86822453d7cba1bba6c704000a8adaniel@transgaming.comclass Renderer; 263c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.comclass SwapChain; 273c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 28ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org 294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comnamespace egl 304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 31ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.comclass Display; 32b6bd727d23c16a4b1c96634d65b3c1548ecb5baedaniel@transgaming.comclass Config; 33ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com 344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comclass Surface 354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com public: 37f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org Surface(Display *display, const egl::Config *config, HWND window, EGLint postSubBufferSupported); 384e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org Surface(Display *display, const egl::Config *config, HANDLE shareHandle, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget); 394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com ~Surface(); 414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 424e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org bool initialize(); 43d36c6a0a2674ded25b28b92f4b9fc22191d8ab61daniel@transgaming.com void release(); 444e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org bool resetSwapChain(); 45d36c6a0a2674ded25b28b92f4b9fc22191d8ab61daniel@transgaming.com 464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com HWND getWindowHandle(); 47c6c6f0272dd81ae040d87e604894c6e81c7c6e1ddaniel@transgaming.com bool swap(); 48f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org bool postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height); 494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 50159acdf5f6370e89f3deda77cd3752ad11d3f76cdaniel@transgaming.com virtual EGLint getWidth() const; 51159acdf5f6370e89f3deda77cd3752ad11d3f76cdaniel@transgaming.com virtual EGLint getHeight() const; 524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 53f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org virtual EGLint isPostSubBufferSupported() const; 54f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org 5576d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.com virtual rx::SwapChain *getSwapChain() const; 56721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com 570db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org void setSwapInterval(EGLint interval); 58beb2a2737f7d184f484d4a4c740e3081a801a7addaniel@transgaming.com bool checkForOutOfDateSwapChain(); // Returns true if swapchain changed due to resize or interval update 59beb2a2737f7d184f484d4a4c740e3081a801a7addaniel@transgaming.com 60ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org virtual EGLenum getTextureFormat() const; 61ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org virtual EGLenum getTextureTarget() const; 62106e1f7b67f042d008dd6616f73ff03492bf1d5adaniel@transgaming.com virtual EGLenum getFormat() const; 63ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org 64ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org virtual void setBoundTexture(gl::Texture2D *texture); 65ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org virtual gl::Texture2D *getBoundTexture() const; 66ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org 67a6e31e58bbb301d8e89a375a3a0c0f44cc557be3nduca@chromium.orgprivate: 684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com DISALLOW_COPY_AND_ASSIGN(Surface); 69db1afef67a8eee06523895471bb86a6945ac7a32daniel@transgaming.com 70ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com Display *const mDisplay; 71b9bb27938fae86822453d7cba1bba6c704000a8adaniel@transgaming.com rx::Renderer *mRenderer; 72721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com 73721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com HANDLE mShareHandle; 7476d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.com rx::SwapChain *mSwapChain; 75db1afef67a8eee06523895471bb86a6945ac7a32daniel@transgaming.com 76a6e31e58bbb301d8e89a375a3a0c0f44cc557be3nduca@chromium.org void subclassWindow(); 77a6e31e58bbb301d8e89a375a3a0c0f44cc557be3nduca@chromium.org void unsubclassWindow(); 78c71ca75ad647335876ed6961ebf461203df4caddshannon.woods@transgaming.com bool resizeSwapChain(int backbufferWidth, int backbufferHeight); 794e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org bool resetSwapChain(int backbufferWidth, int backbufferHeight); 809616e583e97db8b84232418eb94dcb188de41bfaapatrick@chromium.org bool swapRect(EGLint x, EGLint y, EGLint width, EGLint height); 81da6e263cede2f850a62f6b4e250fc5b13518da24daniel@transgaming.com 82da6e263cede2f850a62f6b4e250fc5b13518da24daniel@transgaming.com const HWND mWindow; // Window that the surface is created for. 83a6e31e58bbb301d8e89a375a3a0c0f44cc557be3nduca@chromium.org bool mWindowSubclassed; // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking 84b6bd727d23c16a4b1c96634d65b3c1548ecb5baedaniel@transgaming.com const egl::Config *mConfig; // EGL config surface was created with 85ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com EGLint mHeight; // Height of surface 86ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com EGLint mWidth; // Width of surface 87ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com// EGLint horizontalResolution; // Horizontal dot pitch 88ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com// EGLint verticalResolution; // Vertical dot pitch 89ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com// EGLBoolean largestPBuffer; // If true, create largest pbuffer possible 90ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com// EGLBoolean mipmapTexture; // True if texture has mipmaps 91ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com// EGLint mipmapLevel; // Mipmap level to render to 92ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com// EGLenum multisampleResolve; // Multisample resolve behavior 93ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com EGLint mPixelAspectRatio; // Display aspect ratio 94ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com EGLenum mRenderBuffer; // Render buffer 95ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com EGLenum mSwapBehavior; // Buffer swap behavior 96ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org EGLenum mTextureFormat; // Format of texture: RGB, RGBA, or no texture 97ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org EGLenum mTextureTarget; // Type of texture: 2D or no texture 98ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com// EGLenum vgAlphaFormat; // Alpha format for OpenVG 99ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com// EGLenum vgColorSpace; // Color space for OpenVG 1000db0d6c88fabd966d8bba2d3ff20d66d620863efapatrick@chromium.org EGLint mSwapInterval; 101f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org EGLint mPostSubBufferSupported; 102f4490e220717ee3bdae77a14d1b5d16360190439apatrick@chromium.org 1033c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com bool mSwapIntervalDirty; 104ae345807b2b9ca3ae702af129326c63457bfdf4bjbauman@chromium.org gl::Texture2D *mTexture; 1054f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}; 1064f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1074f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1083c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com#endif // LIBEGL_SURFACE_H_ 109