buffer_filler.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "buffer_filler.h"
  2. #include "basic/basic.h"
  3. bool BufferFiller::Fill(ID3D11Device* device, D3D11_TEXTURE2D_DESC desc, int maxCnt)
  4. {
  5. // 设置通用的纹理属性
  6. desc.ArraySize = 1;
  7. desc.BindFlags = 0;
  8. desc.MiscFlags = 0;
  9. desc.SampleDesc.Count = 1;
  10. desc.SampleDesc.Quality = 0;
  11. desc.MipLevels = 1;
  12. desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
  13. desc.Usage = D3D11_USAGE_STAGING;
  14. // 如果已达到最大缓冲区数量,则替换现有缓冲区
  15. if (_buffers.size() == maxCnt) {
  16. ID3D11Texture2D* dstImg = nullptr;
  17. if (FAILED(device->CreateTexture2D(&desc, nullptr, &dstImg))) {
  18. return false;
  19. }
  20. // 释放旧的缓冲区并替换
  21. if (_buffers[_mapIdx]) {
  22. _buffers[_mapIdx]->Release();
  23. }
  24. _buffers[_mapIdx] = dstImg;
  25. _mapIdx = (_mapIdx + 1) % _buffers.size();
  26. return true;
  27. }
  28. // 否则创建新的缓冲区直到达到最大数量
  29. while (_buffers.size() < maxCnt) {
  30. ID3D11Texture2D* dstImg = nullptr;
  31. if (FAILED(device->CreateTexture2D(&desc, nullptr, &dstImg))) {
  32. break;
  33. }
  34. _buffers.push_back(dstImg);
  35. }
  36. if (_buffers.empty()) {
  37. return false;
  38. }
  39. _copyIdx = 0;
  40. _mapIdx = (_copyIdx + 1) % _buffers.size();
  41. return true;
  42. }
  43. bool BufferFiller::Reset()
  44. {
  45. _buffers[_mapIdx]->Release();
  46. _buffers[_mapIdx] = nullptr;
  47. _copyIdx = (_copyIdx + 1) % _buffers.size();
  48. return true;
  49. }
  50. void BufferFiller::Clear()
  51. {
  52. for (auto&& dstImg : _buffers) {
  53. Free(dstImg, [&dstImg] { dstImg->Release(); });
  54. }
  55. _buffers.clear();
  56. }