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