Subversion Repositories Kolibri OS

Rev

Rev 808 | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. #define BRUSH_MONO   (0<<4)
  3.  
  4. int DrawRect(draw_t* draw)
  5. {
  6.   int x0, y0, x1, y1;
  7.  
  8.   x0 = draw->x;
  9.   y0 = draw->y;
  10.  
  11.   x1 = x0+draw->w-1;
  12.   y1 = y0+draw->h-1;
  13.  
  14. //  dbgprintf("draw rect x0:%d, y0:%d, x1:%d, y1:%d, color: %x\n",
  15. //             x0, y0, x1, y1, draw->color);
  16.  
  17.   if( ! BlockClip( &x0, &y0, &x1, &y1))
  18.   {
  19.      u32 *ring, write;
  20.      int w, h;
  21.      u32 ifl;
  22.  
  23.      w = x1-x0+1;
  24.      h = y1-y0+1;
  25.  
  26.      ifl = safe_cli();
  27.  
  28.      BEGIN_RING();
  29.        OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4));
  30.  
  31.  
  32.        OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  33.                 RADEON_GMC_BRUSH_SOLID_COLOR      |
  34.                 RADEON_GMC_DST_32BPP              |
  35.                 RADEON_GMC_SRC_DATATYPE_COLOR     |
  36.                 (1 << 28)+(1 << 30) | R5XX_ROP3_P);
  37.  
  38.        OUT_RING(rhd.dst_pitch_offset);
  39.        OUT_RING(draw->color);
  40.        OUT_RING((y0<<16)|x0);
  41.        OUT_RING((w<<16)|h);
  42.      COMMIT_RING();
  43.  
  44. /*
  45. #if 1
  46.  
  47. #else
  48.  
  49.      R5xxFIFOWait(7);
  50.  
  51.      OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control | R5XX_ROP3_P |
  52.                                      R5XX_GMC_BRUSH_SOLID_COLOR |
  53.                                      R5XX_GMC_SRC_DATATYPE_COLOR);
  54.  
  55.      OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color);
  56.      OUTREG(R5XX_DP_WRITE_MASK, 0xFFFFFFFF);
  57.      OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
  58.      OUTREG(R5XX_DST_PITCH_OFFSET, rhd.dst_pitch_offset);
  59.      OUTREG(R5XX_DST_Y_X,(y0<<16)|x0);
  60.      OUTREG( R5XX_DST_WIDTH_HEIGHT,(w<<16)|h);
  61. #endif
  62. */
  63.      safe_sti(ifl);
  64.   } ;
  65.   return 0;
  66. }
  67.  
  68. int FillRect(fill_t *fill)
  69. {
  70.   int x0, y0, x1, y1;
  71.  
  72.   x0 = fill->x;
  73.   y0 = fill->y;
  74.  
  75.   x1 = x0+fill->w-1;
  76.   y1 = y0+fill->h-1;
  77.  
  78. //  dbgprintf("fill rect x0:%d, y0:%d, x1:%d, y1:%d\n",
  79. //             x0, y0, x1, y1);
  80.  
  81.   if( ! BlockClip( &x0, &y0, &x1, &y1))
  82.   {
  83.      u32 *ring, write;
  84.      u32 ifl;
  85.  
  86.      ifl = safe_cli();
  87.  
  88.      BEGIN_RING();
  89.        OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT, 7));
  90.        OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL    |
  91.                 BRUSH_MONO                          |
  92.                 RADEON_GMC_DST_32BPP                |
  93.                 RADEON_GMC_SRC_DATATYPE_COLOR       |
  94.                 (1 << 28)+(1 << 30) | R5XX_ROP3_P);
  95.  
  96.          OUT_RING(rhd.dst_pitch_offset);
  97.          OUT_RING(fill->bkcolor);
  98.          OUT_RING(fill->fcolor);
  99.  
  100.          OUT_RING(fill->bmp0);
  101.          OUT_RING(fill->bmp1);
  102.  
  103.          OUT_RING((y0<<16)|x0);
  104.          OUT_RING((y1<<16)|x1);
  105.      COMMIT_RING();
  106.  
  107.      safe_sti(ifl);
  108.   };
  109.   return 0;
  110. }
  111.  
  112. int Blit(blit_t *blit)
  113. {
  114.   int x0, y0, x1, y1;
  115.  
  116.   x0 = blit->src_x;
  117.   y0 = blit->src_y;
  118.  
  119.   x1 = x0+blit->w-1;
  120.   y1 = y0+blit->h-1;
  121.  
  122.  
  123.   if( ! BlockClip( &x0, &y0, &x1, &y1))
  124.   {
  125.      u32 *ring, write;
  126.      int w, h;
  127.      u32 ifl;
  128.  
  129.      w = x1-x0+1;
  130.      h = y1-y0+1;
  131.  
  132.      ifl = safe_cli();
  133.  
  134.      BEGIN_RING();
  135.        OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5));
  136.  
  137.        OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
  138.                 RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  139.                 RADEON_GMC_BRUSH_NONE             |
  140.                 RADEON_GMC_DST_32BPP              |
  141.                 RADEON_GMC_SRC_DATATYPE_COLOR     |
  142.                 RADEON_DP_SRC_SOURCE_MEMORY       |
  143.                 (1 << 28)+(1 << 30) | R5XX_ROP3_S);
  144.  
  145.        OUT_RING(rhd.dst_pitch_offset);
  146.        OUT_RING(rhd.dst_pitch_offset);
  147.  
  148.        OUT_RING((x0<<16)|y0);
  149.        OUT_RING((blit->dst_x<<16)|blit->dst_y);
  150.        OUT_RING((w<<16)|h);
  151.      COMMIT_RING();
  152.  
  153.      safe_sti(ifl);
  154.   } ;
  155.   return 0;
  156. }
  157.  
  158. int Line2P(line2p_t *draw)
  159. {
  160.  
  161.   int x0, y0, x1, y1;
  162.  
  163.   x0 = draw->x0;
  164.   y0 = draw->y0;
  165.  
  166.   x1 = draw->x1;
  167.   y1 = draw->y1;
  168.  
  169.   if ( !LineClip( &x0, &y0, &x1, &y1 ))
  170.   {
  171.     u32 ifl;
  172.     u32 *ring, write;
  173.  
  174.     ifl = safe_cli();
  175.  
  176.      BEGIN_RING();
  177.          OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_POLYLINE, 4));
  178.          OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  179.                   RADEON_GMC_BRUSH_SOLID_COLOR      |
  180.                   RADEON_GMC_DST_32BPP              |
  181.                   RADEON_GMC_SRC_DATATYPE_COLOR     |
  182.                   (1 << 28)+(1 << 30) | R5XX_ROP3_P);
  183.  
  184.          OUT_RING(rhd.dst_pitch_offset);
  185.          OUT_RING(draw->color);
  186.          OUT_RING((y0<<16)|x0);
  187.          OUT_RING((y1<<16)|x1);
  188.      COMMIT_RING();
  189.  
  190.  
  191. /*
  192.      R5xxFIFOWait(7);
  193.  
  194.      OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control | R5XX_ROP3_P |
  195.                                      R5XX_GMC_BRUSH_SOLID_COLOR |
  196.                                      R5XX_GMC_SRC_DATATYPE_COLOR);
  197.  
  198.      OUTREG(R5XX_DST_LINE_PATCOUNT, 0x55 << R5XX_BRES_CNTL_SHIFT);
  199.  
  200.      OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color);
  201.      OUTREG(R5XX_DP_WRITE_MASK, 0xFFFFFFFF);
  202.      OUTREG(R5XX_DST_PITCH_OFFSET, rhd.dst_pitch_offset);
  203.  
  204.      OUTREG(R5XX_DST_LINE_START,(y0<<16)|x0);
  205.      OUTREG(R5XX_DST_LINE_END,(y1<<16)|x1);
  206. */
  207.      safe_sti(ifl);
  208.  
  209.   };
  210.   return 0;
  211. }
  212.