OpenMoHAA 0.82.0
Loading...
Searching...
No Matches
SpuDoubleBuffer.h
1#ifndef DOUBLE_BUFFER_H
2#define DOUBLE_BUFFER_H
3
4#include "SpuFakeDma.h"
5
6
8template<class T, int size>
9class DoubleBuffer
10{
11#ifdef __CELLOS_LV2__
12 T m_buffer0[size] __attribute__ ((aligned (128)));
13 T m_buffer1[size] __attribute__ ((aligned (128)));
14#else
15 T m_buffer0[size];
16 T m_buffer1[size];
17#endif
18
19 T *m_frontBuffer;
20 T *m_backBuffer;
21
22 unsigned int m_dmaTag;
23 bool m_dmaPending;
24public:
25 bool isPending() const { return m_dmaPending;}
26 DoubleBuffer();
27
28 void init ();
29
30 // dma get and put commands
31 void backBufferDmaGet(uint64_t ea, unsigned int numBytes, unsigned int tag);
32 void backBufferDmaPut(uint64_t ea, unsigned int numBytes, unsigned int tag);
33
34 // gets pointer to a buffer
35 T *getFront();
36 T *getBack();
37
38 // if back buffer dma was started, wait for it to complete
39 // then move back to front and vice versa
40 T *swapBuffers();
41};
42
43template<class T, int size>
44DoubleBuffer<T,size>::DoubleBuffer()
45{
46 init ();
47}
48
49template<class T, int size>
50void DoubleBuffer<T,size>::init()
51{
52 this->m_dmaPending = false;
53 this->m_frontBuffer = &this->m_buffer0[0];
54 this->m_backBuffer = &this->m_buffer1[0];
55}
56
57template<class T, int size>
58void
59DoubleBuffer<T,size>::backBufferDmaGet(uint64_t ea, unsigned int numBytes, unsigned int tag)
60{
61 m_dmaPending = true;
62 m_dmaTag = tag;
63 cellDmaLargeGet(m_backBuffer, ea, numBytes, tag, 0, 0);
64}
65
66template<class T, int size>
67void
68DoubleBuffer<T,size>::backBufferDmaPut(uint64_t ea, unsigned int numBytes, unsigned int tag)
69{
70 m_dmaPending = true;
71 m_dmaTag = tag;
72 cellDmaLargePut(m_backBuffer, ea, numBytes, tag, 0, 0);
73}
74
75template<class T, int size>
76T *
77DoubleBuffer<T,size>::getFront()
78{
79 return m_frontBuffer;
80}
81
82template<class T, int size>
83T *
84DoubleBuffer<T,size>::getBack()
85{
86 return m_backBuffer;
87}
88
89template<class T, int size>
90T *
91DoubleBuffer<T,size>::swapBuffers()
92{
93 if (m_dmaPending)
94 {
95 cellDmaWaitTagStatusAll(1<<m_dmaTag);
96 m_dmaPending = false;
97 }
98
99 T *tmp = m_backBuffer;
100 m_backBuffer = m_frontBuffer;
101 m_frontBuffer = tmp;
102
103 return m_frontBuffer;
104}
105
106#endif