Jelajahi Sumber

empaqueto desempaqueto empaqueto desempaqueto empaqueto

David 11 tahun lalu
induk
melakukan
deecb91134
1 mengubah file dengan 41 tambahan dan 11 penghapusan
  1. 41 11
      filtros/blur_asm.asm

+ 41 - 11
filtros/blur_asm.asm

@@ -21,6 +21,9 @@ extern convulcion_matrix
 
 ; Mascaras y esas cosas
 section .data
+	;copiar: db 0,1,2,3,0,1,2,3,3,2,1,0,3,2,1,0;0,1,2,3,0,1,2,3
+	copiar: db 0,1,2,3
+	;copiar: db 3,2,1,0,3,2,1,0,3,2,1,0,3,2,1,0
 
 section .text
 ;void blur_asm    (
@@ -100,6 +103,8 @@ blur_asm:
 	add filas_faltan, radius
 	inc filas_faltan ; 2r+1 filas
 	mov tmp_src, src
+	pxor xmm10,xmm10
+	movdqu xmm11,[copiar]
 	.loopInterno:
 		mov col_faltan, radius
 		add col_faltan, radius
@@ -112,7 +117,7 @@ blur_asm:
 		.loopFila:
 
 			;levanto 4px
-	    	movdqu xmm2, [src]          ; Cargo 4 pix de la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
+			movdqu xmm2, [src]          ; Cargo 4 pix de la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
 			cmp col_faltan, 3
 			jg .normal ;no qiuero shiftear
 			je .tres ;quiero borrar 3 elem
@@ -126,18 +131,38 @@ blur_asm:
 			psrldq xmm2, 3;ok, borre los que no queria
 		.normal:
 			;desempaqueto cada pixel a un registro (cada elem como dword)
-			punpcklbw xmm2, xmm3
-			punpckhbw xmm2, xmm4
-
-			punpcklwd xmm3, xmm5
-			punpckhwd xmm3, xmm6
-			punpcklwd xmm4, xmm7
-			punpckhwd xmm4, xmm8
+			pxor xmm3,xmm3
+			pxor xmm4,xmm4
+			pxor xmm5,xmm5
+			pxor xmm6,xmm6
+			pxor xmm7,xmm7
+			pxor xmm8,xmm8
+			pxor xmm11,xmm11
+
+			movdqa xmm12, xmm2 ;salvo
+			punpcklbw xmm3, xmm2 ;pix a,b
+			punpckhbw xmm4, xmm2 ;pix c,d
+
+			punpcklwd xmm5, xmm3 ;pix a
+			punpckhwd xmm6, xmm3 ;pix b
+			punpcklwd xmm7, xmm4 ;pix c
+			punpckhwd xmm8, xmm4 ;pix d
 
 			;cargo 1 elem de matriz como single
 			movd xmm9, [matriz]
-			;TODO lo clono con mascara a los 4 elem del xmm
-
+			;pshufb xmm9, xmm11;lo clono con mascara a los 4 elem del xmm
+			pshufd xmm9, xmm9, 0x00
+
+
+			psrldq xmm5, 3
+			psrldq xmm6, 3
+			psrldq xmm7, 3
+			psrldq xmm8, 3
+			;int2float
+			CVTDQ2PS xmm5,xmm5 
+			CVTDQ2PS xmm6,xmm6 
+			CVTDQ2PS xmm7,xmm7 
+			CVTDQ2PS xmm8,xmm8 
 			;multiplico cada pixel por su coeficiente de la matriz(float)
 			mulps xmm5, xmm9
 			mulps xmm6, xmm9
@@ -180,8 +205,13 @@ blur_asm:
 		;faltan >0 filas? jmp .loopInterno
 
 .sumar:
+	xor rax,rax
 .write:
-    movdqu [dst], xmm10          ; Escribo en el destino
+	;packusdw xmm10,xmm10
+	;packuswb xmm10,xmm10
+	CVTPS2DQ xmm10,xmm10
+	;me quedan 4 int dword<=255, necesito moverlos a 4byte en la parte baja
+	movd [dst], xmm10          ; Escribo en el destino
 .endLoop:
 	mov src, tmp_src
     add src, PIXEL_SIZE      ; Incremento 1 pixel