blob: 376573fe8a8a64c07c2833746bd0005e9d86a8c8 [file] [log] [blame]
daniel@transgaming.com95a758f2012-07-12 15:17:06 +00001//
Nicolas Capens3501c162014-05-21 13:27:15 -04002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com95a758f2012-07-12 15:17:06 +00003// 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.cpp: Implements 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#include <tchar.h>
12
Scott Graham86f601c2013-09-17 13:28:00 -070013#include <algorithm>
14
Geoff Lang2b5420c2014-11-19 14:20:15 -050015#include "libANGLE/Surface.h"
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000016
17#include "common/debug.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050018#include "libANGLE/Texture.h"
19#include "libANGLE/renderer/SwapChain.h"
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000020
Geoff Lang2b5420c2014-11-19 14:20:15 -050021#include "libANGLE/Display.h"
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000022
Cooper Partineeb1f532014-09-23 10:25:02 -070023#include "common/NativeWindow.h"
24
Jamie Madill93e13fb2014-11-06 15:27:25 -050025//TODO(jmadill): phase this out
Geoff Lang2b5420c2014-11-19 14:20:15 -050026#include "libANGLE/renderer/d3d/RendererD3D.h"
Jamie Madill93e13fb2014-11-06 15:27:25 -050027
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000028namespace egl
29{
30
Cooper Partineeb1f532014-09-23 10:25:02 -070031Surface::Surface(Display *display, const Config *config, EGLNativeWindowType window, EGLint fixedSize, EGLint width, EGLint height, EGLint postSubBufferSupported)
32 : mDisplay(display), mConfig(config), mNativeWindow(window), mPostSubBufferSupported(postSubBufferSupported)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000033{
Jamie Madill93e13fb2014-11-06 15:27:25 -050034 //TODO(jmadill): MANGLE refactor. (note, can't call makeRendererD3D because of dll export issues)
35 mRenderer = static_cast<rx::RendererD3D*>(mDisplay->getRenderer());
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000036 mSwapChain = NULL;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000037 mShareHandle = NULL;
38 mTexture = NULL;
39 mTextureFormat = EGL_NO_TEXTURE;
40 mTextureTarget = EGL_NO_TEXTURE;
41
42 mPixelAspectRatio = (EGLint)(1.0 * EGL_DISPLAY_SCALING); // FIXME: Determine actual pixel aspect ratio
43 mRenderBuffer = EGL_BACK_BUFFER;
44 mSwapBehavior = EGL_BUFFER_PRESERVED;
45 mSwapInterval = -1;
John Bauman3dc300a2014-01-28 15:30:35 -080046 mWidth = width;
47 mHeight = height;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000048 setSwapInterval(1);
John Bauman3dc300a2014-01-28 15:30:35 -080049 mFixedSize = fixedSize;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000050
51 subclassWindow();
52}
53
54Surface::Surface(Display *display, const Config *config, HANDLE shareHandle, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureType)
Cooper Partineeb1f532014-09-23 10:25:02 -070055 : mDisplay(display), mNativeWindow(NULL), mConfig(config), mShareHandle(shareHandle), mWidth(width), mHeight(height), mPostSubBufferSupported(EGL_FALSE)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000056{
Jamie Madill93e13fb2014-11-06 15:27:25 -050057 //TODO(jmadill): MANGLE refactor. (note, can't call makeRendererD3D because of dll export issues)
58 mRenderer = static_cast<rx::RendererD3D*>(mDisplay->getRenderer());
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000059 mSwapChain = NULL;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000060 mWindowSubclassed = false;
61 mTexture = NULL;
62 mTextureFormat = textureFormat;
63 mTextureTarget = textureType;
64
65 mPixelAspectRatio = (EGLint)(1.0 * EGL_DISPLAY_SCALING); // FIXME: Determine actual pixel aspect ratio
66 mRenderBuffer = EGL_BACK_BUFFER;
67 mSwapBehavior = EGL_BUFFER_PRESERVED;
68 mSwapInterval = -1;
69 setSwapInterval(1);
John Bauman3dc300a2014-01-28 15:30:35 -080070 // This constructor is for offscreen surfaces, which are always fixed-size.
71 mFixedSize = EGL_TRUE;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000072}
73
74Surface::~Surface()
75{
76 unsubclassWindow();
77 release();
78}
79
Geoff Lang6b0cf992014-10-06 10:28:07 -040080Error Surface::initialize()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000081{
Cooper Partineeb1f532014-09-23 10:25:02 -070082 if (mNativeWindow.getNativeWindow())
83 {
84 if (!mNativeWindow.initialize())
85 {
Geoff Lang6b0cf992014-10-06 10:28:07 -040086 return Error(EGL_BAD_SURFACE);
Cooper Partineeb1f532014-09-23 10:25:02 -070087 }
88 }
89
Geoff Lang6b0cf992014-10-06 10:28:07 -040090 Error error = resetSwapChain();
91 if (error.isError())
92 {
93 return error;
94 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000095
Geoff Lang6b0cf992014-10-06 10:28:07 -040096 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000097}
98
99void Surface::release()
100{
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +0000101 delete mSwapChain;
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000102 mSwapChain = NULL;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000103
104 if (mTexture)
105 {
106 mTexture->releaseTexImage();
107 mTexture = NULL;
108 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000109}
110
Geoff Lang6b0cf992014-10-06 10:28:07 -0400111Error Surface::resetSwapChain()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000112{
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000113 ASSERT(!mSwapChain);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000114
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000115 int width;
116 int height;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000117
John Bauman3dc300a2014-01-28 15:30:35 -0800118 if (!mFixedSize)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000119 {
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000120 RECT windowRect;
Cooper Partineeb1f532014-09-23 10:25:02 -0700121 if (!mNativeWindow.getClientRect(&windowRect))
apatrick@chromium.org85e44192012-08-17 20:58:01 +0000122 {
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000123 ASSERT(false);
124
Geoff Lang6b0cf992014-10-06 10:28:07 -0400125 return Error(EGL_BAD_SURFACE, "Could not retrieve the window dimensions");
apatrick@chromium.org85e44192012-08-17 20:58:01 +0000126 }
apatrick@chromium.org0c71fd42012-08-10 18:08:47 +0000127
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000128 width = windowRect.right - windowRect.left;
129 height = windowRect.bottom - windowRect.top;
130 }
131 else
132 {
133 // non-window surface - size is determined at creation
134 width = mWidth;
135 height = mHeight;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000136 }
137
Cooper Partineeb1f532014-09-23 10:25:02 -0700138 mSwapChain = mRenderer->createSwapChain(mNativeWindow, mShareHandle,
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +0000139 mConfig->mRenderTargetFormat,
140 mConfig->mDepthStencilFormat);
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000141 if (!mSwapChain)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000142 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400143 return Error(EGL_BAD_ALLOC);
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000144 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000145
Geoff Lang6b0cf992014-10-06 10:28:07 -0400146 Error error = resetSwapChain(width, height);
147 if (error.isError())
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000148 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400149 SafeDelete(mSwapChain);
150 return error;
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000151 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000152
Geoff Lang6b0cf992014-10-06 10:28:07 -0400153 return Error(EGL_SUCCESS);
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000154}
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000155
Geoff Lang6b0cf992014-10-06 10:28:07 -0400156Error Surface::resizeSwapChain(int backbufferWidth, int backbufferHeight)
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000157{
158 ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0);
159 ASSERT(mSwapChain);
160
John Bauman3dc300a2014-01-28 15:30:35 -0800161 EGLint status = mSwapChain->resize(std::max(1, backbufferWidth), std::max(1, backbufferHeight));
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000162
163 if (status == EGL_CONTEXT_LOST)
164 {
165 mDisplay->notifyDeviceLost();
Geoff Lang6b0cf992014-10-06 10:28:07 -0400166 return Error(status);
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000167 }
168 else if (status != EGL_SUCCESS)
169 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400170 return Error(status);
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000171 }
172
173 mWidth = backbufferWidth;
174 mHeight = backbufferHeight;
175
Geoff Lang6b0cf992014-10-06 10:28:07 -0400176 return Error(EGL_SUCCESS);
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000177}
178
Geoff Lang6b0cf992014-10-06 10:28:07 -0400179Error Surface::resetSwapChain(int backbufferWidth, int backbufferHeight)
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000180{
181 ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0);
182 ASSERT(mSwapChain);
183
John Bauman3dc300a2014-01-28 15:30:35 -0800184 EGLint status = mSwapChain->reset(std::max(1, backbufferWidth), std::max(1, backbufferHeight), mSwapInterval);
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000185
186 if (status == EGL_CONTEXT_LOST)
187 {
shannon.woods@transgaming.comeb049e22013-02-28 23:04:49 +0000188 mRenderer->notifyDeviceLost();
Geoff Lang6b0cf992014-10-06 10:28:07 -0400189 return Error(status);
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000190 }
191 else if (status != EGL_SUCCESS)
192 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400193 return Error(status);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000194 }
195
apatrick@chromium.org0c71fd42012-08-10 18:08:47 +0000196 mWidth = backbufferWidth;
197 mHeight = backbufferHeight;
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000198 mSwapIntervalDirty = false;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000199
Geoff Lang6b0cf992014-10-06 10:28:07 -0400200 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000201}
202
Geoff Lang6b0cf992014-10-06 10:28:07 -0400203Error Surface::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000204{
205 if (!mSwapChain)
206 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400207 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000208 }
209
210 if (x + width > mWidth)
211 {
212 width = mWidth - x;
213 }
214
215 if (y + height > mHeight)
216 {
217 height = mHeight - y;
218 }
219
220 if (width == 0 || height == 0)
221 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400222 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000223 }
224
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000225 EGLint status = mSwapChain->swapRect(x, y, width, height);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000226
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000227 if (status == EGL_CONTEXT_LOST)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000228 {
shannon.woods@transgaming.comeb049e22013-02-28 23:04:49 +0000229 mRenderer->notifyDeviceLost();
Geoff Lang6b0cf992014-10-06 10:28:07 -0400230 return Error(status);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000231 }
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000232 else if (status != EGL_SUCCESS)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000233 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400234 return Error(status);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000235 }
236
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000237 checkForOutOfDateSwapChain();
238
Geoff Lang6b0cf992014-10-06 10:28:07 -0400239 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000240}
241
Cooper Partineeb1f532014-09-23 10:25:02 -0700242EGLNativeWindowType Surface::getWindowHandle()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000243{
Cooper Partineeb1f532014-09-23 10:25:02 -0700244 return mNativeWindow.getNativeWindow();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000245}
246
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700247#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000248#define kSurfaceProperty _TEXT("Egl::SurfaceOwner")
249#define kParentWndProc _TEXT("Egl::SurfaceParentWndProc")
250
251static LRESULT CALLBACK SurfaceWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
252{
253 if (message == WM_SIZE)
254 {
255 Surface* surf = reinterpret_cast<Surface*>(GetProp(hwnd, kSurfaceProperty));
256 if(surf)
257 {
258 surf->checkForOutOfDateSwapChain();
259 }
260 }
261 WNDPROC prevWndFunc = reinterpret_cast<WNDPROC >(GetProp(hwnd, kParentWndProc));
262 return CallWindowProc(prevWndFunc, hwnd, message, wparam, lparam);
263}
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700264#endif
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000265
266void Surface::subclassWindow()
267{
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700268#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
Cooper Partineeb1f532014-09-23 10:25:02 -0700269 HWND window = mNativeWindow.getNativeWindow();
270 if (!window)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000271 {
272 return;
273 }
274
275 DWORD processId;
Cooper Partineeb1f532014-09-23 10:25:02 -0700276 DWORD threadId = GetWindowThreadProcessId(window, &processId);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000277 if (processId != GetCurrentProcessId() || threadId != GetCurrentThreadId())
278 {
279 return;
280 }
281
282 SetLastError(0);
Cooper Partineeb1f532014-09-23 10:25:02 -0700283 LONG_PTR oldWndProc = SetWindowLongPtr(window, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(SurfaceWindowProc));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000284 if(oldWndProc == 0 && GetLastError() != ERROR_SUCCESS)
285 {
286 mWindowSubclassed = false;
287 return;
288 }
289
Cooper Partineeb1f532014-09-23 10:25:02 -0700290 SetProp(window, kSurfaceProperty, reinterpret_cast<HANDLE>(this));
291 SetProp(window, kParentWndProc, reinterpret_cast<HANDLE>(oldWndProc));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000292 mWindowSubclassed = true;
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700293#endif
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000294}
295
296void Surface::unsubclassWindow()
297{
298 if(!mWindowSubclassed)
299 {
300 return;
301 }
302
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700303#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
Cooper Partineeb1f532014-09-23 10:25:02 -0700304 HWND window = mNativeWindow.getNativeWindow();
305 if (!window)
306 {
307 return;
308 }
309
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000310 // un-subclass
Cooper Partineeb1f532014-09-23 10:25:02 -0700311 LONG_PTR parentWndFunc = reinterpret_cast<LONG_PTR>(GetProp(window, kParentWndProc));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000312
313 // Check the windowproc is still SurfaceWindowProc.
314 // If this assert fails, then it is likely the application has subclassed the
315 // hwnd as well and did not unsubclass before destroying its EGL context. The
316 // application should be modified to either subclass before initializing the
317 // EGL context, or to unsubclass before destroying the EGL context.
318 if(parentWndFunc)
319 {
Cooper Partineeb1f532014-09-23 10:25:02 -0700320 LONG_PTR prevWndFunc = SetWindowLongPtr(window, GWLP_WNDPROC, parentWndFunc);
Geoff Lang9cd19152014-05-28 15:54:34 -0400321 UNUSED_ASSERTION_VARIABLE(prevWndFunc);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000322 ASSERT(prevWndFunc == reinterpret_cast<LONG_PTR>(SurfaceWindowProc));
323 }
324
Cooper Partineeb1f532014-09-23 10:25:02 -0700325 RemoveProp(window, kSurfaceProperty);
326 RemoveProp(window, kParentWndProc);
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700327#endif
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000328 mWindowSubclassed = false;
329}
330
331bool Surface::checkForOutOfDateSwapChain()
332{
333 RECT client;
John Bauman3dc300a2014-01-28 15:30:35 -0800334 int clientWidth = getWidth();
335 int clientHeight = getHeight();
336 bool sizeDirty = false;
Cooper Partineeb1f532014-09-23 10:25:02 -0700337 if (!mFixedSize && !mNativeWindow.isIconic())
John Bauman827a4712013-10-29 16:03:11 -0700338 {
339 // The window is automatically resized to 150x22 when it's minimized, but the swapchain shouldn't be resized
340 // because that's not a useful size to render to.
Cooper Partineeb1f532014-09-23 10:25:02 -0700341 if (!mNativeWindow.getClientRect(&client))
John Bauman3dc300a2014-01-28 15:30:35 -0800342 {
343 ASSERT(false);
344 return false;
345 }
346
347 // Grow the buffer now, if the window has grown. We need to grow now to avoid losing information.
348 clientWidth = client.right - client.left;
349 clientHeight = client.bottom - client.top;
350 sizeDirty = clientWidth != getWidth() || clientHeight != getHeight();
John Bauman827a4712013-10-29 16:03:11 -0700351 }
352
Jamie Madill58e60322013-12-02 11:09:36 -0500353 bool wasDirty = (mSwapIntervalDirty || sizeDirty);
354
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000355 if (mSwapIntervalDirty)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000356 {
357 resetSwapChain(clientWidth, clientHeight);
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000358 }
359 else if (sizeDirty)
360 {
361 resizeSwapChain(clientWidth, clientHeight);
362 }
363
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500364 return wasDirty;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000365}
366
Geoff Lang6b0cf992014-10-06 10:28:07 -0400367Error Surface::swap()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000368{
369 return swapRect(0, 0, mWidth, mHeight);
370}
371
Geoff Lang6b0cf992014-10-06 10:28:07 -0400372Error Surface::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000373{
374 if (!mPostSubBufferSupported)
375 {
376 // Spec is not clear about how this should be handled.
Geoff Lang6b0cf992014-10-06 10:28:07 -0400377 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000378 }
Nicolas Capens3501c162014-05-21 13:27:15 -0400379
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000380 return swapRect(x, y, width, height);
381}
382
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000383EGLint Surface::isPostSubBufferSupported() const
384{
385 return mPostSubBufferSupported;
386}
387
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +0000388rx::SwapChain *Surface::getSwapChain() const
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000389{
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000390 return mSwapChain;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000391}
392
393void Surface::setSwapInterval(EGLint interval)
394{
395 if (mSwapInterval == interval)
396 {
397 return;
398 }
Nicolas Capens3501c162014-05-21 13:27:15 -0400399
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000400 mSwapInterval = interval;
daniel@transgaming.com114bd462012-10-31 18:42:47 +0000401 mSwapInterval = std::max(mSwapInterval, mRenderer->getMinSwapInterval());
402 mSwapInterval = std::min(mSwapInterval, mRenderer->getMaxSwapInterval());
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000403
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000404 mSwapIntervalDirty = true;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000405}
406
Nicolas Capens3501c162014-05-21 13:27:15 -0400407EGLint Surface::getConfigID() const
408{
409 return mConfig->mConfigID;
410}
411
412EGLint Surface::getWidth() const
413{
414 return mWidth;
415}
416
417EGLint Surface::getHeight() const
418{
419 return mHeight;
420}
421
422EGLint Surface::getPixelAspectRatio() const
423{
424 return mPixelAspectRatio;
425}
426
427EGLenum Surface::getRenderBuffer() const
428{
429 return mRenderBuffer;
430}
431
432EGLenum Surface::getSwapBehavior() const
433{
434 return mSwapBehavior;
435}
436
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000437EGLenum Surface::getTextureFormat() const
438{
439 return mTextureFormat;
440}
441
442EGLenum Surface::getTextureTarget() const
443{
444 return mTextureTarget;
445}
446
447void Surface::setBoundTexture(gl::Texture2D *texture)
448{
449 mTexture = texture;
450}
451
452gl::Texture2D *Surface::getBoundTexture() const
453{
454 return mTexture;
455}
456
John Bauman3dc300a2014-01-28 15:30:35 -0800457EGLint Surface::isFixedSize() const
458{
459 return mFixedSize;
460}
461
daniel@transgaming.com106e1f72012-10-31 18:38:36 +0000462EGLenum Surface::getFormat() const
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000463{
464 return mConfig->mRenderTargetFormat;
465}
466}