13c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// 2cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved. 33c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 43c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// found in the LICENSE file. 53c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// 63c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 7a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.com// SwapChain9.cpp: Implements a back-end specific class for the D3D9 swap chain. 83c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 9c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d9/SwapChain9.h" 10c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d9/renderer9_utils.h" 11c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d9/formatutils9.h" 12c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d9/Renderer9.h" 133c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1476d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.comnamespace rx 153c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 163c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 17a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.comSwapChain9::SwapChain9(Renderer9 *renderer, HWND window, HANDLE shareHandle, 18a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.com GLenum backBufferFormat, GLenum depthBufferFormat) 19a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.com : mRenderer(renderer), SwapChain(window, shareHandle, backBufferFormat, depthBufferFormat) 203c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 213c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mSwapChain = NULL; 223c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mBackBuffer = NULL; 233c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mDepthStencil = NULL; 243c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mRenderTarget = NULL; 253c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mOffscreenTexture = NULL; 263c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mWidth = -1; 273c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mHeight = -1; 28c71ca75ad647335876ed6961ebf461203df4caddshannon.woods@transgaming.com mSwapInterval = -1; 293c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 303c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 31a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.comSwapChain9::~SwapChain9() 323c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 333c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com release(); 343c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 353c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 36a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.comvoid SwapChain9::release() 373c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 38ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mSwapChain); 39ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mBackBuffer); 40ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mDepthStencil); 41ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mRenderTarget); 42ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mOffscreenTexture); 433c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 4421cfaef3a05f3279faaa93d708aeb94eca089544daniel@transgaming.com if (mWindow) 45ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang { 4621cfaef3a05f3279faaa93d708aeb94eca089544daniel@transgaming.com mShareHandle = NULL; 47ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang } 483c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 493c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 503c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.comstatic DWORD convertInterval(EGLint interval) 513c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 52fb8394756ea5940cf41e8276a81d54bacdceb5a6Shannon Woods#ifdef ANGLE_FORCE_VSYNC_OFF 53f5ef21cd8ad7eb2b55ca9a1f49aff57e9d53f89eGeoff Lang return D3DPRESENT_INTERVAL_IMMEDIATE; 54f5ef21cd8ad7eb2b55ca9a1f49aff57e9d53f89eGeoff Lang#else 553c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com switch(interval) 563c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 573c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com case 0: return D3DPRESENT_INTERVAL_IMMEDIATE; 583c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com case 1: return D3DPRESENT_INTERVAL_ONE; 593c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com case 2: return D3DPRESENT_INTERVAL_TWO; 603c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com case 3: return D3DPRESENT_INTERVAL_THREE; 613c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com case 4: return D3DPRESENT_INTERVAL_FOUR; 623c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com default: UNREACHABLE(); 633c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 643c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 653c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return D3DPRESENT_INTERVAL_DEFAULT; 66f5ef21cd8ad7eb2b55ca9a1f49aff57e9d53f89eGeoff Lang#endif 673c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 683c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 69c71ca75ad647335876ed6961ebf461203df4caddshannon.woods@transgaming.comEGLint SwapChain9::resize(int backbufferWidth, int backbufferHeight) 70c71ca75ad647335876ed6961ebf461203df4caddshannon.woods@transgaming.com{ 71c71ca75ad647335876ed6961ebf461203df4caddshannon.woods@transgaming.com // D3D9 does not support resizing swap chains without recreating them 72c71ca75ad647335876ed6961ebf461203df4caddshannon.woods@transgaming.com return reset(backbufferWidth, backbufferHeight, mSwapInterval); 73c71ca75ad647335876ed6961ebf461203df4caddshannon.woods@transgaming.com} 74c71ca75ad647335876ed6961ebf461203df4caddshannon.woods@transgaming.com 75a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.comEGLint SwapChain9::reset(int backbufferWidth, int backbufferHeight, EGLint swapInterval) 763c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 773c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com IDirect3DDevice9 *device = mRenderer->getDevice(); 783c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 793c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (device == NULL) 803c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 813c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_BAD_ACCESS; 823c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 833c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 843c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // Evict all non-render target textures to system memory and release all resources 853c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // before reallocating them to free up as much video memory as possible. 863c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->EvictManagedResources(); 873c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 883c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com HRESULT result; 893c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 903c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // Release specific resources to free up memory for the new render target, while the 913c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // old render target still exists for the purpose of preserving its contents. 92ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mSwapChain); 93ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mBackBuffer); 94ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mOffscreenTexture); 95ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mDepthStencil); 963c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 973c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com HANDLE *pShareHandle = NULL; 983c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (!mWindow && mRenderer->getShareHandleSupport()) 993c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1003c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com pShareHandle = &mShareHandle; 1013c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 1023c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 10391fa9ce47649057c5b15113ea31c5ed4b7bd8fceGeoff Lang const d3d9::TextureFormat &backBufferd3dFormatInfo = d3d9::GetTextureFormatInfo(mBackBufferFormat); 1043c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com result = device->CreateTexture(backbufferWidth, backbufferHeight, 1, D3DUSAGE_RENDERTARGET, 10591fa9ce47649057c5b15113ea31c5ed4b7bd8fceGeoff Lang backBufferd3dFormatInfo.texFormat, D3DPOOL_DEFAULT, &mOffscreenTexture, 10691fa9ce47649057c5b15113ea31c5ed4b7bd8fceGeoff Lang pShareHandle); 1073c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (FAILED(result)) 1083c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1093c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com ERR("Could not create offscreen texture: %08lX", result); 1103c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com release(); 1113c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 112f5f5949101cbf4df3927810bfd9ca233619494c4shannon.woods@transgaming.com if (d3d9::isDeviceLostError(result)) 1133c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1143c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_CONTEXT_LOST; 1153c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 1163c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com else 1173c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1183c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_BAD_ALLOC; 1193c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 1203c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 1213c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1223c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com IDirect3DSurface9 *oldRenderTarget = mRenderTarget; 1233c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1243c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com result = mOffscreenTexture->GetSurfaceLevel(0, &mRenderTarget); 1253c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com ASSERT(SUCCEEDED(result)); 1263c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1273c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (oldRenderTarget) 1283c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1293c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com RECT rect = 1303c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1313c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 0, 0, 1323c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mWidth, mHeight 1333c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com }; 1343c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1353c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (rect.right > static_cast<LONG>(backbufferWidth)) 1363c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1373c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com rect.right = backbufferWidth; 1383c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 1393c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1403c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (rect.bottom > static_cast<LONG>(backbufferHeight)) 1413c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1423c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com rect.bottom = backbufferHeight; 1433c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 1443c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1453c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mRenderer->endScene(); 1463c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1473c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com result = device->StretchRect(oldRenderTarget, &rect, mRenderTarget, &rect, D3DTEXF_NONE); 1483c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com ASSERT(SUCCEEDED(result)); 1493c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 150ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(oldRenderTarget); 1513c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 1523c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 15391fa9ce47649057c5b15113ea31c5ed4b7bd8fceGeoff Lang const d3d9::TextureFormat &depthBufferd3dFormatInfo = d3d9::GetTextureFormatInfo(mDepthBufferFormat); 15491fa9ce47649057c5b15113ea31c5ed4b7bd8fceGeoff Lang 1553c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (mWindow) 1563c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1573c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com D3DPRESENT_PARAMETERS presentParameters = {0}; 15891fa9ce47649057c5b15113ea31c5ed4b7bd8fceGeoff Lang presentParameters.AutoDepthStencilFormat = depthBufferd3dFormatInfo.renderFormat; 1593c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.BackBufferCount = 1; 16091fa9ce47649057c5b15113ea31c5ed4b7bd8fceGeoff Lang presentParameters.BackBufferFormat = backBufferd3dFormatInfo.renderFormat; 1613c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.EnableAutoDepthStencil = FALSE; 1623c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.Flags = 0; 1633c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.hDeviceWindow = mWindow; 1643c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.MultiSampleQuality = 0; // FIXME: Unimplemented 1653c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.MultiSampleType = D3DMULTISAMPLE_NONE; // FIXME: Unimplemented 1663c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.PresentationInterval = convertInterval(swapInterval); 1673c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.SwapEffect = D3DSWAPEFFECT_DISCARD; 1683c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.Windowed = TRUE; 1693c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.BackBufferWidth = backbufferWidth; 1703c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.BackBufferHeight = backbufferHeight; 1713c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1723c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // http://crbug.com/140239 1733c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // http://crbug.com/143434 1743c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // 1753c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // Some AMD/Intel switchable systems / drivers appear to round swap chain surfaces to a multiple of 64 pixels in width 1763c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // when using the integrated Intel. This rounds the width up rather than down. 1773c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // 1783c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // Some non-switchable AMD GPUs / drivers do not respect the source rectangle to Present. Therefore, when the vendor ID 1793c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // is not Intel, the back buffer width must be exactly the same width as the window or horizontal scaling will occur. 180d8e3656a51ad208f95abd22144f5a36c1c4f69a1daniel@transgaming.com if (mRenderer->getAdapterVendor() == VENDOR_ID_INTEL) 1813c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1823c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com presentParameters.BackBufferWidth = (presentParameters.BackBufferWidth + 63) / 64 * 64; 1833c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 1843c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1853c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com result = device->CreateAdditionalSwapChain(&presentParameters, &mSwapChain); 1863c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1873c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (FAILED(result)) 1883c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1893c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_INVALIDCALL || result == D3DERR_DEVICELOST); 1903c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 1913c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com ERR("Could not create additional swap chains or offscreen surfaces: %08lX", result); 1923c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com release(); 1933c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 194f5f5949101cbf4df3927810bfd9ca233619494c4shannon.woods@transgaming.com if (d3d9::isDeviceLostError(result)) 1953c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 1963c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_CONTEXT_LOST; 1973c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 1983c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com else 1993c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 2003c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_BAD_ALLOC; 2013c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 2023c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 2033c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2043c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com result = mSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &mBackBuffer); 2053c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com ASSERT(SUCCEEDED(result)); 206b323df037b7a87eb16fcd8c81b4a3aeda77689c6daniel@transgaming.com InvalidateRect(mWindow, NULL, FALSE); 2073c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 2083c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 209a60160b0c85ea5030edea66590e1475bed8c9a7cdaniel@transgaming.com if (mDepthBufferFormat != GL_NONE) 2103c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 2113c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com result = device->CreateDepthStencilSurface(backbufferWidth, backbufferHeight, 21291fa9ce47649057c5b15113ea31c5ed4b7bd8fceGeoff Lang depthBufferd3dFormatInfo.renderFormat, 2133c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com D3DMULTISAMPLE_NONE, 0, FALSE, &mDepthStencil, NULL); 2143c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2153c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (FAILED(result)) 2163c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 2173c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_INVALIDCALL); 2183c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2193c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com ERR("Could not create depthstencil surface for new swap chain: 0x%08X", result); 2203c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com release(); 2213c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 222f5f5949101cbf4df3927810bfd9ca233619494c4shannon.woods@transgaming.com if (d3d9::isDeviceLostError(result)) 2233c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 2243c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_CONTEXT_LOST; 2253c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 2263c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com else 2273c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 2283c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_BAD_ALLOC; 2293c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 2303c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 2313c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 2323c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2333c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mWidth = backbufferWidth; 2343c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mHeight = backbufferHeight; 235c71ca75ad647335876ed6961ebf461203df4caddshannon.woods@transgaming.com mSwapInterval = swapInterval; 2363c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2373c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_SUCCESS; 2383c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 2393c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2403c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// parameters should be validated/clamped by caller 241a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.comEGLint SwapChain9::swapRect(EGLint x, EGLint y, EGLint width, EGLint height) 2423c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 2433c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (!mSwapChain) 2443c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 2453c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_SUCCESS; 2463c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 2473c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2483c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com IDirect3DDevice9 *device = mRenderer->getDevice(); 2493c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2503c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com // Disable all pipeline operations 2513c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); 2523c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); 2533c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); 2543c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); 2553c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); 2563c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderState(D3DRS_STENCILENABLE, FALSE); 2573c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); 2583c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED); 2593c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderState(D3DRS_SRGBWRITEENABLE, FALSE); 2603c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); 2613c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetPixelShader(NULL); 2623c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetVertexShader(NULL); 2633c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2643c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetRenderTarget(0, mBackBuffer); 2653c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetDepthStencilSurface(NULL); 2663c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2673c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetTexture(0, mOffscreenTexture); 2683c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); 2693c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); 2703c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); 2713c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); 2723c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); 2733c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); 2743c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); 2753c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1); 2763c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2775a60b73990beba0ef1b551cbe0a0c5cbf1236949Jamie Madill for (UINT streamIndex = 0; streamIndex < gl::MAX_VERTEX_ATTRIBS; streamIndex++) 2785a60b73990beba0ef1b551cbe0a0c5cbf1236949Jamie Madill { 2795a60b73990beba0ef1b551cbe0a0c5cbf1236949Jamie Madill device->SetStreamSourceFreq(streamIndex, 1); 2805a60b73990beba0ef1b551cbe0a0c5cbf1236949Jamie Madill } 2815a60b73990beba0ef1b551cbe0a0c5cbf1236949Jamie Madill 2823c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com D3DVIEWPORT9 viewport = {0, 0, mWidth, mHeight, 0.0f, 1.0f}; 2833c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetViewport(&viewport); 2843c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2853c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com float x1 = x - 0.5f; 2863c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com float y1 = (mHeight - y - height) - 0.5f; 2873c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com float x2 = (x + width) - 0.5f; 2883c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com float y2 = (mHeight - y) - 0.5f; 2893c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2903c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com float u1 = x / float(mWidth); 2913c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com float v1 = y / float(mHeight); 2923c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com float u2 = (x + width) / float(mWidth); 2933c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com float v2 = (y + height) / float(mHeight); 2943c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 2953c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com float quad[4][6] = {{x1, y1, 0.0f, 1.0f, u1, v2}, 2963c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com {x2, y1, 0.0f, 1.0f, u2, v2}, 2973c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com {x2, y2, 0.0f, 1.0f, u2, v1}, 2983c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com {x1, y2, 0.0f, 1.0f, u1, v1}}; // x, y, z, rhw, u, v 2993c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3003c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mRenderer->startScene(); 3013c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, quad, 6 * sizeof(float)); 3023c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mRenderer->endScene(); 3033c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3043c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com device->SetTexture(0, NULL); 3053c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3063c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com RECT rect = 3073c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 3083c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com x, mHeight - y - height, 3093c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com x + width, mHeight - y 3103c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com }; 3113c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3123c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com HRESULT result = mSwapChain->Present(&rect, &rect, NULL, NULL, 0); 3133c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 314c43a60557d5e25cfb80cb0cd3c2a01920251745fdaniel@transgaming.com mRenderer->markAllStateDirty(); 3153c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3163c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DRIVERINTERNALERROR) 3173c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 3183c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_BAD_ALLOC; 3193c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 3203c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 321662b8481b2eecd36a46d27ceae48ff95f7ca159cGeoff Lang // On Windows 8 systems, IDirect3DSwapChain9::Present sometimes returns 0x88760873 when the windows is 322662b8481b2eecd36a46d27ceae48ff95f7ca159cGeoff Lang // in the process of entering/exiting fullscreen. This code doesn't seem to have any documentation. The 323662b8481b2eecd36a46d27ceae48ff95f7ca159cGeoff Lang // device appears to be ok after emitting this error so simply return a failure to swap. 324662b8481b2eecd36a46d27ceae48ff95f7ca159cGeoff Lang if (result == 0x88760873) 325662b8481b2eecd36a46d27ceae48ff95f7ca159cGeoff Lang { 326fbcc6345c7a90c2f0872c5ceaca43d23a744a24cNicolas Capens return EGL_BAD_MATCH; 327662b8481b2eecd36a46d27ceae48ff95f7ca159cGeoff Lang } 328662b8481b2eecd36a46d27ceae48ff95f7ca159cGeoff Lang 329cd65ae1685a3ebcf60c92d5bb02ff5bc05482cbdJamie Madill // http://crbug.com/313210 330cd65ae1685a3ebcf60c92d5bb02ff5bc05482cbdJamie Madill // If our swap failed, trigger a device lost event. Resetting will work around an AMD-specific 331cd65ae1685a3ebcf60c92d5bb02ff5bc05482cbdJamie Madill // device removed bug with lost contexts when reinstalling drivers. 332cd65ae1685a3ebcf60c92d5bb02ff5bc05482cbdJamie Madill if (FAILED(result)) 333cd65ae1685a3ebcf60c92d5bb02ff5bc05482cbdJamie Madill { 334cd65ae1685a3ebcf60c92d5bb02ff5bc05482cbdJamie Madill mRenderer->notifyDeviceLost(); 335cd65ae1685a3ebcf60c92d5bb02ff5bc05482cbdJamie Madill return EGL_CONTEXT_LOST; 336cd65ae1685a3ebcf60c92d5bb02ff5bc05482cbdJamie Madill } 3373c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3383c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return EGL_SUCCESS; 3393c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 3403c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3413c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// Increments refcount on surface. 3423c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// caller must Release() the returned surface 3432916b30eb47496327257254d355677a6ebb0388aGeoff Lang// TODO: remove the AddRef to match SwapChain11 344a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.comIDirect3DSurface9 *SwapChain9::getRenderTarget() 3453c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 3463c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (mRenderTarget) 3473c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 3483c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mRenderTarget->AddRef(); 3493c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 3503c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3513c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return mRenderTarget; 3523c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 3533c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3543c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// Increments refcount on surface. 3553c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// caller must Release() the returned surface 3562916b30eb47496327257254d355677a6ebb0388aGeoff Lang// TODO: remove the AddRef to match SwapChain11 357a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.comIDirect3DSurface9 *SwapChain9::getDepthStencil() 3583c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 3593c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (mDepthStencil) 3603c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 3613c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mDepthStencil->AddRef(); 3623c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 3633c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3643c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return mDepthStencil; 3653c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 3663c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3673c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// Increments refcount on texture. 3683c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com// caller must Release() the returned texture 3692916b30eb47496327257254d355677a6ebb0388aGeoff Lang// TODO: remove the AddRef to match SwapChain11 370a27e05ba93cb633afc84e75bf26cede96d871261daniel@transgaming.comIDirect3DTexture9 *SwapChain9::getOffscreenTexture() 3713c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com{ 3723c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com if (mOffscreenTexture) 3733c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com { 3743c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com mOffscreenTexture->AddRef(); 3753c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com } 3763c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 3773c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com return mOffscreenTexture; 3783c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 3793c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com 380d733bb88bc5544f6e55bc359e1ce26faa5d45565daniel@transgaming.comSwapChain9 *SwapChain9::makeSwapChain9(SwapChain *swapChain) 381d733bb88bc5544f6e55bc359e1ce26faa5d45565daniel@transgaming.com{ 3828b400b1e8d84c5b93dd151807504a3e4b90d1b21apatrick@chromium.org ASSERT(HAS_DYNAMIC_TYPE(rx::SwapChain9*, swapChain)); 383d733bb88bc5544f6e55bc359e1ce26faa5d45565daniel@transgaming.com return static_cast<rx::SwapChain9*>(swapChain); 384d733bb88bc5544f6e55bc359e1ce26faa5d45565daniel@transgaming.com} 385d733bb88bc5544f6e55bc359e1ce26faa5d45565daniel@transgaming.com 3868bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.comvoid SwapChain9::recreate() 3878bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com{ 3888bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com if (!mSwapChain) 3898bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com { 3908bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com return; 3918bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com } 3928bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com 3938bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com IDirect3DDevice9 *device = mRenderer->getDevice(); 3948bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com if (device == NULL) 3958bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com { 3968bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com return; 3978bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com } 3988bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com 3998bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com D3DPRESENT_PARAMETERS presentParameters; 4008bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com HRESULT result = mSwapChain->GetPresentParameters(&presentParameters); 4018bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com ASSERT(SUCCEEDED(result)); 4028bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com 4038bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com IDirect3DSwapChain9* newSwapChain = NULL; 4048bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com result = device->CreateAdditionalSwapChain(&presentParameters, &newSwapChain); 4058bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com if (FAILED(result)) 4068bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com { 4078bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com return; 4088bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com } 4098bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com 410ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mSwapChain); 4118bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com mSwapChain = newSwapChain; 4128bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com 413ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang SafeRelease(mBackBuffer); 4148bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com result = mSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &mBackBuffer); 4158bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com ASSERT(SUCCEEDED(result)); 4168bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com} 4178bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com 4183c72078a46b247266c393afd936d50e503142cf7daniel@transgaming.com} 419