Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* extrinsrt r1, r2, src, size, dst: replace bits [dst:dst+size) in r1
  2.  *  with bits [src:src+size) in r2
  3.  *
  4.  * bra(n)z annul: no delay slot
  5.  */
  6.  
  7. /* Bitfield version of NVC0_3D_VERTEX_ARRAY_PER_INSTANCE[].
  8.  * Args: size, bitfield
  9.  */
  10. .section #mme9097_per_instance_bf
  11.    parm $r3
  12.    mov $r2 0x0
  13.    maddr 0x1620
  14. loop:
  15.    mov $r1 (add $r1 -1)
  16.    send (extrshl $r3 $r2 0x1 0x0)
  17.    exit branz $r1 #loop
  18.    mov $r2 (add $r2 0x1)
  19.  
  20. /* The comments above the macros describe what they *should* be doing,
  21.  * but we use less functionality for now.
  22.  */
  23.  
  24. /*
  25.  * for (i = 0; i < 8; ++i)
  26.  *    [NVC0_3D_BLEND_ENABLE(i)] = BIT(i of arg);
  27.  *
  28.  * [3428] = arg;
  29.  *
  30.  * if (arg == 0 || [NVC0_3D_MULTISAMPLE_ENABLE] == 0)
  31.  *    [0d9c] = 0;
  32.  * else
  33.  *    [0d9c] = [342c];
  34.  */
  35. .section #mme9097_blend_enables
  36.    maddr 0x14d8
  37.    send (extrinsrt 0x0 $r1 0x0 0x1 0x0)
  38.    send (extrinsrt 0x0 $r1 0x1 0x1 0x0)
  39.    send (extrinsrt 0x0 $r1 0x2 0x1 0x0)
  40.    send (extrinsrt 0x0 $r1 0x3 0x1 0x0)
  41.    send (extrinsrt 0x0 $r1 0x4 0x1 0x0)
  42.    send (extrinsrt 0x0 $r1 0x5 0x1 0x0)
  43.    exit send (extrinsrt 0x0 $r1 0x6 0x1 0x0)
  44.    send (extrinsrt 0x0 $r1 0x7 0x1 0x0)
  45.  
  46. /*
  47.  * uint64 limit = (parm(0) << 32) | parm(1);
  48.  * uint64 start = (parm(2) << 32);
  49.  *
  50.  * if (limit) {
  51.  *    start |= parm(3);
  52.  *    --limit;
  53.  * } else {
  54.  *    start |= 1;
  55.  * }
  56.  *
  57.  * [0x1c04 + (arg & 0xf) * 16 + 0] = (start >> 32) & 0xff;
  58.  * [0x1c04 + (arg & 0xf) * 16 + 4] = start & 0xffffffff;
  59.  * [0x1f00 + (arg & 0xf) * 8 + 0] = (limit >> 32) & 0xff;
  60.  * [0x1f00 + (arg & 0xf) * 8 + 4] = limit & 0xffffffff;
  61.  */
  62. .section #mme9097_vertex_array_select
  63.    parm $r2
  64.    parm $r3
  65.    parm $r4
  66.    parm $r5
  67.    mov $r6 (extrinsrt 0x0 $r1 0x0 0x4 0x2)
  68.    mov $r7 (extrinsrt 0x0 $r1 0x0 0x4 0x1)
  69.    maddr $r6 (add $r6 0x1701)
  70.    send $r4
  71.    send $r5
  72.    maddr $r7 (add $r7 0x17c0)
  73.    exit send $r2
  74.    send $r3
  75.  
  76. /*
  77.  * [GL_POLYGON_MODE_FRONT] = arg;
  78.  *
  79.  * if (BIT(31 of [0x3410]))
  80.  *    [1a24] = 0x7353;
  81.  *
  82.  * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || [NVC0_3D_SP_SELECT(4)] == 0x41)
  83.  *    [02ec] = 0;
  84.  * else
  85.  * if ([GL_POLYGON_MODE_BACK] == GL_LINE || arg == GL_LINE)
  86.  *    [02ec] = BYTE(1 of [0x3410]) << 4;
  87.  * else
  88.  *    [02ec] = BYTE(0 of [0x3410]) << 4;
  89.  */
  90. .section #mme9097_poly_mode_front
  91.    read $r2 0x36c
  92.    read $r3 0x830
  93.    mov $r7 (or $r1 $r2)
  94.    read $r4 0x840
  95.    mov $r2 0x1
  96.    mov $r6 0x60
  97.    mov $r7 (and $r7 $r2)
  98.    braz $r7 #locn_0a_pmf
  99.    maddr 0x36b
  100.    mov $r6 0x200
  101. locn_0a_pmf:
  102.    mov $r7 (or $r3 $r4)
  103.    mov $r7 (and $r7 $r2)
  104.    braz $r7 #locn_0f_pmf
  105.    send $r1
  106.    mov $r6 0x0
  107. locn_0f_pmf:
  108.    exit maddr 0xbb
  109.    send $r6
  110.  
  111. /*
  112.  * [GL_POLYGON_MODE_BACK] = arg;
  113.  *
  114.  * if (BIT(31 of [0x3410]))
  115.  *    [1a24] = 0x7353;
  116.  *
  117.  * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || [NVC0_3D_SP_SELECT(4)] == 0x41)
  118.  *    [02ec] = 0;
  119.  * else
  120.  * if ([GL_POLYGON_MODE_FRONT] == GL_LINE || arg == GL_LINE)
  121.  *    [02ec] = BYTE(1 of [0x3410]) << 4;
  122.  * else
  123.  *    [02ec] = BYTE(0 of [0x3410]) << 4;
  124.  */
  125. /* NOTE: 0x3410 = 0x80002006 by default,
  126.  *  POLYGON_MODE == GL_LINE check replaced by (MODE & 1)
  127.  *  SP_SELECT(i) == (i << 4) | 1 check replaced by SP_SELECT(i) & 1
  128.  */
  129. .section #mme9097_poly_mode_back
  130.    read $r2 0x36b
  131.    read $r3 0x830
  132.    mov $r7 (or $r1 $r2)
  133.    read $r4 0x840
  134.    mov $r2 0x1
  135.    mov $r6 0x60
  136.    mov $r7 (and $r7 $r2)
  137.    braz $r7 #locn_0a_pmb
  138.    maddr 0x36c
  139.    mov $r6 0x200
  140. locn_0a_pmb:
  141.    mov $r7 (or $r3 $r4)
  142.    mov $r7 (and $r7 $r2)
  143.    braz $r7 #locn_0f_pmb
  144.    send $r1
  145.    mov $r6 0x0
  146. locn_0f_pmb:
  147.    exit maddr 0xbb
  148.    send $r6
  149.  
  150. /*
  151.  * [NVC0_3D_SP_SELECT(4)] = arg
  152.  *
  153.  * if BIT(31 of [0x3410]) == 0
  154.  *    [1a24] = 0x7353;
  155.  *
  156.  * if ([NVC0_3D_SP_SELECT(3)] == 0x31 || arg == 0x41)
  157.  *    [02ec] = 0
  158.  * else
  159.  * if (any POLYGON MODE == LINE)
  160.  *    [02ec] = BYTE(1 of [3410]) << 4;
  161.  * else
  162.  *    [02ec] = BYTE(0 of [3410]) << 4; // 02ec valid bits are 0xff1
  163.  */
  164. .section #mme9097_gp_select
  165.    read $r2 0x36b
  166.    read $r3 0x36c
  167.    mov $r7 (or $r2 $r3)
  168.    read $r4 0x830
  169.    mov $r2 0x1
  170.    mov $r6 0x60
  171.    mov $r7 (and $r7 $r2)
  172.    braz $r7 #locn_0a_gs
  173.    maddr 0x840
  174.    mov $r6 0x200
  175. locn_0a_gs:
  176.    mov $r7 (or $r1 $r4)
  177.    mov $r7 (and $r7 $r2)
  178.    braz $r7 #locn_0f_gs
  179.    send $r1
  180.    mov $r6 0x0
  181. locn_0f_gs:
  182.    exit maddr 0xbb
  183.    send $r6
  184.  
  185. /*
  186.  * [NVC0_3D_SP_SELECT(3)] = arg
  187.  *
  188.  * if BIT(31 of [0x3410]) == 0
  189.  *    [1a24] = 0x7353;
  190.  *
  191.  * if (arg == 0x31) {
  192.  *    if (BIT(2 of [0x3430])) {
  193.  *       int i = 15; do { --i; } while(i);
  194.  *       [0x1a2c] = 0;
  195.  *    }
  196.  * }
  197.  *
  198.  * if ([NVC0_3D_SP_SELECT(4)] == 0x41 || arg == 0x31)
  199.  *    [02ec] = 0
  200.  * else
  201.  * if ([any POLYGON_MODE] == GL_LINE)
  202.  *    [02ec] = BYTE(1 of [3410]) << 4;
  203.  * else
  204.  *    [02ec] = BYTE(0 of [3410]) << 4;
  205.  */
  206. .section #mme9097_tep_select
  207.    read $r2 0x36b
  208.    read $r3 0x36c
  209.    mov $r7 (or $r2 $r3)
  210.    read $r4 0x840
  211.    mov $r2 0x1
  212.    mov $r6 0x60
  213.    mov $r7 (and $r7 $r2)
  214.    braz $r7 #locn_0a_ts
  215.    maddr 0x830
  216.    mov $r6 0x200
  217. locn_0a_ts:
  218.    mov $r7 (or $r1 $r4)
  219.    mov $r7 (and $r7 $r2)
  220.    braz $r7 #locn_0f_ts
  221.    send $r1
  222.    mov $r6 0x0
  223. locn_0f_ts:
  224.    exit maddr 0xbb
  225.    send $r6
  226.  
  227. /* NVC0_3D_MACRO_DRAW_ELEMENTS_INDIRECT
  228.  *
  229.  * NOTE: Saves and restores VB_ELEMENT,INSTANCE_BASE.
  230.  * Forcefully sets VERTEX_ID_BASE to the value of VB_ELEMENT_BASE.
  231.  *
  232.  * arg     = mode
  233.  * parm[0] = count
  234.  * parm[1] = instance_count
  235.  * parm[2] = start
  236.  * parm[3] = index_bias
  237.  * parm[4] = start_instance
  238.  */
  239. .section #mme9097_draw_elts_indirect
  240.    parm $r3 /* count */
  241.    parm $r2 /* instance_count */
  242.    parm $r4 maddr 0x5f7 /* INDEX_BATCH_FIRST, start */
  243.    parm $r4 send $r4 /* index_bias, send start */
  244.    braz $r2 #dei_end
  245.    parm $r5 /* start_instance */
  246.    read $r6 0x50d /* VB_ELEMENT_BASE */
  247.    read $r7 0x50e /* VB_INSTANCE_BASE */
  248.    maddr 0x150d /* VB_ELEMENT,INSTANCE_BASE */
  249.    send $r4
  250.    send $r5
  251.    maddr 0x446
  252.    send $r4
  253.    mov $r4 0x1
  254. dei_again:
  255.    maddr 0x586 /* VERTEX_BEGIN_GL */
  256.    send $r1 /* mode */
  257.    maddr 0x5f8 /* INDEX_BATCH_COUNT */
  258.    send $r3 /* count */
  259.    mov $r2 (sub $r2 $r4)
  260.    maddrsend 0x585 /* VERTEX_END_GL */
  261.    branz $r2 #dei_again
  262.    mov $r1 (extrinsrt $r1 $r4 0 1 26) /* set INSTANCE_NEXT */
  263.    maddr 0x150d /* VB_ELEMENT,INSTANCE_BASE */
  264.    send $r6
  265.    send $r7
  266.    exit maddr 0x446
  267.    send $r6
  268. dei_end:
  269.    exit
  270.    nop
  271.  
  272. /* NVC0_3D_MACRO_DRAW_ARRAYS_INDIRECT:
  273.  *
  274.  * NOTE: Saves and restores VB_INSTANCE_BASE.
  275.  *
  276.  * arg     = mode
  277.  * parm[0] = count
  278.  * parm[1] = instance_count
  279.  * parm[2] = start
  280.  * parm[3] = start_instance
  281.  */
  282. .section #mme9097_draw_arrays_indirect
  283.    parm $r2 /* count */
  284.    parm $r3 /* instance_count */
  285.    parm $r4 maddr 0x35d /* VERTEX_BUFFER_FIRST, start */
  286.    parm $r4 send $r4 /* start_instance */
  287.    braz $r3 #dai_end
  288.    read $r6 0x50e /* VB_INSTANCE_BASE */
  289.    maddr 0x50e /* VB_INSTANCE_BASE */
  290.    mov $r5 0x1
  291.    send $r4
  292. dai_again:
  293.    maddr 0x586 /* VERTEX_BEGIN_GL */
  294.    send $r1 /* mode */
  295.    maddr 0x35e /* VERTEX_BUFFER_COUNT */
  296.    send $r2
  297.    mov $r3 (sub $r3 $r5)
  298.    maddrsend 0x585 /* VERTEX_END_GL */
  299.    branz $r3 #dai_again
  300.    mov $r1 (extrinsrt $r1 $r5 0 1 26) /* set INSTANCE_NEXT */
  301.    exit maddr 0x50e /* VB_INSTANCE_BASE to restore */
  302.    send $r6
  303. dai_end:
  304.    exit
  305.    nop
  306.