gfxD3D11TextureArray.cpp 4.7 KB

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