CmD3D11RenderTexture.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "CmD3D11RenderTexture.h"
  2. #include "CmDepthStencilBuffer.h"
  3. #include "CmD3D11RenderSystem.h"
  4. #include "CmD3D11Device.h"
  5. #include "CmD3D11Texture.h"
  6. #include "CmD3D11Mappings.h"
  7. #include "CmTextureManager.h"
  8. #include "CmException.h"
  9. namespace CamelotEngine
  10. {
  11. D3D11RenderTexture::D3D11RenderTexture()
  12. :RenderTexture(), mRenderTargetView(nullptr)
  13. {
  14. }
  15. D3D11RenderTexture::~D3D11RenderTexture()
  16. {
  17. SAFE_RELEASE(mRenderTargetView);
  18. }
  19. void D3D11RenderTexture::createInternalResourcesImpl()
  20. {
  21. SAFE_RELEASE(mRenderTargetView);
  22. D3D11_RENDER_TARGET_VIEW_DESC RTVDesc;
  23. ZeroMemory(&RTVDesc, sizeof(RTVDesc));
  24. D3D11Texture* d3d11Texture = static_cast<D3D11Texture*>(mTexture.get());
  25. D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = d3d11Texture->getSRVDesc();
  26. RTVDesc.Format = SRVDesc.Format;
  27. switch(SRVDesc.ViewDimension)
  28. {
  29. case D3D11_SRV_DIMENSION_BUFFER:
  30. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_BUFFER;
  31. break;
  32. case D3D11_SRV_DIMENSION_TEXTURE1D:
  33. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1D;
  34. RTVDesc.Texture1D.MipSlice = mMipLevel;
  35. break;
  36. case D3D11_SRV_DIMENSION_TEXTURE1DARRAY:
  37. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1DARRAY;
  38. RTVDesc.Texture1DArray.FirstArraySlice = mFace;
  39. RTVDesc.Texture1DArray.ArraySize = mNumFaces;
  40. RTVDesc.Texture1DArray.MipSlice = mMipLevel;
  41. break;
  42. case D3D11_SRV_DIMENSION_TEXTURECUBE:
  43. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
  44. RTVDesc.Texture2DArray.FirstArraySlice = mFace;
  45. RTVDesc.Texture2DArray.ArraySize = mNumFaces;
  46. RTVDesc.Texture2DArray.MipSlice = mMipLevel;
  47. break;
  48. case D3D11_SRV_DIMENSION_TEXTURE2D:
  49. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
  50. RTVDesc.Texture2D.MipSlice = mMipLevel;
  51. break;
  52. case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
  53. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
  54. RTVDesc.Texture2DArray.FirstArraySlice = mFace;
  55. RTVDesc.Texture2DArray.ArraySize = mNumFaces;
  56. RTVDesc.Texture2DArray.MipSlice = mMipLevel;
  57. break;
  58. case D3D11_SRV_DIMENSION_TEXTURE2DMS:
  59. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
  60. break;
  61. case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY:
  62. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY;
  63. RTVDesc.Texture2DMSArray.FirstArraySlice = mFace;
  64. RTVDesc.Texture2DMSArray.ArraySize = mNumFaces;
  65. break;
  66. case D3D11_SRV_DIMENSION_TEXTURE3D:
  67. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
  68. RTVDesc.Texture3D.MipSlice = mMipLevel;
  69. RTVDesc.Texture3D.FirstWSlice = mFace;
  70. RTVDesc.Texture3D.WSize = mNumFaces;
  71. break;
  72. default:
  73. assert(false);
  74. }
  75. D3D11Device& device = D3D11RenderSystem::getPrimaryDevice();
  76. HRESULT hr = device.getD3D11Device()->CreateRenderTargetView(d3d11Texture->getDX11Resource(), &RTVDesc, &mRenderTargetView);
  77. if (FAILED(hr) || device.hasError())
  78. {
  79. String errorDescription = device.getErrorDescription();
  80. CM_EXCEPT(RenderingAPIException, "Error creating Render Target View\nError Description:" + errorDescription);
  81. }
  82. }
  83. }