-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRingBuffer.h
120 lines (96 loc) · 2.48 KB
/
RingBuffer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#pragma once
#ifndef ASSERT
#define ASSERT(cond) if (!(cond)) abort();
#endif
#include "Radeon.h"
#include "RadeonMemory.h"
#include "Fence.h"
#include "SADomains/Domains.h"
#include "Locks/Timer.h"
#include <private/kernel/util/DoublyLinkedList.h>
enum RingType {
RADEON_RING_TYPE_GFX_INDEX = 0,
CAYMAN_RING_TYPE_CP1_INDEX = 1,
CAYMAN_RING_TYPE_CP2_INDEX = 2,
R600_RING_TYPE_DMA_INDEX = 3,
CAYMAN_RING_TYPE_DMA1_INDEX = 4,
R600_RING_TYPE_UVD_INDEX = 5,
TN_RING_TYPE_VCE1_INDEX = 6,
TN_RING_TYPE_VCE2_INDEX = 7,
RADEON_NUM_RINGS = 8,
};
class RadeonRingBuffer;
class RingFence: public Fence, public DoublyLinkedListLinkImpl<RingFence> {
private:
friend class RadeonRingBuffer;
RadeonRingBuffer *ring;
public:
RingFence();
virtual ~RingFence();
inline RadeonRingBuffer* Ring() {return ring;}
};
class RadeonRingBuffer: public Object {
private:
RingType fType;
uint32 fWseq;
uint32 fRptr, fWptrBeg;
DoublyLinkedList<RingFence> fFences;
protected:
friend class RingFence;
uint32 fSize;
uint64 fFenceGpuAdr;
uint64 fRptrGpuAdr;
vuint32 *fRptrAdr;
vuint32 *fFenceAdr;
MappedBuffer fBuffer;
virtual status_t Start() = 0;
virtual status_t Stop() = 0;
public: // !!! used in GetDmaPacketIb
uint32 fWptr;
public:
RadeonRingBuffer(RingType type);
virtual ~RadeonRingBuffer();
status_t Init(uint32 size);
inline RingType Type();
virtual uint32 NopPacket() const = 0;
virtual uint32 Rptr() = 0;
virtual uint32 Wptr() = 0;
virtual void SetWptr(uint32 val) = 0;
uint32 PendingSize();
uint32 FreeSize();
void UpdateRptr();
inline void Write(uint32 val);
inline void Write8(uint64 val);
template<typename Type>
inline Type &Write();
void WriteNops(uint32 count);
uint32 Rseq() {return *fFenceAdr;}
uint32 Wseq() {return fWseq;}
void WriteFence(RingFence *fence);
virtual void WriteFence2() = 0;
virtual void WriteIb(uint64 adr, uint32 count, uint32 vmId) = 0;
virtual void WriteVmFlush(uint32 vmId, uint64 pdAdr) = 0;
virtual status_t Begin(uint32 len);
void End();
status_t WaitEmpty();
void UpdateFences();
void WriteState();
};
RingType RadeonRingBuffer::Type() {return fType;}
void RadeonRingBuffer::Write(uint32 val)
{
((uint32*)fBuffer.adr)[fWptr % fSize] = val;
fWptr = (fWptr + 1) % fSize;
}
void RadeonRingBuffer::Write8(uint64 val)
{
Write((uint32)(val));
Write((uint32)(val >> 32));
}
template<typename Type>
Type &RadeonRingBuffer::Write()
{
Type *res = (Type*)(((uint32*)fBuffer.adr)[fWptr % fSize]);
fWptr = (fWptr + sizeof(Type)/4) % fSize;
return *res;
}