forked from KolibriOS/kolibrios
fix rev 6100 and optimize
git-svn-id: svn://kolibrios.org@6101 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
2cff28512d
commit
b096a68434
@ -685,17 +685,15 @@ pushad
|
|||||||
stdcall specbuf_get_buffer, edx, dword[ecx+offs_mate_shininess_i], dword[ecx+offs_mate_shininess]
|
stdcall specbuf_get_buffer, edx, dword[ecx+offs_mate_shininess_i], dword[ecx+offs_mate_shininess]
|
||||||
mov edi,eax ;edi = specbuf
|
mov edi,eax ;edi = specbuf
|
||||||
mov dword[idx],SPECULAR_BUFFER_SIZE ;idx = SPECULAR_BUFFER_SIZE
|
mov dword[idx],SPECULAR_BUFFER_SIZE ;idx = SPECULAR_BUFFER_SIZE
|
||||||
fld1
|
|
||||||
fcomp
|
;idx = (int)(dot_spec*SPECULAR_BUFFER_SIZE)
|
||||||
fstsw ax
|
fimul dword[idx]
|
||||||
fild dword[idx]
|
|
||||||
sahf
|
|
||||||
jbe @f ;if(dot_spec < 1.0) st0=1 st1=dot_spec
|
|
||||||
fmul st0,st1 ;idx *= dot_spec
|
|
||||||
@@:
|
|
||||||
fistp dword[idx]
|
fistp dword[idx]
|
||||||
ffree st0 ;dot_spec
|
;if (idx > SPECULAR_BUFFER_SIZE) idx = SPECULAR_BUFFER_SIZE
|
||||||
fincstp
|
cmp dword[idx],SPECULAR_BUFFER_SIZE
|
||||||
|
jle @f
|
||||||
|
mov dword[idx],SPECULAR_BUFFER_SIZE
|
||||||
|
@@:
|
||||||
shl dword[idx],2
|
shl dword[idx],2
|
||||||
add edi,dword[idx]
|
add edi,dword[idx]
|
||||||
fld dword[edi+offs_spec_buf] ;dot_spec = specbuf.buf[idx]
|
fld dword[edi+offs_spec_buf] ;dot_spec = specbuf.buf[idx]
|
||||||
|
@ -8,21 +8,23 @@ locals
|
|||||||
val dd ? ;float
|
val dd ? ;float
|
||||||
f_inc dd ? ;float
|
f_inc dd ? ;float
|
||||||
endl
|
endl
|
||||||
mov dword[val],0.0f
|
|
||||||
mov dword[f_inc],SPECULAR_BUFFER_SIZE
|
mov dword[f_inc],SPECULAR_BUFFER_SIZE
|
||||||
fld1
|
|
||||||
fidiv dword[f_inc]
|
|
||||||
fstp dword[f_inc] ;f_inc = 1.0f/SPECULAR_BUFFER_SIZE
|
|
||||||
mov ebx,[buf]
|
mov ebx,[buf]
|
||||||
add ebx,offs_spec_buf
|
add ebx,offs_spec_buf
|
||||||
|
mov dword[ebx],0.0 ;buf.buf[0] = 0.0
|
||||||
xor ecx,ecx
|
xor ecx,ecx
|
||||||
|
inc ecx
|
||||||
|
fld dword[shininess] ;сначала берем y
|
||||||
|
fld1
|
||||||
|
fidiv dword[f_inc]
|
||||||
|
fst dword[f_inc] ;f_inc = 1.0f/SPECULAR_BUFFER_SIZE
|
||||||
|
fst dword[val]
|
||||||
align 4
|
align 4
|
||||||
.cycle_0: ;for (i = 0; i <= SPECULAR_BUFFER_SIZE; i++)
|
.cycle_0: ;for (i = 1; i <= SPECULAR_BUFFER_SIZE; i++)
|
||||||
cmp ecx,SPECULAR_BUFFER_SIZE
|
cmp ecx,SPECULAR_BUFFER_SIZE
|
||||||
jg @f
|
jg @f
|
||||||
;Вычисляем x^y
|
;Вычисляем x^y
|
||||||
fld dword[val] ;сначала берем y
|
|
||||||
fld dword[shininess] ;а потом x
|
|
||||||
fyl2x ;Стек FPU теперь содержит: st0=z=y*log2(x):
|
fyl2x ;Стек FPU теперь содержит: st0=z=y*log2(x):
|
||||||
;Теперь считаем 2**z:
|
;Теперь считаем 2**z:
|
||||||
fld st0 ;Создаем еще одну копию z
|
fld st0 ;Создаем еще одну копию z
|
||||||
@ -35,15 +37,22 @@ align 4
|
|||||||
fxch st1
|
fxch st1
|
||||||
fstp st ;Результат остается на вершине стека st0
|
fstp st ;Результат остается на вершине стека st0
|
||||||
|
|
||||||
fstp dword[ebx] ;buf.buf[i] = pow(val, shininess)
|
|
||||||
add ebx,4
|
add ebx,4
|
||||||
|
fstp dword[ebx] ;buf.buf[i] = pow(val, shininess)
|
||||||
|
ffree st0 ;испорченный shininess
|
||||||
|
fincstp
|
||||||
|
|
||||||
|
fld dword[shininess] ;сначала берем y
|
||||||
fld dword[val]
|
fld dword[val]
|
||||||
fadd dword[f_inc]
|
fadd dword[f_inc]
|
||||||
fstp dword[val] ;val += f_inc
|
fst dword[val] ;val += f_inc
|
||||||
inc ecx
|
inc ecx
|
||||||
jmp .cycle_0
|
jmp .cycle_0
|
||||||
@@:
|
@@:
|
||||||
|
ffree st0 ;val
|
||||||
|
fincstp
|
||||||
|
ffree st0 ;shininess
|
||||||
|
fincstp
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user