Torque3D Documentation / _generateds / gfxD3D11TextureArray.cpp

gfxD3D11TextureArray.cpp

Engine/source/gfx/D3D11/gfxD3D11TextureArray.cpp

More...

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