|
7 | 7 | BufferMTL::BufferMTL(id<MTLDevice> mtlDevice, unsigned int size, BufferType type, BufferUsage usage) |
8 | 8 | : Buffer(size, type, usage) |
9 | 9 | { |
10 | | -// _mtlBuffer = [mtlDevice newBufferWithLength:size options:MTLResourceStorageModeShared]; |
| 10 | + if (BufferUsage::DYNAMIC == usage) |
| 11 | + { |
| 12 | + NSMutableArray *mutableDynamicDataBuffers = [NSMutableArray arrayWithCapacity:MAX_INFLIGHT_BUFFER]; |
| 13 | + for (int i = 0; i < MAX_INFLIGHT_BUFFER; ++i) |
| 14 | + { |
| 15 | + // Create a new buffer with enough capacity to store one instance of the dynamic buffer data |
| 16 | + id <MTLBuffer> dynamicDataBuffer = [mtlDevice newBufferWithLength:size options:MTLResourceStorageModeShared]; |
| 17 | + [mutableDynamicDataBuffers addObject:dynamicDataBuffer]; |
| 18 | + } |
| 19 | + _dynamicDataBuffers = [mutableDynamicDataBuffers copy]; |
11 | 20 |
|
12 | | - int maxInflightBuffers = BufferUsage::DYNAMIC == usage ? MAX_INFLIGHT_BUFFER : 1; |
13 | | - NSMutableArray *mutableDynamicDataBuffers = [NSMutableArray arrayWithCapacity:maxInflightBuffers]; |
14 | | - for (int i = 0; i < maxInflightBuffers; ++i) |
| 21 | + _mtlBuffer = _dynamicDataBuffers[0]; |
| 22 | + BufferManager::addBuffer(this); |
| 23 | + } |
| 24 | + else |
15 | 25 | { |
16 | | - // Create a new buffer with enough capacity to store one instance of the dynamic buffer data |
17 | | - id <MTLBuffer> dynamicDataBuffer = [mtlDevice newBufferWithLength:size options:MTLResourceStorageModeShared]; |
18 | | - [mutableDynamicDataBuffers addObject:dynamicDataBuffer]; |
| 26 | + _mtlBuffer = [mtlDevice newBufferWithLength:size options:MTLResourceStorageModeShared]; |
19 | 27 | } |
20 | | - _dynamicDataBuffers = [mutableDynamicDataBuffers copy]; |
21 | | - |
22 | | - _mtlBuffer = _dynamicDataBuffers[0]; |
23 | | - |
24 | | - BufferManager::addBuffer(this); |
25 | 28 | } |
26 | 29 |
|
27 | 30 | BufferMTL::~BufferMTL() |
28 | 31 | { |
29 | | - for (id<MTLBuffer> buffer in _dynamicDataBuffers) |
| 32 | + if (BufferUsage::DYNAMIC == _usage) |
| 33 | + { |
| 34 | + for (id<MTLBuffer> buffer in _dynamicDataBuffers) |
30 | 35 | [buffer release]; |
31 | 36 |
|
32 | | - BufferManager::removeBuffer(this); |
| 37 | + BufferManager::removeBuffer(this); |
| 38 | + } |
| 39 | + else |
| 40 | + { |
| 41 | + [_mtlBuffer release]; |
| 42 | + } |
33 | 43 | } |
34 | 44 |
|
35 | 45 | void BufferMTL::updateData(void* data, unsigned int size) |
|
51 | 61 |
|
52 | 62 | void BufferMTL::updateIndex() |
53 | 63 | { |
54 | | - if (BufferUsage::DYNAMIC == _usage) |
55 | | - _currentFrameIndex = (_currentFrameIndex + 1) % MAX_INFLIGHT_BUFFER; |
56 | | - else |
57 | | - _currentFrameIndex = 0; |
58 | | - |
| 64 | + assert(BufferUsage::DYNAMIC == _usage); |
| 65 | + |
| 66 | + _currentFrameIndex = (_currentFrameIndex + 1) % MAX_INFLIGHT_BUFFER; |
59 | 67 | _mtlBuffer = _dynamicDataBuffers[_currentFrameIndex]; |
60 | 68 | } |
61 | 69 |
|
|
0 commit comments