Subversion Repositories Kolibri OS

Rev

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
#endif
836
 
837
>