Rev 876 | 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; |
||
876 | 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 | |
876 | serge | 83 | y1 = 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 | |
876 | 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,(draw->y0<<16)|draw->x0); |
||
122 | OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|h); |
||
123 | #else |
||
812 | serge | 124 | BEGIN_RING(); |
876 | serge | 125 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); |
126 | |||
812 | serge | 127 | |
876 | serge | 128 | RADEON_GMC_BRUSH_SOLID_COLOR | |
129 | RADEON_GMC_DST_32BPP | |
||
130 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
131 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
132 | R5XX_GMC_WR_MSK_DIS | |
||
133 | R5XX_ROP3_P |
||
134 | ); |
||
135 | |||
808 | serge | 136 | |
876 | serge | 137 | OUT_RING(draw->color); |
138 | OUT_RING((draw->x0<<16)|y0); |
||
139 | OUT_RING((w<<16)|h); |
||
140 | COMMIT_RING(); |
||
141 | #endif |
||
812 | serge | 142 | safe_sti(ifl); |
876 | serge | 143 | }; |
144 | return ERR_OK; |
||
145 | } |
||
808 | serge | 146 | |
147 | |||
148 | { |
||
149 | local_pixmap_t *dstpixmap; |
||
876 | serge | 150 | clip_t dst_clip; |
151 | int x0, y0, x1, y1; |
||
152 | |||
808 | serge | 153 | |
876 | serge | 154 | |
817 | serge | 155 | |
876 | serge | 156 | y0 = fill->y; |
157 | |||
808 | serge | 158 | |
876 | serge | 159 | y1 = y0+fill->h-1; |
160 | |||
808 | serge | 161 | |
876 | serge | 162 | dst_clip.ymin = 0; |
163 | dst_clip.xmax = dstpixmap->width-1; |
||
164 | dst_clip.ymax = dstpixmap->height-1; |
||
165 | |||
166 | |||
808 | serge | 167 | // x0, y0, x1, y1); |
168 | |||
169 | |||
876 | serge | 170 | { |
171 | u32_t *ring, write; |
||
172 | u32_t ifl = safe_cli(); |
||
173 | |||
808 | serge | 174 | |
813 | serge | 175 | |
812 | serge | 176 | |
876 | serge | 177 | int h = y1-y0+1; |
178 | |||
179 | |||
180 | |||
181 | |||
182 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
183 | R5XX_GMC_BRUSH_8X8_MONO_FG_BG | |
||
184 | RADEON_GMC_DST_32BPP | |
||
185 | R5XX_GMC_SRC_DATATYPE_COLOR | |
||
186 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
187 | R5XX_GMC_WR_MSK_DIS | |
||
188 | R5XX_ROP3_P |
||
189 | ); |
||
190 | |||
191 | |||
192 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, fill->fcolor); |
||
193 | |||
194 | |||
195 | OUTREG(R5XX_BRUSH_DATA1, fill->bmp1); |
||
196 | |||
197 | |||
198 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); |
||
199 | |||
200 | |||
201 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(h<<16)|w); |
||
202 | #else |
||
812 | serge | 203 | BEGIN_RING(); |
876 | serge | 204 | OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT, 7)); |
205 | OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
206 | R5XX_GMC_BRUSH_8X8_MONO_FG_BG | |
||
207 | RADEON_GMC_DST_32BPP | |
||
208 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
209 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
210 | R5XX_GMC_WR_MSK_DIS | |
||
211 | R5XX_ROP3_P |
||
212 | ); |
||
213 | |||
812 | serge | 214 | |
876 | serge | 215 | OUT_RING(fill->bkcolor); |
216 | OUT_RING(fill->fcolor); |
||
217 | |||
808 | serge | 218 | |
876 | serge | 219 | OUT_RING(fill->bmp1); |
220 | |||
808 | serge | 221 | |
876 | serge | 222 | OUT_RING((y1<<16)|x1); |
223 | COMMIT_RING(); |
||
224 | |||
808 | serge | 225 | |
812 | serge | 226 | safe_sti(ifl); |
876 | serge | 227 | }; |
228 | return ERR_OK; |
||
229 | }; |
||
230 | |||
812 | serge | 231 | |
876 | serge | 232 | int Blit(blit_t *blit) |
810 | serge | 233 | { |
234 | int x0, y0, x1, y1; |
||
235 | |||
808 | serge | 236 | |
810 | serge | 237 | y0 = blit->src_y; |
238 | |||
808 | serge | 239 | |
810 | serge | 240 | y1 = y0+blit->h-1; |
241 | |||
242 | |||
243 | |||
876 | serge | 244 | { |
810 | serge | 245 | u32 *ring, write; |
246 | int w, h; |
||
247 | u32 ifl; |
||
248 | |||
249 | |||
250 | h = y1-y0+1; |
||
251 | |||
252 | |||
253 | |||
254 | |||
813 | serge | 255 | |
812 | serge | 256 | |
257 | |||
258 | |||
259 | |||
810 | serge | 260 | OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); |
261 | |||
262 | |||
263 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
264 | RADEON_GMC_BRUSH_NONE | |
||
265 | RADEON_GMC_DST_32BPP | |
||
266 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
267 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
268 | (1 << 28)+(1 << 30) | R5XX_ROP3_S); |
||
269 | |||
270 | |||
271 | OUT_RING(rhd.dst_pitch_offset); |
||
272 | |||
273 | |||
274 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
||
275 | OUT_RING((w<<16)|h); |
||
276 | COMMIT_RING(); |
||
277 | |||
278 | |||
812 | serge | 279 | |
280 | |||
810 | serge | 281 | } ; |
282 | return ERR_OK; |
||
817 | serge | 283 | } |
810 | serge | 284 | |
285 | |||
813 | serge | 286 | |
808 | serge | 287 | |
815 | serge | 288 | |
876 | serge | 289 | |
290 | |||
817 | serge | 291 | { |
292 | pixmap_t *pixmap; |
||
829 | serge | 293 | size_t size; |
294 | void *usermap; |
||
295 | |||
815 | serge | 296 | |
829 | serge | 297 | |
815 | serge | 298 | |
829 | serge | 299 | return ERR_PARAM; |
300 | else |
||
301 | pixmap = io->pixmap; |
||
302 | |||
817 | serge | 303 | |
829 | serge | 304 | return ERR_PARAM; |
305 | |||
817 | serge | 306 | |
829 | serge | 307 | if (usermap = UserAlloc(size)) |
308 | { |
||
309 | CommitPages(usermap, ((u32_t)pixmap->raw+rhd.PhisBase)|7|(1<<9), size); |
||
310 | pixmap->flags |= PX_LOCK; |
||
311 | pixmap->usermap = usermap; |
||
312 | io->usermap = usermap; |
||
313 | io->pitch = pixmap->pitch; |
||
314 | dbgprintf("map at %x\n", io->usermap); |
||
315 | |||
817 | serge | 316 | |
829 | serge | 317 | } |
318 | else |
||
319 | return ERR_PARAM; |
||
320 | }; |
||
817 | serge | 321 | |
322 | |||
818 | serge | 323 | { |
324 | pixmap_t *pixmap; |
||
325 | size_t size; |
||
326 | |||
817 | serge | 327 | |
818 | serge | 328 | |
329 | |||
330 | return ERR_PARAM; |
||
331 | else |
||
332 | pixmap = io->pixmap; |
||
333 | |||
334 | |||
335 | return ERR_PARAM; |
||
336 | |||
337 | |||
868 | serge | 338 | |
339 | |||
340 | ((u32_t)pixmap->usermap >= 0x80000000) || |
||
341 | ((u32_t)pixmap->usermap & 4095) |
||
342 | ) |
||
343 | return ERR_PARAM; |
||
344 | |||
345 | |||
818 | serge | 346 | |
347 | |||
348 | UserFree(pixmap->usermap); |
||
349 | pixmap->usermap = NULL; |
||
350 | pixmap->flags &= ~PX_LOCK; |
||
351 | io->usermap = NULL; |
||
352 | io->pitch = 0; |
||
353 | |||
354 | |||
355 | }; |
||
356 | |||
357 | |||
876 | serge | 358 | |
818 | serge | 359 | |
815 | serge | 360 | { |
361 | clip_t src_clip, dst_clip; |
||
876 | serge | 362 | |
815 | serge | 363 | |
876 | serge | 364 | local_pixmap_t *dstpixmap; |
365 | |||
815 | serge | 366 | |
817 | serge | 367 | |
815 | serge | 368 | |
369 | srcpixmap = (blit->srcpix == (void*)-1) ? &scr_pixmap : blit->srcpix ; |
||
370 | |||
371 | |||
817 | serge | 372 | |
815 | serge | 373 | |
817 | serge | 374 | //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); |
375 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
||
376 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
||
377 | |||
815 | serge | 378 | |
876 | serge | 379 | src_clip.ymin = 0; |
380 | src_clip.xmax = srcpixmap->width-1; |
||
381 | src_clip.ymax = srcpixmap->height-1; |
||
382 | |||
815 | serge | 383 | |
876 | serge | 384 | dst_clip.ymin = 0; |
385 | dst_clip.xmax = dstpixmap->width-1; |
||
386 | dst_clip.ymax = dstpixmap->height-1; |
||
387 | |||
388 | |||
389 | &src_clip, &blit->src_x, &blit->src_y, |
||
390 | &blit->w, &blit->h) ) |
||
391 | { |
||
392 | u32_t *ring, write; |
||
393 | |||
394 | |||
395 | |||
396 | |||
868 | serge | 397 | |
815 | serge | 398 | |
876 | serge | 399 | |
868 | serge | 400 | |
876 | serge | 401 | RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
402 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
403 | RADEON_GMC_BRUSH_NONE | |
||
404 | RADEON_GMC_DST_32BPP | |
||
405 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
406 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
407 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
408 | R5XX_GMC_WR_MSK_DIS | |
||
409 | R5XX_ROP3_S |
||
410 | ); |
||
411 | |||
868 | serge | 412 | |
876 | serge | 413 | |
868 | serge | 414 | |
876 | serge | 415 | OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset); |
416 | |||
868 | serge | 417 | |
876 | serge | 418 | OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x); |
419 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
||
420 | |||
868 | serge | 421 | |
422 | |||
423 | |||
876 | serge | 424 | OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); |
425 | |||
815 | serge | 426 | |
876 | serge | 427 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
428 | RADEON_GMC_BRUSH_NONE | |
||
429 | RADEON_GMC_DST_32BPP | |
||
430 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
431 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
432 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
||
433 | R5XX_GMC_WR_MSK_DIS | |
||
434 | R5XX_ROP3_S |
||
435 | ); |
||
436 | |||
815 | serge | 437 | |
876 | serge | 438 | OUT_RING(dstpixmap->pitch_offset); |
439 | |||
815 | serge | 440 | |
876 | serge | 441 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
442 | OUT_RING((blit->w<<16)|blit->h); |
||
443 | COMMIT_RING(); |
||
444 | |||
815 | serge | 445 | |
868 | serge | 446 | safe_sti(ifl); |
876 | serge | 447 | }; |
448 | return ERR_OK; |
||
449 | }; |
||
450 | |||
868 | serge | 451 | |
829 | serge | 452 | |
453 | { |
||
454 | clip_t src_clip, dst_clip; |
||
876 | serge | 455 | |
829 | serge | 456 | |
876 | serge | 457 | local_pixmap_t *dstpixmap; |
458 | |||
829 | serge | 459 | |
868 | serge | 460 | |
829 | serge | 461 | |
462 | srcpixmap = (blit->srcpix == (void*)-1) ? &scr_pixmap : blit->srcpix ; |
||
463 | |||
464 | |||
465 | |||
466 | |||
467 | //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); |
||
468 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
||
469 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
||
470 | src_clip.xmin = 0; |
||
876 | serge | 471 | src_clip.ymin = 0; |
472 | src_clip.xmax = srcpixmap->width-1; |
||
473 | src_clip.ymax = srcpixmap->height-1; |
||
474 | |||
829 | serge | 475 | |
876 | serge | 476 | dst_clip.ymin = 0; |
477 | dst_clip.xmax = dstpixmap->width-1; |
||
478 | dst_clip.ymax = dstpixmap->height-1; |
||
479 | |||
829 | serge | 480 | |
876 | serge | 481 | &src_clip, &blit->src_x, &blit->src_y, |
482 | &blit->w, &blit->h) ) |
||
483 | { |
||
484 | u32_t *ring, write; |
||
485 | |||
486 | |||
487 | |||
488 | |||
868 | serge | 489 | |
490 | |||
876 | serge | 491 | |
868 | serge | 492 | |
876 | serge | 493 | RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
494 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
||
495 | RADEON_GMC_BRUSH_NONE | |
||
496 | RADEON_GMC_DST_32BPP | |
||
497 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
498 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
499 | R5XX_GMC_WR_MSK_DIS | |
||
500 | R5XX_ROP3_S |
||
501 | ); |
||
502 | |||
868 | serge | 503 | |
876 | serge | 504 | |
868 | serge | 505 | |
876 | serge | 506 | OUTREG(R5XX_CLR_CMP_MASK, R5XX_CLR_CMP_MSK); |
507 | OUTREG(R5XX_CLR_CMP_CNTL, R5XX_SRC_CMP_EQ_COLOR | R5XX_CLR_CMP_SRC_SOURCE); |
||
508 | |||
868 | serge | 509 | |
876 | serge | 510 | OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset); |
511 | |||
868 | serge | 512 | |
876 | serge | 513 | OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x); |
514 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
||
515 | |||
868 | serge | 516 | |
517 | |||
518 | |||
876 | serge | 519 | OUT_RING(CP_PACKET3(RADEON_CNTL_TRANBLT, 8)); |
520 | |||
829 | serge | 521 | |
876 | serge | 522 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
523 | RADEON_GMC_BRUSH_NONE | |
||
524 | RADEON_GMC_DST_32BPP | |
||
525 | RADEON_GMC_SRC_DATATYPE_COLOR | |
||
526 | RADEON_DP_SRC_SOURCE_MEMORY | |
||
527 | R5XX_GMC_WR_MSK_DIS | |
||
528 | R5XX_ROP3_S |
||
529 | ); |
||
530 | |||
829 | serge | 531 | |
876 | serge | 532 | OUT_RING(dstpixmap->pitch_offset); |
533 | |||
829 | serge | 534 | |
876 | serge | 535 | OUT_RING(0xFF000000); |
536 | OUT_RING(0xFF000000); |
||
537 | |||
829 | serge | 538 | |
876 | serge | 539 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
540 | OUT_RING((blit->w<<16)|blit->h); |
||
541 | |||
868 | serge | 542 | |
876 | serge | 543 | |
829 | serge | 544 | |
868 | serge | 545 | |
546 | |||
876 | serge | 547 | }; |
548 | return ERR_OK; |
||
549 | }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 | 550 | ><16)|h); |
551 |