Subversion Repositories Kolibri OS

Rev

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
#endif
933
 
934
>