DX12Buffer.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #pragma once
  2. #include "DX12Buffer.h"
  3. #include "d3dx12.h"
  4. #include "DX12CommandQueue.h"
  5. using namespace Framework;
  6. // Constructor
  7. // eSize: length of an element in bytes
  8. DX12Buffer::DX12Buffer(
  9. int eSize, ID3D12Device5* zDevice, DX12CommandQueue* queue, int flags)
  10. : DXBuffer(eSize),
  11. buffer(0),
  12. zDevice(zDevice),
  13. queue(queue)
  14. {
  15. description = new D3D12_RESOURCE_DESC();
  16. ZeroMemory(description, sizeof(D3D12_RESOURCE_DESC));
  17. description->Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
  18. description->Alignment = 0;
  19. description->Height = 1;
  20. description->DepthOrArraySize = 1;
  21. description->MipLevels = 1;
  22. description->Format = DXGI_FORMAT_UNKNOWN;
  23. description->SampleDesc.Count = 1;
  24. description->Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
  25. description->Flags = (D3D12_RESOURCE_FLAGS)flags;
  26. }
  27. // Destructor
  28. DX12Buffer::~DX12Buffer()
  29. {
  30. if (buffer) buffer->Release();
  31. if (queue) queue->release();
  32. delete description;
  33. }
  34. // Copies the data into the buffer if it has changed
  35. void DX12Buffer::copyToGPU(__int64 byteCount)
  36. {
  37. if (!len) return;
  38. if (byteCount < 0) byteCount = len;
  39. if (description->Width != (unsigned)len)
  40. {
  41. if (buffer) buffer->Release();
  42. buffer = 0;
  43. description->Width = (unsigned)len;
  44. }
  45. if (!buffer)
  46. {
  47. D3D12_HEAP_PROPERTIES hprop;
  48. hprop.Type = D3D12_HEAP_TYPE_UPLOAD;
  49. hprop.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
  50. hprop.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
  51. hprop.CreationNodeMask = 1;
  52. hprop.VisibleNodeMask = 1;
  53. zDevice->CreateCommittedResource(&hprop,
  54. D3D12_HEAP_FLAG_NONE,
  55. description,
  56. D3D12_RESOURCE_STATE_GENERIC_READ,
  57. 0,
  58. __uuidof(ID3D12Resource),
  59. (void**)&buffer);
  60. }
  61. if (changed && data)
  62. {
  63. BYTE* pData;
  64. D3D12_RANGE r;
  65. r.Begin = 0;
  66. r.End = 0;
  67. buffer->Map(0, &r, (void**)&pData);
  68. memcpy(pData, data, byteCount);
  69. r.End = byteCount;
  70. buffer->Unmap(0, &r);
  71. changed = 0;
  72. }
  73. }
  74. void Framework::DX12Buffer::createBufferWithoutData(
  75. D3D12_RESOURCE_STATES states, D3D12_HEAP_TYPE heapType)
  76. {
  77. if (!len) return;
  78. if (description->Width != len)
  79. {
  80. if (buffer) buffer->Release();
  81. buffer = 0;
  82. description->Width = len;
  83. }
  84. if (!buffer)
  85. {
  86. D3D12_HEAP_PROPERTIES hprop;
  87. hprop.Type = heapType;
  88. hprop.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
  89. hprop.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
  90. hprop.CreationNodeMask = 0;
  91. hprop.VisibleNodeMask = 0;
  92. zDevice->CreateCommittedResource(&hprop,
  93. D3D12_HEAP_FLAG_NONE,
  94. description,
  95. states & ~D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
  96. 0,
  97. __uuidof(ID3D12Resource),
  98. (void**)&buffer);
  99. if (states & D3D12_RESOURCE_STATE_UNORDERED_ACCESS)
  100. {
  101. // TODO: add state transition
  102. CD3DX12_RESOURCE_BARRIER transition
  103. = CD3DX12_RESOURCE_BARRIER::Transition(
  104. buffer, D3D12_RESOURCE_STATE_COMMON, states);
  105. queue->zCommandList()->ResourceBarrier(1, &transition);
  106. }
  107. }
  108. }
  109. // Returns the buffer
  110. ID3D12Resource* DX12Buffer::zBuffer() const
  111. {
  112. return buffer;
  113. }