Subversion Repositories Kolibri OS

Rev

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

  1.  
  2.  
  3. int ClearPixmap(io_clear_t *io)
  4. {
  5.      u32_t *ring;
  6.  
  7.      local_pixmap_t *dstpixmap;
  8.  
  9.      dstpixmap = (io->dstpix == (void*)-1) ? &scr_pixmap : io->dstpix ;
  10.  
  11.      lock_device();
  12.  
  13. #if R300_PIO
  14.  
  15.      FIFOWait(6);
  16.  
  17.      OUTREG(R5XX_DP_GUI_MASTER_CNTL,
  18.             RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  19.             RADEON_GMC_BRUSH_SOLID_COLOR      |
  20.             RADEON_GMC_DST_32BPP              |
  21.             RADEON_GMC_SRC_DATATYPE_COLOR     |
  22.             R5XX_GMC_CLR_CMP_CNTL_DIS         |
  23.             R5XX_GMC_WR_MSK_DIS               |
  24.             R5XX_ROP3_P
  25.            );
  26.  
  27.      OUTREG(R5XX_DP_BRUSH_FRGD_CLR, io->color);
  28.      OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
  29.      OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
  30.      OUTREG(R5XX_DST_Y_X, 0);
  31.      OUTREG(R5XX_DST_WIDTH_HEIGHT,(dstpixmap->width<<16)|dstpixmap->height);
  32.  
  33. #else
  34.       BEGIN_RING(6);
  35.  
  36.         OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4));
  37.  
  38.         OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  39.                  RADEON_GMC_BRUSH_SOLID_COLOR      |
  40.                  RADEON_GMC_DST_32BPP              |
  41.                  RADEON_GMC_SRC_DATATYPE_COLOR     |
  42.                  R5XX_GMC_CLR_CMP_CNTL_DIS         |
  43.                  R5XX_GMC_WR_MSK_DIS               |
  44.                  R5XX_ROP3_P
  45.                 );
  46.  
  47.         OUT_RING(dstpixmap->pitch_offset);
  48.         OUT_RING(io->color);
  49.         OUT_RING( 0 );
  50.         OUT_RING((dstpixmap->width<<16)|dstpixmap->height);
  51.       COMMIT_RING();
  52.  
  53. #endif
  54.  
  55.      unlock_device();
  56.  
  57.      return ERR_OK;
  58. }
  59.  
  60.  
  61. int Line(io_draw_t *draw)
  62. {
  63.      local_pixmap_t *dstpixmap;
  64.      clip_t clip;
  65.      int x0, y0, x1, y1;
  66.  
  67.      dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ;
  68.  
  69.      x0 = draw->x0;
  70.      y0 = draw->y0;
  71.  
  72.      x1 = draw->x1;
  73.      y1 = draw->y1;
  74.  
  75.      clip.xmin = 0;
  76.      clip.ymin = 0;
  77.      clip.xmax = dstpixmap->width-1;
  78.      clip.ymax = dstpixmap->height-1;
  79.  
  80.     if ( !LineClip(&clip, &x0, &y0, &x1, &y1 ))
  81.     {
  82.         u32_t *ring, write;
  83.  
  84.         lock_device();
  85.  
  86. #if R300_PIO
  87.  
  88.         FIFOWait(6);
  89.  
  90.         OUTREG(R5XX_DP_GUI_MASTER_CNTL,
  91.                RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  92.                RADEON_GMC_BRUSH_SOLID_COLOR      |
  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.               );
  99.  
  100.         OUTREG(R5XX_DST_LINE_PATCOUNT, 0x55 << R5XX_BRES_CNTL_SHIFT);
  101.  
  102.         OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color);
  103.         OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
  104.  
  105.         OUTREG(R5XX_DST_LINE_START,(y0<<16)|x0);
  106.         OUTREG(R5XX_DST_LINE_END,(y1<<16)|x1);
  107. #else
  108.        BEGIN_RING(6);
  109.  
  110.          OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_POLYLINE, 4));
  111.          OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  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.          OUT_RING(draw->color);
  121.          OUT_RING((y0<<16)|x0);
  122.          OUT_RING((y1<<16)|x1);
  123.        COMMIT_RING();
  124. #endif
  125.  
  126.         unlock_device();
  127.     };
  128.     return ERR_OK;
  129. }
  130.  
  131. int DrawRect(io_draw_t* draw)
  132. {
  133.     int x0, y0, x1, y1, xend, yend;
  134.  
  135.     local_pixmap_t *dstpixmap;
  136.     clip_t dst_clip;
  137.  
  138.     dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ;
  139.  
  140.     x0 = draw->x0;
  141.     y0 = draw->y0;
  142.  
  143.     x1 = xend = x0 + draw->w - 1;
  144.     y1 = yend = y0 + draw->h - 1;
  145.  
  146.     dst_clip.xmin = 0;
  147.     dst_clip.ymin = 0;
  148.     dst_clip.xmax = dstpixmap->width-1;
  149.     dst_clip.ymax = dstpixmap->height-1;
  150.  
  151.  
  152. //  dbgprintf("draw rect x0:%d, y0:%d, x1:%d, y1:%d, color: %x\n",
  153. //             x0, y0, x1, y1, draw->color);
  154.  
  155.     if( ! BlockClip( &dst_clip, &x0, &y0, &x1, &y1))
  156.     {
  157.         u32_t *ring;
  158.         int w, h;
  159.  
  160.         w = x1 - x0 + 1;
  161.         h = y1 - y0 + 1;
  162.  
  163.         lock_device();
  164.  
  165. #if R300_PIO
  166.  
  167.         FIFOWait(7);
  168.  
  169.         OUTREG(R5XX_DP_GUI_MASTER_CNTL,
  170.                RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  171.                RADEON_GMC_BRUSH_SOLID_COLOR      |
  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.  
  179.         OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color);
  180.         OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
  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);
  184.  
  185.         if( draw->color != draw->border)
  186.         {
  187.             OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->border);
  188.  
  189.             if( y0 == draw->y0)
  190.             {
  191.                 FIFOWait(2);
  192.  
  193.                 OUTREG(R5XX_DST_Y_X,(y0<<16)|x0);
  194.                 OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1);
  195.                 y0++;
  196.                 h--;
  197.             }
  198.             if( y1 == yend )
  199.             {
  200.                 FIFOWait(2);
  201.  
  202.                 OUTREG(R5XX_DST_Y_X,(y1<<16)|x0);
  203.                 OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1);
  204.                 h--;
  205.             }
  206.             if( (h > 0) && (x0 == draw->x0))
  207.             {
  208.                 FIFOWait(2);
  209.  
  210.                 OUTREG(R5XX_DST_Y_X,(y0<<16)|x0);
  211.                 OUTREG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h);
  212.             }
  213.             if( (h > 0) && (x1 == xend))
  214.             {
  215.                 FIFOWait(2);
  216.  
  217.                 OUTREG(R5XX_DST_Y_X,(y0<<16)|x1);
  218.                 OUTREG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h);
  219.             }
  220.         };
  221. #else
  222.  
  223.       BEGIN_RING(64);
  224.  
  225.         OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4));
  226.  
  227.         OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  228.                  RADEON_GMC_BRUSH_SOLID_COLOR      |
  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);
  237.         OUT_RING(draw->color);
  238.         OUT_RING((x0<<16)|y0);
  239.         OUT_RING((w<<16)|h);
  240.         OUT_RING(CP_PACKET2());
  241.         OUT_RING(CP_PACKET2());
  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.                 OUT_RING(draw->border);
  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.            //   h--;
  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.                 OUT_RING(draw->border);
  279.                 OUT_RING((x0<<16)|y1);
  280.                 OUT_RING((w<<16)|1);
  281.                 OUT_RING(CP_PACKET2());
  282.                 OUT_RING(CP_PACKET2());
  283.             //  h--;
  284.             }
  285.             if( (h > 0) && (x0 == draw->x0)) {
  286.                 OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4));
  287.                 OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  288.                          RADEON_GMC_BRUSH_SOLID_COLOR      |
  289.                          RADEON_GMC_DST_32BPP              |
  290.                          RADEON_GMC_SRC_DATATYPE_COLOR     |
  291.                          R5XX_GMC_CLR_CMP_CNTL_DIS         |
  292.                          R5XX_GMC_WR_MSK_DIS               |
  293.                          R5XX_ROP3_P
  294.                       );
  295.  
  296.                 OUT_RING(dstpixmap->pitch_offset);
  297.                 OUT_RING(draw->border);
  298.                 OUT_RING((x0<<16)|y0);
  299.                 OUT_RING((1<<16)|h);
  300.                 OUT_RING(CP_PACKET2());
  301.                 OUT_RING(CP_PACKET2());
  302.             }
  303.             if( (h > 0) && (x1 == xend)) {
  304.                 OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4));
  305.                 OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  306.                        RADEON_GMC_BRUSH_SOLID_COLOR      |
  307.                        RADEON_GMC_DST_32BPP              |
  308.                        RADEON_GMC_SRC_DATATYPE_COLOR     |
  309.                        R5XX_GMC_CLR_CMP_CNTL_DIS         |
  310.                        R5XX_GMC_WR_MSK_DIS               |
  311.                        R5XX_ROP3_P
  312.                       );
  313.  
  314.                 OUT_RING(dstpixmap->pitch_offset);
  315.                 OUT_RING(draw->border);
  316.                 OUT_RING((x1<<16)|y0);
  317.                 OUT_RING((1<<16)|h);
  318.                 OUT_RING(CP_PACKET2());
  319.                 OUT_RING(CP_PACKET2());
  320.             }
  321.         };
  322.  
  323. /*
  324.  
  325.         CP_REG(R5XX_DP_GUI_MASTER_CNTL,
  326.                  RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  327.                  RADEON_GMC_BRUSH_SOLID_COLOR      |
  328.                  RADEON_GMC_DST_32BPP              |
  329.                  RADEON_GMC_SRC_DATATYPE_COLOR     |
  330.                  R5XX_GMC_CLR_CMP_CNTL_DIS         |
  331.                  R5XX_GMC_WR_MSK_DIS               |
  332.                  R5XX_ROP3_P
  333.                 );
  334.         CP_REG(R5XX_DP_BRUSH_FRGD_CLR, draw->color);
  335.         CP_REG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
  336.  
  337.         CP_REG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
  338.         CP_REG(R5XX_DST_Y_X,(y0<<16)|x0);
  339.         CP_REG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|h);
  340.         if( draw->color != draw->border)
  341.         {
  342.         CP_REG(R5XX_DP_GUI_MASTER_CNTL,
  343.                  RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  344.                  RADEON_GMC_BRUSH_SOLID_COLOR      |
  345.                  RADEON_GMC_DST_32BPP              |
  346.                  RADEON_GMC_SRC_DATATYPE_COLOR     |
  347.                  R5XX_GMC_CLR_CMP_CNTL_DIS         |
  348.                  R5XX_GMC_WR_MSK_DIS               |
  349.                  R5XX_ROP3_P
  350.                 );
  351.            CP_REG(R5XX_DP_BRUSH_FRGD_CLR, draw->border);
  352.         CP_REG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
  353.  
  354.         CP_REG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
  355.  
  356.  
  357.            if( y0 == draw->y0) {
  358.               CP_REG(R5XX_DST_Y_X,(y0<<16)|x0);
  359.               CP_REG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1);
  360.               y0++;
  361.               h--;
  362.            }
  363.            if( y1 == yend ) {
  364.               CP_REG(R5XX_DST_Y_X,(y1<<16)|x0);
  365.               CP_REG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1);
  366.               h--;
  367.            }
  368.            if( (h > 0) && (x0 == draw->x0)) {
  369.               CP_REG(R5XX_DST_Y_X,(y0<<16)|x0);
  370.               CP_REG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h);
  371.            }
  372.            if( (h > 0) && (x1 == xend)) {
  373.               CP_REG(R5XX_DST_Y_X,(y0<<16)|x1);
  374.               CP_REG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h);
  375.            }
  376.         };
  377. */
  378.  
  379.       COMMIT_RING();
  380. #endif
  381.         unlock_device();
  382.     };
  383.     return ERR_OK;
  384. }
  385.  
  386. int FillRect(io_fill_t *fill)
  387. {
  388.     local_pixmap_t *dstpixmap;
  389.     clip_t dst_clip;
  390.     int x0, y0, x1, y1, xend, yend;
  391.  
  392.     dstpixmap = (fill->dstpix == (void*)-1) ? &scr_pixmap : fill->dstpix ;
  393.  
  394.     x0 = fill->x;
  395.     y0 = fill->y;
  396.  
  397.     xend = x1 = x0 + fill->w - 1;
  398.     yend = y1 = y0 + fill->h - 1;
  399.  
  400.     dst_clip.xmin = 0;
  401.     dst_clip.ymin = 0;
  402.     dst_clip.xmax = dstpixmap->width-1;
  403.     dst_clip.ymax = dstpixmap->height-1;
  404.  
  405. //  dbgprintf("fill rect x0:%d, y0:%d, x1:%d, y1:%d\n",
  406. //             x0, y0, x1, y1);
  407.  
  408.     if( ! BlockClip(&dst_clip, &x0, &y0, &x1, &y1))
  409.     {
  410.         u32_t *ring, write;
  411.  
  412.         int w = x1 - x0 + 1;
  413.         int h = y1 - y0 + 1;
  414.  
  415.         lock_device();
  416.  
  417. #if R300_PIO
  418.  
  419.         FIFOWait(9);
  420.  
  421.         OUTREG(R5XX_DP_GUI_MASTER_CNTL,
  422.                RADEON_GMC_DST_PITCH_OFFSET_CNTL |
  423.                R5XX_GMC_BRUSH_8X8_MONO_FG_BG    |
  424.                RADEON_GMC_DST_32BPP             |
  425.                R5XX_GMC_SRC_DATATYPE_COLOR      |
  426.                R5XX_GMC_CLR_CMP_CNTL_DIS        |
  427.                R5XX_GMC_WR_MSK_DIS              |
  428.                R5XX_ROP3_P
  429.                );
  430.  
  431.         OUTREG(R5XX_DP_BRUSH_BKGD_CLR, fill->bkcolor);
  432.         OUTREG(R5XX_DP_BRUSH_FRGD_CLR, fill->fcolor);
  433.  
  434.         OUTREG(R5XX_BRUSH_DATA0, fill->bmp0);
  435.         OUTREG(R5XX_BRUSH_DATA1, fill->bmp1);
  436.  
  437.         OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
  438.         OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
  439.  
  440.         OUTREG(R5XX_DST_Y_X,(y0<<16)|x0);
  441.         OUTREG(R5XX_DST_HEIGHT_WIDTH,(h<<16)|w);
  442.  
  443.         if( (fill->border & 0xFF000000) != 0)
  444.         {
  445.             FIFOWait(2);
  446.  
  447.             OUTREG(R5XX_DP_GUI_MASTER_CNTL,
  448.                    RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  449.                    RADEON_GMC_BRUSH_SOLID_COLOR      |
  450.                    RADEON_GMC_DST_32BPP              |
  451.                    RADEON_GMC_SRC_DATATYPE_COLOR     |
  452.                    R5XX_GMC_CLR_CMP_CNTL_DIS         |
  453.                    R5XX_GMC_WR_MSK_DIS               |
  454.                    R5XX_ROP3_P
  455.                   );
  456.  
  457.             OUTREG(R5XX_DP_BRUSH_FRGD_CLR, fill->border);
  458.  
  459.             if( y0 == fill->y)
  460.             {
  461.                 FIFOWait(2);
  462.  
  463.                 OUTREG(R5XX_DST_Y_X,(y0<<16)|x0);
  464.                 OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1);
  465.                 y0++;
  466.                 h--;
  467.             }
  468.             if( y1 == yend )
  469.             {
  470.                 FIFOWait(2);
  471.  
  472.                 OUTREG(R5XX_DST_Y_X,(y1<<16)|x0);
  473.                 OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1);
  474.                 h--;
  475.             }
  476.             if( (h > 0) && (x0 == fill->x))
  477.             {
  478.                 FIFOWait(2);
  479.  
  480.                 OUTREG(R5XX_DST_Y_X,(y0<<16)|x0);
  481.                 OUTREG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h);
  482.             }
  483.             if( (h > 0) && (x1 == xend))
  484.             {
  485.                 FIFOWait(2);
  486.  
  487.                 OUTREG(R5XX_DST_Y_X,(y0<<16)|x1);
  488.                 OUTREG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h);
  489.             }
  490.         };
  491.  
  492.  
  493. #else
  494.       BEGIN_RING(9+10*2);
  495.  
  496.         OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT, 7));
  497.         OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL    |
  498.                  R5XX_GMC_BRUSH_8X8_MONO_FG_BG       |
  499.                  RADEON_GMC_DST_32BPP                |
  500.                  RADEON_GMC_SRC_DATATYPE_COLOR       |
  501.                  R5XX_GMC_CLR_CMP_CNTL_DIS           |
  502.                  R5XX_GMC_WR_MSK_DIS                 |
  503.                  R5XX_ROP3_P
  504.                 );
  505.  
  506.         OUT_RING(dstpixmap->pitch_offset);
  507.         OUT_RING(fill->bkcolor);
  508.         OUT_RING(fill->fcolor);
  509.  
  510.         OUT_RING(fill->bmp0);
  511.         OUT_RING(fill->bmp1);
  512.  
  513.         OUT_RING((y0<<16)|x0);
  514.         OUT_RING((y1<<16)|x1);
  515.  
  516.         if( (fill->border & 0xFF000000) != 0)
  517.         {
  518.             CP_REG(R5XX_DP_GUI_MASTER_CNTL,
  519.                    RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  520.                    RADEON_GMC_BRUSH_SOLID_COLOR      |
  521.                    RADEON_GMC_DST_32BPP              |
  522.                    RADEON_GMC_SRC_DATATYPE_COLOR     |
  523.                    R5XX_GMC_CLR_CMP_CNTL_DIS         |
  524.                    R5XX_GMC_WR_MSK_DIS               |
  525.                    R5XX_ROP3_P
  526.                   );
  527.  
  528.             CP_REG(R5XX_DP_BRUSH_FRGD_CLR, fill->border);
  529.  
  530.             if( y0 == fill->y)
  531.             {
  532.                 CP_REG(R5XX_DST_Y_X,(y0<<16)|x0);
  533.                 CP_REG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1);
  534.                 y0++;
  535.                 h--;
  536.             }
  537.             if( y1 == yend )
  538.             {
  539.                 CP_REG(R5XX_DST_Y_X,(y1<<16)|x0);
  540.                 CP_REG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|1);
  541.                 h--;
  542.             }
  543.             if( (h > 0) && (x0 == fill->x))
  544.             {
  545.                 CP_REG(R5XX_DST_Y_X,(y0<<16)|x0);
  546.                 CP_REG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h);
  547.             }
  548.             if( (h > 0) && (x1 == xend))
  549.             {
  550.                 CP_REG(R5XX_DST_Y_X,(y0<<16)|x1);
  551.                 CP_REG(R5XX_DST_WIDTH_HEIGHT,(1<<16)|h);
  552.             }
  553.         };
  554.  
  555.       COMMIT_RING();
  556.  
  557. #endif
  558.         unlock_device();
  559.      };
  560.      return ERR_OK;
  561. };
  562.  
  563.  
  564. #define ADDRREG(addr)  ((volatile u32_t *)(rhd.MMIOBase + (addr)))
  565.  
  566.  
  567. static int blit_host(u32_t dstpitch, int dstx, int dsty,
  568.                      u32_t  src, int srcx, int srcy,
  569.                      int w, int h, int srcpitch, Bool trans, color_t key)
  570. {
  571.     u32_t     dp_cntl;
  572.     color_t  *src_addr;
  573.  
  574.     lock_device();
  575.  
  576. #if R300_PIO
  577.  
  578.     dp_cntl =  RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  579.                RADEON_GMC_BRUSH_NONE             |
  580.                RADEON_GMC_DST_32BPP              |
  581.                RADEON_GMC_SRC_DATATYPE_COLOR     |
  582.                RADEON_DP_SRC_SOURCE_HOST_DATA    |
  583.                R5XX_GMC_WR_MSK_DIS               |
  584.                R5XX_ROP3_S;
  585.  
  586.     if( trans == FALSE )
  587.     {
  588.         dp_cntl|= R5XX_GMC_CLR_CMP_CNTL_DIS;
  589.         FIFOWait(5);
  590.     }
  591.     else
  592.         FIFOWait(8);
  593.  
  594.     OUTREG(R5XX_DP_GUI_MASTER_CNTL, dp_cntl);
  595.  
  596.     OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT |
  597.                          R5XX_DST_Y_TOP_TO_BOTTOM);
  598.  
  599.     OUTREG(R5XX_DST_PITCH_OFFSET, dstpitch);
  600.  
  601.     if( trans )
  602.     {
  603.         OUTREG(R5XX_CLR_CMP_CLR_SRC, key);
  604.         OUTREG(R5XX_CLR_CMP_MASK, R5XX_CLR_CMP_MSK);
  605.         OUTREG(R5XX_CLR_CMP_CNTL, R5XX_SRC_CMP_EQ_COLOR |
  606.                                   R5XX_CLR_CMP_SRC_SOURCE);
  607.     };
  608.  
  609.     OUTREG(RADEON_DST_Y_X, (dsty << 16) | (dstx & 0xffff));
  610.     OUTREG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | w);
  611.  
  612.     src_addr = &((color_t*)src)[srcpitch*srcy/4+srcx];
  613.  
  614.     while ( h-- )
  615.     {
  616.         color_t *tmp_src = src_addr;
  617.         src_addr += srcpitch/4;
  618.  
  619.         int left = w;
  620.  
  621.         while( left )
  622.         {
  623.             volatile u32_t *d;
  624.  
  625.             if( left > 8 )
  626.             {
  627.                 int i;
  628.  
  629.                 R5xxFIFOWait(8);
  630.                 d = ADDRREG(RADEON_HOST_DATA0);
  631.  
  632.                                 /* Unrolling doesn't improve performance */
  633.                for ( i = 0; i < 8; i++)
  634.                    *d++ = *tmp_src++;
  635.                left -= 8;
  636.            }
  637.            else
  638.            {
  639.                R5xxFIFOWait(left);
  640.  
  641.                if( h )
  642.                    d = ADDRREG(RADEON_HOST_DATA7) - (left - 1);
  643.                else
  644.                    d = ADDRREG(RADEON_HOST_DATA_LAST) - (left - 1);
  645.  
  646.                for ( ; left; --left)
  647.                    *d++ = *tmp_src++;
  648.                left = 0;
  649.            };
  650.        };
  651.    };
  652.  
  653. #endif
  654.  
  655.    unlock_device();
  656.  
  657.    return ERR_OK;
  658. }
  659.  
  660.  
  661. int Blit(io_blit_t *blit)
  662. {
  663.    clip_t src_clip, dst_clip;
  664.  
  665.    local_pixmap_t *srcpixmap;
  666.    local_pixmap_t *dstpixmap;
  667.  
  668.    u32_t  srcpitchoffset;
  669.    Bool   need_sync = FALSE;
  670.  
  671.    dstpixmap = (blit->dstpix == (void*)-1) ? &scr_pixmap : blit->dstpix ;
  672.    srcpixmap = (blit->srcpix == (void*)-1) ? &scr_pixmap : blit->srcpix ;
  673.  
  674.    src_clip.xmin = 0;
  675.    src_clip.ymin = 0;
  676.    src_clip.xmax = srcpixmap->width-1;
  677.    src_clip.ymax = srcpixmap->height-1;
  678.  
  679.    dst_clip.xmin = 0;
  680.    dst_clip.ymin = 0;
  681.    dst_clip.xmax = dstpixmap->width-1;
  682.    dst_clip.ymax = dstpixmap->height-1;
  683.  
  684.    if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y,
  685.                   &src_clip, &blit->src_x, &blit->src_y,
  686.                   &blit->w, &blit->h) )
  687.    {
  688.        u32_t *ring, write;
  689. /*
  690.        if( (srcpixmap->flags & PX_MEM_MASK)==PX_MEM_SYSTEM)
  691.            return blit_host(dstpixmap->pitch_offset,
  692.                             blit->dst_x, blit->dst_y,
  693.                             srcpixmap->mapped,
  694.                             blit->src_x, blit->src_y,
  695.                             blit->w, blit->h,
  696.                             srcpixmap->pitch,
  697.                             FALSE, 0 );
  698. */
  699.  
  700. //        if( (srcpixmap->flags & PX_MEM_MASK)==PX_MEM_SYSTEM)
  701. //        {
  702. //            srcpitchoffset =  bind_pixmap(srcpixmap);
  703. //            need_sync = TRUE;
  704. //        }
  705. //        else
  706.            srcpitchoffset = srcpixmap->pitch_offset;
  707.  
  708.        lock_device();
  709.  
  710. #if R300_PIO
  711.  
  712.        FIFOWait(7);
  713.  
  714.        OUTREG(R5XX_DP_GUI_MASTER_CNTL,
  715.               RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
  716.               RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  717.               RADEON_GMC_BRUSH_NONE             |
  718.               RADEON_GMC_DST_32BPP              |
  719.               RADEON_GMC_SRC_DATATYPE_COLOR     |
  720.               RADEON_DP_SRC_SOURCE_MEMORY       |
  721.               R5XX_GMC_CLR_CMP_CNTL_DIS         |
  722.               R5XX_GMC_WR_MSK_DIS               |
  723.               R5XX_ROP3_S
  724.              );
  725.  
  726.        OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
  727.  
  728.        OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
  729.        OUTREG(R5XX_SRC_PITCH_OFFSET, srcpitchoffset);
  730.  
  731.        OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x);
  732.        OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x);
  733.        OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w);
  734.  
  735. #else
  736.    BEGIN_RING(7);
  737.  
  738.        OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5));
  739.  
  740.        OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
  741.                 RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  742.                 RADEON_GMC_BRUSH_NONE             |
  743.                 RADEON_GMC_DST_32BPP              |
  744.                 RADEON_GMC_SRC_DATATYPE_COLOR     |
  745.                 RADEON_DP_SRC_SOURCE_MEMORY       |
  746.                 R5XX_GMC_CLR_CMP_CNTL_DIS         |
  747.                 R5XX_GMC_WR_MSK_DIS               |
  748.                 R5XX_ROP3_S
  749.                );
  750.  
  751.        OUT_RING(srcpitchoffset);
  752.        OUT_RING(dstpixmap->pitch_offset);
  753.  
  754.        OUT_RING((blit->src_x<<16)|blit->src_y);
  755.        OUT_RING((blit->dst_x<<16)|blit->dst_y);
  756.        OUT_RING((blit->w<<16)|blit->h);
  757.    COMMIT_RING();
  758.  
  759. #endif
  760.  
  761.       if( need_sync == TRUE )
  762.            R5xx2DIdleLocal();
  763.  
  764.        unlock_device();
  765.  
  766.     };
  767.     return ERR_OK;
  768. };
  769.  
  770.  
  771. int BlitTransparent(io_blit_t *blit)
  772. {
  773.     clip_t src_clip, dst_clip;
  774.  
  775.     local_pixmap_t *srcpixmap;
  776.     local_pixmap_t *dstpixmap;
  777.  
  778.     u32_t  srcpitchoffset;
  779.     Bool   need_sync = FALSE;
  780.  
  781.    // dbgprintf("Transblit src: %x dst: %x\n",blit->srcpix, blit->dstpix);
  782.  
  783.     dstpixmap = (blit->dstpix == (void*)-1) ? &scr_pixmap : blit->dstpix ;
  784.     srcpixmap = (blit->srcpix == (void*)-1) ? &scr_pixmap : blit->srcpix ;
  785.  
  786.     //dbgprintf("srcpixmap: %x dstpixmap: %x\n",srcpixmap, dstpixmap);
  787.  
  788.     //dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height);
  789.     //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height);
  790.     //dbgprintf("srcpitch: %x dstpitch: %x\n",
  791.     //           srcpixmap->pitch_offset,dstpixmap->pitch_offset);
  792.     src_clip.xmin = 0;
  793.     src_clip.ymin = 0;
  794.     src_clip.xmax = srcpixmap->width-1;
  795.     src_clip.ymax = srcpixmap->height-1;
  796.  
  797.     dst_clip.xmin = 0;
  798.     dst_clip.ymin = 0;
  799.     dst_clip.xmax = dstpixmap->width-1;
  800.     dst_clip.ymax = dstpixmap->height-1;
  801.  
  802.     if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y,
  803.                    &src_clip, &blit->src_x, &blit->src_y,
  804.                    &blit->w, &blit->h) )
  805.     {
  806.        u32_t *ring, write;
  807.  
  808.  
  809. //        if( (srcpixmap->flags & PX_MEM_MASK)==PX_MEM_SYSTEM)
  810. //        {
  811. //            srcpitchoffset =  bind_pixmap(srcpixmap);
  812. //            need_sync = TRUE;
  813. //        }
  814. //        else
  815.            srcpitchoffset = srcpixmap->pitch_offset;
  816.  
  817.        lock_device();
  818.  
  819. #if R300_PIO
  820.  
  821.        FIFOWait(10);
  822.  
  823.        OUTREG(R5XX_DP_GUI_MASTER_CNTL,
  824.               RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
  825.               RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  826.               RADEON_GMC_BRUSH_NONE             |
  827.               RADEON_GMC_DST_32BPP              |
  828.               RADEON_GMC_SRC_DATATYPE_COLOR     |
  829.               RADEON_DP_SRC_SOURCE_MEMORY       |
  830.               R5XX_GMC_WR_MSK_DIS               |
  831.               R5XX_ROP3_S
  832.              );
  833.  
  834.        OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
  835.  
  836.        OUTREG(R5XX_CLR_CMP_CLR_SRC, blit->key);
  837.        OUTREG(R5XX_CLR_CMP_MASK, R5XX_CLR_CMP_MSK);
  838.        OUTREG(R5XX_CLR_CMP_CNTL, R5XX_SRC_CMP_EQ_COLOR | R5XX_CLR_CMP_SRC_SOURCE);
  839.  
  840.        OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
  841.        OUTREG(R5XX_SRC_PITCH_OFFSET, srcpitchoffset);
  842.  
  843.        OUTREG(R5XX_SRC_Y_X,(blit->src_y<<16)|blit->src_x);
  844.        OUTREG(R5XX_DST_Y_X,(blit->dst_y<<16)|blit->dst_x);
  845.        OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w);
  846.  
  847. #else
  848.  
  849.        BEGIN_RING(10);
  850.  
  851.          OUT_RING(CP_PACKET3(RADEON_CNTL_TRANBLT, 8));
  852.  
  853.          OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL  |
  854.                   RADEON_GMC_DST_PITCH_OFFSET_CNTL  |
  855.                   RADEON_GMC_BRUSH_NONE             |
  856.                   RADEON_GMC_DST_32BPP              |
  857.                   RADEON_GMC_SRC_DATATYPE_COLOR     |
  858.                   RADEON_DP_SRC_SOURCE_MEMORY       |
  859.                   R5XX_GMC_WR_MSK_DIS               |
  860.                   R5XX_ROP3_S
  861.                  );
  862.  
  863.          OUT_RING(srcpitchoffset);
  864.          OUT_RING(dstpixmap->pitch_offset);
  865.  
  866.          OUT_RING(R5XX_CLR_CMP_SRC_SOURCE | R5XX_SRC_CMP_EQ_COLOR);
  867.          OUT_RING(blit->key);
  868.          OUT_RING(0xFFFFFFFF);
  869.  
  870.          OUT_RING((blit->src_x<<16)|blit->src_y);
  871.          OUT_RING((blit->dst_x<<16)|blit->dst_y);
  872.          OUT_RING((blit->w<<16)|blit->h);
  873.  
  874.        COMMIT_RING();
  875.  
  876. #endif
  877.  
  878.       if( need_sync == TRUE )
  879.            R5xx2DIdleLocal();
  880.  
  881.       unlock_device();
  882.  
  883.  
  884.     };
  885.     return ERR_OK;
  886. }
  887.  
  888.  
  889.  
  890.