forked from KolibriOS/kolibrios
make background redraw faster
git-svn-id: svn://kolibrios.org@555 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
43bd1e645f
commit
0e12a2072c
@ -282,6 +282,7 @@ RAMDISK equ (OS_BASE+0x0100000)
|
|||||||
RAMDISK_FAT equ (OS_BASE+0x0280000)
|
RAMDISK_FAT equ (OS_BASE+0x0280000)
|
||||||
FLOPPY_FAT equ (OS_BASE+0x0282000)
|
FLOPPY_FAT equ (OS_BASE+0x0282000)
|
||||||
|
|
||||||
|
BgrAuxTable equ (OS_BASE+0x0298000)
|
||||||
; unused?
|
; unused?
|
||||||
SB16_Status equ (OS_BASE+0x02B0000)
|
SB16_Status equ (OS_BASE+0x02B0000)
|
||||||
|
|
||||||
|
@ -640,6 +640,7 @@ no_lib_load:
|
|||||||
|
|
||||||
mov esi,boot_bgr
|
mov esi,boot_bgr
|
||||||
call boot_log
|
call boot_log
|
||||||
|
call init_background
|
||||||
call calculatebackground
|
call calculatebackground
|
||||||
|
|
||||||
; RESERVE SYSTEM IRQ'S JA PORT'S
|
; RESERVE SYSTEM IRQ'S JA PORT'S
|
||||||
|
@ -176,7 +176,9 @@
|
|||||||
; 0x80280000 -> 281FFF ramdisk fat
|
; 0x80280000 -> 281FFF ramdisk fat
|
||||||
; 0x80282000 -> 283FFF floppy fat
|
; 0x80282000 -> 283FFF floppy fat
|
||||||
;
|
;
|
||||||
; 0x80284000 -> 29FFFF free (112 Kb)
|
; 0x80284000 -> 297FFF free (80 Kb)
|
||||||
|
;
|
||||||
|
; 0x80298000 -> 29ffff auxiliary table for background smoothing code
|
||||||
;
|
;
|
||||||
; 0x802A0000 -> 2B00ff wav device data
|
; 0x802A0000 -> 2B00ff wav device data
|
||||||
; 0x802C0000 -> 2C3fff button info
|
; 0x802C0000 -> 2C3fff button info
|
||||||
|
@ -921,55 +921,53 @@ vesa20_drawbackground_stretch:
|
|||||||
add esi, edx
|
add esi, edx
|
||||||
lea esi, [esi*3]
|
lea esi, [esi*3]
|
||||||
add esi, [img_background]
|
add esi, [img_background]
|
||||||
mov ecx, eax
|
push eax
|
||||||
push eax edx esi
|
push edx
|
||||||
; 3) Loop through redraw rectangle and copy background data
|
push esi
|
||||||
|
; 3) Smooth horizontal
|
||||||
|
bgr_resmooth0:
|
||||||
|
mov ecx, [esp+8]
|
||||||
|
mov edx, [esp+4]
|
||||||
|
mov esi, [esp]
|
||||||
|
push edi
|
||||||
|
mov edi, bgr_cur_line
|
||||||
|
call smooth_line
|
||||||
|
cmp dword [BgrDataHeight], 1
|
||||||
|
jz bgr.no2nd
|
||||||
|
bgr_resmooth1:
|
||||||
|
mov ecx, [esp+8+4]
|
||||||
|
mov edx, [esp+4+4]
|
||||||
|
mov esi, [esp+4]
|
||||||
|
add esi, [BgrDataWidth]
|
||||||
|
add esi, [BgrDataWidth]
|
||||||
|
add esi, [BgrDataWidth]
|
||||||
|
mov edi, bgr_next_line
|
||||||
|
call smooth_line
|
||||||
|
bgr.no2nd:
|
||||||
|
pop edi
|
||||||
|
sdp3:
|
||||||
|
xor esi, esi
|
||||||
|
mov ecx, [esp+12]
|
||||||
|
; 4) Loop through redraw rectangle and copy background data
|
||||||
; Registers meaning:
|
; Registers meaning:
|
||||||
; edx:ecx = x * 2^32 * (BgrDataWidth-1) / (ScreenWidth-1)
|
; esi = offset in current line, edi -> output
|
||||||
; esi -> bgr memory, edi -> output
|
|
||||||
; ebp = offset in WinMapAddress
|
; ebp = offset in WinMapAddress
|
||||||
; dword [esp] = saved esi
|
; dword [esp] = offset in bgr data
|
||||||
; dword [esp+4] = saved edx
|
; qword [esp+4] = x * 2^32 * (BgrDataWidth-1) / (ScreenWidth-1)
|
||||||
; dword [esp+8] = saved ecx
|
|
||||||
; qword [esp+12] = y * 2^32 * (BgrDataHeight-1) / (ScreenHeight-1)
|
; qword [esp+12] = y * 2^32 * (BgrDataHeight-1) / (ScreenHeight-1)
|
||||||
; dword [esp+20] = x
|
; dword [esp+20] = x
|
||||||
; dword [esp+24] = y
|
; dword [esp+24] = y
|
||||||
; precalculated constants:
|
; precalculated constants:
|
||||||
; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
|
; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
|
||||||
; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
|
; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
|
||||||
sdp3:
|
sdp3a:
|
||||||
cmp [ebp+WinMapAddress], byte 1
|
cmp [ebp+WinMapAddress], byte 1
|
||||||
jnz snbgp
|
jnz snbgp
|
||||||
mov al, [esi+2]
|
mov eax, [bgr_cur_line+esi]
|
||||||
shl eax, 16
|
|
||||||
mov ax, [esi]
|
|
||||||
test ecx, ecx
|
test ecx, ecx
|
||||||
jz @f
|
|
||||||
mov ebx, [esi+2]
|
|
||||||
shr ebx, 8
|
|
||||||
call overlapping_of_points
|
|
||||||
@@:
|
|
||||||
cmp dword [esp+12], 0
|
|
||||||
jz .novert
|
jz .novert
|
||||||
mov ebx, [BgrDataWidth]
|
mov ebx, [bgr_next_line+esi]
|
||||||
lea ebx, [ebx*3]
|
call [overlapping_of_points_ptr]
|
||||||
add ebx, esi
|
|
||||||
push eax
|
|
||||||
mov al, [ebx+2]
|
|
||||||
shl eax, 16
|
|
||||||
mov ax, [ebx]
|
|
||||||
test ecx, ecx
|
|
||||||
jz .nohorz
|
|
||||||
mov ebx, [ebx+2]
|
|
||||||
shr ebx, 8
|
|
||||||
call overlapping_of_points
|
|
||||||
.nohorz:
|
|
||||||
mov ebx, eax
|
|
||||||
pop eax
|
|
||||||
push ecx
|
|
||||||
mov ecx, [esp+4+12]
|
|
||||||
call overlapping_of_points
|
|
||||||
pop ecx
|
|
||||||
.novert:
|
.novert:
|
||||||
mov [edi], ax
|
mov [edi], ax
|
||||||
shr eax, 16
|
shr eax, 16
|
||||||
@ -981,15 +979,9 @@ snbgp:
|
|||||||
mov eax, [esp+20]
|
mov eax, [esp+20]
|
||||||
add eax, 1
|
add eax, 1
|
||||||
mov [esp+20], eax
|
mov [esp+20], eax
|
||||||
|
add esi, 4
|
||||||
cmp eax, [draw_data+32+RECT.right]
|
cmp eax, [draw_data+32+RECT.right]
|
||||||
ja sdp4
|
jbe sdp3a
|
||||||
add ecx, [esp+36]
|
|
||||||
mov eax, edx
|
|
||||||
adc edx, [esp+40]
|
|
||||||
sub eax, edx
|
|
||||||
lea eax, [eax*3]
|
|
||||||
sub esi, eax
|
|
||||||
jmp sdp3
|
|
||||||
sdp4:
|
sdp4:
|
||||||
; next y
|
; next y
|
||||||
mov ebx, [esp+24]
|
mov ebx, [esp+24]
|
||||||
@ -1016,16 +1008,24 @@ sdp4:
|
|||||||
add [esp+12], eax
|
add [esp+12], eax
|
||||||
mov eax, [esp+16]
|
mov eax, [esp+16]
|
||||||
adc [esp+16], ebx
|
adc [esp+16], ebx
|
||||||
pop esi edx ecx
|
sub eax, [esp+16]
|
||||||
push ecx edx
|
mov ebx, eax
|
||||||
sub eax, [esp+16-4]
|
|
||||||
lea eax, [eax*3]
|
lea eax, [eax*3]
|
||||||
imul eax, [BgrDataWidth]
|
imul eax, [BgrDataWidth]
|
||||||
sub esi, eax
|
sub [esp], eax
|
||||||
push esi
|
|
||||||
mov eax, [draw_data+32+RECT.left]
|
mov eax, [draw_data+32+RECT.left]
|
||||||
mov [esp+20], eax
|
mov [esp+20], eax
|
||||||
jmp sdp3
|
test ebx, ebx
|
||||||
|
jz sdp3
|
||||||
|
cmp ebx, -1
|
||||||
|
jnz bgr_resmooth0
|
||||||
|
push edi
|
||||||
|
mov esi, bgr_next_line
|
||||||
|
mov edi, bgr_cur_line
|
||||||
|
mov ecx, [ScreenWidth]
|
||||||
|
inc ecx
|
||||||
|
rep movsd
|
||||||
|
jmp bgr_resmooth1
|
||||||
sdpdone:
|
sdpdone:
|
||||||
add esp, 44
|
add esp, 44
|
||||||
popad
|
popad
|
||||||
@ -1033,7 +1033,44 @@ sdpdone:
|
|||||||
call VGA_drawbackground
|
call VGA_drawbackground
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
uglobal
|
||||||
|
align 4
|
||||||
|
bgr_cur_line rd 1280 ; maximum width of screen
|
||||||
|
bgr_next_line rd 1280
|
||||||
|
endg
|
||||||
|
|
||||||
|
smooth_line:
|
||||||
|
mov al, [esi+2]
|
||||||
|
shl eax, 16
|
||||||
|
mov ax, [esi]
|
||||||
|
test ecx, ecx
|
||||||
|
jz @f
|
||||||
|
mov ebx, [esi+2]
|
||||||
|
shr ebx, 8
|
||||||
|
call [overlapping_of_points_ptr]
|
||||||
|
@@:
|
||||||
|
stosd
|
||||||
|
mov eax, [esp+20+8]
|
||||||
|
add eax, 1
|
||||||
|
mov [esp+20+8], eax
|
||||||
|
cmp eax, [draw_data+32+RECT.right]
|
||||||
|
ja @f
|
||||||
|
add ecx, [esp+36+8]
|
||||||
|
mov eax, edx
|
||||||
|
adc edx, [esp+40+8]
|
||||||
|
sub eax, edx
|
||||||
|
lea eax, [eax*3]
|
||||||
|
sub esi, eax
|
||||||
|
jmp smooth_line
|
||||||
|
@@:
|
||||||
|
mov eax, [draw_data+32+RECT.left]
|
||||||
|
mov [esp+20+8], eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 16
|
||||||
overlapping_of_points:
|
overlapping_of_points:
|
||||||
|
if 0
|
||||||
|
; this version of procedure works, but is slower than next version
|
||||||
push ecx edx
|
push ecx edx
|
||||||
mov edx, eax
|
mov edx, eax
|
||||||
push esi
|
push esi
|
||||||
@ -1063,3 +1100,78 @@ overlapping_of_points:
|
|||||||
ror eax, 16
|
ror eax, 16
|
||||||
pop ecx
|
pop ecx
|
||||||
ret
|
ret
|
||||||
|
else
|
||||||
|
push ecx edx
|
||||||
|
mov edx, eax
|
||||||
|
push esi
|
||||||
|
shr ecx, 26
|
||||||
|
mov esi, ecx
|
||||||
|
mov ecx, ebx
|
||||||
|
shl esi, 9
|
||||||
|
movzx ebx, dl
|
||||||
|
movzx eax, cl
|
||||||
|
sub eax, ebx
|
||||||
|
movzx ebx, dh
|
||||||
|
add dl, [BgrAuxTable+(eax+0x100)+esi]
|
||||||
|
movzx eax, ch
|
||||||
|
sub eax, ebx
|
||||||
|
add dh, [BgrAuxTable+(eax+0x100)+esi]
|
||||||
|
ror ecx, 16
|
||||||
|
ror edx, 16
|
||||||
|
movzx eax, cl
|
||||||
|
movzx ebx, dl
|
||||||
|
sub eax, ebx
|
||||||
|
add dl, [BgrAuxTable+(eax+0x100)+esi]
|
||||||
|
pop esi
|
||||||
|
mov eax, edx
|
||||||
|
pop edx
|
||||||
|
ror eax, 16
|
||||||
|
pop ecx
|
||||||
|
ret
|
||||||
|
end if
|
||||||
|
|
||||||
|
iglobal
|
||||||
|
align 4
|
||||||
|
overlapping_of_points_ptr dd overlapping_of_points
|
||||||
|
endg
|
||||||
|
|
||||||
|
init_background:
|
||||||
|
mov edi, BgrAuxTable
|
||||||
|
xor edx, edx
|
||||||
|
.loop2:
|
||||||
|
mov eax, edx
|
||||||
|
shl eax, 8
|
||||||
|
neg eax
|
||||||
|
mov ecx, 0x200
|
||||||
|
.loop1:
|
||||||
|
mov byte [edi], ah
|
||||||
|
inc edi
|
||||||
|
add eax, edx
|
||||||
|
loop .loop1
|
||||||
|
add dl, 4
|
||||||
|
jnz .loop2
|
||||||
|
test byte [cpu_caps+(CAPS_MMX/8)], CAPS_MMX mod 8
|
||||||
|
jz @f
|
||||||
|
mov [overlapping_of_points_ptr], overlapping_of_points_mmx
|
||||||
|
@@:
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 16
|
||||||
|
overlapping_of_points_mmx:
|
||||||
|
movd mm0, eax
|
||||||
|
movd mm4, eax
|
||||||
|
movd mm1, ebx
|
||||||
|
pxor mm2, mm2
|
||||||
|
punpcklbw mm0, mm2
|
||||||
|
punpcklbw mm1, mm2
|
||||||
|
psubw mm1, mm0
|
||||||
|
movd mm3, ecx
|
||||||
|
psrld mm3, 24
|
||||||
|
packuswb mm3, mm3
|
||||||
|
packuswb mm3, mm3
|
||||||
|
pmullw mm1, mm3
|
||||||
|
psrlw mm1, 8
|
||||||
|
packuswb mm1, mm2
|
||||||
|
paddb mm4, mm1
|
||||||
|
movd eax, mm4
|
||||||
|
ret
|
||||||
|
Loading…
Reference in New Issue
Block a user