Subversion Repositories Kolibri OS

Rev

Rev 868 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 868 Rev 876
Line 1... Line -...
1
#define BRUSH_MONO   (0<<4)
-
 
2
 
-
 
Line 3... Line 1...
3
 
1
int DrawRect(draw_t* draw)
4
int DrawRect(draw_t* draw)
2
{
5
{
3
     int x0, y0, x1, y1;
Line 6... Line 4...
6
  int x0, y0, x1, y1;
4
 
-
 
5
     local_pixmap_t *dstpixmap;
Line 7... Line 6...
7
 
6
     clip_t dst_clip;
-
 
7
 
-
 
8
     dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ;
-
 
9
 
-
 
10
     x0 = draw->x0;
-
 
11
     y0 = draw->y0;
-
 
12
 
Line 8... Line 13...
8
  pixmap_t *dstpixmap;
13
     x1 = x0+draw->w-1;
9
 
14
     y1 = y0+draw->h-1;
-
 
15
 
-
 
16
     dst_clip.xmin = 0;
Line 10... Line -...
10
  dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ;
-
 
11
 
-
 
Line 12... Line 17...
12
  x0 = draw->x;
17
     dst_clip.ymin = 0;
13
  y0 = draw->y;
18
     dst_clip.xmax = dstpixmap->width-1;
Line 14... Line 19...
14
 
19
     dst_clip.ymax = dstpixmap->height-1;
15
  x1 = x0+draw->w-1;
20
 
16
  y1 = y0+draw->h-1;
21
 
17
 
22
//  dbgprintf("draw rect x0:%d, y0:%d, x1:%d, y1:%d, color: %x\n",
18
//  dbgprintf("draw rect x0:%d, y0:%d, x1:%d, y1:%d, color: %x\n",
23
//             x0, y0, x1, y1, draw->color);
Line 19... Line 24...
19
//             x0, y0, x1, y1, draw->color);
24
 
20
 
25
     if( ! BlockClip( &dst_clip, &x0, &y0, &x1, &y1))
21
  if( ! BlockClip( &x0, &y0, &x1, &y1))
-
 
22
  {
-
 
Line -... Line 26...
-
 
26
     {
Line 23... Line 27...
23
     u32 *ring, write;
27
        u32_t *ring, write;
Line 24... Line 28...
24
     int w, h;
28
        u32_t ifl;
25
     u32 ifl;
-
 
26
 
-
 
27
     w = x1-x0+1;
-
 
28
     h = y1-y0+1;
-
 
29
 
-
 
30
     ifl = safe_cli();
-
 
31
 
-
 
32
 
-
 
33
#if R300_PIO
-
 
34
 
-
 
35
     R5xxFIFOWait(7);
-
 
Line -... Line 29...
-
 
29
        int w, h;
-
 
30
 
-
 
31
        w = x1-x0+1;
-
 
32
        h = y1-y0+1;
-
 
33
 
-
 
34
        ifl = safe_cli();
-
 
35
 
-
 
36
#if R300_PIO
-
 
37
 
-
 
38
        R5xxFIFOWait(6);
-
 
39
 
-
 
40
        OUTREG(R5XX_DP_GUI_MASTER_CNTL,
-
 
41
               rhd.gui_control              |
-
 
42
               R5XX_ROP3_P                  |
36
 
43
               R5XX_GMC_BRUSH_SOLID_COLOR   |
-
 
44
               R5XX_GMC_SRC_DATATYPE_COLOR  |
-
 
45
               R5XX_GMC_CLR_CMP_CNTL_DIS    |
Line 37... Line -...
37
     OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control | R5XX_ROP3_P |
-
 
38
                                     R5XX_GMC_BRUSH_SOLID_COLOR |
-
 
39
                                     R5XX_GMC_SRC_DATATYPE_COLOR);
-
 
40
 
46
               R5XX_GMC_WR_MSK_DIS
41
     OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color);
47
              );
42
     OUTREG(R5XX_DP_WRITE_MASK, 0xFFFFFFFF);
48
 
43
     OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
49
        OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color);
-
 
50
        OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
-
 
51
        OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
44
     OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
52
        OUTREG(R5XX_DST_Y_X,(draw->y0<<16)|draw->x0);
-
 
53
        OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|h);
45
     OUTREG(R5XX_DST_Y_X,(y0<<16)|x0);
54
#else
46
     OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|h);
55
      BEGIN_RING();
47
 
56
        OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4));
48
#else
57
 
49
 
58
        OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
50
     BEGIN_RING();
59
                 RADEON_GMC_BRUSH_SOLID_COLOR      |
51
       OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4));
-
 
52
 
60
                 RADEON_GMC_DST_32BPP              |
53
       OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
-
 
54
                RADEON_GMC_BRUSH_SOLID_COLOR      |
61
                 RADEON_GMC_SRC_DATATYPE_COLOR     |
55
                RADEON_GMC_DST_32BPP              |
62
                 R5XX_GMC_CLR_CMP_CNTL_DIS         |
56
                RADEON_GMC_SRC_DATATYPE_COLOR     |
63
                 R5XX_GMC_WR_MSK_DIS               |
57
                (1 << 28)+(1 << 30) | R5XX_ROP3_P);
64
                 R5XX_ROP3_P
Line 58... Line 65...
58
 
65
                );
59
       OUT_RING(dstpixmap->pitch_offset);
66
 
60
       OUT_RING(draw->color);
67
        OUT_RING(dstpixmap->pitch_offset);
-
 
68
        OUT_RING(draw->color);
61
       OUT_RING((x0<<16)|y0);
69
        OUT_RING((draw->x0<<16)|y0);
62
       OUT_RING((w<<16)|h);
70
        OUT_RING((w<<16)|h);
63
     COMMIT_RING();
71
      COMMIT_RING();
64
 
72
#endif
65
#endif
73
        safe_sti(ifl);
66
 
74
     };
67
     safe_sti(ifl);
75
     return ERR_OK;
68
  } ;
76
}
69
  return ERR_OK;
77
 
-
 
78
int FillRect(fill_t *fill)
-
 
79
{
-
 
80
     local_pixmap_t *dstpixmap;
-
 
81
     clip_t dst_clip;
-
 
82
     int x0, y0, x1, y1;
Line 70... Line 83...
70
}
83
 
71
 
84
     dstpixmap = (fill->dstpix == (void*)-1) ? &scr_pixmap : fill->dstpix ;
Line 72... Line 85...
72
int FillRect(fill_t *fill)
85
 
73
{
86
     x0 = fill->x;
74
  pixmap_t *dstpixmap;
87
     y0 = fill->y;
75
  int x0, y0, x1, y1;
-
 
76
 
-
 
77
  dstpixmap = (fill->dstpix == (void*)-1) ? &scr_pixmap : fill->dstpix ;
88
 
Line 78... Line 89...
78
 
89
     x1 = x0+fill->w-1;
Line -... Line 90...
-
 
90
     y1 = y0+fill->h-1;
79
  x0 = fill->x;
91
 
Line 80... Line 92...
80
  y0 = fill->y;
92
     dst_clip.xmin = 0;
81
 
-
 
82
  x1 = x0+fill->w-1;
-
 
83
  y1 = y0+fill->h-1;
-
 
84
 
-
 
85
//  dbgprintf("fill rect x0:%d, y0:%d, x1:%d, y1:%d\n",
-
 
86
//             x0, y0, x1, y1);
-
 
87
 
-
 
88
  if( ! BlockClip( &x0, &y0, &x1, &y1))
-
 
89
  {
-
 
90
     u32 *ring, write;
-
 
Line 91... Line 93...
91
     u32 ifl;
93
     dst_clip.ymin = 0;
-
 
94
     dst_clip.xmax = dstpixmap->width-1;
-
 
95
     dst_clip.ymax = dstpixmap->height-1;
-
 
96
 
-
 
97
//  dbgprintf("fill rect x0:%d, y0:%d, x1:%d, y1:%d\n",
-
 
98
//             x0, y0, x1, y1);
-
 
99
 
92
 
100
     if( ! BlockClip(&dst_clip, &x0, &y0, &x1, &y1))
-
 
101
     {
Line 93... Line 102...
93
     ifl = safe_cli();
102
        u32_t *ring, write;
94
 
103
        u32_t ifl = safe_cli();
95
#if R300_PIO
-
 
Line 96... Line -...
96
 
-
 
-
 
104
 
-
 
105
#if R300_PIO
Line -... Line 106...
-
 
106
 
-
 
107
        int w = x1-x0+1;
-
 
108
        int h = y1-y0+1;
-
 
109
 
-
 
110
        R5xxFIFOWait(9);
-
 
111
 
-
 
112
        OUTREG(R5XX_DP_GUI_MASTER_CNTL,
-
 
113
               RADEON_GMC_DST_PITCH_OFFSET_CNTL |
-
 
114
               R5XX_GMC_BRUSH_8X8_MONO_FG_BG    |
-
 
115
               RADEON_GMC_DST_32BPP             |
-
 
116
               R5XX_GMC_SRC_DATATYPE_COLOR      |
-
 
117
               R5XX_GMC_CLR_CMP_CNTL_DIS        |
-
 
118
               R5XX_GMC_WR_MSK_DIS              |
-
 
119
               R5XX_ROP3_P
-
 
120
               );
-
 
121
 
-
 
122
        OUTREG(R5XX_DP_BRUSH_BKGD_CLR, fill->bkcolor);
-
 
123
        OUTREG(R5XX_DP_BRUSH_FRGD_CLR, fill->fcolor);
-
 
124
 
-
 
125
        OUTREG(R5XX_BRUSH_DATA0, fill->bmp0);
-
 
126
        OUTREG(R5XX_BRUSH_DATA1, fill->bmp1);
-
 
127
 
-
 
128
        OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
-
 
129
        OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
-
 
130
 
-
 
131
        OUTREG(R5XX_DST_Y_X,(y0<<16)|x0);
-
 
132
        OUTREG(R5XX_DST_HEIGHT_WIDTH,(h<<16)|w);
-
 
133
#else
-
 
134
      BEGIN_RING();
97
#else
135
        OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT, 7));
98
 
136
        OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL    |
99
     BEGIN_RING();
137
                 R5XX_GMC_BRUSH_8X8_MONO_FG_BG       |
100
       OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT, 7));
138
                 RADEON_GMC_DST_32BPP                |
Line -... Line 139...
-
 
139
                 RADEON_GMC_SRC_DATATYPE_COLOR       |
101
       OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL    |
140
                 R5XX_GMC_CLR_CMP_CNTL_DIS           |
102
                BRUSH_MONO                          |
141
                 R5XX_GMC_WR_MSK_DIS                 |
103
                RADEON_GMC_DST_32BPP                |
142
                 R5XX_ROP3_P
Line 104... Line 143...
104
                RADEON_GMC_SRC_DATATYPE_COLOR       |
143
                );
Line 132... Line 171...
132
  x1 = x0+blit->w-1;
171
  y1 = y0+blit->h-1;
133
  y1 = y0+blit->h-1;
172
 
Line 134... Line 173...
134
 
173
 
135
 
174
  if( ! BlockClip(&clip, &x0, &y0, &x1, &y1))
136
  if( ! BlockClip( &x0, &y0, &x1, &y1))
175
  {
137
  {
176
     u32 *ring, write;
138
     u32 *ring, write;
177
     int w, h;
Line 174... Line 213...
174
  } ;
213
  return ERR_OK;
175
  return ERR_OK;
214
}
176
}
215
 
177
 
216
int Line2P(draw_t *draw)
Line 178... Line 217...
178
int Line2P(line2p_t *draw)
217
{
179
{
218
  local_pixmap_t *dstpixmap;
180
 
-
 
-
 
219
  int x0, y0, x1, y1;
181
  int x0, y0, x1, y1;
220
 
Line -... Line 221...
-
 
221
  dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ;
-
 
222
 
182
 
223
  x0 = draw->x0;
183
  x0 = draw->x0;
224
  y0 = draw->y0;
Line 184... Line 225...
184
  y0 = draw->y0;
225
 
185
 
226
  x1 = draw->x1;
Line 186... Line 227...
186
  x1 = draw->x1;
227
  y1 = draw->y1;
187
  y1 = draw->y1;
228
 
188
 
229
  if ( !LineClip(&clip, &x0, &y0, &x1, &y1 ))
189
  if ( !LineClip( &x0, &y0, &x1, &y1 ))
230
  {
Line 190... Line 231...
190
  {
231
    u32 efl;
Line 191... Line 232...
191
    u32 ifl;
232
    u32 *ring, write;
Line 192... Line 233...
192
    u32 *ring, write;
233
 
Line 232... Line 273...
232
         OUT_RING((y1<<16)|x1);
273
     COMMIT_RING();
233
     COMMIT_RING();
274
 
234
 
275
#endif
Line 235... Line 276...
235
#endif
276
     safe_sti(efl);
236
     safe_sti(ifl);
277
 
Line 237... Line 278...
237
 
278
  };
238
  };
279
  return ERR_OK;
239
  return ERR_OK;
280
}
-
 
281
#endif
Line 240... Line -...
240
}
-
 
241
 
282
 
242
 
283
int CreatePixmap(pixmap_t *io)
-
 
284
{
Line -... Line 285...
-
 
285
     local_pixmap_t *pixmap;
243
int CreatePixmap(userpixmap_t *io)
286
 
Line 244... Line -...
244
{
-
 
245
 
287
     unsigned pitch;
Line 246... Line 288...
246
  pixmap_t *pixmap;
288
     size_t size;
247
 
289
 
248
  u32_t pitch;
290
     void *local;
249
  void *raw;
291
 
-
 
292
     if( (io->width == 0) || (io->width > 2048)||
-
 
293
         (io->height == 0)|| (io->height > 2048))
-
 
294
     {
-
 
295
        dbgprintf("Invalid pixmap size w:%d h:%d\n", io->width,io->height);
-
 
296
        return ERR_PARAM;
-
 
297
     };
-
 
298
 
-
 
299
     pitch = ((io->width+15)&~15)*4;
-
 
300
     size = pitch*io->height;
-
 
301
 
-
 
302
     dbgprintf("pitch = %d\n", pitch);
-
 
303
 
-
 
304
     local = rhd_mem_alloc(&rhd,RHD_MEM_FB,size) ;
-
 
305
     if ( !local)
-
 
306
     {
-
 
307
        dbgprintf("Not enough memory for pixmap\n");
-
 
308
        return ERR_PARAM;
-
 
309
     };
-
 
310
 
-
 
311
     pixmap = malloc(sizeof(local_pixmap_t));
-
 
312
     if(!pixmap)
-
 
313
     {
-
 
314
        rhd_mem_free(&rhd, RHD_MEM_FB,local);
-
 
315
        return ERR_PARAM;
-
 
316
     }
-
 
317
     else
-
 
318
     {
-
 
319
        void *mapped;
-
 
320
 
-
 
321
        size = (size+4095) & ~ 4095;
-
 
322
 
-
 
323
        if (mapped = UserAlloc(size))
-
 
324
        {
-
 
325
           CommitPages(mapped, ((u32_t)local+rhd.PhisBase)|7|(1<<9), size);
-
 
326
 
-
 
327
           io->mapped = mapped;
-
 
328
           io->pitch   = pitch;
-
 
329
           io->handle  = (u32_t)pixmap;
-
 
330
 
-
 
331
           pixmap->width   = io->width;
-
 
332
           pixmap->height  = io->height;
-
 
333
           pixmap->format  = PICT_a8r8g8b8;
-
 
334
           pixmap->flags   = io->flags;
-
 
335
           pixmap->pitch   = pitch;
-
 
336
           pixmap->mapped  = mapped;
-
 
337
           pixmap->pitch_offset =  ((pitch/64)<<22)| (((u32_t)local+rhd.FbIntAddress)>>10);
-
 
338
           pixmap->local   = local;
-
 
339
 
-
 
340
           dbgprintf("pixmap.pitch_offset: %x\n", pixmap->pitch_offset);
-
 
341
           dbgprintf("width: %d height: %d\n",pixmap->width,pixmap->height );
-
 
342
           dbgprintf("map at %x\n", pixmap->mapped);
-
 
343
 
-
 
344
           return ERR_OK;
250
 
345
        };
-
 
346
        rhd_mem_free(&rhd, RHD_MEM_FB,local);
Line 251... Line -...
251
  if( (io->width == 0) || (io->width > 2048)||
-
 
252
      (io->height == 0)|| (io->height > 2048))
-
 
253
  {
-
 
254
     dbgprintf("Invalid pixmap size w:%d h:%d\n", io->width,io->height);
-
 
255
     return ERR_PARAM;
-
 
256
 
-
 
257
  };
-
 
258
 
-
 
259
  pitch = ((io->width+15)&~15)*4;
-
 
260
  dbgprintf("pitch = %d\n", pitch);
-
 
261
 
-
 
Line 262... Line 347...
262
  raw = rhd_mem_alloc(&rhd,RHD_MEM_FB,pitch*io->height) ;
347
        free(pixmap);
263
  if (! raw)
-
 
264
  {
348
     };
265
    dbgprintf("Not enough memory for pixmap\n");
-
 
266
    return ERR_PARAM;
-
 
267
  };
-
 
268
 
-
 
269
  pixmap = malloc(sizeof(pixmap_t));
-
 
270
  if(!pixmap)
349
     return ERR_PARAM;
271
  {
-
 
272
    rhd_mem_free(&rhd, RHD_MEM_FB,raw);
-
 
273
    return ERR_PARAM;
350
};
274
  }
-
 
275
  else
-
 
276
  {
-
 
277
    io->pixmap  = pixmap;
-
 
278
    io->usermap = NULL;
-
 
279
    io->format  = PICT_a8r8g8b8;
-
 
280
    io->pitch   = 0;
-
 
281
 
-
 
282
    pixmap->width   = io->width;
-
 
283
    pixmap->height  = io->height;
-
 
284
    pixmap->format  = PICT_a8r8g8b8;
-
 
285
    pixmap->flags   = 0;
-
 
286
    pixmap->pitch   = pitch;
-
 
287
    pixmap->offset  = (u32_t)raw+rhd.FbIntAddress;
-
 
Line 288... Line -...
288
    pixmap->pitch_offset =  ((pitch/64)<<22)| (pixmap->offset>>10);
-
 
289
    pixmap->raw     = raw;
351
 
290
    pixmap->usermap = NULL;
-
 
Line 291... Line 352...
291
 
352
 
-
 
353
int DestroyPixmap( pixmap_t *io )
292
    dbgprintf("pixmap.pitch_offset: %x\n", pixmap->pitch_offset);
354
{
293
    dbgprintf("width: %d height: %d\n",pixmap->width,pixmap->height );
355
     local_pixmap_t *pixmap;
Line 294... Line 356...
294
    dbgprintf("pixmap.offset: %x\n", pixmap->offset);
356
     size_t size;
Line 295... Line 357...
295
 
357
 
296
  }
-
 
297
  return ERR_OK;
-
 
298
}
358
     dbgprintf("Destroy pixmap %x\n", io->handle);
Line 299... Line 359...
299
 
359
 
300
int DestroyPixmap( userpixmap_t *io)
360
     if(io->handle == -1)
Line 301... Line -...
301
{
-
 
302
   pixmap_t *pixmap;
-
 
303
 
-
 
304
   dbgprintf("Destroy pixmap %x\n", io->pixmap);
-
 
305
 
361
        return ERR_PARAM;
306
   if(io->pixmap == (pixmap_t*)-1)
362
     else
307
     return ERR_PARAM;
363
        pixmap = (local_pixmap_t*)io->handle;
308
   else
364
 
Line 309... Line 365...
309
     pixmap = io->pixmap;
365
     size = (pixmap->pitch*pixmap->height+4095) & ~ 4095;
310
 
366
 
Line -... Line 367...
-
 
367
     UnmapPages(pixmap->mapped, size);
-
 
368
     UserFree(pixmap->mapped);
311
   if( (pixmap->flags & 1) == PX_LOCK )
369
 
312
     UnlockPixmap(io);
370
     rhd_mem_free(&rhd,RHD_MEM_FB,pixmap->local);
313
 
371
     free(pixmap);
314
   UserFree(pixmap->usermap);
372
 
315
   rhd_mem_free(&rhd,RHD_MEM_FB,pixmap->raw);
373
     io->format  = 0;
Line 389... Line 447...
389
 
447
  return ERR_OK;
Line 390... Line 448...
390
  return ERR_OK;
448
};
391
};
449
 
Line -... Line 450...
-
 
450
#endif
Line 392... Line 451...
392
 
451
 
393
 
452
int PixBlit(pixblit_t *blit)
-
 
453
{
Line 394... Line -...
394
int PixBlit(pixblit_t *blit)
-
 
395
{
-
 
396
 
-
 
397
     u32 *ring, write;
-
 
398
     int w, h;
-
 
399
     u32 ifl;
454
     clip_t src_clip, dst_clip;
400
     int x0, y0;
455
 
Line 401... Line 456...
401
 
456
     local_pixmap_t *srcpixmap;
Line 402... Line 457...
402
     pixmap_t *srcpixmap;
457
     local_pixmap_t *dstpixmap;
403
     pixmap_t *dstpixmap;
458
 
Line 413... Line 468...
413
     //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height);
468
     //dbgprintf("srcpitch: %x dstpitch: %x\n",
414
     //dbgprintf("srcpitch: %x dstpitch: %x\n",
469
     //           srcpixmap->pitch_offset,dstpixmap->pitch_offset);
415
     //           srcpixmap->pitch_offset,dstpixmap->pitch_offset);
470
 
416
 
471
     src_clip.xmin = 0;
Line -... Line 472...
-
 
472
     src_clip.ymin = 0;
-
 
473
     src_clip.xmax = srcpixmap->width-1;
-
 
474
     src_clip.ymax = srcpixmap->height-1;
-
 
475
 
-
 
476
     dst_clip.xmin = 0;
-
 
477
     dst_clip.ymin = 0;
-
 
478
     dst_clip.xmax = dstpixmap->width-1;
-
 
479
     dst_clip.ymax = dstpixmap->height-1;
-
 
480
 
-
 
481
     if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y,
-
 
482
                    &src_clip, &blit->src_x, &blit->src_y,
-
 
483
                    &blit->w, &blit->h) )
-
 
484
     {
-
 
485
        u32_t *ring, write;
-
 
486
 
-
 
487
        u32_t ifl = safe_cli();
417
     ifl = safe_cli();
488
 
Line 418... Line 489...
418
 
489
#if R300_PIO
Line 419... Line 490...
419
#if R300_PIO
490
 
Line 420... Line 491...
420
 
491
        R5xxFIFOWait(7);
421
     R5xxFIFOWait(7);
492
 
422
 
493
        OUTREG(R5XX_DP_GUI_MASTER_CNTL,
423
     OUTREG(R5XX_DP_GUI_MASTER_CNTL,
494
               RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
424
            RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
495
               RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
425
            RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
496
               RADEON_GMC_BRUSH_NONE             |
426
            RADEON_GMC_BRUSH_NONE             |
497
               RADEON_GMC_DST_32BPP              |
427
            RADEON_GMC_DST_32BPP              |
498
               RADEON_GMC_SRC_DATATYPE_COLOR     |
428
            RADEON_GMC_SRC_DATATYPE_COLOR     |
499
               RADEON_DP_SRC_SOURCE_MEMORY       |
429
            RADEON_DP_SRC_SOURCE_MEMORY       |
500
               R5XX_GMC_CLR_CMP_CNTL_DIS         |
430
            R5XX_GMC_CLR_CMP_CNTL_DIS         |
501
               R5XX_GMC_WR_MSK_DIS               |
431
            R5XX_GMC_WR_MSK_DIS               |
502
               R5XX_ROP3_S
432
            R5XX_ROP3_S
503
              );
433
           );
504
 
434
 
505
        OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
435
     OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
506
 
436
 
507
        OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
437
     OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
508
        OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset);
438
     OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset);
509
 
439
 
510
        OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x);
Line 440... Line 511...
440
     OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x);
511
        OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x);
Line 441... Line 512...
441
     OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x);
512
        OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w);
442
     OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w);
513
 
443
 
-
 
444
#else
-
 
445
 
-
 
446
     BEGIN_RING();
-
 
447
       OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5));
-
 
448
 
-
 
449
       OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
-
 
450
                RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
-
 
451
                RADEON_GMC_BRUSH_NONE             |
-
 
452
                RADEON_GMC_DST_32BPP              |
-
 
453
                RADEON_GMC_SRC_DATATYPE_COLOR     |
-
 
454
                RADEON_DP_SRC_SOURCE_MEMORY       |
-
 
455
                R5XX_GMC_CLR_CMP_CNTL_DIS         |
-
 
456
                R5XX_GMC_WR_MSK_DIS               |
-
 
Line -... Line 514...
-
 
514
#else
-
 
515
 
-
 
516
        BEGIN_RING();
-
 
517
          OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5));
-
 
518
 
-
 
519
          OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
-
 
520
                   RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
-
 
521
                   RADEON_GMC_BRUSH_NONE             |
-
 
522
                   RADEON_GMC_DST_32BPP              |
-
 
523
                   RADEON_GMC_SRC_DATATYPE_COLOR     |
-
 
524
                   RADEON_DP_SRC_SOURCE_MEMORY       |
-
 
525
                   R5XX_GMC_CLR_CMP_CNTL_DIS         |
-
 
526
                   R5XX_GMC_WR_MSK_DIS               |
-
 
527
                   R5XX_ROP3_S
457
                R5XX_ROP3_S
528
                  );
458
               );
529
 
459
 
530
          OUT_RING(srcpixmap->pitch_offset);
460
       OUT_RING(srcpixmap->pitch_offset);
531
          OUT_RING(dstpixmap->pitch_offset);
Line 461... Line 532...
461
       OUT_RING(dstpixmap->pitch_offset);
532
 
462
 
-
 
463
       OUT_RING((blit->src_x<<16)|blit->src_y);
533
          OUT_RING((blit->src_x<<16)|blit->src_y);
-
 
534
          OUT_RING((blit->dst_x<<16)|blit->dst_y);
464
       OUT_RING((blit->dst_x<<16)|blit->dst_y);
535
          OUT_RING((blit->w<<16)|blit->h);
465
       OUT_RING((blit->w<<16)|blit->h);
536
        COMMIT_RING();
Line 466... Line 537...
466
     COMMIT_RING();
537
 
467
 
538
#endif
-
 
539
       safe_sti(ifl);
Line 468... Line -...
468
#endif
-
 
469
 
-
 
470
     safe_sti(ifl);
-
 
471
  return ERR_OK;
-
 
472
}
-
 
473
 
540
     };
474
 
541
     return ERR_OK;
Line 475... Line 542...
475
int TransBlit(pixblit_t *blit)
542
};
Line 476... Line 543...
476
{
543
 
477
 
544
 
Line 493... Line 560...
493
     //dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height);
560
     //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height);
494
     //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height);
561
     //dbgprintf("srcpitch: %x dstpitch: %x\n",
495
     //dbgprintf("srcpitch: %x dstpitch: %x\n",
562
     //           srcpixmap->pitch_offset,dstpixmap->pitch_offset);
496
     //           srcpixmap->pitch_offset,dstpixmap->pitch_offset);
563
     src_clip.xmin = 0;
-
 
564
     src_clip.ymin = 0;
-
 
565
     src_clip.xmax = srcpixmap->width-1;
-
 
566
     src_clip.ymax = srcpixmap->height-1;
-
 
567
 
-
 
568
     dst_clip.xmin = 0;
-
 
569
     dst_clip.ymin = 0;
-
 
570
     dst_clip.xmax = dstpixmap->width-1;
-
 
571
     dst_clip.ymax = dstpixmap->height-1;
-
 
572
 
-
 
573
     if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y,
-
 
574
                    &src_clip, &blit->src_x, &blit->src_y,
-
 
575
                    &blit->w, &blit->h) )
-
 
576
     {
-
 
577
        u32_t *ring, write;
-
 
578
 
Line 497... Line 579...
497
 
579
        u32_t ifl = safe_cli();
Line 498... Line 580...
498
     ifl = safe_cli();
580
 
Line 499... Line 581...
499
 
581
#if R300_PIO
Line 500... Line 582...
500
#if R300_PIO
582
 
501
 
583
        R5xxFIFOWait(10);
502
     R5xxFIFOWait(10);
584
 
503
 
585
        OUTREG(R5XX_DP_GUI_MASTER_CNTL,
504
     OUTREG(R5XX_DP_GUI_MASTER_CNTL,
586
               RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
505
            RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
587
               RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
506
            RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
588
               RADEON_GMC_BRUSH_NONE             |
507
            RADEON_GMC_BRUSH_NONE             |
589
               RADEON_GMC_DST_32BPP              |
508
            RADEON_GMC_DST_32BPP              |
590
               RADEON_GMC_SRC_DATATYPE_COLOR     |
509
            RADEON_GMC_SRC_DATATYPE_COLOR     |
591
               RADEON_DP_SRC_SOURCE_MEMORY       |
510
            RADEON_DP_SRC_SOURCE_MEMORY       |
592
               R5XX_GMC_WR_MSK_DIS               |
511
            R5XX_GMC_WR_MSK_DIS               |
593
               R5XX_ROP3_S
512
            R5XX_ROP3_S
594
              );
513
           );
595
 
514
 
596
        OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
515
     OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
597
 
516
 
598
        OUTREG(R5XX_CLR_CMP_CLR_SRC, 0xFF000000);
517
     OUTREG(R5XX_CLR_CMP_CLR_SRC, 0xFF000000);
599
        OUTREG(R5XX_CLR_CMP_MASK, R5XX_CLR_CMP_MSK);
518
     OUTREG(R5XX_CLR_CMP_MASK, R5XX_CLR_CMP_MSK);
600
        OUTREG(R5XX_CLR_CMP_CNTL, R5XX_SRC_CMP_EQ_COLOR | R5XX_CLR_CMP_SRC_SOURCE);
519
     OUTREG(R5XX_CLR_CMP_CNTL, R5XX_SRC_CMP_EQ_COLOR | R5XX_CLR_CMP_SRC_SOURCE);
601
 
520
 
602
        OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
521
     OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
603
        OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset);
522
     OUTREG(R5XX_SRC_PITCH_OFFSET, srcpixmap->pitch_offset);
604
 
Line 523... Line 605...
523
 
605
        OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x);
Line 524... Line 606...
524
     OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x);
606
        OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x);
525
     OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x);
607
        OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w);
Line 526... Line 608...
526
     OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w);
608
 
527
 
609
#else
528
#else
610
 
529
 
611
        BEGIN_RING();
530
     BEGIN_RING();
612
          OUT_RING(CP_PACKET3(RADEON_CNTL_TRANBLT, 8));
531
       OUT_RING(CP_PACKET3(RADEON_CNTL_TRANBLT, 8));
613
 
532
 
614
          OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
533
       OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
615
                   RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
534
                RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
616
                   RADEON_GMC_BRUSH_NONE             |
-
 
617
                   RADEON_GMC_DST_32BPP              |
-
 
618
                   RADEON_GMC_SRC_DATATYPE_COLOR     |
-
 
619
                   RADEON_DP_SRC_SOURCE_MEMORY       |
-
 
620
                   R5XX_GMC_WR_MSK_DIS               |
-
 
621
                   R5XX_ROP3_S
-
 
622
                  );
-
 
623
 
-
 
624
          OUT_RING(srcpixmap->pitch_offset);
-
 
625
          OUT_RING(dstpixmap->pitch_offset);
-
 
626
 
-
 
627
          OUT_RING(R5XX_CLR_CMP_SRC_SOURCE | R5XX_SRC_CMP_EQ_COLOR);
Line 535... Line -...
535
                RADEON_GMC_BRUSH_NONE             |
-
 
536
                RADEON_GMC_DST_32BPP              |
-
 
537
                RADEON_GMC_SRC_DATATYPE_COLOR     |
-
 
538
                RADEON_DP_SRC_SOURCE_MEMORY       |
-
 
539
                R5XX_GMC_WR_MSK_DIS               |
-
 
540
                R5XX_ROP3_S
-
 
541
               );
-
 
542
 
-
 
543
       OUT_RING(srcpixmap->pitch_offset);
-
 
544
       OUT_RING(dstpixmap->pitch_offset);
-
 
545
 
-
 
546
       OUT_RING(R5XX_CLR_CMP_SRC_SOURCE | R5XX_SRC_CMP_EQ_COLOR);
628
          OUT_RING(0xFF000000);
Line 547... Line 629...
547
       OUT_RING(0xFF000000);
629
          OUT_RING(0xFF000000);
Line 548... Line 630...
548
       OUT_RING(0xFF000000);
630
 
-
 
631
          OUT_RING((blit->src_x<<16)|blit->src_y);
549
 
632
          OUT_RING((blit->dst_x<<16)|blit->dst_y);
550
       OUT_RING((blit->src_x<<16)|blit->src_y);
633
          OUT_RING((blit->w<<16)|blit->h);