1bdf2d80f459d43f5a6df074431bacf41584f81b7shannon.woods@transgaming.com#include "precompiled.h"
24834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com//
34834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
44834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
54834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com// found in the LICENSE file.
64834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com//
74834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
84834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com// TextureStorage11.cpp: Implements the abstract rx::TextureStorage11 class and its concrete derived
94834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11 texture.
104834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
114834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com#include "libGLESv2/renderer/TextureStorage11.h"
124834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
134834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com#include "libGLESv2/renderer/Renderer11.h"
144834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com#include "libGLESv2/renderer/RenderTarget11.h"
154834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com#include "libGLESv2/renderer/SwapChain11.h"
164834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com#include "libGLESv2/renderer/renderer11_utils.h"
174834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
18486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/utilities.h"
194834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com#include "libGLESv2/main.h"
204834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
214834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comnamespace rx
224834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
234834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
244834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comTextureStorage11::TextureStorage11(Renderer *renderer, UINT bindFlags)
254834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    : mBindFlags(bindFlags),
26b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com      mLodOffset(0),
2753b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com      mMipLevels(0),
2853b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com      mTexture(NULL),
2953b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com      mTextureFormat(DXGI_FORMAT_UNKNOWN),
3053b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com      mShaderResourceFormat(DXGI_FORMAT_UNKNOWN),
3153b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com      mRenderTargetFormat(DXGI_FORMAT_UNKNOWN),
3253b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com      mDepthStencilFormat(DXGI_FORMAT_UNKNOWN),
3396c21eea84a34524b0c731a8b94d1fdec1724921shannon.woods@transgaming.com      mSRV(NULL),
3453b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com      mTextureWidth(0),
3553b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com      mTextureHeight(0)
364834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
374834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    mRenderer = Renderer11::makeRenderer11(renderer);
384834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
394834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
404834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comTextureStorage11::~TextureStorage11()
414834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
421e1b5e91c101bdb565f61c5341c69b2bb7702690daniel@transgaming.com}
434834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
444834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comTextureStorage11 *TextureStorage11::makeTextureStorage11(TextureStorage *storage)
454834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
468b400b1e8d84c5b93dd151807504a3e4b90d1b21apatrick@chromium.org    ASSERT(HAS_DYNAMIC_TYPE(TextureStorage11*, storage));
474834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    return static_cast<TextureStorage11*>(storage);
484834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
494834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
504834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comDWORD TextureStorage11::GetTextureBindFlags(DXGI_FORMAT format, GLenum glusage, bool forceRenderable)
514834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
524834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    UINT bindFlags = D3D11_BIND_SHADER_RESOURCE;
534834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
54eec5c6308990a157ee3fe0f66349ebc3cee3fc19shannon.woods@transgaming.com    if (d3d11::IsDepthStencilFormat(format))
554834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    {
564834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        bindFlags |= D3D11_BIND_DEPTH_STENCIL;
574834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    }
584834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    else if(forceRenderable || (TextureStorage11::IsTextureFormatRenderable(format) && (glusage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE)))
594834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    {
604834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        bindFlags |= D3D11_BIND_RENDER_TARGET;
614834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    }
624834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    return bindFlags;
634834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
644834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
654834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.combool TextureStorage11::IsTextureFormatRenderable(DXGI_FORMAT format)
664834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
674834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    switch(format)
684834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    {
694834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_R8G8B8A8_UNORM:
704834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_A8_UNORM:
714834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_R32G32B32A32_FLOAT:
724834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_R16G16B16A16_FLOAT:
734834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_B8G8R8A8_UNORM:
744834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_R8_UNORM:
754834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_R8G8_UNORM:
764834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_R16_FLOAT:
774834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_R16G16_FLOAT:
784834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        return true;
794834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_BC1_UNORM:
804834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_BC2_UNORM:
814834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      case DXGI_FORMAT_BC3_UNORM:
825b3f92177fd5cefb4833d48d47f0f4dcea3955b5Shannon Woods      case DXGI_FORMAT_R32G32B32_FLOAT: // not renderable on all devices
834834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        return false;
844834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com      default:
854834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        UNREACHABLE();
864834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        return false;
874834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    }
884834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
894834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
904834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comUINT TextureStorage11::getBindFlags() const
914834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
924834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    return mBindFlags;
934834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
944834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
9553b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.comID3D11Texture2D *TextureStorage11::getBaseTexture() const
9653b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com{
9753b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com    return mTexture;
9853b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com}
9953b0ecb848cd17a0e72a0b2813c196386e8cf3b1shannon.woods@transgaming.com
1004834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comint TextureStorage11::getLodOffset() const
1014834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
1024834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    return mLodOffset;
1034834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
1044834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
1054834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.combool TextureStorage11::isRenderTarget() const
1064834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
1074834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    return (mBindFlags & (D3D11_BIND_RENDER_TARGET | D3D11_BIND_DEPTH_STENCIL)) != 0;
1084834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
1094834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
1104834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.combool TextureStorage11::isManaged() const
1114834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
1124834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    return false;
1134834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
1144834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
1154834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comint TextureStorage11::levelCount()
1164834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
1174834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    int levels = 0;
1184834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    if (getBaseTexture())
1194834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    {
120b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com        levels = mMipLevels - getLodOffset();
1214834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    }
1224834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    return levels;
1234834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
1244834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
1259a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.comUINT TextureStorage11::getSubresourceIndex(int level, int faceIndex)
1269a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com{
1279a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com    UINT index = 0;
1289a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com    if (getBaseTexture())
1299a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com    {
130b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com        index = D3D11CalcSubresource(level, faceIndex, mMipLevels);
1319a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com    }
1329a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com    return index;
1339a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com}
1349a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com
13581ae58ac5438ed6059529115ea694f5ae1b649cashannon.woods@transgaming.combool TextureStorage11::updateSubresourceLevel(ID3D11Texture2D *srcTexture, unsigned int sourceSubresource,
13681ae58ac5438ed6059529115ea694f5ae1b649cashannon.woods@transgaming.com                                              int level, int face, GLint xoffset, GLint yoffset,
13781ae58ac5438ed6059529115ea694f5ae1b649cashannon.woods@transgaming.com                                              GLsizei width, GLsizei height)
1389a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com{
1399a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com    if (srcTexture)
1409a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com    {
1417ae9e7fc1648f9c5b5231248e273ed203417cb35shannon.woods@transgaming.com        // Round up the width and height to the nearest multiple of dimension alignment
1427ae9e7fc1648f9c5b5231248e273ed203417cb35shannon.woods@transgaming.com        unsigned int dimensionAlignment = d3d11::GetTextureFormatDimensionAlignment(mTextureFormat);
1437ae9e7fc1648f9c5b5231248e273ed203417cb35shannon.woods@transgaming.com        width = width + dimensionAlignment - 1 - (width - 1) % dimensionAlignment;
1447ae9e7fc1648f9c5b5231248e273ed203417cb35shannon.woods@transgaming.com        height = height + dimensionAlignment - 1 - (height - 1) % dimensionAlignment;
1457ae9e7fc1648f9c5b5231248e273ed203417cb35shannon.woods@transgaming.com
1469a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com        D3D11_BOX srcBox;
1479a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com        srcBox.left = xoffset;
1489a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com        srcBox.top = yoffset;
1499a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com        srcBox.right = xoffset + width;
1509a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com        srcBox.bottom = yoffset + height;
1519a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com        srcBox.front = 0;
1529a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com        srcBox.back = 1;
1539a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com
1549a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com        ID3D11DeviceContext *context = mRenderer->getDeviceContext();
1559a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com
156858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        ASSERT(getBaseTexture());
15781ae58ac5438ed6059529115ea694f5ae1b649cashannon.woods@transgaming.com        context->CopySubresourceRegion(getBaseTexture(), getSubresourceIndex(level + mLodOffset, face),
15881ae58ac5438ed6059529115ea694f5ae1b649cashannon.woods@transgaming.com                                       xoffset, yoffset, 0, srcTexture, sourceSubresource, &srcBox);
1599a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com        return true;
1609a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com    }
1619a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com
1629a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com    return false;
1639a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com}
1649a2f54dbdda14e3a72d1de41ddfdd6e817a29325daniel@transgaming.com
16585bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.comvoid TextureStorage11::generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest)
16685bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com{
16785bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com    if (source && dest)
16885bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com    {
16985bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com        ID3D11ShaderResourceView *sourceSRV = source->getShaderResourceView();
17085bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com        ID3D11RenderTargetView *destRTV = dest->getRenderTargetView();
17185bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com
17285bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com        if (sourceSRV && destRTV)
17385bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com        {
17485bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            gl::Rectangle sourceArea;
17585bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            sourceArea.x = 0;
17685bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            sourceArea.y = 0;
17785bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            sourceArea.width = source->getWidth();
17885bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            sourceArea.height = source->getHeight();
17985bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com
18085bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            gl::Rectangle destArea;
18185bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            destArea.x = 0;
18285bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            destArea.y = 0;
18385bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            destArea.width = dest->getWidth();
18485bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            destArea.height = dest->getHeight();
18585bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com
18685bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com            mRenderer->copyTexture(sourceSRV, sourceArea, source->getWidth(), source->getHeight(),
18785bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com                                   destRTV, destArea, dest->getWidth(), dest->getHeight(),
18885bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com                                   GL_RGBA);
18985bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com        }
19085bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com    }
19185bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com}
19285bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com
1934834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comTextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapchain)
1944834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    : TextureStorage11(renderer, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE)
1954834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
1965b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mTexture = swapchain->getOffscreenTexture();
1975b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mSRV = swapchain->getRenderTargetShaderResource();
198858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
199858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
200858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    {
201858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        mRenderTarget[i] = NULL;
202858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    }
2034834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
2045b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    D3D11_TEXTURE2D_DESC texDesc;
2055b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mTexture->GetDesc(&texDesc);
2065b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mMipLevels = texDesc.MipLevels;
2075b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mTextureFormat = texDesc.Format;
2085b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mTextureWidth = texDesc.Width;
2095b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mTextureHeight = texDesc.Height;
2105b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
2115b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
2125b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mSRV->GetDesc(&srvDesc);
2135b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mShaderResourceFormat = srvDesc.Format;
2145b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
2155b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    ID3D11RenderTargetView* offscreenRTV = swapchain->getRenderTarget();
2165b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
2175b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    offscreenRTV->GetDesc(&rtvDesc);
2185b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mRenderTargetFormat = rtvDesc.Format;
2195b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    offscreenRTV->Release();
2204834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
2215b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    mDepthStencilFormat = DXGI_FORMAT_UNKNOWN;
2224834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
2234834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
2244834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comTextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height)
2254834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    : TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, forceRenderable))
2264834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
227858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
228858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    {
229858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        mRenderTarget[i] = NULL;
230858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    }
231858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
2325b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    DXGI_FORMAT convertedFormat = gl_d3d11::ConvertTextureFormat(internalformat);
2335b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    if (d3d11::IsDepthStencilFormat(convertedFormat))
2345b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    {
2355b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mTextureFormat = d3d11::GetDepthTextureFormat(convertedFormat);
2365b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mShaderResourceFormat = d3d11::GetDepthShaderResourceFormat(convertedFormat);
2375b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mDepthStencilFormat = convertedFormat;
2385b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mRenderTargetFormat = DXGI_FORMAT_UNKNOWN;
2395b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    }
2405b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    else
2415b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    {
2425b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mTextureFormat = convertedFormat;
2435b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mShaderResourceFormat = convertedFormat;
2445b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mDepthStencilFormat = DXGI_FORMAT_UNKNOWN;
2455b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mRenderTargetFormat = convertedFormat;
2465b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    }
2475b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
2484834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    // if the width or height is not positive this should be treated as an incomplete texture
2494834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    // we handle that here by skipping the d3d texture creation
2504834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    if (width > 0 && height > 0)
2514834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    {
2524834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        // adjust size if needed for compressed textures
2534834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        gl::MakeValidSize(false, gl::IsCompressed(internalformat), &width, &height, &mLodOffset);
2544834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
2554834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        ID3D11Device *device = mRenderer->getDevice();
2564834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
2574834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        D3D11_TEXTURE2D_DESC desc;
2584834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        desc.Width = width;      // Compressed texture size constraints?
2594834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        desc.Height = height;
260c22e3604aeb9147dfd479740b0907979c63b970ashannon.woods@transgaming.com        desc.MipLevels = (levels > 0) ? levels + mLodOffset : 0;
2614834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        desc.ArraySize = 1;
2625b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        desc.Format = mTextureFormat;
2634834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        desc.SampleDesc.Count = 1;
2644834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        desc.SampleDesc.Quality = 0;
2654834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        desc.Usage = D3D11_USAGE_DEFAULT;
2664834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        desc.BindFlags = getBindFlags();
2674834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        desc.CPUAccessFlags = 0;
2684834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        desc.MiscFlags = 0;
2694834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
2704834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        HRESULT result = device->CreateTexture2D(&desc, NULL, &mTexture);
2714834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
272ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com        // this can happen from windows TDR
273ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com        if (d3d11::isDeviceLostError(result))
274ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com        {
275ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com            mRenderer->notifyDeviceLost();
276ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com            gl::error(GL_OUT_OF_MEMORY);
277ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com        }
278ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com        else if (FAILED(result))
2794834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        {
2804834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com            ASSERT(result == E_OUTOFMEMORY);
2814834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com            ERR("Creating image failed.");
282779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            gl::error(GL_OUT_OF_MEMORY);
2834834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        }
284b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com        else
285b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com        {
286b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com            mTexture->GetDesc(&desc);
287b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com            mMipLevels = desc.MipLevels;
288858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            mTextureWidth = desc.Width;
289858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            mTextureHeight = desc.Height;
290b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com        }
2914834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    }
2924834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
2934834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
2944834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comTextureStorage11_2D::~TextureStorage11_2D()
2954834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
2964834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    if (mTexture)
2974b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    {
2984834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com        mTexture->Release();
2994b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com        mTexture = NULL;
3004b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    }
3011e1b5e91c101bdb565f61c5341c69b2bb7702690daniel@transgaming.com
3021e1b5e91c101bdb565f61c5341c69b2bb7702690daniel@transgaming.com    if (mSRV)
3034b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    {
3041e1b5e91c101bdb565f61c5341c69b2bb7702690daniel@transgaming.com        mSRV->Release();
3054b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com        mSRV = NULL;
3064b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    }
3074b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com
308858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
3094b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    {
310858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        delete mRenderTarget[i];
311858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        mRenderTarget[i] = NULL;
3124b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    }
3134834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
3144834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
3154834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.comTextureStorage11_2D *TextureStorage11_2D::makeTextureStorage11_2D(TextureStorage *storage)
3164834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
3178b400b1e8d84c5b93dd151807504a3e4b90d1b21apatrick@chromium.org    ASSERT(HAS_DYNAMIC_TYPE(TextureStorage11_2D*, storage));
3184834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    return static_cast<TextureStorage11_2D*>(storage);
3194834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
3204834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
321858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.comRenderTarget *TextureStorage11_2D::getRenderTarget(int level)
3224834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
323858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    if (level >= 0 && level < static_cast<int>(mMipLevels))
3244b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    {
325858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        if (!mRenderTarget[level])
326858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        {
327858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            ID3D11Device *device = mRenderer->getDevice();
328858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            HRESULT result;
329858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
330183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com            D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
3315b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            srvDesc.Format = mShaderResourceFormat;
332183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com            srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
333183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com            srvDesc.Texture2D.MostDetailedMip = level;
334183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com            srvDesc.Texture2D.MipLevels = 1;
335183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com
336183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com            ID3D11ShaderResourceView *srv;
337183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com            result = device->CreateShaderResourceView(mTexture, &srvDesc, &srv);
338183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com
339183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com            if (result == E_OUTOFMEMORY)
340183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com            {
341779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com                return gl::error(GL_OUT_OF_MEMORY, static_cast<RenderTarget*>(NULL));
342183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com            }
343183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com            ASSERT(SUCCEEDED(result));
344183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com
3455b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN)
3465b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            {
3475b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
3485b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                rtvDesc.Format = mRenderTargetFormat;
3495b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
3505b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                rtvDesc.Texture2D.MipSlice = level;
3515b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
3525b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                ID3D11RenderTargetView *rtv;
3535b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                result = device->CreateRenderTargetView(mTexture, &rtvDesc, &rtv);
3545b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
3555b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                if (result == E_OUTOFMEMORY)
3565b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                {
3575b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                    srv->Release();
3585b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                    return gl::error(GL_OUT_OF_MEMORY, static_cast<RenderTarget*>(NULL));
3595b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                }
3605b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                ASSERT(SUCCEEDED(result));
3615b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
3625b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                // RenderTarget11 expects to be the owner of the resources it is given but TextureStorage11
3635b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                // also needs to keep a reference to the texture.
3645b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                mTexture->AddRef();
3655b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
3665b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                mRenderTarget[level] = new RenderTarget11(mRenderer, rtv, mTexture, srv,
3675b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                                                          std::max(mTextureWidth >> level, 1U),
3685b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                                                          std::max(mTextureHeight >> level, 1U));
3695b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            }
3705b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            else if (mDepthStencilFormat != DXGI_FORMAT_UNKNOWN)
3715b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            {
3725b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
3735b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                dsvDesc.Format = mDepthStencilFormat;
3745b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
3755b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                dsvDesc.Texture2D.MipSlice = level;
3765b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                dsvDesc.Flags = 0;
3775b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
3785b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                ID3D11DepthStencilView *dsv;
3795b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                result = device->CreateDepthStencilView(mTexture, &dsvDesc, &dsv);
3805b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
3815b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                if (result == E_OUTOFMEMORY)
3825b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                {
3835b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                    srv->Release();
3845b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                    return gl::error(GL_OUT_OF_MEMORY, static_cast<RenderTarget*>(NULL));
3855b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                }
3865b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                ASSERT(SUCCEEDED(result));
3875b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
3885b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                // RenderTarget11 expects to be the owner of the resources it is given but TextureStorage11
3895b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                // also needs to keep a reference to the texture.
3905b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                mTexture->AddRef();
3917e23285f51e48e8f3d75c99a1451023543fb4c66shannon.woods@transgaming.com
3925b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                mRenderTarget[level] = new RenderTarget11(mRenderer, dsv, mTexture, srv,
3935b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                                                          std::max(mTextureWidth >> level, 1U),
3945b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                                                          std::max(mTextureHeight >> level, 1U));
3955b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            }
3965b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            else
3975b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            {
3985b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                UNREACHABLE();
3995b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            }
400858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        }
401858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
402858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        return mRenderTarget[level];
4034b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    }
4044b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    else
4054b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    {
406858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        return NULL;
4074b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    }
4084834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com}
4094834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com
410858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.comID3D11ShaderResourceView *TextureStorage11_2D::getSRV()
4114834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com{
412858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    if (!mSRV)
4134834ee2ccfe4b0a89083daeb42607dc6e21da2e6daniel@transgaming.com    {
414858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        ID3D11Device *device = mRenderer->getDevice();
415b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com
416b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
4175b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        srvDesc.Format = mShaderResourceFormat;
418b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
419f2685e5f0d8e710054eef23909e43eaa11551087shannon.woods@transgaming.com        srvDesc.Texture2D.MipLevels = (mMipLevels == 0 ? -1 : mMipLevels);
420858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        srvDesc.Texture2D.MostDetailedMip = 0;
421b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com
422b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        HRESULT result = device->CreateShaderResourceView(mTexture, &srvDesc, &mSRV);
423b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com
424b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        if (result == E_OUTOFMEMORY)
425b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        {
426779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11ShaderResourceView*>(NULL));
427b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        }
428b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        ASSERT(SUCCEEDED(result));
429b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com    }
430858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
431858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    return mSRV;
432858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com}
433858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
434858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.comvoid TextureStorage11_2D::generateMipmap(int level)
435858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com{
43685bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com    RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(level - 1));
43785bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com    RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(level));
43885bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com
43985bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com    generateMipmapLayer(source, dest);
440b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com}
441b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com
442b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.comTextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size)
443b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    : TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, forceRenderable))
444b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com{
445858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    for (unsigned int i = 0; i < 6; i++)
4465cdd0586d171e2f81c1c47ca21736c0f3e912b11daniel@transgaming.com    {
447858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        for (unsigned int j = 0; j < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; j++)
448858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        {
449858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            mRenderTarget[i][j] = NULL;
450858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        }
4515cdd0586d171e2f81c1c47ca21736c0f3e912b11daniel@transgaming.com    }
4525cdd0586d171e2f81c1c47ca21736c0f3e912b11daniel@transgaming.com
4535b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    DXGI_FORMAT convertedFormat = gl_d3d11::ConvertTextureFormat(internalformat);
4545b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    if (d3d11::IsDepthStencilFormat(convertedFormat))
4555b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    {
4565b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mTextureFormat = d3d11::GetDepthTextureFormat(convertedFormat);
4575b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mShaderResourceFormat = d3d11::GetDepthShaderResourceFormat(convertedFormat);
4585b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mDepthStencilFormat = convertedFormat;
4595b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mRenderTargetFormat = DXGI_FORMAT_UNKNOWN;
4605b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    }
4615b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    else
4625b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    {
4635b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mTextureFormat = convertedFormat;
4645b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mShaderResourceFormat = convertedFormat;
4655b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mDepthStencilFormat = DXGI_FORMAT_UNKNOWN;
4665b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        mRenderTargetFormat = convertedFormat;
4675b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com    }
4685b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
469b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    // if the size is not positive this should be treated as an incomplete texture
470b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    // we handle that here by skipping the d3d texture creation
471b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    if (size > 0)
472b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    {
473b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        // adjust size if needed for compressed textures
474b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        int height = size;
475b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        gl::MakeValidSize(false, gl::IsCompressed(internalformat), &size, &height, &mLodOffset);
476b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
477b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        ID3D11Device *device = mRenderer->getDevice();
478b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
479b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        D3D11_TEXTURE2D_DESC desc;
480b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        desc.Width = size;
481b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        desc.Height = size;
482c22e3604aeb9147dfd479740b0907979c63b970ashannon.woods@transgaming.com        desc.MipLevels = (levels > 0) ? levels + mLodOffset : 0;
483b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        desc.ArraySize = 6;
4845b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        desc.Format = mTextureFormat;
485b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        desc.SampleDesc.Count = 1;
486b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        desc.SampleDesc.Quality = 0;
487b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        desc.Usage = D3D11_USAGE_DEFAULT;
488b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        desc.BindFlags = getBindFlags();
489b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        desc.CPUAccessFlags = 0;
490b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;
491b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
492b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        HRESULT result = device->CreateTexture2D(&desc, NULL, &mTexture);
493b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
494b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        if (FAILED(result))
495b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        {
496b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com            ASSERT(result == E_OUTOFMEMORY);
497b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com            ERR("Creating image failed.");
498779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            gl::error(GL_OUT_OF_MEMORY);
499b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        }
500b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com        else
501b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com        {
502b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com            mTexture->GetDesc(&desc);
503b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com            mMipLevels = desc.MipLevels;
504858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            mTextureWidth = desc.Width;
505858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            mTextureHeight = desc.Height;
506b115455104f6d20ad1bad11ceddf68e7ce6c8052daniel@transgaming.com        }
507b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    }
508b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com}
509b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
510b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.comTextureStorage11_Cube::~TextureStorage11_Cube()
511b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com{
512b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    if (mTexture)
5134b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    {
514b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        mTexture->Release();
5154b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com        mTexture = NULL;
5164b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    }
5171e1b5e91c101bdb565f61c5341c69b2bb7702690daniel@transgaming.com
5181e1b5e91c101bdb565f61c5341c69b2bb7702690daniel@transgaming.com    if (mSRV)
5194b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    {
5201e1b5e91c101bdb565f61c5341c69b2bb7702690daniel@transgaming.com        mSRV->Release();
5214b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com        mSRV = NULL;
5224b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    }
5234b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com
5244b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    for (unsigned int i = 0; i < 6; i++)
5254b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    {
526858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        for (unsigned int j = 0; j < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; j++)
5274b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com        {
528858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            delete mRenderTarget[i][j];
529858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            mRenderTarget[i][j] = NULL;
5304b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com        }
5314b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    }
532b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com}
533b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
534b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.comTextureStorage11_Cube *TextureStorage11_Cube::makeTextureStorage11_Cube(TextureStorage *storage)
535b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com{
5368b400b1e8d84c5b93dd151807504a3e4b90d1b21apatrick@chromium.org    ASSERT(HAS_DYNAMIC_TYPE(TextureStorage11_Cube*, storage));
537b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    return static_cast<TextureStorage11_Cube*>(storage);
538b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com}
539b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
540858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.comRenderTarget *TextureStorage11_Cube::getRenderTarget(GLenum faceTarget, int level)
541b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com{
542858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    unsigned int faceIdx = gl::TextureCubeMap::faceIndex(faceTarget);
543858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    if (level >= 0 && level < static_cast<int>(mMipLevels))
5444b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com    {
545858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        if (!mRenderTarget[faceIdx][level])
546b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        {
547858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            ID3D11Device *device = mRenderer->getDevice();
548858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            HRESULT result;
549b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
5505b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
5515b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            srvDesc.Format = mShaderResourceFormat;
552d89f1943ad1375e03bd6b3fb36be1ea413dca93cshannon.woods@transgaming.com            srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
5535b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            srvDesc.Texture2DArray.MostDetailedMip = level;
5545b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            srvDesc.Texture2DArray.MipLevels = 1;
5555b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            srvDesc.Texture2DArray.FirstArraySlice = faceIdx;
5565b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            srvDesc.Texture2DArray.ArraySize = 1;
5575b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
5585b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            ID3D11ShaderResourceView *srv;
5595b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            result = device->CreateShaderResourceView(mTexture, &srvDesc, &srv);
5605b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
5615b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            if (result == E_OUTOFMEMORY)
5625b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            {
5635b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                return gl::error(GL_OUT_OF_MEMORY, static_cast<RenderTarget*>(NULL));
5645b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            }
5655b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            ASSERT(SUCCEEDED(result));
5665b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
5675b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN)
568b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com            {
569858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
5705b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                rtvDesc.Format = mRenderTargetFormat;
571858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
572858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                rtvDesc.Texture2DArray.MipSlice = level;
573858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                rtvDesc.Texture2DArray.FirstArraySlice = faceIdx;
574858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                rtvDesc.Texture2DArray.ArraySize = 1;
5754b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com
576858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                ID3D11RenderTargetView *rtv;
577858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                result = device->CreateRenderTargetView(mTexture, &rtvDesc, &rtv);
578b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
579858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                if (result == E_OUTOFMEMORY)
580858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                {
5815b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                    srv->Release();
582779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com                    return gl::error(GL_OUT_OF_MEMORY, static_cast<RenderTarget*>(NULL));
5834b47235339ceba9ea5182a24ea5d806d9c5521bbshannon.woods@transgaming.com                }
584858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                ASSERT(SUCCEEDED(result));
585858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
5865b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                // RenderTarget11 expects to be the owner of the resources it is given but TextureStorage11
5875b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                // also needs to keep a reference to the texture.
5885b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                mTexture->AddRef();
589183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com
5905b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                mRenderTarget[faceIdx][level] = new RenderTarget11(mRenderer, rtv, mTexture, srv,
5915b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                                                                   std::max(mTextureWidth >> level, 1U),
5925b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                                                                   std::max(mTextureHeight >> level, 1U));
5935b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            }
5945b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            else if (mDepthStencilFormat != DXGI_FORMAT_UNKNOWN)
5955b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            {
5965b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
5975b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                dsvDesc.Format = mRenderTargetFormat;
5985b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
5995b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                dsvDesc.Texture2DArray.MipSlice = level;
6005b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                dsvDesc.Texture2DArray.FirstArraySlice = faceIdx;
6015b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                dsvDesc.Texture2DArray.ArraySize = 1;
6025b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com
6035b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                ID3D11DepthStencilView *dsv;
6045b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                result = device->CreateDepthStencilView(mTexture, &dsvDesc, &dsv);
605183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com
606183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com                if (result == E_OUTOFMEMORY)
607183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com                {
6085b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                    srv->Release();
609779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com                    return gl::error(GL_OUT_OF_MEMORY, static_cast<RenderTarget*>(NULL));
610183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com                }
611183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com                ASSERT(SUCCEEDED(result));
612183408d0c4fdaa702329c5a386e09129aa8b2bb2shannon.woods@transgaming.com
6137e23285f51e48e8f3d75c99a1451023543fb4c66shannon.woods@transgaming.com                // RenderTarget11 expects to be the owner of the resources it is given but TextureStorage11
6147e23285f51e48e8f3d75c99a1451023543fb4c66shannon.woods@transgaming.com                // also needs to keep a reference to the texture.
6157e23285f51e48e8f3d75c99a1451023543fb4c66shannon.woods@transgaming.com                mTexture->AddRef();
6167e23285f51e48e8f3d75c99a1451023543fb4c66shannon.woods@transgaming.com
6175b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                mRenderTarget[faceIdx][level] = new RenderTarget11(mRenderer, dsv, mTexture, srv,
618858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                                                                   std::max(mTextureWidth >> level, 1U),
619858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com                                                                   std::max(mTextureHeight >> level, 1U));
620b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com            }
6215b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com            else
622858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            {
6235b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com                UNREACHABLE();
624858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com            }
625b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com        }
626858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
627858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        return mRenderTarget[faceIdx][level];
628858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    }
629858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    else
630858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    {
631858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        return NULL;
632b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com    }
633b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com}
634b2151e5597bd5ed69cb8e0a55c8ad727efee1e04daniel@transgaming.com
635858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.comID3D11ShaderResourceView *TextureStorage11_Cube::getSRV()
636858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com{
637858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    if (!mSRV)
638b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com    {
639858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com        ID3D11Device *device = mRenderer->getDevice();
640858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
641b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
6425b2d855fbe69f74db2ed98892e2f4f019dd78fceshannon.woods@transgaming.com        srvDesc.Format = mShaderResourceFormat;
643b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
644f2685e5f0d8e710054eef23909e43eaa11551087shannon.woods@transgaming.com        srvDesc.TextureCube.MipLevels = (mMipLevels == 0 ? -1 : mMipLevels);
645b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        srvDesc.TextureCube.MostDetailedMip = 0;
646b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com
647b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        HRESULT result = device->CreateShaderResourceView(mTexture, &srvDesc, &mSRV);
648b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com
649b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        if (result == E_OUTOFMEMORY)
650b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        {
651779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com            return gl::error(GL_OUT_OF_MEMORY, static_cast<ID3D11ShaderResourceView*>(NULL));
652b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        }
653b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com        ASSERT(SUCCEEDED(result));
654b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com    }
655858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
656858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com    return mSRV;
657858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com}
658858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com
659858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.comvoid TextureStorage11_Cube::generateMipmap(int face, int level)
660858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com{
66185bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com    RenderTarget11 *source = RenderTarget11::makeRenderTarget11(getRenderTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level - 1));
66285bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com    RenderTarget11 *dest = RenderTarget11::makeRenderTarget11(getRenderTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level));
66385bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com
66485bdfce9f7a1774c7e1a984a6f26c7f15b1fac78shannon.woods@transgaming.com    generateMipmapLayer(source, dest);
665b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com}
666b50d5302513839a6b88a9f465b5a0a2ce252d2f3daniel@transgaming.com
667858d32fa8bc0298a7d78954f5340d5019d718d11shannon.woods@transgaming.com}
668