BsD3D11GpuBufferView.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsD3D11GpuBufferView.h"
  4. #include "BsD3D11GpuBuffer.h"
  5. #include "BsD3D11RenderAPI.h"
  6. #include "BsD3D11Device.h"
  7. #include "Profiling/BsRenderStats.h"
  8. #include "Error/BsException.h"
  9. #include "BsD3D11Mappings.h"
  10. namespace bs { namespace ct
  11. {
  12. size_t GpuBufferView::HashFunction::operator()(const GPU_BUFFER_VIEW_DESC& key) const
  13. {
  14. size_t seed = 0;
  15. hash_combine(seed, key.elementWidth);
  16. hash_combine(seed, key.firstElement);
  17. hash_combine(seed, key.numElements);
  18. hash_combine(seed, key.useCounter);
  19. hash_combine(seed, key.usage);
  20. hash_combine(seed, key.format);
  21. return seed;
  22. }
  23. bool GpuBufferView::EqualFunction::operator()
  24. (const GPU_BUFFER_VIEW_DESC& a, const GPU_BUFFER_VIEW_DESC& b) const
  25. {
  26. return a.elementWidth == b.elementWidth && a.firstElement == b.firstElement && a.numElements == b.numElements
  27. && a.useCounter == b.useCounter && a.usage == b.usage && a.format == b.format;
  28. }
  29. GpuBufferView::GpuBufferView()
  30. :mSRV(nullptr), mUAV(nullptr)
  31. {
  32. }
  33. GpuBufferView::~GpuBufferView()
  34. {
  35. SAFE_RELEASE(mSRV);
  36. SAFE_RELEASE(mUAV);
  37. BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_ResourceView);
  38. }
  39. void GpuBufferView::initialize(const SPtr<D3D11GpuBuffer>& buffer, GPU_BUFFER_VIEW_DESC& desc)
  40. {
  41. mBuffer = buffer;
  42. mDesc = desc;
  43. D3D11GpuBuffer* d3d11GpuBuffer = static_cast<D3D11GpuBuffer*>(buffer.get());
  44. if ((desc.usage & GVU_DEFAULT) != 0)
  45. mSRV = createSRV(d3d11GpuBuffer, desc.firstElement, desc.elementWidth, desc.numElements);
  46. if((desc.usage & GVU_RANDOMWRITE) != 0)
  47. mUAV = createUAV(d3d11GpuBuffer, desc.firstElement, desc.numElements, desc.useCounter);
  48. if((desc.usage & GVU_RENDERTARGET) != 0 || (desc.usage & GVU_DEPTHSTENCIL) != 0)
  49. {
  50. BS_EXCEPT(NotImplementedException, "Invalid usage flags for a GPU buffer view.");
  51. }
  52. BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_ResourceView);
  53. }
  54. ID3D11ShaderResourceView* GpuBufferView::createSRV(D3D11GpuBuffer* buffer, UINT32 firstElement, UINT32 elementWidth, UINT32 numElements)
  55. {
  56. const GpuBufferProperties& props = buffer->getProperties();
  57. D3D11_SHADER_RESOURCE_VIEW_DESC desc;
  58. ZeroMemory(&desc, sizeof(desc));
  59. if (props.getType() == GBT_STANDARD)
  60. {
  61. desc.Format = D3D11Mappings::getBF(props.getFormat());
  62. desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
  63. desc.Buffer.FirstElement = firstElement;
  64. desc.Buffer.NumElements = numElements;
  65. }
  66. else if (props.getType() == GBT_STRUCTURED)
  67. {
  68. desc.Format = DXGI_FORMAT_UNKNOWN;
  69. desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
  70. desc.Buffer.FirstElement = firstElement;
  71. desc.Buffer.NumElements = numElements;
  72. }
  73. else if (props.getType() == GBT_INDIRECTARGUMENT)
  74. {
  75. desc.Format = DXGI_FORMAT_R32_UINT;
  76. desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
  77. desc.Buffer.ElementOffset = firstElement * elementWidth;
  78. desc.Buffer.ElementWidth = elementWidth;
  79. }
  80. ID3D11ShaderResourceView* srv = nullptr;
  81. D3D11RenderAPI* d3d11rs = static_cast<D3D11RenderAPI*>(D3D11RenderAPI::instancePtr());
  82. HRESULT hr = d3d11rs->getPrimaryDevice().getD3D11Device()->CreateShaderResourceView(buffer->getDX11Buffer(), &desc, &srv);
  83. if (FAILED(hr) || d3d11rs->getPrimaryDevice().hasError())
  84. {
  85. String msg = d3d11rs->getPrimaryDevice().getErrorDescription();
  86. BS_EXCEPT(RenderingAPIException, "Cannot create ShaderResourceView: " + msg);
  87. }
  88. return srv;
  89. }
  90. ID3D11UnorderedAccessView* GpuBufferView::createUAV(D3D11GpuBuffer* buffer, UINT32 firstElement, UINT32 numElements,
  91. bool useCounter)
  92. {
  93. const GpuBufferProperties& props = buffer->getProperties();
  94. D3D11_UNORDERED_ACCESS_VIEW_DESC desc;
  95. ZeroMemory(&desc, sizeof(desc));
  96. desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
  97. if (props.getType() == GBT_STANDARD)
  98. {
  99. desc.Format = D3D11Mappings::getBF(props.getFormat());
  100. desc.Buffer.FirstElement = firstElement;
  101. desc.Buffer.NumElements = numElements;
  102. if (useCounter)
  103. desc.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_COUNTER;
  104. else
  105. desc.Buffer.Flags = 0;
  106. }
  107. else if (props.getType() == GBT_STRUCTURED)
  108. {
  109. desc.Format = DXGI_FORMAT_UNKNOWN;
  110. desc.Buffer.FirstElement = firstElement;
  111. desc.Buffer.NumElements = numElements;
  112. if(useCounter)
  113. desc.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_COUNTER;
  114. else
  115. desc.Buffer.Flags = 0;
  116. }
  117. else if (props.getType() == GBT_INDIRECTARGUMENT)
  118. {
  119. desc.Format = DXGI_FORMAT_R32_UINT;
  120. desc.Buffer.Flags = 0;
  121. desc.Buffer.FirstElement = firstElement;
  122. desc.Buffer.NumElements = numElements;
  123. }
  124. ID3D11UnorderedAccessView* uav = nullptr;
  125. D3D11RenderAPI* d3d11rs = static_cast<D3D11RenderAPI*>(D3D11RenderAPI::instancePtr());
  126. HRESULT hr = d3d11rs->getPrimaryDevice().getD3D11Device()->CreateUnorderedAccessView(buffer->getDX11Buffer(), &desc, &uav);
  127. if (FAILED(hr) || d3d11rs->getPrimaryDevice().hasError())
  128. {
  129. String msg = d3d11rs->getPrimaryDevice().getErrorDescription();
  130. BS_EXCEPT(RenderingAPIException, "Cannot create UnorderedAccessView: " + msg);
  131. }
  132. return uav;
  133. }
  134. }}