فهرست منبع

Merge branch 'master' of ssh://git.davidventura.com.ar:443/david/orga2-simd

Fabian 11 سال پیش
والد
کامیت
bada6289b3
2فایلهای تغییر یافته به همراه31 افزوده شده و 36 حذف شده
  1. 25 32
      filtros/blur_asm.asm
  2. 6 4
      filtros/blur_c.c

+ 25 - 32
filtros/blur_asm.asm

@@ -103,7 +103,7 @@ blur_asm:
 	inc filas_faltan ; 2r+1 filas
 	mov tmp_src, src
 	pxor xmm10,xmm10
-	mov matriz, r15
+	mov matriz, r15 ;voy al inicio de la matriz
 	.loopInterno:
 		mov col_faltan, radius
 		add col_faltan, radius
@@ -112,22 +112,20 @@ blur_asm:
 		mov rax,PIXEL_SIZE
 		mul col_faltan ;destruyo rdx
 		mov col_faltan, rax
-		mov rdx, basura ;salvo rdx
+		mov rdx, basura ;recupero rdx
 		.loopFila:
+			movdqu xmm2, [src] ;levanto 4px
+			cmp col_faltan, 3*PIXEL_SIZE
+			jg .normal ;no quiero shiftear
+			je .tres ;quiero borrar 1 elem
 
-			;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)|......|
-			cmp col_faltan, 3
-			jg .normal ;no qiuero shiftear
-			je .tres ;quiero borrar 3 elem
-			;quiero borrar 1 elem
-
-		.uno:
-			;shift (4-faltantes) bytes
-			psrldq xmm2, 1;ok, borre los que no queria
+			;quiero borrar 3 elem
+			pslldq xmm2, 3;ok, borre los que no queria
+			psrldq xmm2, 3;ok, borre los que no queria
 			jmp .normal
 		.tres:
-			psrldq xmm2, 3;ok, borre los que no queria
+			pslldq xmm2, 1;ok, borre los que no queria
+			psrldq xmm2, 1;ok, borre los que no queria
 		.normal:
 			;desempaqueto cada pixel a un registro (cada elem como dword)
 			pxor xmm3,xmm3
@@ -145,15 +143,15 @@ blur_asm:
 			punpcklwd xmm7, xmm4 ;pix c
 			punpckhwd xmm8, xmm4 ;pix d
 
-			;cargo 1 elem de matriz como single
-			movdqu xmm9, [matriz] ;traje 4 float.
+			;cargo 4 elem de matriz como single
+			movdqu xmm9, [matriz] 
 
-			pshufd xmm11, xmm9, 0x00
-			pshufd xmm12, xmm9, 0x55
-			pshufd xmm13, xmm9, 0xAA
-			pshufd xmm14, xmm9, 0xFF
+			pshufd xmm11, xmm9, 0x00 ;primer elem en las 4 pos
+			pshufd xmm12, xmm9, 0x55 ;2do...
+			pshufd xmm13, xmm9, 0xAA ;3ro..
+			pshufd xmm14, xmm9, 0xFF ;4to..
 
-			;acomodo los registros
+			;acomodo los registros (byte->dword)
 			psrldq xmm5, 3
 			psrldq xmm6, 3
 			psrldq xmm7, 3
@@ -182,35 +180,30 @@ blur_asm:
 			cmp col_faltan, 0
 			jle .finFilaInterna
 
-			cmp col_faltan, 4
-			jle .retroceder ;me faltan entre 0 y 4 pixeles, retrocedo suficiente para que me falten 4 exactos
-
+			cmp col_faltan, 4*PIXEL_SIZE ;me faltan entre 0 y 4 pixeles, retrocedo suficiente para que me falten 4 exactos
+			jle .retroceder
 
     		add src, PIXEL_SIZE*4      ; Incremento 4 pixeles
-			add matriz, PIXEL_SIZE*4
+			add matriz, PIXEL_SIZE*4   ; me faltan al menos 4 pixeles en esta fila 
 			jmp .loopFila
 
 		.retroceder:
 			lea src, [src-(4-col_faltan)]
+			lea matriz, [matriz-(4-col_faltan)] ;retrocedo 1-3
 			jmp .loopFila
 			
 		.finFilaInterna:
 			dec filas_faltan
 			cmp filas_faltan, 0
-			je .sumar
+			je .write
 
 			jmp .loopInterno
 
-		;avanzo ancho img - (2k+1 pix)
-		;faltan >0 filas? jmp .loopInterno
-
-.sumar:
-	xor rax,rax
 .write:
 	CVTPS2DQ xmm10,xmm10 ;me quedan 4 int (dword) <=255, necesito moverlos a 4byte en la parte baja
 	movdqu xmm11, [cosa] ;uso xmm11 de tmp
-	pshufb xmm10, xmm11
-	movd [dst], xmm10          ; Escribo en el destino
+	pshufb xmm10, xmm11	 ;dejo 0000,0000,0000,rgba
+	movd [dst], xmm10    ; Escribo en el destino
 .endLoop:
 	mov src, tmp_src
     add src, PIXEL_SIZE      ; Incremento 1 pixel

+ 6 - 4
filtros/blur_c.c

@@ -53,11 +53,13 @@ void blur_c(unsigned char *src, unsigned char *dst, int cols, int filas, float s
 
 			// Recorro la submatriz que le corresponde al pixel actual y hago las multiplicaciones
 			for(y=-r; y<=r; y++) {
-				for(x=-r; x<=r; x++) {
+				for(x=-r; x<=r+1; x++) {
 					//En C nunca veo la ultima posicion (0) de la matriz
-					tmp[0]+=src_matrix[i+y][4*(x+j)+0] * mc[matPos];
-					tmp[1]+=src_matrix[i+y][4*(x+j)+1] * mc[matPos];
-					tmp[2]+=src_matrix[i+y][4*(x+j)+2] * mc[matPos];
+					if (x<=r){
+						tmp[0]+=src_matrix[i+y][4*(x+j)+0] * mc[matPos];
+						tmp[1]+=src_matrix[i+y][4*(x+j)+1] * mc[matPos];
+						tmp[2]+=src_matrix[i+y][4*(x+j)+2] * mc[matPos];
+					}
 					matPos++;	// Aumento una posición en la matriz de convulsion
 				}
 			}