Subversion Repositories Kolibri OS

Rev

Rev 5922 | Rev 6111 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ; Макрос DRAW_LINE имеет параметр code, от которого зависит
  3. ; будет ли включен код или объявлены переменные.
  4. ; В версии на C++ параметра code нет, потому что там переменные
  5. ; можно ставить в любом месте функции, в asm версии такое не проходит.
  6. ;
  7.  
  8. INTERP_Z equ 1
  9.  
  10. macro DRAW_INIT
  11. {
  12. if TGL_FEATURE_RENDER_BITS eq 24
  13.         mov ecx,[p2]
  14.         mov eax,[ecx+offs_zbup_r]
  15.         mov [colorR],ah ;colorR=p2.r>>8
  16.         mov eax,[ecx+offs_zbup_g]
  17.         mov [colorG],ah ;colorG=p2.g>>8
  18.         mov eax,[ecx+offs_zbup_b]
  19.         mov [colorB],ah ;colorB=p2.b>>8
  20. ;else
  21. ;  color=RGB_TO_PIXEL(p2->r,p2->g,p2->b);
  22. end if
  23. }
  24.  
  25. macro PUT_PIXEL _a
  26. {
  27. local .end_0
  28.         mov eax,[z]
  29.         shr eax, ZB_POINT_Z_FRAC_BITS
  30.         mov [zz],eax
  31.         mov ebx,[pz]
  32.         cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a])
  33.         jl .end_0
  34.                 ;edi = pp
  35.                 mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
  36. if TGL_FEATURE_RENDER_BITS eq 24
  37.                 mov cl,[colorR]
  38.                 mov ch,[colorG]
  39.                 mov word[edi+3*_a],cx
  40.                 mov cl,[colorB]
  41.                 mov byte[edi+3*_a +2],cl
  42. ;else
  43. ;      pp[_a]=color;
  44. end if
  45.         .end_0:
  46.         mov eax,[dzdx]
  47.         add [z],eax
  48. }
  49.  
  50. align 4
  51. proc ZB_fillTriangleFlat, zb:dword, p0:dword, p1:dword, p2:dword
  52. locals
  53. if TGL_FEATURE_RENDER_BITS eq 24
  54.         colorR db ?
  55.         colorG db ?
  56.         colorB db ? ;unsigned char
  57. else
  58.         color dd ? ;int
  59. end if
  60. include 'ztriangle.inc'
  61.  
  62. ;
  63. ; Smooth filled triangle.
  64. ; The code below is very tricky :)
  65. ;
  66.  
  67. INTERP_Z equ 1
  68. INTERP_RGB equ 1
  69.  
  70. macro DRAW_INIT
  71. {
  72. if TGL_FEATURE_RENDER_BITS eq 16
  73. ;  _drgbdx=((drdx / (1<<6)) << 22) & 0xFFC00000;
  74. ;  _drgbdx|=(dgdx / (1<<5)) & 0x000007FF;
  75. ;  _drgbdx|=((dbdx / (1<<7)) << 12) & 0x001FF000;
  76. end if
  77. }
  78.  
  79. macro PUT_PIXEL _a
  80. {
  81. local .end_0
  82.         mov eax,[z]
  83.         shr eax,ZB_POINT_Z_FRAC_BITS
  84.         mov [zz],eax
  85.         mov ebx,[pz]
  86.         cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a])
  87.         jl .end_0
  88.                 ;edi = pp
  89.                 mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
  90. if TGL_FEATURE_RENDER_BITS eq 24
  91.                 mov ecx,[og1]
  92.                 mov eax,[or1]
  93.                 mov cl,ah
  94.                 mov word[edi+3*_a],cx
  95.                 mov eax,[ob1]
  96.                 mov byte[edi+3*_a +2],ah
  97. end if
  98. if TGL_FEATURE_RENDER_BITS eq 16
  99. ;      tmp=rgb & 0xF81F07E0;
  100. ;      pp[_a]=tmp | (tmp >> 16);
  101. ;else
  102. ;      pp[_a] = RGB_TO_PIXEL(or1, og1, ob1);
  103. end if
  104.         .end_0:
  105.         mov eax,[dzdx]
  106.         add [z],eax
  107. if TGL_FEATURE_RENDER_BITS eq 16
  108. ;    rgb=(rgb+drgbdx) & ( ~ 0x00200800);
  109. end if
  110. if TGL_FEATURE_RENDER_BITS <> 16
  111.         mov eax,[dgdx]
  112.         add [og1],eax
  113.         mov eax,[drdx]
  114.         add [or1],eax
  115.         mov eax,[dbdx]
  116.         add [ob1],eax
  117. end if
  118. }
  119.  
  120. macro DRAW_LINE code
  121. {
  122. local .cycle_0
  123. local .cycle_1
  124. if TGL_FEATURE_RENDER_BITS eq 16
  125. if code eq 0
  126.         tmp dd ? ;uint
  127.         rgb dd ? ;uint
  128.         drgbdx dd ? ;uint
  129. end if
  130. if code eq 1
  131.         mov eax,[x2]
  132.         sar eax,16
  133.         sub eax,[x1]
  134.         mov [n],eax ;n = (x2 >> 16) - x1
  135.         mov edi,[pp1]
  136.         add edi,[x1] ;pp = pp1 + x1
  137.         mov eax,[pz1]
  138.         add eax,[x1]
  139.         mov [pz],eax ;pz = pz1 + x1
  140.         mov eax,[z1]
  141.         mov [z],eax ;z = z1
  142.         mov eax,[r1]
  143.         shl eax,16
  144.         and eax,0xFFC00000
  145.         mov [rgb],eax ;rgb = (r1 << 16) & 0xFFC00000
  146.         mov eax,[g1]
  147.         shr eax,5
  148.         and eax,0x000007FF
  149.         or [rgb],eax ;rgb |= (g1 >> 5) & 0x000007FF
  150.         mov eax,[b1]
  151.         shl eax,5
  152.         and eax,0x001FF000
  153.         or [rgb],eax ;rgb |= (b1 << 5) & 0x001FF000
  154.         mov eax,[_drgbdx]
  155.         mov [drgbdx],eax ;drgbdx = _drgbdx
  156. align 4
  157.         .cycle_0: ;while (n>=3)
  158.         cmp dword[n],3
  159.         jl .cycle_1
  160.                 PUT_PIXEL 0
  161.                 PUT_PIXEL 1
  162.                 PUT_PIXEL 2
  163.                 PUT_PIXEL 3
  164.                 add dword[pz],8
  165.                 add edi,4*3
  166.                 sub [n],4
  167.         jmp .cycle_0
  168.         .cycle_1: ;while (n>=0)
  169.         cmp dword[n],0
  170.         jl .cycle_1_end
  171.                 PUT_PIXEL 0
  172.                 add dword[pz],2
  173.                 add edi,3
  174.                 dec dword[n]
  175.                 jmp .cycle_1
  176.         .cycle_1_end:
  177. end if
  178. end if
  179. }
  180.  
  181. align 4
  182. proc ZB_fillTriangleSmooth, zb:dword, p0:dword, p1:dword, p2:dword
  183. locals
  184. if TGL_FEATURE_RENDER_BITS eq 16
  185.         _drgbdx dd ? ;int
  186. end if
  187. include 'ztriangle.inc'
  188.  
  189. align 4
  190. proc ZB_setTexture uses eax ebx, zb:dword, texture:dword
  191.         mov eax,[zb]
  192.         mov ebx,[texture]
  193.         mov dword[eax+offs_zbuf_current_texture],ebx
  194.         ret
  195. endp
  196.  
  197. INTERP_Z equ 1
  198. INTERP_ST equ 1
  199.  
  200. macro DRAW_INIT
  201. {
  202.         mov eax,[zb]
  203.         mov eax,[eax+offs_zbuf_current_texture]
  204.         mov [texture],eax
  205. }
  206.  
  207. macro PUT_PIXEL _a
  208. {
  209. local .end_0
  210.         mov eax,[z]
  211.         shr eax,ZB_POINT_Z_FRAC_BITS
  212.         mov [zz],eax
  213.         mov ebx,[pz]
  214.         cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a])
  215.         jl .end_0
  216.                 ;edi = pp
  217.                 mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
  218. if TGL_FEATURE_RENDER_BITS eq 24
  219.                 mov ebx,[t]
  220.                 and ebx,0x3fc00000
  221.                 or ebx,[s]
  222.                 shr ebx,14
  223.                 imul ebx,3
  224.                 add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
  225.                 mov ax,word[ebx]
  226.                 mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
  227.                 mov al,byte[ebx+2]
  228.                 mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
  229. else
  230. ;       pp[_a]=texture[((t & 0x3FC00000) | s) >> 14];
  231. end if
  232.         .end_0:
  233.         mov eax,[dzdx]
  234.         add [z],eax
  235.         mov eax,[dsdx]
  236.         add [s],eax
  237.         mov eax,[dtdx]
  238.         add [t],eax
  239. }
  240.  
  241. align 4
  242. proc ZB_fillTriangleMapping, zb:dword, p0:dword, p1:dword, p2:dword
  243. locals
  244.         texture dd ? ;PIXEL*
  245. include 'ztriangle.inc'
  246.  
  247. ;
  248. ; Texture mapping with perspective correction.
  249. ; We use the gradient method to make less divisions.
  250. ; TODO: pipeline the division
  251. ;
  252. if 1
  253.  
  254. INTERP_Z equ 1
  255. INTERP_STZ equ 1
  256.  
  257. NB_INTERP equ 8
  258.  
  259. macro DRAW_INIT
  260. {
  261.         mov eax,[zb]
  262.         mov eax,[eax+offs_zbuf_current_texture]
  263.         mov [texture],eax
  264.         mov dword[esp-4],NB_INTERP
  265.         fild dword[esp-4]
  266.         fild dword[dzdx]
  267.         fst dword[fdzdx] ;fdzdx = (float)dzdx
  268.         fmul st0,st1
  269.         fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx
  270.         fld dword[fdzdx]
  271.         fmul st0,st1
  272.         fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx
  273.         fmul dword[dtzdx]
  274.         fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx
  275. }
  276.  
  277. macro PUT_PIXEL _a
  278. {
  279. local .end_0
  280.         mov eax,[z]
  281.         shr eax,ZB_POINT_Z_FRAC_BITS
  282.         mov [zz],eax
  283.         mov ebx,[pz]
  284.         cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a])
  285.         jl .end_0
  286.                 ;edi = pp
  287.                 mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
  288. if TGL_FEATURE_RENDER_BITS eq 24
  289.                 mov ebx,[t]
  290.                 and ebx,0x3fc00000
  291.                 mov eax,[s]
  292.                 and eax,0x003fc000
  293.                 or ebx,eax
  294.                 shr ebx,14
  295.                 imul ebx,3
  296.                 add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
  297.                 mov ax,word[ebx]
  298.                 mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
  299.                 mov al,byte[ebx+2]
  300.                 mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
  301. else
  302. ;       pp[_a]=*(PIXEL *)((char *)texture+
  303. ;           (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
  304. end if
  305.         .end_0:
  306.         mov eax,[dzdx]
  307.         add [z],eax
  308.         mov eax,[dsdx]
  309.         add [s],eax
  310.         mov eax,[dtdx]
  311.         add [t],eax
  312. }
  313.  
  314. DRAW_LINE_M equ 1
  315.  
  316. macro DRAW_LINE code
  317. {
  318. if TGL_FEATURE_RENDER_BITS eq 24
  319. if code eq 0
  320.         s dd ? ;uint
  321.         t dd ? ;uint
  322.         n1 dd ? ;int - длинна горизонтальной линии в пикселях
  323.         dsdx dd ? ;int
  324.         dtdx dd ? ;int
  325.         fz dd ? ;float
  326.         zinv dd ? ;float
  327. end if
  328. if code eq 1
  329.         mov eax,[x2]
  330.         sar eax,16
  331.         sub eax,[x1]
  332.         mov [n1],eax ;n1 = (x2 >> 16) - x1
  333. fld1
  334.         fild dword[z1]
  335.         fst dword[fz] ;fz = (float)z1
  336.         ;fld1
  337.         fdivp
  338.         fstp dword[zinv] ;zinv = 1.0 / fz
  339.         mov edi,[x1]
  340.         imul edi,PSZB
  341.         add edi,[pp1] ;pp = (pp1 + x1 * PSZB)
  342.         mov eax,[pz1]
  343.         add eax,[x1]
  344.         mov [pz],eax ;pz = pz1 + x1
  345.         mov eax,[z1]
  346.         mov [z],eax ;z = z1
  347.         mov eax,[sz1]
  348.         mov [s_z],eax ;sz = sz1
  349.         mov eax,[tz1]
  350.         mov [t_z],eax ;tz = tz1
  351. align 4
  352.         .cycle_2: ;while (n1>=(NB_INTERP-1))
  353.         cmp dword[n1],NB_INTERP-1
  354.         jl .cycle_2_end
  355.                 fld dword[zinv]
  356.                 fld st0
  357.                 fmul dword[s_z] ;ss = (sz * zinv)
  358.                 fist dword[s] ;s = (int) ss
  359.                 fmul dword[fdzdx]
  360.                 fchs
  361.                 fadd dword[dszdx]
  362.                 fmul dword[zinv]
  363.                 fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
  364.                 fmul dword[t_z] ;tt = (tz * zinv)
  365.                 fist dword[t] ;t = (int) tt
  366.                 fmul dword[fdzdx]
  367.                 fchs
  368.                 fadd dword[dtzdx]
  369.                 fmul dword[zinv]
  370.                 fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
  371. fld1
  372.                 fld dword[fz]
  373.                 fadd dword[fndzdx]
  374.                 fst dword[fz] ;fz += fndzdx
  375.                 ;fld1
  376.                 fdivp
  377.                 fstp dword[zinv] ;zinv = 1.0 / fz
  378.                 PUT_PIXEL 0
  379.                 PUT_PIXEL 1
  380.                 PUT_PIXEL 2
  381.                 PUT_PIXEL 3
  382.                 PUT_PIXEL 4
  383.                 PUT_PIXEL 5
  384.                 PUT_PIXEL 6
  385.                 PUT_PIXEL 7
  386.                 add dword[pz],2*NB_INTERP ;pz += NB_INTERP
  387.                 add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB
  388.                 sub dword[n1],NB_INTERP ;n1 -= NB_INTERP
  389.                 fld dword[ndszdx]
  390.                 fadd dword[s_z]
  391.                 fstp dword[s_z] ;s_z += ndszdx
  392.                 fld dword[ndtzdx]
  393.                 fadd dword[t_z]
  394.                 fstp dword[t_z] ;tz += ndtzdx
  395.                 jmp .cycle_2
  396.         .cycle_2_end:
  397.         fld dword[zinv]
  398.         fld st0
  399.         fmul dword[s_z] ;ss = (sz * zinv)
  400.         fist dword[s] ;s = (int) ss
  401.         fmul dword[fdzdx]
  402.         fchs
  403.         fadd dword[dszdx]
  404.         fmul dword[zinv]
  405.         fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
  406.         fmul dword[t_z] ;tt = (tz * zinv)
  407.         fist dword[t] ;t = (int) tt
  408.         fmul dword[fdzdx]
  409.         fchs
  410.         fadd dword[dtzdx]
  411.         fmul dword[zinv]
  412.         fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
  413. align 4
  414.         .cycle_3: ;while (n1>=0)
  415.         cmp dword[n1],0
  416.         jl .cycle_3_end
  417.                 PUT_PIXEL 0
  418.                 add dword[pz],2 ;pz += 1
  419.                 add edi,PSZB ;pp += PSZB
  420.                 dec dword[n1]
  421.                 jmp .cycle_3
  422.         .cycle_3_end:
  423. end if
  424. end if
  425. }
  426.  
  427. align 4
  428. proc ZB_fillTriangleMappingPerspective, zb:dword, p0:dword, p1:dword, p2:dword
  429. locals
  430.         texture dd ? ;PIXEL *
  431.         fdzdx dd ? ;float
  432.         fndzdx dd ? ;float
  433.         ndszdx dd ? ;float
  434.         ndtzdx dd ? ;float
  435. include 'ztriangle.inc'
  436.  
  437. end if
  438.  
  439. if 0
  440.  
  441. ; slow but exact version (only there for reference, incorrect for 24
  442. ; bits)
  443.  
  444. INTERP_Z equ 1
  445. INTERP_STZ equ 1
  446.  
  447. macro DRAW_INIT
  448. {
  449.         mov eax,[zb]
  450.         mov eax,[eax+offs_zbuf_current_texture]
  451.         mov [texture],eax
  452. }
  453.  
  454. macro PUT_PIXEL _a
  455. {
  456. local .end_0
  457. ;   int s,t;
  458.         mov eax,[z]
  459.         shr eax,ZB_POINT_Z_FRAC_BITS
  460.         mov [zz],eax
  461.         mov ebx,[pz]
  462.         cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a])
  463.         jl .end_0
  464.                 ;edi = pp
  465.                 mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
  466.                 fild dword[z]
  467.                 fld dword[s_z]
  468.                 fdiv st0,st1
  469.                 ;fistp dword[...s...] ;s = (int) (s_z / (float) z)
  470. ;       t= (int) (t_z / (float) z);
  471. ;       pp[_a]=texture[((t & 0x3FC00000) | s) >> 14];
  472.         .end_0:
  473.         mov eax,[dzdx]
  474.         add [z],eax
  475.         fld dword[dszdx]
  476.         fadd dword[s_z]
  477.         fstp dword[s_z]
  478.         fld dword,[dtzdx]
  479.         fadd dword[t_z]
  480.         fstp dword[t_z]
  481. }
  482.  
  483. align 4
  484. proc ZB_fillTriangleMappingPerspective, zb:dword, p0:dword, p1:dword, p2:dword
  485. locals
  486.         texture dd ? ;PIXEL*
  487. include 'ztriangle.inc'
  488.  
  489. end if
  490.