home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Chapter 13 The Compute Shader / SobelFilter / RenderTarget.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2016-03-02  |  2.9 KB  |  104 lines

  1. //***************************************************************************************
  2. // RenderTarget.cpp by Frank Luna (C) 2011 All Rights Reserved.
  3. //***************************************************************************************
  4.  
  5. #include "RenderTarget.h"
  6.  
  7. RenderTarget::RenderTarget(ID3D12Device* device, 
  8.                            UINT width, UINT height,
  9.                            DXGI_FORMAT format)
  10. {
  11.     md3dDevice = device;
  12.  
  13.     mWidth = width;
  14.     mHeight = height;
  15.     mFormat = format;
  16.  
  17.     BuildResource();
  18. }
  19.  
  20. ID3D12Resource*  RenderTarget::Resource()
  21. {
  22.     return mOffscreenTex.Get();
  23. }
  24.  
  25. CD3DX12_GPU_DESCRIPTOR_HANDLE RenderTarget::Srv()
  26. {
  27.     return mhGpuSrv;
  28. }
  29.  
  30. CD3DX12_CPU_DESCRIPTOR_HANDLE RenderTarget::Rtv()
  31. {
  32.     return mhCpuRtv;
  33. }
  34.  
  35. void RenderTarget::BuildDescriptors(CD3DX12_CPU_DESCRIPTOR_HANDLE hCpuSrv,
  36.                                     CD3DX12_GPU_DESCRIPTOR_HANDLE hGpuSrv,
  37.                                     CD3DX12_CPU_DESCRIPTOR_HANDLE hCpuRtv)
  38. {
  39.     // Save references to the descriptors. 
  40.     mhCpuSrv = hCpuSrv;
  41.     mhGpuSrv = hGpuSrv;
  42.     mhCpuRtv = hCpuRtv;
  43.  
  44.     BuildDescriptors();
  45. }
  46.  
  47. void RenderTarget::OnResize(UINT newWidth, UINT newHeight)
  48. {
  49.     if((mWidth != newWidth) || (mHeight != newHeight))
  50.     {
  51.         mWidth = newWidth;
  52.         mHeight = newHeight;
  53.  
  54.         BuildResource();
  55.  
  56.         // New resource, so we need new descriptors to that resource.
  57.         BuildDescriptors();
  58.     }
  59. }
  60.  
  61. void RenderTarget::BuildDescriptors()
  62. {
  63.     D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
  64.     srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
  65.     srvDesc.Format = mFormat;
  66.     srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
  67.     srvDesc.Texture2D.MostDetailedMip = 0;
  68.     srvDesc.Texture2D.MipLevels = 1;
  69.  
  70.     md3dDevice->CreateShaderResourceView(mOffscreenTex.Get(), &srvDesc, mhCpuSrv);
  71.  
  72.     md3dDevice->CreateRenderTargetView(mOffscreenTex.Get(), nullptr, mhCpuRtv);
  73. }
  74.  
  75. void RenderTarget::BuildResource()
  76. {
  77.     // Note, compressed formats cannot be used for UAV.  We get error like:
  78.     // ERROR: ID3D11Device::CreateTexture2D: The format (0x4d, BC3_UNORM) 
  79.     // cannot be bound as an UnorderedAccessView, or cast to a format that
  80.     // could be bound as an UnorderedAccessView.  Therefore this format 
  81.     // does not support D3D11_BIND_UNORDERED_ACCESS.
  82.  
  83.     D3D12_RESOURCE_DESC texDesc;
  84.     ZeroMemory(&texDesc, sizeof(D3D12_RESOURCE_DESC));
  85.     texDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
  86.     texDesc.Alignment = 0;
  87.     texDesc.Width = mWidth;
  88.     texDesc.Height = mHeight;
  89.     texDesc.DepthOrArraySize = 1;
  90.     texDesc.MipLevels = 1;
  91.     texDesc.Format = mFormat;
  92.     texDesc.SampleDesc.Count = 1;
  93.     texDesc.SampleDesc.Quality = 0;
  94.     texDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
  95.     texDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
  96.  
  97.     ThrowIfFailed(md3dDevice->CreateCommittedResource(
  98.         &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
  99.         D3D12_HEAP_FLAG_NONE,
  100.         &texDesc,
  101.         D3D12_RESOURCE_STATE_GENERIC_READ,
  102.         nullptr,
  103.         IID_PPV_ARGS(&mOffscreenTex)));
  104. }