Rev 877 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
808 | serge | 1 | |
877 | serge | 2 | { |
3 | local_pixmap_t *dstpixmap; |
||
4 | clip_t clip; |
||
5 | int x0, y0, x1, y1; |
||
6 | |||
808 | serge | 7 | |
877 | serge | 8 | |
9 | |||
10 | y0 = draw->y0; |
||
11 | |||
12 | |||
13 | y1 = draw->y1; |
||
14 | |||
15 | |||
16 | clip.ymin = 0; |
||
17 | clip.xmax = dstpixmap->width-1; |
||
18 | clip.ymax = dstpixmap->height-1; |
||
19 | |||
20 | |||
21 | { |
||
22 | u32_t efl; |
||
23 | u32_t *ring, write; |
||
24 | |||
25 | |||
26 | |||
27 | |||
28 | |||
29 | |||
30 | |||
31 | |||
32 | rhd.gui_control | |
||
33 | R5XX_GMC_BRUSH_SOLID_COLOR | |
||
34 | R5XX_GMC_SRC_DATATYPE_COLOR | |
||
35 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
36 | R5XX_GMC_WR_MSK_DIS | |
||
37 | R5XX_ROP3_P |
||
38 | ); |
||
39 | |||
40 | |||
41 | |||
42 | |||
43 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
||
44 | |||
45 | |||
46 | OUTREG(R5XX_DST_LINE_END,(y1<<16)|x1); |
||
47 | #else |
||
48 | BEGIN_RING(); |
||
49 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_POLYLINE, 4)); |
||
50 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
51 | RADEON_GMC_BRUSH_SOLID_COLOR | |
||
52 | RADEON_GMC_DST_32BPP | |
||
53 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
54 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
55 | R5XX_GMC_WR_MSK_DIS | |
||
56 | R5XX_ROP3_P); |
||
57 | |||
58 | |||
59 | OUT_RING(draw->color); |
||
60 | OUT_RING((y0<<16)|x0); |
||
61 | OUT_RING((y1<<16)|x1); |
||
62 | COMMIT_RING(); |
||
63 | |||
64 | |||
65 | safe_sti(efl); |
||
66 | }; |
||
67 | return ERR_OK; |
||
68 | } |
||
69 | |||
70 | |||
808 | serge | 71 | { |
72 | int x0, y0, x1, y1, xend, yend; |
||
878 | serge | 73 | |
808 | serge | 74 | |
876 | serge | 75 | clip_t dst_clip; |
76 | |||
817 | serge | 77 | |
876 | serge | 78 | |
817 | serge | 79 | |
876 | serge | 80 | y0 = draw->y0; |
81 | |||
808 | serge | 82 | |
878 | serge | 83 | y1 = yend = y0 + draw->h - 1; |
84 | |||
808 | serge | 85 | |
876 | serge | 86 | dst_clip.ymin = 0; |
87 | dst_clip.xmax = dstpixmap->width-1; |
||
88 | dst_clip.ymax = dstpixmap->height-1; |
||
89 | |||
90 | |||
91 | |||
808 | serge | 92 | // x0, y0, x1, y1, draw->color); |
93 | |||
94 | |||
876 | serge | 95 | { |
96 | u32_t *ring, write; |
||
97 | u32_t ifl; |
||
98 | int w, h; |
||
99 | |||
808 | serge | 100 | |
878 | serge | 101 | h = y1 - y0 + 1; |
102 | |||
808 | serge | 103 | |
876 | serge | 104 | |
808 | serge | 105 | |
813 | serge | 106 | |
812 | serge | 107 | |
876 | serge | 108 | |
812 | serge | 109 | |
876 | serge | 110 | rhd.gui_control | |
111 | R5XX_ROP3_P | |
||
112 | R5XX_GMC_BRUSH_SOLID_COLOR | |
||
113 | R5XX_GMC_SRC_DATATYPE_COLOR | |
||
114 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
115 | R5XX_GMC_WR_MSK_DIS |
||
116 | ); |
||
117 | |||
812 | serge | 118 | |
876 | serge | 119 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
120 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
||
121 | OUTREG(R5XX_DST_Y_X,(y0<<16)|x0); |
||
878 | serge | 122 | OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|h); |
876 | serge | 123 | |
878 | serge | 124 | |
125 | { |
||
126 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->border); |
||
127 | |||
128 | |||
129 | { |
||
130 | R5xxFIFOWait(2); |
||
131 | |||
132 | |||
133 | OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1); |
||
134 | y0++; |
||
135 | h--; |
||
136 | } |
||
137 | if( y1 == yend ) |
||
138 | { |
||
139 | R5xxFIFOWait(2); |
||
140 | |||
141 | |||
142 | OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1); |
||
143 | h--; |
||
144 | } |
||
145 | if( x0 == draw->x0) |
||
146 | { |
||
147 | R5xxFIFOWait(2); |
||
148 | |||
149 | |||
150 | OUTREG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h); |
||
151 | } |
||
152 | if( x1 == xend) |
||
153 | { |
||
154 | R5xxFIFOWait(2); |
||
155 | |||
156 | |||
157 | OUTREG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h); |
||
158 | } |
||
159 | }; |
||
160 | #else |
||
812 | serge | 161 | BEGIN_RING(); |
876 | serge | 162 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); |
163 | |||
812 | serge | 164 | |
876 | serge | 165 | RADEON_GMC_BRUSH_SOLID_COLOR | |
166 | RADEON_GMC_DST_32BPP | |
||
167 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
168 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
169 | R5XX_GMC_WR_MSK_DIS | |
||
170 | R5XX_ROP3_P |
||
171 | ); |
||
172 | |||
808 | serge | 173 | |
876 | serge | 174 | OUT_RING(draw->color); |
175 | OUT_RING((draw->x0<<16)|y0); |
||
176 | OUT_RING((w<<16)|h); |
||
177 | COMMIT_RING(); |
||
178 | #endif |
||
812 | serge | 179 | safe_sti(ifl); |
876 | serge | 180 | }; |
181 | return ERR_OK; |
||
182 | } |
||
808 | serge | 183 | |
184 | |||
185 | { |
||
186 | local_pixmap_t *dstpixmap; |
||
876 | serge | 187 | clip_t dst_clip; |
188 | int x0, y0, x1, y1; |
||
189 | |||
808 | serge | 190 | |
876 | serge | 191 | |
817 | serge | 192 | |
876 | serge | 193 | y0 = fill->y; |
194 | |||
808 | serge | 195 | |
876 | serge | 196 | y1 = y0+fill->h-1; |
197 | |||
808 | serge | 198 | |
876 | serge | 199 | dst_clip.ymin = 0; |
200 | dst_clip.xmax = dstpixmap->width-1; |
||
201 | dst_clip.ymax = dstpixmap->height-1; |
||
202 | |||
203 | |||
808 | serge | 204 | // x0, y0, x1, y1); |
205 | |||
206 | |||
876 | serge | 207 | { |
208 | u32_t *ring, write; |
||
209 | u32_t ifl = safe_cli(); |
||
210 | |||
808 | serge | 211 | |
813 | serge | 212 | |
812 | serge | 213 | |
876 | serge | 214 | int h = y1-y0+1; |
215 | |||
216 | |||
217 | |||
218 | |||
219 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
220 | R5XX_GMC_BRUSH_8X8_MONO_FG_BG | |
||
221 | RADEON_GMC_DST_32BPP | |
||
222 | R5XX_GMC_SRC_DATATYPE_COLOR | |
||
223 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
224 | R5XX_GMC_WR_MSK_DIS | |
||
225 | R5XX_ROP3_P |
||
226 | ); |
||
227 | |||
228 | |||
229 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, fill->fcolor); |
||
230 | |||
231 | |||
232 | OUTREG(R5XX_BRUSH_DATA1, fill->bmp1); |
||
233 | |||
234 | |||
235 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
||
236 | |||
237 | |||
238 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(h<<16)|w); |
||
239 | #else |
||
812 | serge | 240 | BEGIN_RING(); |
876 | serge | 241 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT, 7)); |
242 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
243 | R5XX_GMC_BRUSH_8X8_MONO_FG_BG | |
||
244 | RADEON_GMC_DST_32BPP | |
||
245 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
246 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
247 | R5XX_GMC_WR_MSK_DIS | |
||
248 | R5XX_ROP3_P |
||
249 | ); |
||
250 | |||
812 | serge | 251 | |
876 | serge | 252 | OUT_RING(fill->bkcolor); |
253 | OUT_RING(fill->fcolor); |
||
254 | |||
808 | serge | 255 | |
876 | serge | 256 | OUT_RING(fill->bmp1); |
257 | |||
808 | serge | 258 | |
876 | serge | 259 | OUT_RING((y1<<16)|x1); |
260 | COMMIT_RING(); |
||
261 | |||
808 | serge | 262 | |
812 | serge | 263 | safe_sti(ifl); |
876 | serge | 264 | }; |
265 | return ERR_OK; |
||
266 | }; |
||
267 | |||
812 | serge | 268 | |
876 | serge | 269 | int Blit(blit_t *blit) |
810 | serge | 270 | { |
271 | int x0, y0, x1, y1; |
||
272 | |||
808 | serge | 273 | |
810 | serge | 274 | y0 = blit->src_y; |
275 | |||
808 | serge | 276 | |
810 | serge | 277 | y1 = y0+blit->h-1; |
278 | |||
279 | |||
280 | |||
876 | serge | 281 | { |
810 | serge | 282 | u32 *ring, write; |
283 | int w, h; |
||
284 | u32 ifl; |
||
285 | |||
286 | |||
287 | h = y1-y0+1; |
||
288 | |||
289 | |||
290 | |||
291 | |||
813 | serge | 292 | |
812 | serge | 293 | |
294 | |||
295 | |||
296 | |||
810 | serge | 297 | OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); |
298 | |||
299 | |||
300 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
301 | RADEON_GMC_BRUSH_NONE | |
||
302 | RADEON_GMC_DST_32BPP | |
||
303 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
304 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
305 | (1 << 28)+(1 << 30) | R5XX_ROP3_S); |
||
306 | |||
307 | |||
308 | OUT_RING(rhd.dst_pitch_offset); |
||
309 | |||
310 | |||
311 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
||
312 | OUT_RING((w<<16)|h); |
||
313 | COMMIT_RING(); |
||
314 | |||
315 | |||
812 | serge | 316 | |
317 | |||
810 | serge | 318 | } ; |
319 | return ERR_OK; |
||
817 | serge | 320 | } |
810 | serge | 321 | |
322 | |||
813 | serge | 323 | |
808 | serge | 324 | |
815 | serge | 325 | |
876 | serge | 326 | |
327 | |||
817 | serge | 328 | { |
329 | pixmap_t *pixmap; |
||
829 | serge | 330 | size_t size; |
331 | void *usermap; |
||
332 | |||
815 | serge | 333 | |
829 | serge | 334 | |
815 | serge | 335 | |
829 | serge | 336 | return ERR_PARAM; |
337 | else |
||
338 | pixmap = io->pixmap; |
||
339 | |||
817 | serge | 340 | |
829 | serge | 341 | return ERR_PARAM; |
342 | |||
817 | serge | 343 | |
829 | serge | 344 | if (usermap = UserAlloc(size)) |
345 | { |
||
346 | CommitPages(usermap, ((u32_t)pixmap->raw+rhd.PhisBase)|7|(1<<9), size); |
||
347 | pixmap->flags |= PX_LOCK; |
||
348 | pixmap->usermap = usermap; |
||
349 | io->usermap = usermap; |
||
350 | io->pitch = pixmap->pitch; |
||
351 | dbgprintf("map at %x\n", io->usermap); |
||
352 | |||
817 | serge | 353 | |
829 | serge | 354 | } |
355 | else |
||
356 | return ERR_PARAM; |
||
357 | }; |
||
817 | serge | 358 | |
359 | |||
818 | serge | 360 | { |
361 | pixmap_t *pixmap; |
||
362 | size_t size; |
||
363 | |||
817 | serge | 364 | |
818 | serge | 365 | |
366 | |||
367 | return ERR_PARAM; |
||
368 | else |
||
369 | pixmap = io->pixmap; |
||
370 | |||
371 | |||
372 | return ERR_PARAM; |
||
373 | |||
374 | |||
868 | serge | 375 | |
376 | |||
377 | ((u32_t)pixmap->usermap >= 0x80000000) || |
||
378 | ((u32_t)pixmap->usermap & 4095) |
||
379 | ) |
||
380 | return ERR_PARAM; |
||
381 | |||
382 | |||
818 | serge | 383 | |
384 | |||
385 | UserFree(pixmap->usermap); |
||
386 | pixmap->usermap = NULL; |
||
387 | pixmap->flags &= ~PX_LOCK; |
||
388 | io->usermap = NULL; |
||
389 | io->pitch = 0; |
||
390 | |||
391 | |||
392 | }; |
||
393 | |||
394 | |||
876 | serge | 395 | |
818 | serge | 396 | |
815 | serge | 397 | { |
398 | clip_t src_clip, dst_clip; |
||
876 | serge | 399 | |
815 | serge | 400 | |
876 | serge | 401 | local_pixmap_t *dstpixmap; |
402 | |||
815 | serge | 403 | |
817 | serge | 404 | |
815 | serge | 405 | |
406 | srcpixmap = (blit->srcpix == (void*)-1) ? &scr_pixmap : blit->srcpix ; |
||
407 | |||
408 | |||
817 | serge | 409 | |
815 | serge | 410 | |
817 | serge | 411 | //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); |
412 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
||
413 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
||
414 | |||
815 | serge | 415 | |
876 | serge | 416 | src_clip.ymin = 0; |
417 | src_clip.xmax = srcpixmap->width-1; |
||
418 | src_clip.ymax = srcpixmap->height-1; |
||
419 | |||
815 | serge | 420 | |
876 | serge | 421 | dst_clip.ymin = 0; |
422 | dst_clip.xmax = dstpixmap->width-1; |
||
423 | dst_clip.ymax = dstpixmap->height-1; |
||
424 | |||
425 | |||
426 | &src_clip, &blit->src_x, &blit->src_y, |
||
427 | &blit->w, &blit->h) ) |
||
428 | { |
||
429 | u32_t *ring, write; |
||
430 | |||
431 | |||
432 | |||
433 | |||
868 | serge | 434 | |
815 | serge | 435 | |
876 | serge | 436 | |
868 | serge | 437 | |
876 | serge | 438 | RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
439 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
440 | RADEON_GMC_BRUSH_NONE | |
||
441 | RADEON_GMC_DST_32BPP | |
||
442 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
443 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
444 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
445 | R5XX_GMC_WR_MSK_DIS | |
||
446 | R5XX_ROP3_S |
||
447 | ); |
||
448 | |||
868 | serge | 449 | |
876 | serge | 450 | |
868 | serge | 451 | |
876 | serge | 452 | OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset); |
453 | |||
868 | serge | 454 | |
876 | serge | 455 | OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x); |
456 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
||
457 | |||
868 | serge | 458 | |
459 | |||
460 | |||
876 | serge | 461 | OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); |
462 | |||
815 | serge | 463 | |
876 | serge | 464 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
465 | RADEON_GMC_BRUSH_NONE | |
||
466 | RADEON_GMC_DST_32BPP | |
||
467 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
468 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
469 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
470 | R5XX_GMC_WR_MSK_DIS | |
||
471 | R5XX_ROP3_S |
||
472 | ); |
||
473 | |||
815 | serge | 474 | |
876 | serge | 475 | OUT_RING(dstpixmap->pitch_offset); |
476 | |||
815 | serge | 477 | |
876 | serge | 478 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
479 | OUT_RING((blit->w<<16)|blit->h); |
||
480 | COMMIT_RING(); |
||
481 | |||
815 | serge | 482 | |
868 | serge | 483 | safe_sti(ifl); |
876 | serge | 484 | }; |
485 | return ERR_OK; |
||
486 | }; |
||
487 | |||
868 | serge | 488 | |
829 | serge | 489 | |
490 | { |
||
491 | clip_t src_clip, dst_clip; |
||
876 | serge | 492 | |
829 | serge | 493 | |
876 | serge | 494 | local_pixmap_t *dstpixmap; |
495 | |||
829 | serge | 496 | |
868 | serge | 497 | |
829 | serge | 498 | |
499 | srcpixmap = (blit->srcpix == (void*)-1) ? &scr_pixmap : blit->srcpix ; |
||
500 | |||
501 | |||
502 | |||
503 | |||
504 | //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); |
||
505 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
||
506 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
||
507 | src_clip.xmin = 0; |
||
876 | serge | 508 | src_clip.ymin = 0; |
509 | src_clip.xmax = srcpixmap->width-1; |
||
510 | src_clip.ymax = srcpixmap->height-1; |
||
511 | |||
829 | serge | 512 | |
876 | serge | 513 | dst_clip.ymin = 0; |
514 | dst_clip.xmax = dstpixmap->width-1; |
||
515 | dst_clip.ymax = dstpixmap->height-1; |
||
516 | |||
829 | serge | 517 | |
876 | serge | 518 | &src_clip, &blit->src_x, &blit->src_y, |
519 | &blit->w, &blit->h) ) |
||
520 | { |
||
521 | u32_t *ring, write; |
||
522 | |||
523 | |||
524 | |||
525 | |||
868 | serge | 526 | |
527 | |||
876 | serge | 528 | |
868 | serge | 529 | |
876 | serge | 530 | RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
531 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
532 | RADEON_GMC_BRUSH_NONE | |
||
533 | RADEON_GMC_DST_32BPP | |
||
534 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
535 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
536 | R5XX_GMC_WR_MSK_DIS | |
||
537 | R5XX_ROP3_S |
||
538 | ); |
||
539 | |||
868 | serge | 540 | |
876 | serge | 541 | |
868 | serge | 542 | |
876 | serge | 543 | OUTREG(R5XX_CLR_CMP_MASK, R5XX_CLR_CMP_MSK); |
544 | OUTREG(R5XX_CLR_CMP_CNTL, R5XX_SRC_CMP_EQ_COLOR | R5XX_CLR_CMP_SRC_SOURCE); |
||
545 | |||
868 | serge | 546 | |
876 | serge | 547 | OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset); |
548 | |||
868 | serge | 549 | |
876 | serge | 550 | OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x); |
551 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
||
552 | |||
868 | serge | 553 | |
554 | |||
555 | |||
876 | serge | 556 | OUT_RING(CP_PACKET3(RADEON_CNTL_TRANBLT, 8)); |
557 | |||
829 | serge | 558 | |
876 | serge | 559 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
560 | RADEON_GMC_BRUSH_NONE | |
||
561 | RADEON_GMC_DST_32BPP | |
||
562 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
563 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
564 | R5XX_GMC_WR_MSK_DIS | |
||
565 | R5XX_ROP3_S |
||
566 | ); |
||
567 | |||
829 | serge | 568 | |
876 | serge | 569 | OUT_RING(dstpixmap->pitch_offset); |
570 | |||
829 | serge | 571 | |
876 | serge | 572 | OUT_RING(0xFF000000); |
573 | OUT_RING(0xFF000000); |
||
574 | |||
829 | serge | 575 | |
876 | serge | 576 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
577 | OUT_RING((blit->w<<16)|blit->h); |
||
578 | |||
868 | serge | 579 | |
876 | serge | 580 | |
829 | serge | 581 | |
868 | serge | 582 | |
583 | |||
876 | serge | 584 | }; |
585 | return ERR_OK; |
||
586 | }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->9),><9),>16)|h); |
||
829 | serge | 587 | ><16)|h); |
588 |