Rev 883 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
808 | serge | 1 | |
879 | serge | 2 | |
3 | u32_t ifl; |
||
877 | serge | 4 | u32_t *ring; |
879 | serge | 5 | |
883 | serge | 6 | local_pixmap_t *dstpixmap; |
879 | serge | 7 | |
877 | serge | 8 | dstpixmap = (io->dstpix == (void*)-1) ? &scr_pixmap : io->dstpix ; |
879 | serge | 9 | |
10 | ifl = safe_cli(); |
||
11 | |||
12 | #if R300_PIO |
||
13 | |||
14 | R5xxFIFOWait(6); |
||
15 | |||
16 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
||
17 | |||
18 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
19 | RADEON_GMC_DST_32BPP | |
||
20 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
21 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
22 | R5XX_GMC_WR_MSK_DIS | |
||
23 | R5XX_ROP3_P |
||
24 | ); |
||
25 | |||
26 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, io->color); |
||
27 | |||
28 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
||
29 | OUTREG(R5XX_DST_Y_X, 0); |
||
30 | OUTREG(R5XX_DST_WIDTH_HEIGHT,(dstpixmap->width<<16)|dstpixmap->height); |
||
31 | |||
32 | #else |
||
33 | |||
34 | |||
883 | serge | 35 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); |
36 | |||
879 | serge | 37 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
38 | |||
39 | RADEON_GMC_DST_32BPP | |
||
40 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
41 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
42 | R5XX_GMC_WR_MSK_DIS | |
||
43 | R5XX_ROP3_P |
||
44 | ); |
||
45 | |||
46 | OUT_RING(dstpixmap->pitch_offset); |
||
47 | |||
48 | OUT_RING( 0 ); |
||
49 | OUT_RING((dstpixmap->width<<16)|dstpixmap->height); |
||
50 | COMMIT_RING(); |
||
51 | |||
52 | #endif |
||
53 | |||
54 | safe_sti(ifl); |
||
55 | |||
56 | return ERR_OK; |
||
57 | |||
58 | |||
59 | |||
60 | |||
61 | |||
62 | local_pixmap_t *dstpixmap; |
||
63 | clip_t clip; |
||
64 | int x0, y0, x1, y1; |
||
877 | serge | 65 | |
66 | dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ; |
||
808 | serge | 67 | |
877 | serge | 68 | x0 = draw->x0; |
69 | |||
70 | |||
71 | x1 = draw->x1; |
||
72 | |||
73 | |||
74 | clip.xmin = 0; |
||
75 | |||
76 | clip.xmax = dstpixmap->width-1; |
||
77 | clip.ymax = dstpixmap->height-1; |
||
78 | |||
79 | if ( !LineClip(&clip, &x0, &y0, &x1, &y1 )) |
||
80 | |||
81 | u32_t ifl; |
||
82 | u32_t *ring, write; |
||
883 | serge | 83 | |
877 | serge | 84 | ifl = safe_cli(); |
85 | |||
883 | serge | 86 | #if R300_PIO |
877 | serge | 87 | |
88 | R5xxFIFOWait(6); |
||
89 | |||
90 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
||
91 | |||
92 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
879 | serge | 93 | RADEON_GMC_DST_32BPP | |
94 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
95 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
96 | R5XX_GMC_WR_MSK_DIS | |
||
97 | R5XX_ROP3_P |
||
98 | ); |
||
877 | serge | 99 | |
100 | OUTREG(R5XX_DST_LINE_PATCOUNT, 0x55 << R5XX_BRES_CNTL_SHIFT); |
||
101 | |||
102 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color); |
||
103 | |||
104 | |||
105 | OUTREG(R5XX_DST_LINE_START,(y0<<16)|x0); |
||
106 | |||
107 | #else |
||
108 | BEGIN_RING(6); |
||
109 | |||
883 | serge | 110 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_POLYLINE, 4)); |
111 | |||
877 | serge | 112 | RADEON_GMC_BRUSH_SOLID_COLOR | |
113 | RADEON_GMC_DST_32BPP | |
||
114 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
115 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
116 | R5XX_GMC_WR_MSK_DIS | |
||
117 | R5XX_ROP3_P); |
||
118 | |||
119 | OUT_RING(dstpixmap->pitch_offset); |
||
120 | |||
121 | OUT_RING((y0<<16)|x0); |
||
122 | OUT_RING((y1<<16)|x1); |
||
123 | COMMIT_RING(); |
||
124 | #endif |
||
125 | safe_sti(ifl); |
||
126 | }; |
||
883 | serge | 127 | return ERR_OK; |
877 | serge | 128 | } |
129 | |||
130 | int DrawRect(io_draw_t* draw) |
||
131 | |||
879 | serge | 132 | int x0, y0, x1, y1, xend, yend; |
808 | serge | 133 | |
878 | serge | 134 | local_pixmap_t *dstpixmap; |
808 | serge | 135 | |
876 | serge | 136 | |
137 | dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ; |
||
817 | serge | 138 | |
876 | serge | 139 | x0 = draw->x0; |
817 | serge | 140 | |
876 | serge | 141 | |
142 | x1 = xend = x0 + draw->w - 1; |
||
808 | serge | 143 | |
878 | serge | 144 | |
145 | dst_clip.xmin = 0; |
||
808 | serge | 146 | |
876 | serge | 147 | dst_clip.xmax = dstpixmap->width-1; |
148 | dst_clip.ymax = dstpixmap->height-1; |
||
149 | |||
150 | |||
151 | |||
152 | |||
808 | serge | 153 | |
154 | if( ! BlockClip( &dst_clip, &x0, &y0, &x1, &y1)) |
||
155 | |||
876 | serge | 156 | u32_t *ring; |
157 | u32_t ifl; |
||
883 | serge | 158 | int w, h; |
876 | serge | 159 | |
160 | w = x1 - x0 + 1; |
||
808 | serge | 161 | |
878 | serge | 162 | |
163 | ifl = safe_cli(); |
||
808 | serge | 164 | |
876 | serge | 165 | #if R300_PIO |
808 | serge | 166 | |
813 | serge | 167 | R5xxFIFOWait(6); |
812 | serge | 168 | |
876 | serge | 169 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
812 | serge | 170 | |
876 | serge | 171 | RADEON_GMC_BRUSH_SOLID_COLOR | |
879 | serge | 172 | RADEON_GMC_DST_32BPP | |
173 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
174 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
175 | R5XX_GMC_WR_MSK_DIS | |
||
176 | R5XX_ROP3_P |
||
177 | ); |
||
178 | |||
876 | serge | 179 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color); |
812 | serge | 180 | |
876 | serge | 181 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
182 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x0); |
||
183 | OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|h); |
||
878 | serge | 184 | |
876 | serge | 185 | if( draw->color != draw->border) |
878 | serge | 186 | |
187 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->border); |
||
188 | |||
189 | if( y0 == draw->y0) |
||
190 | |||
191 | R5xxFIFOWait(2); |
||
192 | |||
193 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x0); |
||
194 | |||
195 | y0++; |
||
196 | h--; |
||
197 | } |
||
198 | if( y1 == yend ) |
||
199 | { |
||
200 | R5xxFIFOWait(2); |
||
201 | |||
202 | OUTREG(R5XX_DST_Y_X,(y1<<16)|x0); |
||
203 | |||
204 | h--; |
||
205 | } |
||
206 | if( (h > 0) && (x0 == draw->x0)) |
||
207 | { |
||
880 | serge | 208 | R5xxFIFOWait(2); |
878 | serge | 209 | |
210 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x0); |
||
211 | |||
212 | } |
||
213 | if( (h > 0) && (x1 == xend)) |
||
214 | { |
||
880 | serge | 215 | R5xxFIFOWait(2); |
878 | serge | 216 | |
217 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x1); |
||
218 | |||
219 | } |
||
220 | }; |
||
221 | #else |
||
222 | |||
812 | serge | 223 | BEGIN_RING(64); |
883 | serge | 224 | |
225 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); |
||
226 | |||
876 | serge | 227 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
812 | serge | 228 | |
876 | serge | 229 | RADEON_GMC_DST_32BPP | |
230 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
231 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
232 | R5XX_GMC_WR_MSK_DIS | |
||
233 | R5XX_ROP3_P |
||
234 | ); |
||
235 | |||
236 | OUT_RING(dstpixmap->pitch_offset); |
||
808 | serge | 237 | |
876 | serge | 238 | OUT_RING((x0<<16)|y0); |
239 | OUT_RING((w<<16)|h); |
||
883 | serge | 240 | OUT_RING(CP_PACKET2()); |
876 | serge | 241 | OUT_RING(CP_PACKET2()); |
883 | serge | 242 | |
243 | if( draw->color != draw->border) |
||
244 | |||
245 | if( y0 == draw->y0) { |
||
246 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); |
||
247 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
248 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
249 | RADEON_GMC_DST_32BPP | |
||
250 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
251 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
252 | R5XX_GMC_WR_MSK_DIS | |
||
253 | R5XX_ROP3_P |
||
254 | ); |
||
255 | |||
256 | OUT_RING(dstpixmap->pitch_offset); |
||
257 | |||
258 | OUT_RING((x0<<16)|y0); |
||
259 | OUT_RING((w<<16)|1); |
||
260 | OUT_RING(CP_PACKET2()); |
||
261 | OUT_RING(CP_PACKET2()); |
||
262 | |||
263 | // y0++; |
||
264 | |||
265 | } |
||
266 | if( y1 == yend ) { |
||
267 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); |
||
268 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
269 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
270 | RADEON_GMC_DST_32BPP | |
||
271 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
272 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
273 | R5XX_GMC_WR_MSK_DIS | |
||
274 | R5XX_ROP3_P |
||
275 | ); |
||
276 | |||
277 | OUT_RING(dstpixmap->pitch_offset); |
||
278 | |||
279 | OUT_RING((x0<<16)|y1); |
||
280 | OUT_RING((w<<16)|1); |
||
281 | OUT_RING(CP_PACKET2()); |
||
282 | OUT_RING(CP_PACKET2()); |
||
283 | |||
284 | // h--; |
||
285 | |||
286 | if( (h > 0) && (x0 == draw->x0)) { |
||
287 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); |
||
288 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
289 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
290 | RADEON_GMC_DST_32BPP | |
||
291 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
292 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
293 | R5XX_GMC_WR_MSK_DIS | |
||
294 | R5XX_ROP3_P |
||
295 | ); |
||
296 | |||
297 | OUT_RING(dstpixmap->pitch_offset); |
||
298 | |||
299 | OUT_RING((x0<<16)|y0); |
||
300 | OUT_RING((1<<16)|h); |
||
301 | OUT_RING(CP_PACKET2()); |
||
302 | OUT_RING(CP_PACKET2()); |
||
303 | |||
304 | } |
||
305 | |||
306 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); |
||
307 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
308 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
309 | RADEON_GMC_DST_32BPP | |
||
310 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
311 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
312 | R5XX_GMC_WR_MSK_DIS | |
||
313 | R5XX_ROP3_P |
||
314 | ); |
||
315 | |||
316 | OUT_RING(dstpixmap->pitch_offset); |
||
317 | |||
318 | OUT_RING((x1<<16)|y0); |
||
319 | OUT_RING((1<<16)|h); |
||
320 | OUT_RING(CP_PACKET2()); |
||
321 | OUT_RING(CP_PACKET2()); |
||
322 | |||
323 | } |
||
324 | |||
325 | |||
326 | /* |
||
327 | |||
328 | CP_REG(R5XX_DP_GUI_MASTER_CNTL, |
||
329 | |||
330 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
331 | RADEON_GMC_DST_32BPP | |
||
332 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
333 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
334 | R5XX_GMC_WR_MSK_DIS | |
||
335 | R5XX_ROP3_P |
||
336 | ); |
||
337 | CP_REG(R5XX_DP_BRUSH_FRGD_CLR, draw->color); |
||
338 | CP_REG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
||
339 | |||
340 | CP_REG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
||
341 | |||
342 | CP_REG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|h); |
||
343 | if( draw->color != draw->border) |
||
344 | { |
||
345 | CP_REG(R5XX_DP_GUI_MASTER_CNTL, |
||
346 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
347 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
348 | RADEON_GMC_DST_32BPP | |
||
349 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
350 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
351 | R5XX_GMC_WR_MSK_DIS | |
||
352 | R5XX_ROP3_P |
||
353 | ); |
||
354 | CP_REG(R5XX_DP_BRUSH_FRGD_CLR, draw->border); |
||
355 | CP_REG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
||
356 | |||
357 | CP_REG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
||
358 | |||
359 | |||
360 | |||
361 | |||
362 | CP_REG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1); |
||
363 | y0++; |
||
364 | h--; |
||
365 | } |
||
366 | if( y1 == yend ) { |
||
367 | CP_REG(R5XX_DST_Y_X,(y1<<16)|x0); |
||
368 | CP_REG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1); |
||
369 | h--; |
||
370 | } |
||
371 | if( (h > 0) && (x0 == draw->x0)) { |
||
372 | CP_REG(R5XX_DST_Y_X,(y0<<16)|x0); |
||
373 | CP_REG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h); |
||
374 | } |
||
375 | if( (h > 0) && (x1 == xend)) { |
||
376 | CP_REG(R5XX_DST_Y_X,(y0<<16)|x1); |
||
377 | CP_REG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h); |
||
378 | } |
||
379 | }; |
||
380 | */ |
||
381 | |||
382 | COMMIT_RING(); |
||
383 | |||
876 | serge | 384 | safe_sti(ifl); |
812 | serge | 385 | }; |
876 | serge | 386 | return ERR_OK; |
387 | } |
||
388 | |||
808 | serge | 389 | int FillRect(io_fill_t *fill) |
390 | |||
879 | serge | 391 | local_pixmap_t *dstpixmap; |
808 | serge | 392 | clip_t dst_clip; |
876 | serge | 393 | int x0, y0, x1, y1, xend, yend; |
394 | |||
879 | serge | 395 | dstpixmap = (fill->dstpix == (void*)-1) ? &scr_pixmap : fill->dstpix ; |
808 | serge | 396 | |
876 | serge | 397 | x0 = fill->x; |
817 | serge | 398 | |
876 | serge | 399 | |
400 | xend = x1 = x0 + fill->w - 1; |
||
808 | serge | 401 | |
879 | serge | 402 | |
403 | dst_clip.xmin = 0; |
||
808 | serge | 404 | |
876 | serge | 405 | dst_clip.xmax = dstpixmap->width-1; |
406 | dst_clip.ymax = dstpixmap->height-1; |
||
407 | |||
408 | // dbgprintf("fill rect x0:%d, y0:%d, x1:%d, y1:%d\n", |
||
409 | |||
808 | serge | 410 | |
411 | if( ! BlockClip(&dst_clip, &x0, &y0, &x1, &y1)) |
||
412 | |||
876 | serge | 413 | u32_t *ring, write; |
414 | u32_t ifl; |
||
415 | |||
883 | serge | 416 | int w = x1 - x0 + 1; |
808 | serge | 417 | |
879 | serge | 418 | |
419 | ifl = safe_cli(); |
||
876 | serge | 420 | |
883 | serge | 421 | #if R300_PIO |
422 | |||
423 | R5xxFIFOWait(9); |
||
424 | |||
876 | serge | 425 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
426 | |||
427 | R5XX_GMC_BRUSH_8X8_MONO_FG_BG | |
||
428 | RADEON_GMC_DST_32BPP | |
||
429 | R5XX_GMC_SRC_DATATYPE_COLOR | |
||
430 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
431 | R5XX_GMC_WR_MSK_DIS | |
||
432 | R5XX_ROP3_P |
||
433 | ); |
||
434 | |||
435 | OUTREG(R5XX_DP_BRUSH_BKGD_CLR, fill->bkcolor); |
||
436 | |||
437 | |||
438 | OUTREG(R5XX_BRUSH_DATA0, fill->bmp0); |
||
439 | |||
440 | |||
441 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
||
442 | |||
443 | |||
444 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x0); |
||
445 | |||
446 | |||
447 | if( (fill->border & 0xFF000000) != 0) |
||
879 | serge | 448 | |
449 | R5xxFIFOWait(2); |
||
450 | |||
451 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
||
452 | |||
453 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
454 | RADEON_GMC_DST_32BPP | |
||
455 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
456 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
457 | R5XX_GMC_WR_MSK_DIS | |
||
458 | R5XX_ROP3_P |
||
459 | ); |
||
460 | |||
461 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, fill->border); |
||
462 | |||
463 | if( y0 == fill->y) |
||
464 | |||
465 | R5xxFIFOWait(2); |
||
466 | |||
467 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x0); |
||
468 | |||
469 | y0++; |
||
470 | h--; |
||
471 | } |
||
472 | if( y1 == yend ) |
||
473 | { |
||
474 | R5xxFIFOWait(2); |
||
475 | |||
476 | OUTREG(R5XX_DST_Y_X,(y1<<16)|x0); |
||
477 | |||
478 | h--; |
||
479 | } |
||
480 | if( (h > 0) && (x0 == fill->x)) |
||
481 | { |
||
880 | serge | 482 | R5xxFIFOWait(2); |
879 | serge | 483 | |
484 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x0); |
||
485 | |||
486 | } |
||
487 | if( (h > 0) && (x1 == xend)) |
||
488 | { |
||
880 | serge | 489 | R5xxFIFOWait(2); |
879 | serge | 490 | |
491 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x1); |
||
492 | |||
493 | } |
||
494 | }; |
||
495 | |||
496 | |||
497 | |||
498 | |||
812 | serge | 499 | |
883 | serge | 500 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT, 7)); |
501 | |||
876 | serge | 502 | R5XX_GMC_BRUSH_8X8_MONO_FG_BG | |
503 | RADEON_GMC_DST_32BPP | |
||
504 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
505 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
506 | R5XX_GMC_WR_MSK_DIS | |
||
507 | R5XX_ROP3_P |
||
508 | ); |
||
509 | |||
510 | OUT_RING(dstpixmap->pitch_offset); |
||
812 | serge | 511 | |
876 | serge | 512 | OUT_RING(fill->fcolor); |
513 | |||
514 | OUT_RING(fill->bmp0); |
||
808 | serge | 515 | |
876 | serge | 516 | |
517 | OUT_RING((y0<<16)|x0); |
||
808 | serge | 518 | |
876 | serge | 519 | |
520 | if( (fill->border & 0xFF000000) != 0) |
||
883 | serge | 521 | |
522 | CP_REG(R5XX_DP_GUI_MASTER_CNTL, |
||
523 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
524 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
525 | RADEON_GMC_DST_32BPP | |
||
526 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
527 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
528 | R5XX_GMC_WR_MSK_DIS | |
||
529 | R5XX_ROP3_P |
||
530 | ); |
||
531 | |||
532 | CP_REG(R5XX_DP_BRUSH_FRGD_CLR, fill->border); |
||
533 | |||
534 | if( y0 == fill->y) |
||
535 | |||
536 | CP_REG(R5XX_DST_Y_X,(y0<<16)|x0); |
||
537 | CP_REG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1); |
||
538 | y0++; |
||
539 | h--; |
||
540 | } |
||
541 | if( y1 == yend ) |
||
542 | { |
||
543 | CP_REG(R5XX_DST_Y_X,(y1<<16)|x0); |
||
544 | CP_REG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1); |
||
545 | h--; |
||
546 | } |
||
547 | if( (h > 0) && (x0 == fill->x)) |
||
548 | { |
||
549 | CP_REG(R5XX_DST_Y_X,(y0<<16)|x0); |
||
550 | CP_REG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h); |
||
551 | } |
||
552 | if( (h > 0) && (x1 == xend)) |
||
553 | { |
||
554 | CP_REG(R5XX_DST_Y_X,(y0<<16)|x1); |
||
555 | CP_REG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h); |
||
556 | } |
||
557 | }; |
||
558 | |||
559 | COMMIT_RING(); |
||
560 | |||
876 | serge | 561 | #endif |
808 | serge | 562 | |
812 | serge | 563 | }; |
876 | serge | 564 | return ERR_OK; |
565 | }; |
||
566 | |||
567 | |||
812 | serge | 568 | |
808 | serge | 569 | |
1002 | serge | 570 | |
808 | serge | 571 | |
1002 | serge | 572 | |
573 | int w, int h, int srcpitch) |
||
574 | { |
||
575 | u32_t ifl; |
||
576 | color_t *src_addr; |
||
577 | |||
578 | ifl = safe_cli(); |
||
579 | |||
580 | #if R300_PIO |
||
581 | |||
582 | R5xxFIFOWait(5); |
||
583 | |||
584 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
||
585 | |||
586 | // RADEON_GMC_DST_CLIPPING | |
||
587 | RADEON_GMC_BRUSH_NONE | |
||
588 | RADEON_GMC_DST_32BPP | |
||
589 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
590 | RADEON_DP_SRC_SOURCE_HOST_DATA | |
||
591 | // RADEON_GMC_BYTE_MSB_TO_LSB | |
||
592 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
593 | R5XX_GMC_WR_MSK_DIS | |
||
594 | R5XX_ROP3_S |
||
595 | ); |
||
596 | |||
597 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | |
||
598 | |||
599 | |||
600 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpitch); |
||
601 | |||
602 | // OUTREG(RADEON_SC_TOP_LEFT, (y << 16) | ((x+skipleft) & 0xffff)); |
||
603 | |||
604 | |||
605 | OUTREG(RADEON_DST_Y_X, (dsty << 16) | (dstx & 0xffff)); |
||
606 | |||
607 | |||
608 | |||
609 | |||
610 | |||
611 | while ( h-- ) |
||
612 | |||
613 | color_t *tmp_src = src_addr; |
||
614 | src_addr += srcpitch/4; |
||
615 | |||
616 | int left = w; |
||
617 | |||
618 | while( left ) |
||
619 | |||
620 | volatile u32_t *d; |
||
621 | |||
622 | if( left > 8 ) |
||
623 | |||
624 | int i; |
||
625 | |||
626 | R5xxFIFOWait(8); |
||
627 | |||
628 | |||
629 | /* Unrolling doesn't improve performance */ |
||
630 | |||
631 | *d++ = *tmp_src++; |
||
632 | left -= 8; |
||
633 | } |
||
634 | else |
||
635 | { |
||
636 | R5xxFIFOWait(left); |
||
637 | |||
638 | if( h ) |
||
639 | |||
640 | else |
||
641 | d = ADDRREG(RADEON_HOST_DATA_LAST) - (left - 1); |
||
642 | |||
643 | for ( ; left; --left) |
||
644 | |||
645 | left = 0; |
||
646 | }; |
||
647 | }; |
||
648 | }; |
||
649 | |||
650 | #endif |
||
651 | |||
652 | safe_sti(ifl); |
||
653 | |||
654 | return ERR_OK; |
||
655 | |||
656 | |||
657 | |||
658 | |||
659 | |||
879 | serge | 660 | clip_t src_clip, dst_clip; |
817 | serge | 661 | |
1002 | serge | 662 | local_pixmap_t *srcpixmap; |
815 | serge | 663 | |
1002 | serge | 664 | |
665 | //dbgprintf("Pixblit src: %x dst: %x\n",blit->srcpix, blit->dstpix); |
||
815 | serge | 666 | |
1002 | serge | 667 | dstpixmap = (blit->dstpix == (void*)-1) ? &scr_pixmap : blit->dstpix ; |
815 | serge | 668 | |
1002 | serge | 669 | |
670 | //dbgprintf("srcpixmap: %x dstpixmap: %x\n",srcpixmap, dstpixmap); |
||
815 | serge | 671 | |
1002 | serge | 672 | //dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height); |
815 | serge | 673 | |
1002 | serge | 674 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
675 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
||
676 | |||
677 | src_clip.xmin = 0; |
||
815 | serge | 678 | |
1002 | serge | 679 | src_clip.xmax = srcpixmap->width-1; |
680 | src_clip.ymax = srcpixmap->height-1; |
||
681 | |||
682 | dst_clip.xmin = 0; |
||
815 | serge | 683 | |
1002 | serge | 684 | dst_clip.xmax = dstpixmap->width-1; |
685 | dst_clip.ymax = dstpixmap->height-1; |
||
686 | |||
687 | if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y, |
||
876 | serge | 688 | |
1002 | serge | 689 | &blit->w, &blit->h) ) |
690 | { |
||
691 | u32_t *ring, write; |
||
692 | u32_t ifl; |
||
876 | serge | 693 | |
883 | serge | 694 | if( (srcpixmap->flags & PX_MEM_MASK)==PX_MEM_SYSTEM) |
876 | serge | 695 | |
1002 | serge | 696 | blit->dst_x, blit->dst_y, |
697 | srcpixmap->mapped, |
||
698 | blit->src_x, blit->src_y, |
||
699 | blit->w, blit->h, |
||
700 | srcpixmap->pitch); |
||
701 | |||
702 | ifl = safe_cli(); |
||
703 | |||
883 | serge | 704 | #if R300_PIO |
876 | serge | 705 | |
868 | serge | 706 | R5xxFIFOWait(7); |
815 | serge | 707 | |
876 | serge | 708 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
868 | serge | 709 | |
876 | serge | 710 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
711 | RADEON_GMC_BRUSH_NONE | |
||
712 | RADEON_GMC_DST_32BPP | |
||
713 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
714 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
715 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
716 | R5XX_GMC_WR_MSK_DIS | |
||
717 | R5XX_ROP3_S |
||
718 | ); |
||
719 | |||
720 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
||
868 | serge | 721 | |
876 | serge | 722 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
868 | serge | 723 | |
876 | serge | 724 | |
725 | OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x); |
||
868 | serge | 726 | |
876 | serge | 727 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
728 | |||
729 | #else |
||
868 | serge | 730 | |
731 | |||
1002 | serge | 732 | OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); |
868 | serge | 733 | |
1002 | serge | 734 | OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
815 | serge | 735 | |
1002 | serge | 736 | RADEON_GMC_BRUSH_NONE | |
737 | RADEON_GMC_DST_32BPP | |
||
738 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
739 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
740 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
741 | R5XX_GMC_WR_MSK_DIS | |
||
742 | R5XX_ROP3_S |
||
743 | ); |
||
744 | |||
745 | OUT_RING(srcpixmap->pitch_offset); |
||
815 | serge | 746 | |
1002 | serge | 747 | |
748 | OUT_RING((blit->src_x<<16)|blit->src_y); |
||
815 | serge | 749 | |
1002 | serge | 750 | OUT_RING((blit->w<<16)|blit->h); |
751 | COMMIT_RING(); |
||
752 | |||
753 | #endif |
||
815 | serge | 754 | |
868 | serge | 755 | }; |
1002 | serge | 756 | return ERR_OK; |
876 | serge | 757 | }; |
758 | |||
759 | |||
868 | serge | 760 | |
829 | serge | 761 | |
879 | serge | 762 | clip_t src_clip, dst_clip; |
829 | serge | 763 | |
876 | serge | 764 | local_pixmap_t *srcpixmap; |
829 | serge | 765 | |
876 | serge | 766 | |
767 | // dbgprintf("Transblit src: %x dst: %x\n",blit->srcpix, blit->dstpix); |
||
829 | serge | 768 | |
868 | serge | 769 | dstpixmap = (blit->dstpix == (void*)-1) ? &scr_pixmap : blit->dstpix ; |
829 | serge | 770 | |
771 | |||
772 | //dbgprintf("srcpixmap: %x dstpixmap: %x\n",srcpixmap, dstpixmap); |
||
773 | |||
774 | //dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height); |
||
775 | |||
776 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
||
777 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
||
778 | src_clip.xmin = 0; |
||
779 | src_clip.ymin = 0; |
||
876 | serge | 780 | src_clip.xmax = srcpixmap->width-1; |
781 | src_clip.ymax = srcpixmap->height-1; |
||
782 | |||
783 | dst_clip.xmin = 0; |
||
829 | serge | 784 | |
876 | serge | 785 | dst_clip.xmax = dstpixmap->width-1; |
786 | dst_clip.ymax = dstpixmap->height-1; |
||
787 | |||
788 | if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y, |
||
829 | serge | 789 | |
876 | serge | 790 | &blit->w, &blit->h) ) |
791 | { |
||
792 | u32_t *ring, write; |
||
793 | |||
794 | u32_t ifl; |
||
795 | |||
883 | serge | 796 | ifl = safe_cli(); |
876 | serge | 797 | |
883 | serge | 798 | #if R300_PIO |
799 | |||
868 | serge | 800 | R5xxFIFOWait(10); |
801 | |||
876 | serge | 802 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
868 | serge | 803 | |
876 | serge | 804 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
805 | RADEON_GMC_BRUSH_NONE | |
||
806 | RADEON_GMC_DST_32BPP | |
||
807 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
808 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
809 | R5XX_GMC_WR_MSK_DIS | |
||
810 | R5XX_ROP3_S |
||
811 | ); |
||
812 | |||
813 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
||
868 | serge | 814 | |
876 | serge | 815 | OUTREG(R5XX_CLR_CMP_CLR_SRC, blit->key); |
868 | serge | 816 | |
883 | serge | 817 | OUTREG(R5XX_CLR_CMP_CNTL, R5XX_SRC_CMP_EQ_COLOR | R5XX_CLR_CMP_SRC_SOURCE); |
876 | serge | 818 | |
819 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
||
868 | serge | 820 | |
876 | serge | 821 | |
822 | OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x); |
||
868 | serge | 823 | |
876 | serge | 824 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
825 | |||
826 | #else |
||
868 | serge | 827 | |
828 | BEGIN_RING(10); |
||
829 | |||
883 | serge | 830 | OUT_RING(CP_PACKET3(RADEON_CNTL_TRANBLT, 8)); |
831 | |||
876 | serge | 832 | OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
829 | serge | 833 | |
876 | serge | 834 | RADEON_GMC_BRUSH_NONE | |
835 | RADEON_GMC_DST_32BPP | |
||
836 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
837 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
838 | R5XX_GMC_WR_MSK_DIS | |
||
839 | R5XX_ROP3_S |
||
840 | ); |
||
841 | |||
842 | OUT_RING(srcpixmap->pitch_offset); |
||
829 | serge | 843 | |
876 | serge | 844 | |
845 | OUT_RING(R5XX_CLR_CMP_SRC_SOURCE | R5XX_SRC_CMP_EQ_COLOR); |
||
829 | serge | 846 | |
876 | serge | 847 | OUT_RING(0xFFFFFFFF); |
883 | serge | 848 | |
849 | OUT_RING((blit->src_x<<16)|blit->src_y); |
||
829 | serge | 850 | |
876 | serge | 851 | OUT_RING((blit->w<<16)|blit->h); |
852 | |||
853 | COMMIT_RING(); |
||
868 | serge | 854 | |
876 | serge | 855 | #endif |
829 | serge | 856 | |
868 | serge | 857 | safe_sti(ifl); |
858 | |||
876 | serge | 859 | return ERR_OK; |
860 | } |
||
861 | |||
829 | serge | 862 | |
863 | |||
879 | serge | 864 | |
865 | int LockPixmap(userpixmap_t *io) |
||
866 | |||
867 | pixmap_t *pixmap; |
||
868 | size_t size; |
||
869 | void *usermap; |
||
870 | |||
871 | dbgprintf("Lock pixmap %x\n", io->pixmap); |
||
872 | |||
873 | if(io->pixmap == (pixmap_t*)-1) |
||
874 | |||
875 | else |
||
876 | pixmap = io->pixmap; |
||
877 | |||
878 | if( (pixmap->flags & 1) == PX_LOCK ) |
||
879 | |||
880 | |||
881 | size = (pixmap->pitch*pixmap->width+4095) & ~ 4095; |
||
882 | |||
883 | { |
||
884 | CommitPages(usermap, ((u32_t)pixmap->raw+rhd.PhisBase)|7|(1<<9), size); |
||
885 | pixmap->flags |= PX_LOCK; |
||
886 | pixmap->usermap = usermap; |
||
887 | io->usermap = usermap; |
||
888 | io->pitch = pixmap->pitch; |
||
889 | dbgprintf("map at %x\n", io->usermap); |
||
890 | |||
891 | return ERR_OK; |
||
892 | |||
893 | else |
||
894 | return ERR_PARAM; |
||
895 | }; |
||
896 | |||
897 | int UnlockPixmap(userpixmap_t *io) |
||
898 | |||
899 | pixmap_t *pixmap; |
||
900 | size_t size; |
||
901 | |||
902 | dbgprintf("Unlock pixmap %x\n", io->pixmap); |
||
903 | |||
904 | if(io->pixmap == (pixmap_t*)-1) |
||
905 | |||
906 | else |
||
907 | pixmap = io->pixmap; |
||
908 | |||
909 | if( (pixmap->flags & 1) != PX_LOCK ) |
||
910 | |||
911 | |||
912 | /* Sanity checks */ |
||
913 | |||
914 | if( (pixmap->usermap == 0)|| |
||
915 | |||
916 | ((u32_t)pixmap->usermap & 4095) |
||
917 | ) |
||
918 | return ERR_PARAM; |
||
919 | |||
920 | size = (pixmap->pitch*pixmap->width+4095) & ~ 4095; |
||
921 | |||
922 | UnmapPages(pixmap->usermap, size); |
||
923 | |||
924 | pixmap->usermap = NULL; |
||
925 | pixmap->flags &= ~PX_LOCK; |
||
926 | io->usermap = NULL; |
||
927 | io->pitch = 0; |
||
928 | |||
929 | return ERR_OK; |
||
930 | |||
931 | |||
932 | #endif9),><9),>16)|blit-><16)|blit->16)|blit-><16)|blit->16)|blit-><16)|blit->16)|blit-><16)|blit->16)|blit-><16)|blit->16)|blit-><16)|blit->16)|blit-><16)|blit->16)|blit-><16)|blit->16)|blit-><16)|blit->16)|blit-><16)|blit->16)|blit-><16)|blit->16)|blit-><16)|blit->>><>><>><>><>16)|h); |
||
933 | |||
934 | >16)|x1); |