Subversion Repositories Kolibri OS

Rev

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

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