2
0

CmD3D11RenderTexture.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "CmD3D11RenderTexture.h"
  2. #include "CmD3D11DepthStencilBuffer.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. ID3D11RenderTargetView* D3D11RenderTexture::createRenderTargetView(const SurfaceDesc& surfaceDesc)
  20. {
  21. D3D11_RENDER_TARGET_VIEW_DESC RTVDesc;
  22. ZeroMemory(&RTVDesc, sizeof(RTVDesc));
  23. D3D11Texture* d3d11Texture = static_cast<D3D11Texture*>(surfaceDesc.texture.get());
  24. D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = d3d11Texture->getSRVDesc();
  25. RTVDesc.Format = SRVDesc.Format;
  26. switch(SRVDesc.ViewDimension)
  27. {
  28. case D3D11_SRV_DIMENSION_BUFFER:
  29. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_BUFFER;
  30. break;
  31. case D3D11_SRV_DIMENSION_TEXTURE1D:
  32. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1D;
  33. RTVDesc.Texture1D.MipSlice = surfaceDesc.mipLevel;
  34. break;
  35. case D3D11_SRV_DIMENSION_TEXTURE1DARRAY:
  36. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1DARRAY;
  37. RTVDesc.Texture1DArray.FirstArraySlice = surfaceDesc.face;
  38. RTVDesc.Texture1DArray.ArraySize = surfaceDesc.numFaces;
  39. RTVDesc.Texture1DArray.MipSlice = surfaceDesc.mipLevel;
  40. break;
  41. case D3D11_SRV_DIMENSION_TEXTURECUBE:
  42. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
  43. RTVDesc.Texture2DArray.FirstArraySlice = surfaceDesc.face;
  44. RTVDesc.Texture2DArray.ArraySize = surfaceDesc.numFaces;
  45. RTVDesc.Texture2DArray.MipSlice = surfaceDesc.mipLevel;
  46. break;
  47. case D3D11_SRV_DIMENSION_TEXTURE2D:
  48. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
  49. RTVDesc.Texture2D.MipSlice = surfaceDesc.mipLevel;
  50. break;
  51. case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
  52. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
  53. RTVDesc.Texture2DArray.FirstArraySlice = surfaceDesc.face;
  54. RTVDesc.Texture2DArray.ArraySize = surfaceDesc.numFaces;
  55. RTVDesc.Texture2DArray.MipSlice = surfaceDesc.mipLevel;
  56. break;
  57. case D3D11_SRV_DIMENSION_TEXTURE2DMS:
  58. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
  59. break;
  60. case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY:
  61. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY;
  62. RTVDesc.Texture2DMSArray.FirstArraySlice = surfaceDesc.face;
  63. RTVDesc.Texture2DMSArray.ArraySize = surfaceDesc.numFaces;
  64. break;
  65. case D3D11_SRV_DIMENSION_TEXTURE3D:
  66. RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
  67. RTVDesc.Texture3D.MipSlice = surfaceDesc.mipLevel;
  68. RTVDesc.Texture3D.FirstWSlice = surfaceDesc.face;
  69. RTVDesc.Texture3D.WSize = surfaceDesc.numFaces;
  70. break;
  71. default:
  72. assert(false);
  73. }
  74. ID3D11RenderTargetView* rtv;
  75. D3D11Device& device = D3D11RenderSystem::getPrimaryDevice();
  76. HRESULT hr = device.getD3D11Device()->CreateRenderTargetView(d3d11Texture->getDX11Resource(), &RTVDesc, &rtv);
  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. return rtv;
  83. }
  84. void D3D11RenderTexture::createInternalResourcesImpl()
  85. {
  86. SAFE_RELEASE(mRenderTargetView);
  87. mRenderTargetView = createRenderTargetView(mSurface);
  88. }
  89. void D3D11RenderTexture::getCustomAttribute(const String& name, void* pData)
  90. {
  91. if(name == "RTV")
  92. {
  93. ID3D11RenderTargetView** pRTVs = (ID3D11RenderTargetView **)pData;
  94. *pRTVs = mRenderTargetView;
  95. return;
  96. }
  97. else if(name == "DSV")
  98. {
  99. ID3D11DepthStencilView** pDSV = (ID3D11DepthStencilView **)pData;
  100. D3D11DepthStencilBuffer* d3d11depthStencilBuffer = static_cast<D3D11DepthStencilBuffer*>(mDepthStencilBuffer.get());
  101. *pDSV = d3d11depthStencilBuffer->getDepthStencilView();
  102. return;
  103. }
  104. }
  105. }