gfxD3D11TextureArray.cpp
Engine/source/gfx/D3D11/gfxD3D11TextureArray.cpp
Detailed Description
1 2#include "gfxD3D11TextureArray.h" 3 4#include <d3d11.h> 5 6#include "gfxD3D11Device.h" 7#include "gfxD3D11EnumTranslate.h" 8#include "core/util/tVector.h" 9#include "gfx/util/screenspace.h" 10#include "shaderGen/shaderFeature.h" 11 12 13void GFXD3D11TextureArray::init() 14{ 15 mTextureArrayDesc.Width = mWidth; 16 mTextureArrayDesc.Height = mHeight; 17 mTextureArrayDesc.MipLevels = mMipLevels; 18 mTextureArrayDesc.ArraySize = mArraySize; 19 mTextureArrayDesc.Format = GFXD3D11TextureFormat[mFormat]; 20 mTextureArrayDesc.SampleDesc.Count = 1; 21 mTextureArrayDesc.SampleDesc.Quality = 0; 22 mTextureArrayDesc.Usage = D3D11_USAGE_DEFAULT; 23 mTextureArrayDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; 24 mTextureArrayDesc.CPUAccessFlags = 0; 25 mTextureArrayDesc.MiscFlags = 0; 26 27 HRESULT hr = D3D11DEVICE->CreateTexture2D(&mTextureArrayDesc, NULL, &mTextureArray); 28 AssertFatal(SUCCEEDED(hr), "GFXD3D11TextureArray::init failed to create texture array!"); 29 30 //--------------------------------------------------------------------------------------- 31 // Create a resource view to the texture array. 32 //--------------------------------------------------------------------------------------- 33 createResourceView(mTextureArrayDesc.Format, mTextureArrayDesc.MipLevels, mTextureArrayDesc.BindFlags); 34 //--------------------------------------------------------------------------------------- 35} 36 37void GFXD3D11TextureArray::_setTexture(const GFXTexHandle& texture, U32 slot) 38{ 39 GFXD3D11TextureObject *texObj = dynamic_cast<GFXD3D11TextureObject*>(texture.getPointer()); 40 ID3D11Texture2D* tex2d = texObj->get2DTex(); 41 D3D11_TEXTURE2D_DESC desc; 42 tex2d->GetDesc(&desc); 43 // for each mipmap level... 44 for (UINT j = 0; j < desc.MipLevels; ++j) 45 { 46 const U32 srcSubResource = D3D11CalcSubresource(j, 0, desc.MipLevels); 47 const U32 dstSubResource = D3D11CalcSubresource(j, slot, mTextureArrayDesc.MipLevels); 48 D3D11DEVICECONTEXT->CopySubresourceRegion(mTextureArray, dstSubResource, 0, 0, 0, tex2d, srcSubResource, NULL); 49 } 50} 51 52void GFXD3D11TextureArray::setToTexUnit(U32 tuNum) 53{ 54 D3D11DEVICECONTEXT->PSSetShaderResources(tuNum, 1, &mSRView); 55} 56 57void GFXD3D11TextureArray::createResourceView(DXGI_FORMAT format, U32 numMipLevels, U32 usageFlags) 58{ 59 HRESULT hr; 60 if (usageFlags & D3D11_BIND_SHADER_RESOURCE) 61 { 62 D3D11_SHADER_RESOURCE_VIEW_DESC desc; 63 64 if (usageFlags & D3D11_BIND_DEPTH_STENCIL) 65 desc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; // reads the depth 66 else 67 desc.Format = format; 68 69 desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; 70 desc.Texture2DArray.MostDetailedMip = 0; 71 desc.Texture2DArray.MipLevels = numMipLevels; 72 desc.Texture2DArray.FirstArraySlice = 0; 73 desc.Texture2DArray.ArraySize = mArraySize; 74 75 hr = D3D11DEVICE->CreateShaderResourceView(mTextureArray, &desc, &mSRView); 76 AssertFatal(SUCCEEDED(hr), "GFXD3D11TextureArray::CreateShaderResourceView failed to create view!"); 77 } 78 79 if (usageFlags & D3D11_BIND_RENDER_TARGET) 80 { 81 D3D11_RENDER_TARGET_VIEW_DESC desc; 82 desc.Format = format; 83 desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; 84 desc.Texture2DArray.MipSlice = 0; 85 desc.Texture2DArray.FirstArraySlice = 0; 86 desc.Texture2DArray.ArraySize = mArraySize; 87 hr = D3D11DEVICE->CreateRenderTargetView(mTextureArray, &desc, &mRTView); 88 AssertFatal(SUCCEEDED(hr), "GFXD3D11TextureArray::CreateRenderTargetView failed to create view!"); 89 } 90 91 if (usageFlags & D3D11_BIND_DEPTH_STENCIL) 92 { 93 D3D11_DEPTH_STENCIL_VIEW_DESC desc; 94 desc.Format = format; 95 desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; 96 desc.Texture2DArray.MipSlice = 0; 97 desc.Texture2DArray.FirstArraySlice = 0; 98 desc.Texture2DArray.ArraySize = mArraySize; 99 desc.Flags = 0; 100 hr = D3D11DEVICE->CreateDepthStencilView(mTextureArray, &desc, &mDSView); 101 AssertFatal(SUCCEEDED(hr), "GFXD3D11TextureArray::CreateDepthStencilView failed to create view!"); 102 } 103} 104 105 106void GFXD3D11TextureArray::Release() 107{ 108 SAFE_RELEASE(mSRView) 109 SAFE_RELEASE(mRTView) 110 SAFE_RELEASE(mDSView) 111 SAFE_RELEASE(mTextureArray) 112 113 GFXTextureArray::Release(); 114} 115 116ID3D11ShaderResourceView* GFXD3D11TextureArray::getSRView() 117{ 118 return mSRView; 119} 120ID3D11RenderTargetView* GFXD3D11TextureArray::getRTView() 121{ 122 return mRTView; 123} 124ID3D11DepthStencilView* GFXD3D11TextureArray::getDSView() 125{ 126 return mDSView; 127} 128 129ID3D11ShaderResourceView** GFXD3D11TextureArray::getSRViewPtr() 130{ 131 return &mSRView; 132} 133ID3D11RenderTargetView** GFXD3D11TextureArray::getRTViewPtr() 134{ 135 return &mRTView; 136} 137 138ID3D11DepthStencilView** GFXD3D11TextureArray::getDSViewPtr() 139{ 140 return &mDSView; 141} 142 143void GFXD3D11TextureArray::zombify() 144{ 145 // Unsupported 146} 147 148void GFXD3D11TextureArray::resurrect() 149{ 150 // Unsupported 151} 152