Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2.  
  3. int Init3DEngine(RHDPtr info)
  4. {
  5.     u32_t gb_tile_config, su_reg_dest, vap_cntl;
  6.  
  7.     u32_t *ring;
  8.     u32_t ifl;
  9.  
  10.    // info->texW[0] = info->texH[0] = info->texW[1] = info->texH[1] = 1;
  11.  
  12.     ifl = safe_cli();
  13.  
  14.  
  15.  
  16.     if (IS_R300_3D || IS_R500_3D) {
  17.  
  18.         BEGIN_ACCEL(3);
  19.         OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D);
  20.         OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE);
  21.         OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);
  22.         FINISH_ACCEL();
  23.  
  24.         gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16 | R300_SUBPIXEL_1_16);
  25.  
  26.         switch(info->num_gb_pipes)
  27.         {
  28.             case 2: gb_tile_config |= R300_PIPE_COUNT_R300; break;
  29.             case 3: gb_tile_config |= R300_PIPE_COUNT_R420_3P; break;
  30.             case 4: gb_tile_config |= R300_PIPE_COUNT_R420; break;
  31.             default:
  32.             case 1: gb_tile_config |= R300_PIPE_COUNT_RV350; break;
  33.         }
  34.  
  35.         BEGIN_ACCEL(5);
  36.         OUT_ACCEL_REG(R300_GB_TILE_CONFIG, gb_tile_config);
  37.         OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);
  38.         OUT_ACCEL_REG(R300_DST_PIPE_CONFIG, R300_PIPE_AUTO_CONFIG);
  39.         OUT_ACCEL_REG(R300_GB_SELECT, 0);
  40.         OUT_ACCEL_REG(R300_GB_ENABLE, 0);
  41.         FINISH_ACCEL();
  42.  
  43.         if (IS_R500_3D) {
  44.         su_reg_dest = ((1 << info->num_gb_pipes) - 1);
  45.             BEGIN_ACCEL(2);
  46.             OUT_ACCEL_REG(R500_SU_REG_DEST, su_reg_dest);
  47.             OUT_ACCEL_REG(R500_VAP_INDEX_OFFSET, 0);
  48.             FINISH_ACCEL();
  49.         }
  50.  
  51.         BEGIN_ACCEL(3);
  52.         OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D);
  53.         OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE);
  54.         OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);
  55.         FINISH_ACCEL();
  56.  
  57.         BEGIN_ACCEL(5);
  58.         OUT_ACCEL_REG(R300_GB_AA_CONFIG, 0);
  59.         OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D);
  60.         OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE);
  61.         OUT_ACCEL_REG(R300_GB_MSPOS0, ((8 << R300_MS_X0_SHIFT) |
  62.                                        (8 << R300_MS_Y0_SHIFT) |
  63.                                        (8 << R300_MS_X1_SHIFT) |
  64.                                        (8 << R300_MS_Y1_SHIFT) |
  65.                                        (8 << R300_MS_X2_SHIFT) |
  66.                                        (8 << R300_MS_Y2_SHIFT) |
  67.                                        (8 << R300_MSBD0_Y_SHIFT) |
  68.                                        (7 << R300_MSBD0_X_SHIFT)));
  69.         OUT_ACCEL_REG(R300_GB_MSPOS1, ((8 << R300_MS_X3_SHIFT) |
  70.                                        (8 << R300_MS_Y3_SHIFT) |
  71.                                        (8 << R300_MS_X4_SHIFT) |
  72.                                        (8 << R300_MS_Y4_SHIFT) |
  73.                                        (8 << R300_MS_X5_SHIFT) |
  74.                                        (8 << R300_MS_Y5_SHIFT) |
  75.                                        (8 << R300_MSBD1_SHIFT)));
  76.         FINISH_ACCEL();
  77.  
  78.         BEGIN_ACCEL(5);
  79.         OUT_ACCEL_REG(R300_GA_ENHANCE, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL);
  80.         OUT_ACCEL_REG(R300_GA_POLY_MODE, R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE);
  81.         OUT_ACCEL_REG(R300_GA_ROUND_MODE, (R300_GEOMETRY_ROUND_NEAREST |
  82.                                           R300_COLOR_ROUND_NEAREST));
  83.         OUT_ACCEL_REG(R300_GA_COLOR_CONTROL, (R300_RGB0_SHADING_GOURAUD |
  84.                                               R300_ALPHA0_SHADING_GOURAUD |
  85.                                               R300_RGB1_SHADING_GOURAUD |
  86.                                               R300_ALPHA1_SHADING_GOURAUD |
  87.                                               R300_RGB2_SHADING_GOURAUD |
  88.                                               R300_ALPHA2_SHADING_GOURAUD |
  89.                                               R300_RGB3_SHADING_GOURAUD |
  90.                                               R300_ALPHA3_SHADING_GOURAUD));
  91.         OUT_ACCEL_REG(R300_GA_OFFSET, 0);
  92.         FINISH_ACCEL();
  93.  
  94.         BEGIN_ACCEL(5);
  95.         OUT_ACCEL_REG(R300_SU_TEX_WRAP, 0);
  96.         OUT_ACCEL_REG(R300_SU_POLY_OFFSET_ENABLE, 0);
  97.         OUT_ACCEL_REG(R300_SU_CULL_MODE, R300_FACE_NEG);
  98.         OUT_ACCEL_REG(R300_SU_DEPTH_SCALE, 0x4b7fffff);
  99.         OUT_ACCEL_REG(R300_SU_DEPTH_OFFSET, 0);
  100.         FINISH_ACCEL();
  101.  
  102.         /* setup the VAP */
  103.         if (info->has_tcl)
  104.             vap_cntl = ((5 << R300_PVS_NUM_SLOTS_SHIFT) |
  105.                         (5 << R300_PVS_NUM_CNTLRS_SHIFT) |
  106.                         (9 << R300_VF_MAX_VTX_NUM_SHIFT));
  107.         else
  108.             vap_cntl = ((10 << R300_PVS_NUM_SLOTS_SHIFT) |
  109.                         (5 << R300_PVS_NUM_CNTLRS_SHIFT) |
  110.                         (5 << R300_VF_MAX_VTX_NUM_SHIFT));
  111.  
  112.         if (info->ChipFamily == CHIP_FAMILY_RV515)
  113.             vap_cntl |= (2 << R300_PVS_NUM_FPUS_SHIFT);
  114.         else if ((info->ChipFamily == CHIP_FAMILY_RV530) ||
  115.                  (info->ChipFamily == CHIP_FAMILY_RV560) ||
  116.                  (info->ChipFamily == CHIP_FAMILY_RV570))
  117.             vap_cntl |= (5 << R300_PVS_NUM_FPUS_SHIFT);
  118.         else if ((info->ChipFamily == CHIP_FAMILY_RV410) ||
  119.                  (info->ChipFamily == CHIP_FAMILY_R420))
  120.             vap_cntl |= (6 << R300_PVS_NUM_FPUS_SHIFT);
  121.         else if ((info->ChipFamily == CHIP_FAMILY_R520) ||
  122.                  (info->ChipFamily == CHIP_FAMILY_R580))
  123.             vap_cntl |= (8 << R300_PVS_NUM_FPUS_SHIFT);
  124.         else
  125.             vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT);
  126.  
  127.     if (info->has_tcl)
  128.         BEGIN_ACCEL(15)
  129.         else
  130.             BEGIN_ACCEL(9);
  131.  
  132.         OUT_ACCEL_REG(R300_VAP_VTX_STATE_CNTL, 0);
  133.         OUT_ACCEL_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0);
  134.  
  135.         if (info->has_tcl)
  136.             OUT_ACCEL_REG(R300_VAP_CNTL_STATUS, 0);
  137.         else
  138.             OUT_ACCEL_REG(R300_VAP_CNTL_STATUS, R300_PVS_BYPASS);
  139.         OUT_ACCEL_REG(R300_VAP_CNTL, vap_cntl);
  140.         OUT_ACCEL_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0);
  141.         OUT_ACCEL_REG(R300_VAP_VTE_CNTL, R300_VTX_XY_FMT | R300_VTX_Z_FMT);
  142.         OUT_ACCEL_REG(R300_VAP_PSC_SGN_NORM_CNTL, 0);
  143.  
  144.         OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_EXT_0,
  145.                     ((R300_SWIZZLE_SELECT_X << R300_SWIZZLE_SELECT_X_0_SHIFT) |
  146.                      (R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_0_SHIFT) |
  147.                      (R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_0_SHIFT) |
  148.                      (R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_0_SHIFT) |
  149.                        ((R300_WRITE_ENA_X | R300_WRITE_ENA_Y | R300_WRITE_ENA_Z | R300_WRITE_ENA_W)
  150.                         << R300_WRITE_ENA_0_SHIFT) |
  151.                      (R300_SWIZZLE_SELECT_X << R300_SWIZZLE_SELECT_X_1_SHIFT) |
  152.                      (R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_1_SHIFT) |
  153.                      (R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_1_SHIFT) |
  154.                      (R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_1_SHIFT) |
  155.                        ((R300_WRITE_ENA_X | R300_WRITE_ENA_Y | R300_WRITE_ENA_Z | R300_WRITE_ENA_W)
  156.                         << R300_WRITE_ENA_1_SHIFT)));
  157.         OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_EXT_1,
  158.                      ((R300_SWIZZLE_SELECT_X << R300_SWIZZLE_SELECT_X_2_SHIFT) |
  159.                       (R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_2_SHIFT) |
  160.                       (R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_2_SHIFT) |
  161.                       (R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_2_SHIFT) |
  162.                        ((R300_WRITE_ENA_X | R300_WRITE_ENA_Y | R300_WRITE_ENA_Z | R300_WRITE_ENA_W)
  163.                         << R300_WRITE_ENA_2_SHIFT)));
  164.  
  165.     if (info->has_tcl) {
  166.             OUT_ACCEL_REG(R300_VAP_PVS_FLOW_CNTL_OPC, 0);
  167.             OUT_ACCEL_REG(R300_VAP_GB_VERT_CLIP_ADJ, 0x3f800000);
  168.             OUT_ACCEL_REG(R300_VAP_GB_VERT_DISC_ADJ, 0x3f800000);
  169.             OUT_ACCEL_REG(R300_VAP_GB_HORZ_CLIP_ADJ, 0x3f800000);
  170.             OUT_ACCEL_REG(R300_VAP_GB_HORZ_DISC_ADJ, 0x3f800000);
  171.             OUT_ACCEL_REG(R300_VAP_CLIP_CNTL, R300_CLIP_DISABLE);
  172.         }
  173.         FINISH_ACCEL();
  174.  
  175.         /* pre-load the vertex shaders */
  176.     if (info->has_tcl) {
  177.         /* exa mask/Xv bicubic shader program
  178.  
  179.            dcl_position   v0
  180.            dcl_texcoord   v1
  181.            dcl_texcoord1  v2
  182.  
  183.            mov oPos,  v0
  184.            mov oT0,   v1
  185.            mov oT1,   v2      */
  186.  
  187.  
  188.             BEGIN_ACCEL(13);
  189.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, 0);
  190.             /* PVS inst 0 */
  191.             OUT_ACCEL_REG (R300_VAP_PVS_VECTOR_DATA_REG,
  192.                           (R300_PVS_DST_OPCODE(R300_VE_ADD) |
  193.                            R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
  194.                            R300_PVS_DST_OFFSET(0) |
  195.                            R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y |
  196.                            R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W));
  197.             OUT_ACCEL_REG (R300_VAP_PVS_VECTOR_DATA_REG,
  198.                       (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  199.                        R300_PVS_SRC_OFFSET(0) |
  200.                        R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) |
  201.                        R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) |
  202.                        R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) |
  203.                        R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W)));
  204.             OUT_ACCEL_REG (R300_VAP_PVS_VECTOR_DATA_REG,
  205.                       (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  206.                        R300_PVS_SRC_OFFSET(0) |
  207.                        R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  208.                        R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  209.                        R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  210.                        R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  211.             OUT_ACCEL_REG (R300_VAP_PVS_VECTOR_DATA_REG,
  212.                       (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  213.                        R300_PVS_SRC_OFFSET(0) |
  214.                        R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  215.                        R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  216.                        R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  217.                        R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  218.  
  219.             /* PVS inst 1 */
  220.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  221.                      (R300_PVS_DST_OPCODE(R300_VE_ADD) |
  222.                       R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
  223.                       R300_PVS_DST_OFFSET(1) |
  224.                       R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y |
  225.                       R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W));
  226.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  227.                      (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  228.                       R300_PVS_SRC_OFFSET(6) |
  229.                       R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) |
  230.                       R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) |
  231.                       R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) |
  232.                       R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W)));
  233.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  234.                      (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  235.                       R300_PVS_SRC_OFFSET(6) |
  236.                       R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  237.                       R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  238.                       R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  239.                       R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  240.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  241.                      (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  242.                       R300_PVS_SRC_OFFSET(6) |
  243.                       R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  244.                       R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  245.                       R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  246.                       R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  247.  
  248.             /* PVS inst 2 */
  249.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  250.                           (R300_PVS_DST_OPCODE(R300_VE_ADD) |
  251.                            R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
  252.                            R300_PVS_DST_OFFSET(2) |
  253.                            R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y |
  254.                            R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W));
  255.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  256.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  257.                            R300_PVS_SRC_OFFSET(7) |
  258.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) |
  259.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) |
  260.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) |
  261.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W)));
  262.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  263.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  264.                            R300_PVS_SRC_OFFSET(7) |
  265.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  266.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  267.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  268.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  269.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  270.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  271.                            R300_PVS_SRC_OFFSET(7) |
  272.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  273.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  274.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  275.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  276.             FINISH_ACCEL();
  277.  
  278.             BEGIN_ACCEL(9);
  279.  
  280.         /* exa no mask instruction
  281.  
  282.              dcl_position   v0
  283.              dcl_texcoord   v1
  284.  
  285.              mov oPos,  v0
  286.              mov oT0,   v1      */
  287.  
  288.  
  289.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, 3);
  290.             /* PVS inst 0 */
  291.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  292.                           (R300_PVS_DST_OPCODE(R300_VE_ADD) |
  293.                            R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
  294.                            R300_PVS_DST_OFFSET(0) |
  295.                            R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y |
  296.                            R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W));
  297.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  298.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  299.                            R300_PVS_SRC_OFFSET(0) |
  300.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) |
  301.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) |
  302.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) |
  303.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W)));
  304.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  305.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  306.                            R300_PVS_SRC_OFFSET(0) |
  307.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  308.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  309.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  310.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  311.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  312.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  313.                            R300_PVS_SRC_OFFSET(0) |
  314.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  315.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  316.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  317.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  318.  
  319.             /* PVS inst 1 */
  320.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  321.                           (R300_PVS_DST_OPCODE(R300_VE_ADD) |
  322.                            R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
  323.                            R300_PVS_DST_OFFSET(1) |
  324.                            R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y |
  325.                            R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W));
  326.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  327.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  328.                            R300_PVS_SRC_OFFSET(6) |
  329.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) |
  330.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) |
  331.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) |
  332.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W)));
  333.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  334.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  335.                            R300_PVS_SRC_OFFSET(6) |
  336.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  337.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  338.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  339.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  340.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  341.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  342.                            R300_PVS_SRC_OFFSET(6) |
  343.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  344.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  345.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  346.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  347.             FINISH_ACCEL();
  348.  
  349.             /* Xv shader program */
  350.             BEGIN_ACCEL(9);
  351.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, 5);
  352.  
  353.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  354.                           (R300_PVS_DST_OPCODE(R300_VE_ADD) |
  355.                            R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
  356.                            R300_PVS_DST_OFFSET(0) |
  357.                            R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y |
  358.                            R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W));
  359.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  360.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  361.                            R300_PVS_SRC_OFFSET(0) |
  362.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) |
  363.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) |
  364.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) |
  365.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W)));
  366.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  367.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  368.                            R300_PVS_SRC_OFFSET(0) |
  369.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  370.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  371.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  372.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  373.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  374.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  375.                            R300_PVS_SRC_OFFSET(0) |
  376.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  377.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  378.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  379.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  380.  
  381.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  382.                           (R300_PVS_DST_OPCODE(R300_VE_ADD) |
  383.                            R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
  384.                            R300_PVS_DST_OFFSET(1) |
  385.                            R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y |
  386.                            R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W));
  387.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  388.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  389.                            R300_PVS_SRC_OFFSET(6) |
  390.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) |
  391.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) |
  392.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) |
  393.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W)));
  394.            OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  395.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  396.                            R300_PVS_SRC_OFFSET(6) |
  397.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  398.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  399.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  400.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  401.             OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG,
  402.                           (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
  403.                            R300_PVS_SRC_OFFSET(6) |
  404.                            R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) |
  405.                            R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) |
  406.                            R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) |
  407.                            R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0)));
  408.             FINISH_ACCEL();
  409.         }
  410.  
  411.         /* pre-load the RS instructions */
  412.         BEGIN_ACCEL(4);
  413.         if (IS_R300_3D) {
  414.             /* rasterizer source table
  415.              * R300_RS_TEX_PTR is the offset into the input RS stream
  416.              * 0,1 are tex0
  417.              * 2,3 are tex1
  418.              */
  419.             OUT_ACCEL_REG(R300_RS_IP_0,
  420.                           (R300_RS_TEX_PTR(0) |
  421.                            R300_RS_SEL_S(R300_RS_SEL_C0) |
  422.                            R300_RS_SEL_T(R300_RS_SEL_C1) |
  423.                            R300_RS_SEL_R(R300_RS_SEL_K0) |
  424.                            R300_RS_SEL_Q(R300_RS_SEL_K1)));
  425.             OUT_ACCEL_REG(R300_RS_IP_1,
  426.                           (R300_RS_TEX_PTR(2) |
  427.                            R300_RS_SEL_S(R300_RS_SEL_C0) |
  428.                            R300_RS_SEL_T(R300_RS_SEL_C1) |
  429.                            R300_RS_SEL_R(R300_RS_SEL_K0) |
  430.                            R300_RS_SEL_Q(R300_RS_SEL_K1)));
  431.             /* src tex */
  432.             /* R300_INST_TEX_ID - select the RS source table entry
  433.              * R300_INST_TEX_ADDR - the FS temp register for the texture data
  434.              */
  435.             OUT_ACCEL_REG(R300_RS_INST_0, (R300_INST_TEX_ID(0) |
  436.                                            R300_RS_INST_TEX_CN_WRITE |
  437.                                            R300_INST_TEX_ADDR(0)));
  438.             /* mask tex */
  439.             OUT_ACCEL_REG(R300_RS_INST_1, (R300_INST_TEX_ID(1) |
  440.                                            R300_RS_INST_TEX_CN_WRITE |
  441.                                            R300_INST_TEX_ADDR(1)));
  442.  
  443.         } else {
  444.             /* rasterizer source table
  445.              * R300_RS_TEX_PTR is the offset into the input RS stream
  446.              * 0,1 are tex0
  447.              * 2,3 are tex1
  448.              */
  449.             OUT_ACCEL_REG(R500_RS_IP_0, ((0 << R500_RS_IP_TEX_PTR_S_SHIFT) |
  450.                                          (1 << R500_RS_IP_TEX_PTR_T_SHIFT) |
  451.                                          (R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT) |
  452.                                          (R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT)));
  453.  
  454.            OUT_ACCEL_REG(R500_RS_IP_1, ((2 << R500_RS_IP_TEX_PTR_S_SHIFT) |
  455.                                          (3 << R500_RS_IP_TEX_PTR_T_SHIFT) |
  456.                                          (R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT) |
  457.                                          (R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT)));
  458.             /* src tex */
  459.             /* R500_RS_INST_TEX_ID_SHIFT - select the RS source table entry
  460.              * R500_RS_INST_TEX_ADDR_SHIFT - the FS temp register for the texture data
  461.              */
  462.           OUT_ACCEL_REG(R500_RS_INST_0, ((0 << R500_RS_INST_TEX_ID_SHIFT) |
  463.                           R500_RS_INST_TEX_CN_WRITE |
  464.                                            (0 << R500_RS_INST_TEX_ADDR_SHIFT)));
  465.             /* mask tex */
  466.           OUT_ACCEL_REG(R500_RS_INST_1, ((1 << R500_RS_INST_TEX_ID_SHIFT) |
  467.                                            R500_RS_INST_TEX_CN_WRITE |
  468.                                            (1 << R500_RS_INST_TEX_ADDR_SHIFT)));
  469.         }
  470.         FINISH_ACCEL();
  471.  
  472.         /* pre-load FS tex instructions */
  473.         if (IS_R300_3D) {
  474.             BEGIN_ACCEL(2);
  475.             /* tex inst for src texture */
  476.            OUT_ACCEL_REG(R300_US_TEX_INST_0,
  477.                           (R300_TEX_SRC_ADDR(0) |
  478.                            R300_TEX_DST_ADDR(0) |
  479.                            R300_TEX_ID(0) |
  480.                            R300_TEX_INST(R300_TEX_INST_LD)));
  481.  
  482.             /* tex inst for mask texture */
  483.           OUT_ACCEL_REG(R300_US_TEX_INST_1,
  484.                           (R300_TEX_SRC_ADDR(1) |
  485.                            R300_TEX_DST_ADDR(1) |
  486.                            R300_TEX_ID(1) |
  487.                            R300_TEX_INST(R300_TEX_INST_LD)));
  488.             FINISH_ACCEL();
  489.         }
  490.  
  491.         if (IS_R300_3D) {
  492.             BEGIN_ACCEL(8);
  493.             OUT_ACCEL_REG(R300_US_CONFIG, (0 << R300_NLEVEL_SHIFT) | R300_FIRST_TEX);
  494.             OUT_ACCEL_REG(R300_US_CODE_ADDR_0,
  495.                           (R300_ALU_START(0) |
  496.                            R300_ALU_SIZE(0) |
  497.                            R300_TEX_START(0) |
  498.                            R300_TEX_SIZE(0)));
  499.             OUT_ACCEL_REG(R300_US_CODE_ADDR_1,
  500.                           (R300_ALU_START(0) |
  501.                            R300_ALU_SIZE(0) |
  502.                            R300_TEX_START(0) |
  503.                            R300_TEX_SIZE(0)));
  504.             OUT_ACCEL_REG(R300_US_CODE_ADDR_2,
  505.                           (R300_ALU_START(0) |
  506.                            R300_ALU_SIZE(0) |
  507.                            R300_TEX_START(0) |
  508.                            R300_TEX_SIZE(0)));
  509.         } else {
  510.             BEGIN_ACCEL(6);
  511.             OUT_ACCEL_REG(R300_US_CONFIG, R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO);
  512.             OUT_ACCEL_REG(R500_US_FC_CTRL, 0);
  513.         }
  514.         OUT_ACCEL_REG(R300_US_W_FMT, 0);
  515.         OUT_ACCEL_REG(R300_US_OUT_FMT_1, (R300_OUT_FMT_UNUSED |
  516.                                           R300_OUT_FMT_C0_SEL_BLUE |
  517.                                           R300_OUT_FMT_C1_SEL_GREEN |
  518.                                           R300_OUT_FMT_C2_SEL_RED |
  519.                                           R300_OUT_FMT_C3_SEL_ALPHA));
  520.         OUT_ACCEL_REG(R300_US_OUT_FMT_2, (R300_OUT_FMT_UNUSED |
  521.                                           R300_OUT_FMT_C0_SEL_BLUE |
  522.                                           R300_OUT_FMT_C1_SEL_GREEN |
  523.                                           R300_OUT_FMT_C2_SEL_RED |
  524.                                           R300_OUT_FMT_C3_SEL_ALPHA));
  525.         OUT_ACCEL_REG(R300_US_OUT_FMT_3, (R300_OUT_FMT_UNUSED |
  526.                                           R300_OUT_FMT_C0_SEL_BLUE |
  527.                                           R300_OUT_FMT_C1_SEL_GREEN |
  528.                                           R300_OUT_FMT_C2_SEL_RED |
  529.                                           R300_OUT_FMT_C3_SEL_ALPHA));
  530.         FINISH_ACCEL();
  531.  
  532.  
  533.         BEGIN_ACCEL(3);
  534.         OUT_ACCEL_REG(R300_FG_DEPTH_SRC, 0);
  535.         OUT_ACCEL_REG(R300_FG_FOG_BLEND, 0);
  536.         OUT_ACCEL_REG(R300_FG_ALPHA_FUNC, 0);
  537.         FINISH_ACCEL();
  538.  
  539.         BEGIN_ACCEL(13);
  540.         OUT_ACCEL_REG(R300_RB3D_ABLENDCNTL, 0);
  541.         OUT_ACCEL_REG(R300_RB3D_ZSTENCILCNTL, 0);
  542.         OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE);
  543.         OUT_ACCEL_REG(R300_RB3D_BW_CNTL, 0);
  544.         OUT_ACCEL_REG(R300_RB3D_ZCNTL, 0);
  545.         OUT_ACCEL_REG(R300_RB3D_ZTOP, 0);
  546.         OUT_ACCEL_REG(R300_RB3D_ROPCNTL, 0);
  547.  
  548.         OUT_ACCEL_REG(R300_RB3D_AARESOLVE_CTL, 0);
  549.         OUT_ACCEL_REG(R300_RB3D_COLOR_CHANNEL_MASK, (R300_BLUE_MASK_EN |
  550.                                                      R300_GREEN_MASK_EN |
  551.                                                      R300_RED_MASK_EN |
  552.                                                      R300_ALPHA_MASK_EN));
  553.         OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D);
  554.         OUT_ACCEL_REG(R300_RB3D_CCTL, 0);
  555.         OUT_ACCEL_REG(R300_RB3D_DITHER_CTL, 0);
  556.         OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D);
  557.         FINISH_ACCEL();
  558.  
  559.         BEGIN_ACCEL(7);
  560.         OUT_ACCEL_REG(R300_SC_EDGERULE, 0xA5294A5);
  561.         OUT_ACCEL_REG(R300_SC_SCISSOR0, ((0 << R300_SCISSOR_X_SHIFT) |
  562.                                          (0 << R300_SCISSOR_Y_SHIFT)));
  563.         OUT_ACCEL_REG(R300_SC_SCISSOR1, ((8191 << R300_SCISSOR_X_SHIFT) |
  564.                                          (8191 << R300_SCISSOR_Y_SHIFT)));
  565.  
  566.         if (IS_R300_3D) {
  567.             /* clip has offset 1440 */
  568.             OUT_ACCEL_REG(R300_SC_CLIP_0_A, ((1088 << R300_CLIP_X_SHIFT) |
  569.                                          (1088 << R300_CLIP_Y_SHIFT)));
  570.             OUT_ACCEL_REG(R300_SC_CLIP_0_B, (((1080 + 2920) << R300_CLIP_X_SHIFT) |
  571.                                          ((1080 + 2920) << R300_CLIP_Y_SHIFT)));
  572.         } else {
  573.             OUT_ACCEL_REG(R300_SC_CLIP_0_A, ((0 << R300_CLIP_X_SHIFT) |
  574.                                          (0 << R300_CLIP_Y_SHIFT)));
  575.             OUT_ACCEL_REG(R300_SC_CLIP_0_B, ((4080 << R300_CLIP_X_SHIFT) |
  576.                                          (4080 << R300_CLIP_Y_SHIFT)));
  577.         }
  578.         OUT_ACCEL_REG(R300_SC_CLIP_RULE, 0xAAAA);
  579.         OUT_ACCEL_REG(R300_SC_SCREENDOOR, 0xffffff);
  580.         FINISH_ACCEL();
  581.     } else if ((info->ChipFamily == CHIP_FAMILY_RV250) ||
  582.              (info->ChipFamily == CHIP_FAMILY_RV280) ||
  583.              (info->ChipFamily == CHIP_FAMILY_RS300) ||
  584.                (info->ChipFamily == CHIP_FAMILY_R200)) {
  585.  
  586.         BEGIN_ACCEL(7);
  587.         if (info->ChipFamily == CHIP_FAMILY_RS300) {
  588.             OUT_ACCEL_REG(R200_SE_VAP_CNTL_STATUS, RADEON_TCL_BYPASS);
  589.         } else {
  590.             OUT_ACCEL_REG(R200_SE_VAP_CNTL_STATUS, 0);
  591.         }
  592.         OUT_ACCEL_REG(R200_PP_CNTL_X, 0);
  593.         OUT_ACCEL_REG(R200_PP_TXMULTI_CTL_0, 0);
  594.         OUT_ACCEL_REG(R200_SE_VTX_STATE_CNTL, 0);
  595.         OUT_ACCEL_REG(R200_RE_CNTL, 0x0);
  596.         OUT_ACCEL_REG(R200_SE_VTE_CNTL, 0);
  597.         OUT_ACCEL_REG(R200_SE_VAP_CNTL, R200_VAP_FORCE_W_TO_ONE |
  598.                         R200_VAP_VF_MAX_VTX_NUM);
  599.         FINISH_ACCEL();
  600.  
  601.         BEGIN_ACCEL(5);
  602.         OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0);
  603.         OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, 0x07ff07ff);
  604.         OUT_ACCEL_REG(RADEON_AUX_SC_CNTL, 0);
  605.         OUT_ACCEL_REG(RADEON_RB3D_PLANEMASK, 0xffffffff);
  606.         OUT_ACCEL_REG(RADEON_SE_CNTL, (RADEON_DIFFUSE_SHADE_GOURAUD |
  607.                                        RADEON_BFACE_SOLID |
  608.                                        RADEON_FFACE_SOLID |
  609.                                        RADEON_VTX_PIX_CENTER_OGL |
  610.                                        RADEON_ROUND_MODE_ROUND |
  611.                                        RADEON_ROUND_PREC_4TH_PIX));
  612.         FINISH_ACCEL();
  613.     } else {
  614.         BEGIN_ACCEL(2);
  615.         if ((info->ChipFamily == CHIP_FAMILY_RADEON) ||
  616.             (info->ChipFamily == CHIP_FAMILY_RV200))
  617.             OUT_ACCEL_REG(RADEON_SE_CNTL_STATUS, 0);
  618.         else
  619.             OUT_ACCEL_REG(RADEON_SE_CNTL_STATUS, RADEON_TCL_BYPASS);
  620.         OUT_ACCEL_REG(RADEON_SE_COORD_FMT,
  621.             RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
  622.                                            RADEON_VTX_ST0_NONPARAMETRIC |
  623.                                            RADEON_VTX_ST1_NONPARAMETRIC |
  624.                                            RADEON_TEX1_W_ROUTING_USE_W0);
  625.         FINISH_ACCEL();
  626.  
  627.         BEGIN_ACCEL(5);
  628.         OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0);
  629.         OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, 0x07ff07ff);
  630.         OUT_ACCEL_REG(RADEON_AUX_SC_CNTL, 0);
  631.         OUT_ACCEL_REG(RADEON_RB3D_PLANEMASK, 0xffffffff);
  632.         OUT_ACCEL_REG(RADEON_SE_CNTL, (RADEON_DIFFUSE_SHADE_GOURAUD |
  633.                                        RADEON_BFACE_SOLID |
  634.                                        RADEON_FFACE_SOLID |
  635.                                        RADEON_VTX_PIX_CENTER_OGL |
  636.                                        RADEON_ROUND_MODE_ROUND |
  637.                                        RADEON_ROUND_PREC_4TH_PIX));
  638.         FINISH_ACCEL();
  639.     }
  640.  
  641.  
  642.     safe_sti(ifl);
  643.  
  644. }
  645.  
  646.