ATI R500: clip output

git-svn-id: svn://kolibrios.org@734 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2008-02-12 10:36:05 +00:00
parent cf23a1ccc7
commit 86aea3e746
2 changed files with 359 additions and 50 deletions

View File

@ -1311,6 +1311,11 @@ ati_io dd ?
if R500_HW2D if R500_HW2D
__xmin rd 1
__xmax rd 1
__ymin rd 1
__ymax rd 1
rhd RHD rhd RHD
end if end if

View File

@ -67,6 +67,9 @@ if 0
end if end if
D1GRPH_PITCH equ 0x6120 D1GRPH_PITCH equ 0x6120
D1GRPH_X_END equ 0x6134
D1GRPH_Y_END equ 0x6138
R5XX_DATATYPE_ARGB8888 equ 6 R5XX_DATATYPE_ARGB8888 equ 6
@ -364,64 +367,46 @@ proc R5xx2DReset
R5XX_SOFT_RESET_E2 or R5XX_SOFT_RESET_RB R5XX_SOFT_RESET_E2 or R5XX_SOFT_RESET_RB
mov [tmp], eax mov [tmp], eax
; RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, tmp);
wrr R5XX_RBBM_SOFT_RESET, eax wrr R5XX_RBBM_SOFT_RESET, eax
; RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET);
rdr ebx, R5XX_RBBM_SOFT_RESET rdr ebx, R5XX_RBBM_SOFT_RESET
and eax, not (R5XX_SOFT_RESET_CP or R5XX_SOFT_RESET_HI or \ and eax, not (R5XX_SOFT_RESET_CP or R5XX_SOFT_RESET_HI or \
R5XX_SOFT_RESET_SE or R5XX_SOFT_RESET_RE or \ R5XX_SOFT_RESET_SE or R5XX_SOFT_RESET_RE or \
R5XX_SOFT_RESET_PP or R5XX_SOFT_RESET_E2 or \ R5XX_SOFT_RESET_PP or R5XX_SOFT_RESET_E2 or \
R5XX_SOFT_RESET_RB) R5XX_SOFT_RESET_RB)
; RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, tmp);
wrr R5XX_RBBM_SOFT_RESET, eax wrr R5XX_RBBM_SOFT_RESET, eax
; RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET);
rdr ebx, R5XX_RBBM_SOFT_RESET rdr ebx, R5XX_RBBM_SOFT_RESET
; RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, save);
mov eax, [save] mov eax, [save]
wrr R5XX_RBBM_SOFT_RESET, eax wrr R5XX_RBBM_SOFT_RESET, eax
; RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET);
rdr ebx, R5XX_RBBM_SOFT_RESET rdr ebx, R5XX_RBBM_SOFT_RESET
; R5xx2DFlush(rhdPtr->scrnIndex);
call R5xx2DFlush call R5xx2DFlush
; Soft resetting HDP thru RBBM_SOFT_RESET register can cause some ; Soft resetting HDP thru RBBM_SOFT_RESET register can cause some
; unexpected behaviour on some machines. Here we use ; unexpected behaviour on some machines. Here we use
; R5XX_HOST_PATH_CNTL to reset it. ; R5XX_HOST_PATH_CNTL to reset it.
; save = RHDRegRead(rhdPtr, R5XX_HOST_PATH_CNTL);
rdr edx, R5XX_HOST_PATH_CNTL rdr edx, R5XX_HOST_PATH_CNTL
; tmp = RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET);
rdr ebx, R5XX_RBBM_SOFT_RESET rdr ebx, R5XX_RBBM_SOFT_RESET
; tmp |= R5XX_SOFT_RESET_CP | R5XX_SOFT_RESET_HI | R5XX_SOFT_RESET_E2;
or ebx, R5XX_SOFT_RESET_CP or R5XX_SOFT_RESET_HI or R5XX_SOFT_RESET_E2 or ebx, R5XX_SOFT_RESET_CP or R5XX_SOFT_RESET_HI or R5XX_SOFT_RESET_E2
; RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, tmp);
wrr R5XX_RBBM_SOFT_RESET, ebx wrr R5XX_RBBM_SOFT_RESET, ebx
; RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET);
rdr eax, R5XX_RBBM_SOFT_RESET rdr eax, R5XX_RBBM_SOFT_RESET
; RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, 0);
wrr R5XX_RBBM_SOFT_RESET, 0 wrr R5XX_RBBM_SOFT_RESET, 0
; tmp = RHDRegRead(rhdPtr, R5XX_RB3D_DSTCACHE_MODE);
rdr ebx, R5XX_RB3D_DSTCACHE_MODE rdr ebx, R5XX_RB3D_DSTCACHE_MODE
; RHDRegWrite(rhdPtr, R5XX_RB3D_DSTCACHE_MODE, tmp | (1 << 17)); /* FIXME */
or ebx, (1 shl 17) or ebx, (1 shl 17)
wrr R5XX_RB3D_DSTCACHE_MODE, ebx wrr R5XX_RB3D_DSTCACHE_MODE, ebx
; RHDRegWrite(rhdPtr, R5XX_HOST_PATH_CNTL, save | R5XX_HDP_SOFT_RESET);
lea eax, [edx+R5XX_HDP_SOFT_RESET] lea eax, [edx+R5XX_HDP_SOFT_RESET]
wrr R5XX_HOST_PATH_CNTL, eax wrr R5XX_HOST_PATH_CNTL, eax
; RHDRegRead(rhdPtr, R5XX_HOST_PATH_CNTL);
rdr ebx, R5XX_HOST_PATH_CNTL rdr ebx, R5XX_HOST_PATH_CNTL
; RHDRegWrite(rhdPtr, R5XX_HOST_PATH_CNTL, save);
wrr R5XX_HOST_PATH_CNTL, edx wrr R5XX_HOST_PATH_CNTL, edx
ret ret
@ -435,72 +420,54 @@ R5xx2DSetup:
; random bogus DMA in case we inadvertently trigger the engine ; random bogus DMA in case we inadvertently trigger the engine
; in the wrong place (happened). ; in the wrong place (happened).
; R5xxFIFOWaitLocal(rhdPtr->scrnIndex, 2);
mov eax, 2 mov eax, 2
call R5xxFIFOWaitLocal call R5xxFIFOWaitLocal
; RHDRegWrite(rhdPtr, R5XX_DST_PITCH_OFFSET, TwoDInfo->dst_pitch_offset);
mov eax, [rhd.dst_pitch_offset] mov eax, [rhd.dst_pitch_offset]
wrr R5XX_DST_PITCH_OFFSET, eax wrr R5XX_DST_PITCH_OFFSET, eax
; RHDRegWrite(rhdPtr, R5XX_SRC_PITCH_OFFSET, TwoDInfo->dst_pitch_offset);
wrr R5XX_SRC_PITCH_OFFSET, eax wrr R5XX_SRC_PITCH_OFFSET, eax
; R5xxFIFOWaitLocal(rhdPtr->scrnIndex, 1);
mov eax, 1 mov eax, 1
call R5xxFIFOWaitLocal call R5xxFIFOWaitLocal
; RHDRegMask(rhdPtr, R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN);
rmask R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN rmask R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN
; RHDRegWrite(rhdPtr, R5XX_SURFACE_CNTL, TwoDInfo->surface_cntl);
mov eax, [rhd.surface_cntl] mov eax, [rhd.surface_cntl]
wrr R5XX_SURFACE_CNTL, eax wrr R5XX_SURFACE_CNTL, eax
; R5xxFIFOWaitLocal(rhdPtr->scrnIndex, 1);
mov eax, 1 mov eax, 1
call R5xxFIFOWaitLocal call R5xxFIFOWaitLocal
; RHDRegWrite(rhdPtr, R5XX_DEFAULT_SC_BOTTOM_RIGHT,
; R5XX_DEFAULT_SC_RIGHT_MAX | R5XX_DEFAULT_SC_BOTTOM_MAX);
wrr R5XX_DEFAULT_SC_BOTTOM_RIGHT,\ wrr R5XX_DEFAULT_SC_BOTTOM_RIGHT,\
(R5XX_DEFAULT_SC_RIGHT_MAX or R5XX_DEFAULT_SC_BOTTOM_MAX) (R5XX_DEFAULT_SC_RIGHT_MAX or R5XX_DEFAULT_SC_BOTTOM_MAX)
; R5xxFIFOWaitLocal(rhdPtr->scrnIndex, 1);
mov eax, 1 mov eax, 1
call R5xxFIFOWaitLocal call R5xxFIFOWaitLocal
; RHDRegWrite(rhdPtr, R5XX_DP_GUI_MASTER_CNTL, TwoDInfo->control |
; R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR);
mov eax, [rhd.control] mov eax, [rhd.control]
or eax, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR) or eax, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
wrr R5XX_DP_GUI_MASTER_CNTL, eax wrr R5XX_DP_GUI_MASTER_CNTL, eax
; R5xxFIFOWaitLocal(rhdPtr->scrnIndex, 5);
mov eax, 5 mov eax, 5
call R5xxFIFOWaitLocal call R5xxFIFOWaitLocal
; RHDRegWrite(rhdPtr, R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF);
wrr R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF wrr R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF
; RHDRegWrite(rhdPtr, R5XX_DP_BRUSH_BKGD_CLR, 0x00000000);
wrr R5XX_DP_BRUSH_BKGD_CLR, 0x00000000 wrr R5XX_DP_BRUSH_BKGD_CLR, 0x00000000
; RHDRegWrite(rhdPtr, R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF);
wrr R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF wrr R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF
; RHDRegWrite(rhdPtr, R5XX_DP_SRC_BKGD_CLR, 0x00000000);
wrr R5XX_DP_SRC_BKGD_CLR, 0x00000000 wrr R5XX_DP_SRC_BKGD_CLR, 0x00000000
; RHDRegWrite(rhdPtr, R5XX_DP_WRITE_MASK, 0xFFFFFFFF);
wrr R5XX_DP_WRITE_MASK, 0xFFFFFFFF wrr R5XX_DP_WRITE_MASK, 0xFFFFFFFF
; R5xx2DIdleLocal(rhdPtr->scrnIndex);
call R5xx2DIdleLocal call R5xx2DIdleLocal
ret ret
align 4 align 4
R5xx2DPreInit: R5xx2DPreInit:
mov [rhd.control], (R5XX_DATATYPE_ARGB8888 shl R5XX_GMC_DST_DATATYPE_SHIFT) or\ mov [rhd.control],\
(R5XX_DATATYPE_ARGB8888 shl R5XX_GMC_DST_DATATYPE_SHIFT) or\
R5XX_GMC_CLR_CMP_CNTL_DIS or R5XX_GMC_DST_PITCH_OFFSET_CNTL R5XX_GMC_CLR_CMP_CNTL_DIS or R5XX_GMC_DST_PITCH_OFFSET_CNTL
mov [rhd.datatype], R5XX_DATATYPE_ARGB8888 mov [rhd.datatype], R5XX_DATATYPE_ARGB8888
@ -513,7 +480,6 @@ R5xx2DPreInit:
shr ebx, 10 shr ebx, 10
or eax, ebx or eax, ebx
; or eax, ((1024*4)/64) shl 22
mov [rhd.dst_pitch_offset], eax mov [rhd.dst_pitch_offset], eax
ret ret
@ -525,6 +491,17 @@ R5xx2DInit:
wrr R5XX_RB3D_CNTL, 0 wrr R5XX_RB3D_CNTL, 0
call R5xx2DReset call R5xx2DReset
call R5xx2DSetup call R5xx2DSetup
rdr eax, D1GRPH_X_END
rdr ebx, D1GRPH_Y_END
dec eax
dec ebx
mov [__xmin], 0 ;set clip
mov [__ymin], 0
mov [__xmax], eax
mov [__ymax], ebx
ret ret
proc R5xxSetupForSolidFill stdcall,color:dword, rop:dword, planemask:dword proc R5xxSetupForSolidFill stdcall,color:dword, rop:dword, planemask:dword
@ -540,19 +517,14 @@ proc R5xxSetupForSolidFill stdcall,color:dword, rop:dword, planemask:dword
mov eax, 4 mov eax, 4
call R5xxFIFOWait call R5xxFIFOWait
; RHDRegWrite(pScrn, R5XX_DP_GUI_MASTER_CNTL, control);
wrr R5XX_DP_GUI_MASTER_CNTL, edx wrr R5XX_DP_GUI_MASTER_CNTL, edx
; RHDRegWrite(pScrn, R5XX_DP_BRUSH_FRGD_CLR, color);
mov eax, [color] mov eax, [color]
wrr R5XX_DP_BRUSH_FRGD_CLR, eax wrr R5XX_DP_BRUSH_FRGD_CLR, eax
; RHDRegWrite(pScrn, R5XX_DP_WRITE_MASK, planemask);
mov ebx, [planemask] mov ebx, [planemask]
wrr R5XX_DP_WRITE_MASK, ebx wrr R5XX_DP_WRITE_MASK, ebx
; RHDRegWrite(pScrn, R5XX_DP_CNTL,
; R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM);
wrr R5XX_DP_CNTL, (R5XX_DST_X_LEFT_TO_RIGHT or R5XX_DST_Y_TOP_TO_BOTTOM) wrr R5XX_DP_CNTL, (R5XX_DST_X_LEFT_TO_RIGHT or R5XX_DST_Y_TOP_TO_BOTTOM)
ret ret
@ -686,6 +658,33 @@ GXcopy equ 3
align 4 align 4
solid_fill: solid_fill:
mov ebx, [esi+FILL.x]
mov ecx, [esi+FILL.y]
mov eax, [esi+FILL.w]
mov edx, [esi+FILL.h]
lea eax, [eax+ebx-1] ;x2
lea edx, [edx+ecx-1] ;y2
push edx ;y2
push eax ;x2
mov eax, esp ;&x2
lea ebx, [esp+4] ;&y2
lea ecx, [esi+FILL.x]
lea edx, [esi+FILL.y]
push ebx ;&y2
push eax ;&x2
push edx ;&y1
push ecx ;&x1
call _BlockClip
add esp, 16
test eax, eax
jnz .exit
mov edx, [R5xxRops+4+GXcopy*8] mov edx, [R5xxRops+4+GXcopy*8]
or edx, [rhd.control] or edx, [rhd.control]
or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR) or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
@ -710,16 +709,41 @@ solid_fill:
mov bx, word [esi+FILL.x] mov bx, word [esi+FILL.x]
wrr R5XX_DST_Y_X, ebx wrr R5XX_DST_Y_X, ebx
mov ecx, [esi+FILL.w] mov ecx, [esp] ;x2
shl ecx, 16 sub ecx, [esi+FILL.x]
mov cx, word [esi+FILL.h] inc ecx ;w
wrr R5XX_DST_WIDTH_HEIGHT, ecx
mov eax, [esp+4] ;y2
sub eax, [esi+FILL.y]
inc eax ;h
; mov ecx, [esi+FILL.w]
shl ecx, 16
; mov cx, word [esi+FILL.h]
mov cx, ax ;w|h
wrr R5XX_DST_WIDTH_HEIGHT, ecx
.exit:
add esp, 8
ret ret
align 4 align 4
solid_line: solid_line:
lea eax, [esi+LINE2P.y2]
lea ebx, [esi+LINE2P.x2]
lea ecx, [esi+LINE2P.y1]
lea edx, [esi+LINE2P.x1]
push eax
push ebx
push ecx
push edx
call _LineClip
add esp, 16
test eax, eax
jnz .exit
mov eax, 7 mov eax, 7
call R5xxFIFOWait call R5xxFIFOWait
@ -747,5 +771,285 @@ solid_line:
shl ecx, 16 shl ecx, 16
mov cx, word [esi+LINE2P.x2] mov cx, word [esi+LINE2P.x2]
wrr R5XX_DST_LINE_END, ecx wrr R5XX_DST_LINE_END, ecx
.exit:
ret
align 4
__L1OutCode:
cmp eax, [__xmin]
mov ecx, edx
setl dl
sal edx, 3
cmp eax, [__xmax]
jle L9
or edx, 4
L9:
cmp ecx, [__ymin]
jge L11
or edx, 1
L11:
cmp ecx, [__ymax]
jle L13
or edx, 2
L13:
movzx eax, dl
ret
align 4
_line_inter:
push ebp
mov ebp, edx
push edi
push esi
push ebx
sub esp, 4
mov ebx, [eax]
mov [esp], eax
mov edx, [esp+24]
mov edi, [ebp]
sub ecx, ebx
mov eax, ecx
sar eax, 31
sub edx, edi
mov esi, eax
xor esi, ecx
sub esi, eax
mov eax, [esp+28]
lea ecx, [edx+edx]
sub eax, ebx
cdq
xor eax, edx
sub eax, edx
imul ecx, eax
test ecx, ecx
jle L17
add ecx, esi
jmp L19
L17:
sub ecx, esi
L19:
lea edx, [esi+esi]
mov eax, ecx
mov ebx, edx
cdq
idiv ebx
lea eax, [eax+edi]
mov [ebp], eax
mov eax, [esp]
mov edx, [esp+28]
mov [eax], edx
pop eax
pop ebx
pop esi
pop edi
pop ebp
ret
_LineClip:
push ebp
push edi
push esi
push ebx
mov eax, [esp+24]
mov ecx, [esp+20]
mov ebp, [esp+28]
mov edi, [esp+32]
mov edx, [eax]
mov eax, [ecx]
call __L1OutCode
mov edx, [edi]
mov bl, al
mov eax, [ebp]
call __L1OutCode
L48:
mov esi, eax
L47:
mov eax, esi
and al, bl
jne L23
mov edx, esi
cmp bl, dl
je L23
test bl, bl
jne L26
movsx eax, dl
test al, 1
je L28
push [__ymin]
mov ecx, [esp+24]
push dword [ecx]
jmp L51
L28:
test al, 2
je L31
push [__ymax]
mov edx, [esp+24]
push dword [edx]
L51:
mov eax, [esp+32]
mov edx, ebp
mov ecx, [eax]
mov eax, edi
jmp L49
L31:
test al, 4
je L33
push [__xmax]
jmp L52
L33:
test al, 8
je L30
push [__xmin]
L52:
mov edx, [esp+28]
push dword [edx]
mov edx, edi
mov eax, [esp+28]
mov ecx, [eax]
mov eax, ebp
L49:
call _line_inter
pop esi
pop eax
L30:
mov edx, [edi]
mov eax, [ebp]
call __L1OutCode
jmp L48
L26:
movsx eax, bl
test al, 1
je L36
push [__ymin]
jmp L53
L36:
test al, 2
je L39
push [__ymax]
L53:
push dword [ebp]
mov ecx, [edi]
mov edx, [esp+28]
mov eax, [esp+32]
jmp L50
L39:
test al, 4
je L41
push [__xmax]
jmp L54
L41:
test al, 8
je L38
push [__xmin]
L54:
push dword [edi]
mov ecx, [ebp]
mov edx, [esp+32]
mov eax, [esp+28]
L50:
call _line_inter
pop edx
pop ecx
L38:
mov ecx, [esp+24]
mov edx, [ecx]
mov ecx, [esp+20]
mov eax, [ecx]
call __L1OutCode
mov bl, al
jmp L47
L23:
pop ebx
movsx eax, al
pop esi
pop edi
pop ebp
ret
align 4
_block_inter:
test cl, 1
push ebx
mov ebx, eax
je L57
mov eax, [__ymin]
jmp L66
L57:
test cl, 2
je L60
mov eax, [__ymax]
L66:
mov [edx], eax
jmp L65
L60:
test cl, 4
je L62
mov eax, [__xmax]
jmp L67
L62:
and cl, 8
je L65
mov eax, [__xmin]
L67:
mov [ebx], eax
L65:
pop ebx
ret
align 4
_BlockClip:
push ebp
push edi
push esi
push ebx
mov eax, [esp+24]
mov ecx, [esp+20]
mov ebp, [esp+28]
mov edi, [esp+32]
mov edx, [eax]
mov eax, [ecx]
call __L1OutCode
mov edx, [edi]
mov ebx, eax
mov eax, [ebp]
call __L1OutCode
L80:
mov esi, eax
L79:
test esi, ebx
jne L70
cmp ebx, esi
je L72
test ebx, ebx
jne L74
mov edx, edi
mov eax, ebp
mov ecx, esi
call _block_inter
mov edx, [edi]
mov eax, [ebp]
call __L1OutCode
jmp L80
L74:
mov edx, [esp+24]
mov ecx, ebx
mov eax, [esp+20]
call _block_inter
mov eax, [esp+24]
mov ecx, [esp+20]
mov edx, [eax]
mov eax, [ecx]
call __L1OutCode
mov ebx, eax
jmp L79
L72:
mov esi, ebx
L70:
mov eax, esi
and eax, ebx
pop ebx
cwde
pop esi
pop edi
pop ebp
ret ret