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