blob: 68ace7dcdcee2281889a167f01b6039840c191c3 [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 {
Jamie Madill4c76fea2014-11-24 11:38:52 -0500188 //TODO(jmadill): MANGLE refactor
189 rx::RendererD3D *rendererD3D = static_cast<rx::RendererD3D*>(mRenderer);
190 rendererD3D->notifyDeviceLost();
Geoff Lang6b0cf992014-10-06 10:28:07 -0400191 return Error(status);
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000192 }
193 else if (status != EGL_SUCCESS)
194 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400195 return Error(status);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000196 }
197
apatrick@chromium.org0c71fd42012-08-10 18:08:47 +0000198 mWidth = backbufferWidth;
199 mHeight = backbufferHeight;
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000200 mSwapIntervalDirty = false;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000201
Geoff Lang6b0cf992014-10-06 10:28:07 -0400202 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000203}
204
Geoff Lang6b0cf992014-10-06 10:28:07 -0400205Error Surface::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000206{
207 if (!mSwapChain)
208 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400209 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000210 }
211
212 if (x + width > mWidth)
213 {
214 width = mWidth - x;
215 }
216
217 if (y + height > mHeight)
218 {
219 height = mHeight - y;
220 }
221
222 if (width == 0 || height == 0)
223 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400224 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000225 }
226
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000227 EGLint status = mSwapChain->swapRect(x, y, width, height);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000228
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000229 if (status == EGL_CONTEXT_LOST)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000230 {
Jamie Madill4c76fea2014-11-24 11:38:52 -0500231 //TODO(jmadill): MANGLE refactor
232 rx::RendererD3D *rendererD3D = static_cast<rx::RendererD3D*>(mRenderer);
233 rendererD3D->notifyDeviceLost();
Geoff Lang6b0cf992014-10-06 10:28:07 -0400234 return Error(status);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000235 }
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000236 else if (status != EGL_SUCCESS)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000237 {
Geoff Lang6b0cf992014-10-06 10:28:07 -0400238 return Error(status);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000239 }
240
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000241 checkForOutOfDateSwapChain();
242
Geoff Lang6b0cf992014-10-06 10:28:07 -0400243 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000244}
245
Cooper Partineeb1f532014-09-23 10:25:02 -0700246EGLNativeWindowType Surface::getWindowHandle()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000247{
Cooper Partineeb1f532014-09-23 10:25:02 -0700248 return mNativeWindow.getNativeWindow();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000249}
250
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700251#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000252#define kSurfaceProperty _TEXT("Egl::SurfaceOwner")
253#define kParentWndProc _TEXT("Egl::SurfaceParentWndProc")
254
255static LRESULT CALLBACK SurfaceWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
256{
257 if (message == WM_SIZE)
258 {
259 Surface* surf = reinterpret_cast<Surface*>(GetProp(hwnd, kSurfaceProperty));
260 if(surf)
261 {
262 surf->checkForOutOfDateSwapChain();
263 }
264 }
265 WNDPROC prevWndFunc = reinterpret_cast<WNDPROC >(GetProp(hwnd, kParentWndProc));
266 return CallWindowProc(prevWndFunc, hwnd, message, wparam, lparam);
267}
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700268#endif
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000269
270void Surface::subclassWindow()
271{
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700272#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
Cooper Partineeb1f532014-09-23 10:25:02 -0700273 HWND window = mNativeWindow.getNativeWindow();
274 if (!window)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000275 {
276 return;
277 }
278
279 DWORD processId;
Cooper Partineeb1f532014-09-23 10:25:02 -0700280 DWORD threadId = GetWindowThreadProcessId(window, &processId);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000281 if (processId != GetCurrentProcessId() || threadId != GetCurrentThreadId())
282 {
283 return;
284 }
285
286 SetLastError(0);
Cooper Partineeb1f532014-09-23 10:25:02 -0700287 LONG_PTR oldWndProc = SetWindowLongPtr(window, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(SurfaceWindowProc));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000288 if(oldWndProc == 0 && GetLastError() != ERROR_SUCCESS)
289 {
290 mWindowSubclassed = false;
291 return;
292 }
293
Cooper Partineeb1f532014-09-23 10:25:02 -0700294 SetProp(window, kSurfaceProperty, reinterpret_cast<HANDLE>(this));
295 SetProp(window, kParentWndProc, reinterpret_cast<HANDLE>(oldWndProc));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000296 mWindowSubclassed = true;
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700297#endif
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000298}
299
300void Surface::unsubclassWindow()
301{
302 if(!mWindowSubclassed)
303 {
304 return;
305 }
306
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700307#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
Cooper Partineeb1f532014-09-23 10:25:02 -0700308 HWND window = mNativeWindow.getNativeWindow();
309 if (!window)
310 {
311 return;
312 }
313
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000314 // un-subclass
Cooper Partineeb1f532014-09-23 10:25:02 -0700315 LONG_PTR parentWndFunc = reinterpret_cast<LONG_PTR>(GetProp(window, kParentWndProc));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000316
317 // Check the windowproc is still SurfaceWindowProc.
318 // If this assert fails, then it is likely the application has subclassed the
319 // hwnd as well and did not unsubclass before destroying its EGL context. The
320 // application should be modified to either subclass before initializing the
321 // EGL context, or to unsubclass before destroying the EGL context.
322 if(parentWndFunc)
323 {
Cooper Partineeb1f532014-09-23 10:25:02 -0700324 LONG_PTR prevWndFunc = SetWindowLongPtr(window, GWLP_WNDPROC, parentWndFunc);
Geoff Lang9cd19152014-05-28 15:54:34 -0400325 UNUSED_ASSERTION_VARIABLE(prevWndFunc);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000326 ASSERT(prevWndFunc == reinterpret_cast<LONG_PTR>(SurfaceWindowProc));
327 }
328
Cooper Partineeb1f532014-09-23 10:25:02 -0700329 RemoveProp(window, kSurfaceProperty);
330 RemoveProp(window, kParentWndProc);
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700331#endif
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000332 mWindowSubclassed = false;
333}
334
335bool Surface::checkForOutOfDateSwapChain()
336{
337 RECT client;
John Bauman3dc300a2014-01-28 15:30:35 -0800338 int clientWidth = getWidth();
339 int clientHeight = getHeight();
340 bool sizeDirty = false;
Cooper Partineeb1f532014-09-23 10:25:02 -0700341 if (!mFixedSize && !mNativeWindow.isIconic())
John Bauman827a4712013-10-29 16:03:11 -0700342 {
343 // The window is automatically resized to 150x22 when it's minimized, but the swapchain shouldn't be resized
344 // because that's not a useful size to render to.
Cooper Partineeb1f532014-09-23 10:25:02 -0700345 if (!mNativeWindow.getClientRect(&client))
John Bauman3dc300a2014-01-28 15:30:35 -0800346 {
347 ASSERT(false);
348 return false;
349 }
350
351 // Grow the buffer now, if the window has grown. We need to grow now to avoid losing information.
352 clientWidth = client.right - client.left;
353 clientHeight = client.bottom - client.top;
354 sizeDirty = clientWidth != getWidth() || clientHeight != getHeight();
John Bauman827a4712013-10-29 16:03:11 -0700355 }
356
Jamie Madill58e60322013-12-02 11:09:36 -0500357 bool wasDirty = (mSwapIntervalDirty || sizeDirty);
358
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000359 if (mSwapIntervalDirty)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000360 {
361 resetSwapChain(clientWidth, clientHeight);
shannon.woods@transgaming.comc71ca752013-02-28 23:06:50 +0000362 }
363 else if (sizeDirty)
364 {
365 resizeSwapChain(clientWidth, clientHeight);
366 }
367
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500368 return wasDirty;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000369}
370
Geoff Lang6b0cf992014-10-06 10:28:07 -0400371Error Surface::swap()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000372{
373 return swapRect(0, 0, mWidth, mHeight);
374}
375
Geoff Lang6b0cf992014-10-06 10:28:07 -0400376Error Surface::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000377{
378 if (!mPostSubBufferSupported)
379 {
380 // Spec is not clear about how this should be handled.
Geoff Lang6b0cf992014-10-06 10:28:07 -0400381 return Error(EGL_SUCCESS);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000382 }
Nicolas Capens3501c162014-05-21 13:27:15 -0400383
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000384 return swapRect(x, y, width, height);
385}
386
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000387EGLint Surface::isPostSubBufferSupported() const
388{
389 return mPostSubBufferSupported;
390}
391
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +0000392rx::SwapChain *Surface::getSwapChain() const
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000393{
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000394 return mSwapChain;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000395}
396
397void Surface::setSwapInterval(EGLint interval)
398{
399 if (mSwapInterval == interval)
400 {
401 return;
402 }
Nicolas Capens3501c162014-05-21 13:27:15 -0400403
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000404 mSwapInterval = interval;
daniel@transgaming.com114bd462012-10-31 18:42:47 +0000405 mSwapInterval = std::max(mSwapInterval, mRenderer->getMinSwapInterval());
406 mSwapInterval = std::min(mSwapInterval, mRenderer->getMaxSwapInterval());
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000407
daniel@transgaming.com3c720782012-10-31 18:42:34 +0000408 mSwapIntervalDirty = true;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000409}
410
Nicolas Capens3501c162014-05-21 13:27:15 -0400411EGLint Surface::getConfigID() const
412{
413 return mConfig->mConfigID;
414}
415
416EGLint Surface::getWidth() const
417{
418 return mWidth;
419}
420
421EGLint Surface::getHeight() const
422{
423 return mHeight;
424}
425
426EGLint Surface::getPixelAspectRatio() const
427{
428 return mPixelAspectRatio;
429}
430
431EGLenum Surface::getRenderBuffer() const
432{
433 return mRenderBuffer;
434}
435
436EGLenum Surface::getSwapBehavior() const
437{
438 return mSwapBehavior;
439}
440
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000441EGLenum Surface::getTextureFormat() const
442{
443 return mTextureFormat;
444}
445
446EGLenum Surface::getTextureTarget() const
447{
448 return mTextureTarget;
449}
450
451void Surface::setBoundTexture(gl::Texture2D *texture)
452{
453 mTexture = texture;
454}
455
456gl::Texture2D *Surface::getBoundTexture() const
457{
458 return mTexture;
459}
460
John Bauman3dc300a2014-01-28 15:30:35 -0800461EGLint Surface::isFixedSize() const
462{
463 return mFixedSize;
464}
465
daniel@transgaming.com106e1f72012-10-31 18:38:36 +0000466EGLenum Surface::getFormat() const
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000467{
468 return mConfig->mRenderTargetFormat;
469}
470}