Rev 880 | 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 | |
570 | |||
879 | serge | 571 | clip_t src_clip, dst_clip; |
817 | serge | 572 | |
876 | serge | 573 | local_pixmap_t *srcpixmap; |
815 | serge | 574 | |
876 | serge | 575 | |
576 | //dbgprintf("Pixblit src: %x dst: %x\n",blit->srcpix, blit->dstpix); |
||
815 | serge | 577 | |
817 | serge | 578 | dstpixmap = (blit->dstpix == (void*)-1) ? &scr_pixmap : blit->dstpix ; |
815 | serge | 579 | |
580 | |||
581 | //dbgprintf("srcpixmap: %x dstpixmap: %x\n",srcpixmap, dstpixmap); |
||
582 | |||
817 | serge | 583 | //dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height); |
815 | serge | 584 | |
817 | serge | 585 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
586 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
||
587 | |||
588 | src_clip.xmin = 0; |
||
815 | serge | 589 | |
876 | serge | 590 | src_clip.xmax = srcpixmap->width-1; |
591 | src_clip.ymax = srcpixmap->height-1; |
||
592 | |||
593 | dst_clip.xmin = 0; |
||
815 | serge | 594 | |
876 | serge | 595 | dst_clip.xmax = dstpixmap->width-1; |
596 | dst_clip.ymax = dstpixmap->height-1; |
||
597 | |||
598 | if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y, |
||
599 | |||
600 | &blit->w, &blit->h) ) |
||
601 | { |
||
602 | u32_t *ring, write; |
||
603 | u32_t ifl; |
||
604 | |||
883 | serge | 605 | ifl = safe_cli(); |
876 | serge | 606 | |
883 | serge | 607 | #if R300_PIO |
876 | serge | 608 | |
868 | serge | 609 | R5xxFIFOWait(7); |
815 | serge | 610 | |
876 | serge | 611 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
868 | serge | 612 | |
876 | serge | 613 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
614 | RADEON_GMC_BRUSH_NONE | |
||
615 | RADEON_GMC_DST_32BPP | |
||
616 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
617 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
618 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
619 | R5XX_GMC_WR_MSK_DIS | |
||
620 | R5XX_ROP3_S |
||
621 | ); |
||
622 | |||
623 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
||
868 | serge | 624 | |
876 | serge | 625 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
868 | serge | 626 | |
876 | serge | 627 | |
628 | OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x); |
||
868 | serge | 629 | |
876 | serge | 630 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
631 | |||
632 | #else |
||
868 | serge | 633 | |
634 | |||
883 | serge | 635 | OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); |
868 | serge | 636 | |
876 | serge | 637 | OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
815 | serge | 638 | |
876 | serge | 639 | RADEON_GMC_BRUSH_NONE | |
640 | RADEON_GMC_DST_32BPP | |
||
641 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
642 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
643 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
644 | R5XX_GMC_WR_MSK_DIS | |
||
645 | R5XX_ROP3_S |
||
646 | ); |
||
647 | |||
648 | OUT_RING(srcpixmap->pitch_offset); |
||
815 | serge | 649 | |
876 | serge | 650 | |
651 | OUT_RING((blit->src_x<<16)|blit->src_y); |
||
815 | serge | 652 | |
876 | serge | 653 | OUT_RING((blit->w<<16)|blit->h); |
654 | COMMIT_RING(); |
||
655 | |||
656 | #endif |
||
815 | serge | 657 | |
868 | serge | 658 | }; |
876 | serge | 659 | return ERR_OK; |
660 | }; |
||
661 | |||
662 | |||
868 | serge | 663 | |
829 | serge | 664 | |
879 | serge | 665 | clip_t src_clip, dst_clip; |
829 | serge | 666 | |
876 | serge | 667 | local_pixmap_t *srcpixmap; |
829 | serge | 668 | |
876 | serge | 669 | |
670 | // dbgprintf("Transblit src: %x dst: %x\n",blit->srcpix, blit->dstpix); |
||
829 | serge | 671 | |
868 | serge | 672 | dstpixmap = (blit->dstpix == (void*)-1) ? &scr_pixmap : blit->dstpix ; |
829 | serge | 673 | |
674 | |||
675 | //dbgprintf("srcpixmap: %x dstpixmap: %x\n",srcpixmap, dstpixmap); |
||
676 | |||
677 | //dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height); |
||
678 | |||
679 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
||
680 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
||
681 | src_clip.xmin = 0; |
||
682 | src_clip.ymin = 0; |
||
876 | serge | 683 | src_clip.xmax = srcpixmap->width-1; |
684 | src_clip.ymax = srcpixmap->height-1; |
||
685 | |||
686 | dst_clip.xmin = 0; |
||
829 | serge | 687 | |
876 | serge | 688 | dst_clip.xmax = dstpixmap->width-1; |
689 | dst_clip.ymax = dstpixmap->height-1; |
||
690 | |||
691 | if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y, |
||
829 | serge | 692 | |
876 | serge | 693 | &blit->w, &blit->h) ) |
694 | { |
||
695 | u32_t *ring, write; |
||
696 | |||
697 | u32_t ifl; |
||
698 | |||
883 | serge | 699 | ifl = safe_cli(); |
876 | serge | 700 | |
883 | serge | 701 | #if R300_PIO |
702 | |||
868 | serge | 703 | R5xxFIFOWait(10); |
704 | |||
876 | serge | 705 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
868 | serge | 706 | |
876 | serge | 707 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
708 | RADEON_GMC_BRUSH_NONE | |
||
709 | RADEON_GMC_DST_32BPP | |
||
710 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
711 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
712 | R5XX_GMC_WR_MSK_DIS | |
||
713 | R5XX_ROP3_S |
||
714 | ); |
||
715 | |||
716 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
||
868 | serge | 717 | |
876 | serge | 718 | OUTREG(R5XX_CLR_CMP_CLR_SRC, blit->key); |
868 | serge | 719 | |
883 | serge | 720 | OUTREG(R5XX_CLR_CMP_CNTL, R5XX_SRC_CMP_EQ_COLOR | R5XX_CLR_CMP_SRC_SOURCE); |
876 | serge | 721 | |
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 | BEGIN_RING(10); |
||
732 | |||
883 | serge | 733 | OUT_RING(CP_PACKET3(RADEON_CNTL_TRANBLT, 8)); |
734 | |||
876 | serge | 735 | OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
829 | serge | 736 | |
876 | serge | 737 | RADEON_GMC_BRUSH_NONE | |
738 | RADEON_GMC_DST_32BPP | |
||
739 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
740 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
741 | R5XX_GMC_WR_MSK_DIS | |
||
742 | R5XX_ROP3_S |
||
743 | ); |
||
744 | |||
745 | OUT_RING(srcpixmap->pitch_offset); |
||
829 | serge | 746 | |
876 | serge | 747 | |
748 | OUT_RING(R5XX_CLR_CMP_SRC_SOURCE | R5XX_SRC_CMP_EQ_COLOR); |
||
829 | serge | 749 | |
876 | serge | 750 | OUT_RING(0xFFFFFFFF); |
883 | serge | 751 | |
752 | OUT_RING((blit->src_x<<16)|blit->src_y); |
||
829 | serge | 753 | |
876 | serge | 754 | OUT_RING((blit->w<<16)|blit->h); |
755 | |||
756 | COMMIT_RING(); |
||
868 | serge | 757 | |
876 | serge | 758 | #endif |
829 | serge | 759 | |
868 | serge | 760 | safe_sti(ifl); |
761 | |||
876 | serge | 762 | return ERR_OK; |
763 | } |
||
764 | |||
829 | serge | 765 | |
766 | |||
879 | serge | 767 | |
768 | int LockPixmap(userpixmap_t *io) |
||
769 | |||
770 | pixmap_t *pixmap; |
||
771 | size_t size; |
||
772 | void *usermap; |
||
773 | |||
774 | dbgprintf("Lock pixmap %x\n", io->pixmap); |
||
775 | |||
776 | if(io->pixmap == (pixmap_t*)-1) |
||
777 | |||
778 | else |
||
779 | pixmap = io->pixmap; |
||
780 | |||
781 | if( (pixmap->flags & 1) == PX_LOCK ) |
||
782 | |||
783 | |||
784 | size = (pixmap->pitch*pixmap->width+4095) & ~ 4095; |
||
785 | |||
786 | { |
||
787 | CommitPages(usermap, ((u32_t)pixmap->raw+rhd.PhisBase)|7|(1<<9), size); |
||
788 | pixmap->flags |= PX_LOCK; |
||
789 | pixmap->usermap = usermap; |
||
790 | io->usermap = usermap; |
||
791 | io->pitch = pixmap->pitch; |
||
792 | dbgprintf("map at %x\n", io->usermap); |
||
793 | |||
794 | return ERR_OK; |
||
795 | |||
796 | else |
||
797 | return ERR_PARAM; |
||
798 | }; |
||
799 | |||
800 | int UnlockPixmap(userpixmap_t *io) |
||
801 | |||
802 | pixmap_t *pixmap; |
||
803 | size_t size; |
||
804 | |||
805 | dbgprintf("Unlock pixmap %x\n", io->pixmap); |
||
806 | |||
807 | if(io->pixmap == (pixmap_t*)-1) |
||
808 | |||
809 | else |
||
810 | pixmap = io->pixmap; |
||
811 | |||
812 | if( (pixmap->flags & 1) != PX_LOCK ) |
||
813 | |||
814 | |||
815 | /* Sanity checks */ |
||
816 | |||
817 | if( (pixmap->usermap == 0)|| |
||
818 | |||
819 | ((u32_t)pixmap->usermap & 4095) |
||
820 | ) |
||
821 | return ERR_PARAM; |
||
822 | |||
823 | size = (pixmap->pitch*pixmap->width+4095) & ~ 4095; |
||
824 | |||
825 | UnmapPages(pixmap->usermap, size); |
||
826 | |||
827 | pixmap->usermap = NULL; |
||
828 | pixmap->flags &= ~PX_LOCK; |
||
829 | io->usermap = NULL; |
||
830 | io->pitch = 0; |
||
831 | |||
832 | return ERR_OK; |
||
833 | |||
834 | |||
835 | #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); |
||
836 | |||
837 | >16)|x1); |