blob: 1c6f12e4b17e762777d8ee75bb837d03d01cd9b2 [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
Jamie Madill93e13fb2014-11-06 15:27:25 -050023//TODO(jmadill): phase this out
Geoff Lang2b5420c2014-11-19 14:20:15 -050024#include "libANGLE/renderer/d3d/RendererD3D.h"
Jamie Madill93e13fb2014-11-06 15:27:25 -050025
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000026namespace egl
27{
28
Cooper Partineeb1f532014-09-23 10:25:02 -070029Surface::Surface(Display *display, const Config *config, EGLNativeWindowType window, EGLint fixedSize, EGLint width, EGLint height, EGLint postSubBufferSupported)
30 : mDisplay(display), mConfig(config), mNativeWindow(window), mPostSubBufferSupported(postSubBufferSupported)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000031{
Jamie Madill93e13fb2014-11-06 15:27:25 -050032 //TODO(jmadill): MANGLE refactor. (note, can't call makeRendererD3D because of dll export issues)
33 mRenderer = static_cast<rx::RendererD3D*>(mDisplay->getRenderer());
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000034 mSwapChain = NULL;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000035 mShareHandle = NULL;
36 mTexture = NULL;
37 mTextureFormat = EGL_NO_TEXTURE;
38 mTextureTarget = EGL_NO_TEXTURE;
39
40 mPixelAspectRatio = (EGLint)(1.0 * EGL_DISPLAY_SCALING); // FIXME: Determine actual pixel aspect ratio
41 mRenderBuffer = EGL_BACK_BUFFER;
42 mSwapBehavior = EGL_BUFFER_PRESERVED;
43 mSwapInterval = -1;
John Bauman3dc300a2014-01-28 15:30:35 -080044 mWidth = width;
45 mHeight = height;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000046 setSwapInterval(1);
John Bauman3dc300a2014-01-28 15:30:35 -080047 mFixedSize = fixedSize;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000048
49 subclassWindow();
50}
51
52Surface::Surface(Display *display, const Config *config, HANDLE shareHandle, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureType)
Cooper Partineeb1f532014-09-23 10:25:02 -070053 : mDisplay(display), mNativeWindow(NULL), mConfig(config), mShareHandle(shareHandle), mWidth(width), mHeight(height), mPostSubBufferSupported(EGL_FALSE)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000054{
Jamie Madill93e13fb2014-11-06 15:27:25 -050055 //TODO(jmadill): MANGLE refactor. (note, can't call makeRendererD3D because of dll export issues)
56 mRenderer = static_cast<rx::RendererD3D*>(mDisplay->getRenderer());
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000057 mSwapChain = NULL;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000058 mWindowSubclassed = false;
59 mTexture = NULL;
60 mTextureFormat = textureFormat;
61 mTextureTarget = textureType;
62
63 mPixelAspectRatio = (EGLint)(1.0 * EGL_DISPLAY_SCALING); // FIXME: Determine actual pixel aspect ratio
64 mRenderBuffer = EGL_BACK_BUFFER;
65 mSwapBehavior = EGL_BUFFER_PRESERVED;
66 mSwapInterval = -1;
67 setSwapInterval(1);
John Bauman3dc300a2014-01-28 15:30:35 -080068 // This constructor is for offscreen surfaces, which are always fixed-size.
69 mFixedSize = EGL_TRUE;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000070}
71
72Surface::~Surface()
73{
74 unsubclassWindow();
75 release();
76}
77
Geoff Lang6b0cf992014-10-06 10:28:07 -040078Error Surface::initialize()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000079{
Cooper Partineeb1f532014-09-23 10:25:02 -070080 if (mNativeWindow.getNativeWindow())
81 {
82 if (!mNativeWindow.initialize())
83 {
Geoff Lang6b0cf992014-10-06 10:28:07 -040084 return Error(EGL_BAD_SURFACE);
Cooper Partineeb1f532014-09-23 10:25:02 -070085 }
86 }
87
Geoff Lang6b0cf992014-10-06 10:28:07 -040088 Error error = resetSwapChain();
89 if (error.isError())
90 {
91 return error;
92 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000093
Geoff Lang6b0cf992014-10-06 10:28:07 -040094 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000095}
96
97void Surface::release()
98{
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +000099 delete mSwapChain;
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000100 mSwapChain = NULL;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000101
102 if (mTexture)
103 {
104 mTexture->releaseTexImage();
105 mTexture = NULL;
106 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000107}
108
Geoff Lang6b0cf992014-10-06 10:28:07 -0400109Error Surface::resetSwapChain()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000110{
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000111 ASSERT(!mSwapChain);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000112
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000113 int width;
114 int height;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000115
John Bauman3dc300a2014-01-28 15:30:35 -0800116 if (!mFixedSize)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000117 {
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000118 RECT windowRect;
Cooper Partineeb1f532014-09-23 10:25:02 -0700119 if (!mNativeWindow.getClientRect(&windowRect))
apatrick@chromium.org85e44192012-08-17 20:58:01 +0000120 {
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000121 ASSERT(false);
122
Geoff Lang6b0cf992014-10-06 10:28:07 -0400123 return Error(EGL_BAD_SURFACE, "Could not retrieve the window dimensions");
apatrick@chromium.org85e44192012-08-17 20:58:01 +0000124 }
apatrick@chromium.org0c71fd42012-08-10 18:08:47 +0000125
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000126 width = windowRect.right - windowRect.left;
127 height = windowRect.bottom - windowRect.top;
128 }
129 else
130 {
131 // non-window surface - size is determined at creation
132 width = mWidth;
133 height = mHeight;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000134 }
135
Cooper Partineeb1f532014-09-23 10:25:02 -0700136 mSwapChain = mRenderer->createSwapChain(mNativeWindow, mShareHandle,
daniel@transgaming.comb9bb2792012-11-28 19:36:49 +0000137 mConfig->mRenderTargetFormat,
138 mConfig->mDepthStencilFormat);
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000139 if (!mSwapChain)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000140 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400141 return Error(EGL_BAD_ALLOC);
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000142 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000143
Geoff Lang6b0cf992014-10-06 10:28:07 -0400144 Error error = resetSwapChain(width, height);
145 if (error.isError())
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000146 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400147 SafeDelete(mSwapChain);
148 return error;
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000149 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000150
Geoff Lang6b0cf992014-10-06 10:28:07 -0400151 return Error(EGL_SUCCESS);
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000152}
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000153
Geoff Lang6b0cf992014-10-06 10:28:07 -0400154Error Surface::resizeSwapChain(int backbufferWidth, int backbufferHeight)
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000155{
156 ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0);
157 ASSERT(mSwapChain);
158
John Bauman3dc300a2014-01-28 15:30:35 -0800159 EGLint status = mSwapChain->resize(std::max(1, backbufferWidth), std::max(1, backbufferHeight));
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000160
161 if (status == EGL_CONTEXT_LOST)
162 {
163 mDisplay->notifyDeviceLost();
Geoff Lang6b0cf992014-10-06 10:28:07 -0400164 return Error(status);
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000165 }
166 else if (status != EGL_SUCCESS)
167 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400168 return Error(status);
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000169 }
170
171 mWidth = backbufferWidth;
172 mHeight = backbufferHeight;
173
Geoff Lang6b0cf992014-10-06 10:28:07 -0400174 return Error(EGL_SUCCESS);
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000175}
176
Geoff Lang6b0cf992014-10-06 10:28:07 -0400177Error Surface::resetSwapChain(int backbufferWidth, int backbufferHeight)
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000178{
179 ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0);
180 ASSERT(mSwapChain);
181
John Bauman3dc300a2014-01-28 15:30:35 -0800182 EGLint status = mSwapChain->reset(std::max(1, backbufferWidth), std::max(1, backbufferHeight), mSwapInterval);
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000183
184 if (status == EGL_CONTEXT_LOST)
185 {
Jamie Madill4c76fea2014-11-24 11:38:52 -0500186 //TODO(jmadill): MANGLE refactor
187 rx::RendererD3D *rendererD3D = static_cast<rx::RendererD3D*>(mRenderer);
188 rendererD3D->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 {
Jamie Madill4c76fea2014-11-24 11:38:52 -0500229 //TODO(jmadill): MANGLE refactor
230 rx::RendererD3D *rendererD3D = static_cast<rx::RendererD3D*>(mRenderer);
231 rendererD3D->notifyDeviceLost();
Geoff Lang6b0cf992014-10-06 10:28:07 -0400232 return Error(status);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000233 }
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000234 else if (status != EGL_SUCCESS)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000235 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400236 return Error(status);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000237 }
238
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000239 checkForOutOfDateSwapChain();
240
Geoff Lang6b0cf992014-10-06 10:28:07 -0400241 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000242}
243
Cooper Partineeb1f532014-09-23 10:25:02 -0700244EGLNativeWindowType Surface::getWindowHandle()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000245{
Cooper Partineeb1f532014-09-23 10:25:02 -0700246 return mNativeWindow.getNativeWindow();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000247}
248
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700249#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000250#define kSurfaceProperty _TEXT("Egl::SurfaceOwner")
251#define kParentWndProc _TEXT("Egl::SurfaceParentWndProc")
252
253static LRESULT CALLBACK SurfaceWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
254{
255 if (message == WM_SIZE)
256 {
257 Surface* surf = reinterpret_cast<Surface*>(GetProp(hwnd, kSurfaceProperty));
258 if(surf)
259 {
260 surf->checkForOutOfDateSwapChain();
261 }
262 }
263 WNDPROC prevWndFunc = reinterpret_cast<WNDPROC >(GetProp(hwnd, kParentWndProc));
264 return CallWindowProc(prevWndFunc, hwnd, message, wparam, lparam);
265}
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700266#endif
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000267
268void Surface::subclassWindow()
269{
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700270#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
Cooper Partineeb1f532014-09-23 10:25:02 -0700271 HWND window = mNativeWindow.getNativeWindow();
272 if (!window)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000273 {
274 return;
275 }
276
277 DWORD processId;
Cooper Partineeb1f532014-09-23 10:25:02 -0700278 DWORD threadId = GetWindowThreadProcessId(window, &processId);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000279 if (processId != GetCurrentProcessId() || threadId != GetCurrentThreadId())
280 {
281 return;
282 }
283
284 SetLastError(0);
Cooper Partineeb1f532014-09-23 10:25:02 -0700285 LONG_PTR oldWndProc = SetWindowLongPtr(window, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(SurfaceWindowProc));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000286 if(oldWndProc == 0 && GetLastError() != ERROR_SUCCESS)
287 {
288 mWindowSubclassed = false;
289 return;
290 }
291
Cooper Partineeb1f532014-09-23 10:25:02 -0700292 SetProp(window, kSurfaceProperty, reinterpret_cast<HANDLE>(this));
293 SetProp(window, kParentWndProc, reinterpret_cast<HANDLE>(oldWndProc));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000294 mWindowSubclassed = true;
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700295#endif
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000296}
297
298void Surface::unsubclassWindow()
299{
300 if(!mWindowSubclassed)
301 {
302 return;
303 }
304
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700305#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
Cooper Partineeb1f532014-09-23 10:25:02 -0700306 HWND window = mNativeWindow.getNativeWindow();
307 if (!window)
308 {
309 return;
310 }
311
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000312 // un-subclass
Cooper Partineeb1f532014-09-23 10:25:02 -0700313 LONG_PTR parentWndFunc = reinterpret_cast<LONG_PTR>(GetProp(window, kParentWndProc));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000314
315 // Check the windowproc is still SurfaceWindowProc.
316 // If this assert fails, then it is likely the application has subclassed the
317 // hwnd as well and did not unsubclass before destroying its EGL context. The
318 // application should be modified to either subclass before initializing the
319 // EGL context, or to unsubclass before destroying the EGL context.
320 if(parentWndFunc)
321 {
Cooper Partineeb1f532014-09-23 10:25:02 -0700322 LONG_PTR prevWndFunc = SetWindowLongPtr(window, GWLP_WNDPROC, parentWndFunc);
Geoff Lang9cd19152014-05-28 15:54:34 -0400323 UNUSED_ASSERTION_VARIABLE(prevWndFunc);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000324 ASSERT(prevWndFunc == reinterpret_cast<LONG_PTR>(SurfaceWindowProc));
325 }
326
Cooper Partineeb1f532014-09-23 10:25:02 -0700327 RemoveProp(window, kSurfaceProperty);
328 RemoveProp(window, kParentWndProc);
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700329#endif
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000330 mWindowSubclassed = false;
331}
332
333bool Surface::checkForOutOfDateSwapChain()
334{
335 RECT client;
John Bauman3dc300a2014-01-28 15:30:35 -0800336 int clientWidth = getWidth();
337 int clientHeight = getHeight();
338 bool sizeDirty = false;
Cooper Partineeb1f532014-09-23 10:25:02 -0700339 if (!mFixedSize && !mNativeWindow.isIconic())
John Bauman827a4712013-10-29 16:03:11 -0700340 {
341 // The window is automatically resized to 150x22 when it's minimized, but the swapchain shouldn't be resized
342 // because that's not a useful size to render to.
Cooper Partineeb1f532014-09-23 10:25:02 -0700343 if (!mNativeWindow.getClientRect(&client))
John Bauman3dc300a2014-01-28 15:30:35 -0800344 {
345 ASSERT(false);
346 return false;
347 }
348
349 // Grow the buffer now, if the window has grown. We need to grow now to avoid losing information.
350 clientWidth = client.right - client.left;
351 clientHeight = client.bottom - client.top;
352 sizeDirty = clientWidth != getWidth() || clientHeight != getHeight();
John Bauman827a4712013-10-29 16:03:11 -0700353 }
354
Jamie Madill58e60322013-12-02 11:09:36 -0500355 bool wasDirty = (mSwapIntervalDirty || sizeDirty);
356
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000357 if (mSwapIntervalDirty)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000358 {
359 resetSwapChain(clientWidth, clientHeight);
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000360 }
361 else if (sizeDirty)
362 {
363 resizeSwapChain(clientWidth, clientHeight);
364 }
365
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500366 return wasDirty;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000367}
368
Geoff Lang6b0cf992014-10-06 10:28:07 -0400369Error Surface::swap()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000370{
371 return swapRect(0, 0, mWidth, mHeight);
372}
373
Geoff Lang6b0cf992014-10-06 10:28:07 -0400374Error Surface::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000375{
376 if (!mPostSubBufferSupported)
377 {
378 // Spec is not clear about how this should be handled.
Geoff Lang6b0cf992014-10-06 10:28:07 -0400379 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000380 }
Nicolas Capens3501c162014-05-21 13:27:15 -0400381
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000382 return swapRect(x, y, width, height);
383}
384
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000385EGLint Surface::isPostSubBufferSupported() const
386{
387 return mPostSubBufferSupported;
388}
389
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +0000390rx::SwapChain *Surface::getSwapChain() const
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000391{
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000392 return mSwapChain;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000393}
394
395void Surface::setSwapInterval(EGLint interval)
396{
397 if (mSwapInterval == interval)
398 {
399 return;
400 }
Nicolas Capens3501c162014-05-21 13:27:15 -0400401
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000402 mSwapInterval = interval;
daniel@transgaming.com114bd462012-10-31 18:42:47 +0000403 mSwapInterval = std::max(mSwapInterval, mRenderer->getMinSwapInterval());
404 mSwapInterval = std::min(mSwapInterval, mRenderer->getMaxSwapInterval());
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000405
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000406 mSwapIntervalDirty = true;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000407}
408
Nicolas Capens3501c162014-05-21 13:27:15 -0400409EGLint Surface::getConfigID() const
410{
411 return mConfig->mConfigID;
412}
413
414EGLint Surface::getWidth() const
415{
416 return mWidth;
417}
418
419EGLint Surface::getHeight() const
420{
421 return mHeight;
422}
423
424EGLint Surface::getPixelAspectRatio() const
425{
426 return mPixelAspectRatio;
427}
428
429EGLenum Surface::getRenderBuffer() const
430{
431 return mRenderBuffer;
432}
433
434EGLenum Surface::getSwapBehavior() const
435{
436 return mSwapBehavior;
437}
438
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000439EGLenum Surface::getTextureFormat() const
440{
441 return mTextureFormat;
442}
443
444EGLenum Surface::getTextureTarget() const
445{
446 return mTextureTarget;
447}
448
449void Surface::setBoundTexture(gl::Texture2D *texture)
450{
451 mTexture = texture;
452}
453
454gl::Texture2D *Surface::getBoundTexture() const
455{
456 return mTexture;
457}
458
John Bauman3dc300a2014-01-28 15:30:35 -0800459EGLint Surface::isFixedSize() const
460{
461 return mFixedSize;
462}
463
daniel@transgaming.com106e1f72012-10-31 18:38:36 +0000464EGLenum Surface::getFormat() const
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000465{
466 return mConfig->mRenderTargetFormat;
467}
468}