gallium: fix refcount bug introduced in eb20e2984
[mesa.git] / src / mesa / drivers / dri / s3v / s3v_macros.h
1 /*
2 * Author: Max Lingua <sunmax@libero.it>
3 */
4
5 #ifndef _S3V_MACROS_H_
6 #define _S3V_MACROS_H_
7
8 /**************/
9 /* DRI macros */
10 /**************/
11
12 #define GENERIC_DEBUG 0
13 #define FLOW_DEBUG 0
14 #define DMABUFS_DEBUG 0
15
16 /* Note: The argument to DEBUG*() _must_ be enclosed in parenthesis */
17
18 #if (GENERIC_DEBUG || FLOW_DEBUG || DMABUFS_DEBUG)
19 #include <stdio.h>
20 #endif
21
22 #if GENERIC_DEBUG
23 #define DEBUG(str) printf str
24 #else
25 #define DEBUG(str)
26 #endif
27
28 #if FLOW_DEBUG
29 #define DEBUG_WHERE(str) printf str
30 #else
31 #define DEBUG_WHERE(str)
32 #endif
33
34 #if DMABUFS_DEBUG
35 #define DEBUG_BUFS(str) printf str
36 #else
37 #define DEBUG_BUFS(str)
38 #endif
39
40
41 #if 0
42 #define S3V_DMA_SEND_FLAGS DRM_DMA_PRIORITY
43 #define S3V_DMA_SEND_FLAGS DRM_DMA_BLOCK
44 #else
45 #define S3V_DMA_SEND_FLAGS 0
46 #endif
47
48 #if 0
49 #define S3V_DMA_GET_FLAGS \
50 (DRM_DMA_SMALLER_OK | DRM_DMA_LARGER_OK | DRM_DMA_WAIT)
51 #else
52 #define S3V_DMA_GET_FLAGS DRM_DMA_WAIT
53 #endif
54
55
56 #define DMAOUT_CHECK(reg,len) \
57 do { \
58 DEBUG(("DMAOUT_CHECK: reg = 0x%x\n", S3V_##reg##_REG)); \
59 DEBUG_BUFS(("DMAOUT_CHECK (was): ")); \
60 DEBUG_BUFS(("vmesa->bufCount=%i of vmesa->bufSize=%i\n", \
61 vmesa->bufCount, vmesa->bufSize)); \
62 /* FIXME: > or >= */ \
63 if (vmesa->bufCount+(len+1) >= vmesa->bufSize) \
64 DMAFLUSH(); \
65 \
66 vmesa->bufCount += (len+1); \
67 DEBUG_BUFS(("DMAOUT_CHECK (is): vmesa->bufCount=%i len=%i, reg=%x\n", \
68 vmesa->bufCount, len, S3V_##reg##_REG)); \
69 DMAOUT( ((len & 0xffff) | ((S3V_##reg##_REG & 0xfffc) << 14)) ); \
70 } while (0)
71
72 #define DMAOUT(val) \
73 do { \
74 *(vmesa->buf++)=val; \
75 DEBUG_BUFS(("DMAOUT: val=0x%x\n", (unsigned int)val)); \
76 } while(0)
77
78 #define DMAFINISH() \
79 do { \
80 /* NOTE: it does nothing - it just prints some summary infos */ \
81 DEBUG(("DMAFINISH: vmesa->bufCount=%i\n", vmesa->bufCount)); \
82 DEBUG(("buf: index=%i; addr=%p\n", vmesa->bufIndex[vmesa->_bufNum], \
83 vmesa->s3vScreen->bufs->list[vmesa->bufIndex[vmesa->_bufNum]].address)); \
84 } while(0)
85
86 #define DMAFLUSH() \
87 do { \
88 if (vmesa->bufCount) { \
89 SEND_DMA(vmesa->driFd, vmesa->hHWContext, 1, \
90 &vmesa->bufIndex[vmesa->_bufNum], &vmesa->bufCount); \
91 /*
92 GET_DMA(vmesa->driFd, vmesa->hHWContext, 1, \
93 &vmesa->bufIndex, &vmesa->bufSize); \
94 */ \
95 vmesa->_bufNum = !(vmesa->_bufNum); \
96 vmesa->buf = vmesa->_buf[vmesa->_bufNum]; \
97 /*
98 vmesa->buf = \
99 vmesa->s3vScreen->bufs->list[vmesa->bufIndex].address; \
100 */ \
101 vmesa->bufCount = 0; \
102 } \
103 } while (0)
104
105 #define CMDCHANGE() \
106 do { \
107 DMAOUT_CHECK(3DTRI_CMDSET, 1); /* FIXME: TRI/LINE */ \
108 DMAOUT(vmesa->CMD); \
109 DMAFINISH(); \
110 } while (0)
111
112 #ifdef DONT_SEND_DMA
113 #define GET_DMA(fd, hHWCtx, n, idx, size)
114 #define SEND_DMA(fd, hHWCtx,n, idx, cnt)
115 #else
116 #define GET_DMA(fd, hHWCtx, n, idx, size) \
117 do { \
118 drmDMAReq dma; \
119 int retcode, i; \
120 \
121 DEBUG(("GET_DMA: ")); \
122 DEBUG(("req_count=%i; req_list[#0]=%i; req_size[#0]=%i\n", \
123 n, (idx)[n-1], (size)[n-1])); \
124 \
125 dma.context = (hHWCtx); \
126 dma.send_count = 0; \
127 dma.send_list = NULL; \
128 dma.send_sizes = NULL; \
129 dma.flags = S3V_DMA_GET_FLAGS; \
130 dma.request_count = (n); \
131 dma.request_size = S3V_DMA_BUF_SZ; \
132 dma.request_list = (idx); \
133 dma.request_sizes = (size); \
134 \
135 do { \
136 if ((retcode = drmDMA((fd), &dma))) { \
137 DEBUG_BUFS(("drmDMA (get) returned %d\n", retcode)); \
138 } \
139 } while (!(dma).granted_count); \
140 \
141 for (i = 0; i < (n); i++) { \
142 DEBUG(("Got buffer %i (index #%i)\n", (idx)[i], i)); \
143 DEBUG(("of %i bytes (%i words) size\n", \
144 (size)[i], (size)[i] >>2)); \
145 /* Convert from bytes to words */ \
146 (size)[i] >>= 2; \
147 } \
148 } while (0)
149
150 #define SEND_DMA(fd, hHWCtx, n, idx, cnt) \
151 do { \
152 drmDMAReq dma; \
153 int retcode, i; \
154 \
155 DEBUG(("SEND_DMA: ")); \
156 DEBUG(("send_count=%i; send_list[#0]=%i; send_sizes[#0]=%i\n", \
157 n, (idx)[n-1], (cnt)[n-1])); \
158 \
159 for (i = 0; i < (n); i++) { \
160 /* Convert from words to bytes */ \
161 (cnt)[i] <<= 2; \
162 } \
163 \
164 dma.context = (hHWCtx); \
165 dma.send_count = (n); \
166 dma.send_list = (idx); \
167 dma.send_sizes = (cnt); \
168 dma.flags = S3V_DMA_SEND_FLAGS; \
169 dma.request_count = 0; \
170 dma.request_size = 0; \
171 dma.request_list = NULL; \
172 dma.request_sizes = NULL; \
173 \
174 if ((retcode = drmDMA((fd), &dma))) { \
175 DEBUG_BUFS(("drmDMA (send) returned %d\n", retcode)); \
176 } \
177 \
178 for (i = 0; i < (n); i++) { \
179 DEBUG(("Sent buffer %i (index #%i)\n", (idx)[i], i)); \
180 DEBUG(("of %i bytes (%i words) size\n", \
181 (cnt)[i], (cnt)[i] >>2)); \
182 (cnt)[i] = 0; \
183 } \
184 } while (0)
185 #endif /* DONT_SEND_DMA */
186
187 #define GET_FIRST_DMA(fd, hHWCtx, n, idx, size, buf, cnt, vPriv) \
188 do { \
189 int i; \
190 DEBUG_BUFS(("GET_FIRST_DMA\n")); \
191 DEBUG_BUFS(("n=%i idx=%i size=%i\n", n, *idx, *size)); \
192 DEBUG_BUFS(("going to GET_DMA\n")); \
193 GET_DMA(fd, hHWCtx, n, idx, size); \
194 DEBUG_BUFS(("coming from GET_DMA\n")); \
195 DEBUG_BUFS(("n=%i idx=%i size=%i\n", n, (idx)[0], (size)[0])); \
196 for (i = 0; i < (n); i++) { \
197 DEBUG_BUFS(("buf #%i @%p\n", \
198 i, (vPriv)->bufs->list[(idx)[i]].address)); \
199 (buf)[i] = (vPriv)->bufs->list[(idx)[i]].address; \
200 (cnt)[i] = 0; \
201 } \
202 DEBUG(("GOING HOME\n")); \
203 } while (0)
204
205 /**************************/
206 /* generic, global macros */
207 /**************************/
208
209 #define CALC_LOG2(l2,s) \
210 do { \
211 int __s = s; \
212 l2 = 0; \
213 while (__s > 1) { ++l2; __s >>= 1; } \
214 } while (0)
215
216 #define PrimType_Null 0x00000000
217 #define PrimType_Points 0x10000000
218 #define PrimType_Lines 0x20000000
219 #define PrimType_LineLoop 0x30000000
220 #define PrimType_LineStrip 0x40000000
221 #define PrimType_Triangles 0x50000000
222 #define PrimType_TriangleStrip 0x60000000
223 #define PrimType_TriangleFan 0x70000000
224 #define PrimType_Quads 0x80000000
225 #define PrimType_QuadStrip 0x90000000
226 #define PrimType_Polygon 0xa0000000
227 #define PrimType_Mask 0xf0000000
228
229 #endif /* _S3V_MACROS_H_ */