DX12Buffer.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. currentState(D3D12_RESOURCE_STATE_COMMON)
  15. {
  16. description = new D3D12_RESOURCE_DESC();
  17. ZeroMemory(description, sizeof(D3D12_RESOURCE_DESC));
  18. description->Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
  19. description->Alignment = 0;
  20. description->Height = 1;
  21. description->DepthOrArraySize = 1;
  22. description->MipLevels = 1;
  23. description->Format = DXGI_FORMAT_UNKNOWN;
  24. description->SampleDesc.Count = 1;
  25. description->Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
  26. description->Flags = (D3D12_RESOURCE_FLAGS)flags;
  27. }
  28. // Destructor
  29. DX12Buffer::~DX12Buffer()
  30. {
  31. if (buffer) buffer->Release();
  32. if (queue) queue->release();
  33. delete description;
  34. }
  35. // Copies the data into the buffer if it has changed
  36. void DX12Buffer::copyToGPU(__int64 byteCount)
  37. {
  38. if (!len) return;
  39. if (byteCount < 0) byteCount = len;
  40. if (description->Width != (unsigned)len)
  41. {
  42. if (buffer) buffer->Release();
  43. buffer = 0;
  44. description->Width = (unsigned)len;
  45. }
  46. if (!buffer)
  47. {
  48. D3D12_HEAP_PROPERTIES hprop;
  49. hprop.Type = D3D12_HEAP_TYPE_UPLOAD;
  50. hprop.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
  51. hprop.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
  52. hprop.CreationNodeMask = 1;
  53. hprop.VisibleNodeMask = 1;
  54. zDevice->CreateCommittedResource(&hprop,
  55. D3D12_HEAP_FLAG_NONE,
  56. description,
  57. D3D12_RESOURCE_STATE_GENERIC_READ,
  58. 0,
  59. __uuidof(ID3D12Resource),
  60. (void**)&buffer);
  61. }
  62. if (changed && data)
  63. {
  64. BYTE* pData;
  65. D3D12_RANGE r;
  66. r.Begin = 0;
  67. r.End = 0;
  68. buffer->Map(0, &r, (void**)&pData);
  69. memcpy(pData, data, byteCount);
  70. r.End = byteCount;
  71. buffer->Unmap(0, &r);
  72. changed = 0;
  73. }
  74. }
  75. void Framework::DX12Buffer::createBufferWithoutData(
  76. D3D12_RESOURCE_STATES states, D3D12_HEAP_TYPE heapType)
  77. {
  78. if (!len) return;
  79. if (description->Width != len)
  80. {
  81. if (buffer) buffer->Release();
  82. buffer = 0;
  83. description->Width = len;
  84. }
  85. if (!buffer)
  86. {
  87. D3D12_HEAP_PROPERTIES hprop;
  88. hprop.Type = heapType;
  89. hprop.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
  90. hprop.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
  91. hprop.CreationNodeMask = 0;
  92. hprop.VisibleNodeMask = 0;
  93. zDevice->CreateCommittedResource(&hprop,
  94. D3D12_HEAP_FLAG_NONE,
  95. description,
  96. states & ~D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
  97. 0,
  98. __uuidof(ID3D12Resource),
  99. (void**)&buffer);
  100. if (states & D3D12_RESOURCE_STATE_UNORDERED_ACCESS)
  101. {
  102. // TODO: add state transition
  103. CD3DX12_RESOURCE_BARRIER transition
  104. = CD3DX12_RESOURCE_BARRIER::Transition(
  105. buffer, D3D12_RESOURCE_STATE_COMMON, states);
  106. queue->zCommandList()->ResourceBarrier(1, &transition);
  107. }
  108. this->currentState = states;
  109. }
  110. }
  111. void Framework::DX12Buffer::transformState(D3D12_RESOURCE_STATES newState)
  112. {
  113. CD3DX12_RESOURCE_BARRIER transition
  114. = CD3DX12_RESOURCE_BARRIER::Transition(buffer, currentState, newState);
  115. queue->zCommandList()->ResourceBarrier(1, &transition);
  116. currentState = newState;
  117. }
  118. // Returns the buffer
  119. ID3D12Resource* DX12Buffer::zBuffer() const
  120. {
  121. return buffer;
  122. }