buffer_filler.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. __CheckBool(!_buffers.empty());
  37. _copyIdx = 0;
  38. _mapIdx = (_copyIdx + 1) % _buffers.size();
  39. return true;
  40. }
  41. bool BufferFiller::Reset()
  42. {
  43. _buffers[_mapIdx]->Release();
  44. _buffers[_mapIdx] = nullptr;
  45. _copyIdx = (_copyIdx + 1) % _buffers.size();
  46. return true;
  47. }
  48. void BufferFiller::Clear()
  49. {
  50. for (auto&& dstImg : _buffers) {
  51. Free(dstImg, [&dstImg] { dstImg->Release(); });
  52. }
  53. _buffers.clear();
  54. }