Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/physics/src/bullet/BulletMultiThreaded/SpuDoubleBuffer.h @ 1971

Last change on this file since 1971 was 1966, checked in by rgrieder, 16 years ago

Let's go for multithreaded physics!

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