Parcourir la source

Finalizada la introducción para diff, se mejoraron los comentarios en el código del diff para que queden claros.

Fabian il y a 11 ans
Parent
commit
3dd4ad0853

+ 8 - 9
filtros/diff_asm.asm

@@ -18,8 +18,7 @@ global diff_asm
 
 ; Mascaras y esas cosas
 section .data
-	BLUE_MASK:	db 0,0,0,ALPHA_POS,4,4,4,ALPHA_POS,8,8,8,ALPHA_POS,12,12,12,ALPHA_POS ; TODO: Ver que hacer con el alpha
-	;TODO: Si el alpha viene en 255 entonces puedo poner el mismo byte que vino!!!!
+	BLUE_MASK:	db 0,0,0,ALPHA_POS,4,4,4,ALPHA_POS,8,8,8,ALPHA_POS,12,12,12,ALPHA_POS
 	GREEN_MASK:	db 1,1,1,255,5,5,5,255,9,9,9,255,13,13,13,255
 	RED_MASK:	db 2,2,2,255,6,6,6,255,10,10,10,255,14,14,14,255
 
@@ -62,12 +61,12 @@ diff_asm:
     movdqu xmm2, [src2]         ; Cargo la imagen 2 => xmm1 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
 
 .cuentas:                       ; Resto componente a componente de 4 pixeles de cada imagen
-	movdqu xmm1, xmm0			; Copia para desempaquetar
-	punpcklbw xmm0, xmm15		; Desempaqueto la parte baja de imagen 1
-	punpckhbw xmm1, xmm15		; Desempaqueto parte alta de imagen 1
-	movdqu xmm3, xmm2			; Copia para desempaquetar
-	punpcklbw xmm2, xmm15		; Desempaqueto aprte baja de imagen 1
-	punpckhbw xmm3, xmm15		; Parte alta de imagen 1
+	movdqu xmm1, xmm0			; Copia para desempaquetar la imagen 1
+	punpcklbw xmm0, xmm15		; xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|R(P2)|A(P2)|
+	punpckhbw xmm1, xmm15		; xmm1 = |B(P3)|G(P3)|R(P3)|A(P3)|B(P4)|G(P5)|R(P5)|A(P5)|
+	movdqu xmm3, xmm2			; Copia para desempaquetar la imagen 2
+	punpcklbw xmm2, xmm15		; Desempaqueto aprte baja de imagen 2
+	punpckhbw xmm3, xmm15		; Parte alta de imagen 2
 
 	psubw xmm2, xmm0			; Resto parte baja de cada imagen
     psubw xmm3, xmm1            ; xmm3 = |B(img1_P1) - R(img2_P1)|G(Img1_P1) - Img2_P2|....|
@@ -79,7 +78,7 @@ diff_asm:
 	paddb xmm0, xmm11			; Sumo el canal alpha solitario en xmm0
 	movdqu xmm2, xmm0			; Copias para usar los shuffle
 	movdqu xmm3, xmm0
-	pshufb xmm0, xmm14			; Pongo en cada byte de cada pixel el componente azul
+	pshufb xmm0, xmm14			; Pongo en cada byte de cada pixel el componente azul y el alpha donde corresponde
 	pshufb xmm2, xmm13			; Simil anterior, con verde
 	pshufb xmm3, xmm12			; Rojo
 	pmaxub xmm2, xmm3			; Calculo el mayor de los componentes verde y rojo

+ 11 - 11
filtros/diff_c.c

@@ -6,12 +6,12 @@
 unsigned int max(unsigned int a, unsigned int b, unsigned int c){
 	if (a > b) {
 		return a > c ? a : c;
-	}else {
+	} else {
 		return b > c ? b : c;
 	}
 }
 
-void diff_c (unsigned char *src, unsigned char *src_2, unsigned char *dst, int m, int n, int src_row_size, int src_2_row_size, int dst_row_size) {
+void diff_c (unsigned char *src, unsigned char *src_2, unsigned char *dst, int filas, int cols, int src_row_size, int src_2_row_size, int dst_row_size) {
 	unsigned char (*src_matrix)[src_row_size] = (unsigned char (*)[src_row_size]) src;
 	unsigned char (*src_2_matrix)[src_2_row_size] = (unsigned char (*)[src_2_row_size]) src_2;
 	unsigned char (*dst_matrix)[dst_row_size] = (unsigned char (*)[dst_row_size]) dst;
@@ -19,16 +19,16 @@ void diff_c (unsigned char *src, unsigned char *src_2, unsigned char *dst, int m
 	int i,j;
 	short val;
 
-	for(i=0;i<n;i++){
-		for(j=0;j<m*4;j+=4){
-			val=max(abs(src_matrix[i][j+0]-src_2_matrix[i][j+0]),
- 					abs(src_matrix[i][j+1]-src_2_matrix[i][j+1]),
-  					abs(src_matrix[i][j+2]-src_2_matrix[i][j+2]));
+	for(i=0; i<cols; i++){
+		for(j=0; j<filas * 4; j+=4){
+			val=max(abs(src_matrix[i][j+0]-src_2_matrix[i][j+0]),		// Diferencia de canal B y max
+ 					abs(src_matrix[i][j+1]-src_2_matrix[i][j+1]),		// Diferencia G
+  					abs(src_matrix[i][j+2]-src_2_matrix[i][j+2]));		// Diferencia R
 
-			dst_matrix[i][j+0]=val;
-			dst_matrix[i][j+1]=val;
-			dst_matrix[i][j+2]=val;
-			dst_matrix[i][j+3]=255;
+			dst_matrix[i][j+0]=val;		// Guardo B
+			dst_matrix[i][j+1]=val;		// Guardo G
+			dst_matrix[i][j+2]=val;		// Guardo R
+			dst_matrix[i][j+3]=255;		// Alpha siempre tiene 255
 		}
 	}
 }

+ 0 - 5
informe/include/diff1_1.asm

@@ -1,5 +0,0 @@
-.calc_value:						; xmm0 = |0x0|0x0|0x0|VALUE|
-	pshufd xmm15, xmm0, MASK_REPEAT	; xmm15 = |VALUE|VALUE|VALUE|VALUE|
-	movups xmm14, [UNO]				; xmm14 = |1.0|1.0|1.0|1.0|
-	subps xmm14, xmm15				; xmm14 = |1-VALUE|1-VALUE|1-VALUE|1-VALUE|	
-

+ 0 - 10
informe/include/diff1_2.asm

@@ -1,10 +0,0 @@
-.read_pixels_img1:
-	movdqu xmm0, [rdx]				; IMAGEN1 xmm1 = |p0|p1|p2|p3| = |ARGB|ARGB|ARGB|ARGB|
-	movdqa xmm12, xmm0				; Copia para procesar la otra mitad 
-	punpcklbw xmm0, xmm13			; xmm0 = |p0|p1| - Desempaqueto la parte baja
-	movdqa xmm1, xmm0				; xmm1 = xmm0
-	punpcklwd xmm0, xmm13			; xmm0 = |p1|
-	movdqa xmm3, xmm0				; xmm3 = xmm0
-	punpckhwd xmm1, xmm13			; xmm1 = |p0|
-	movdqa xmm4, xmm1				; xmm4 = xmm1
-

+ 0 - 7
informe/include/diff1_3.asm

@@ -1,7 +0,0 @@
-	cvttps2dq xmm6, xmm6			;  No convierto los de la imagen2 por que ya no me sirven
-.pack_data:							; Empaqueto los 4 pixeles de nuevo
-	packusdw xmm5, xmm6				; xmm5 = |p2|p3|
-	packusdw xmm3, xmm4				; xmm3 = |p0|p1|
-	packuswb xmm3, xmm5				; xmm3 = |p0|p1|p2|p3|
-.write_pixels:
-	movdqu [rdx], xmm3

+ 0 - 20
informe/include/diff2_1.asm

@@ -1,20 +0,0 @@
-.calc_value:
-	; Proceso 2 pixeles al mismo tiempo, por que ya no estoy limitado a solo 4 floats por registro.
-	; MUL_S (Float) y MUL(Word) son las mismas elegidas para realizar la multiplicacion y luego el shifteo.
-	; MUL_S sirve para multiplicar el valor de merge antes de convertirlo a entero, asi no se pierde presicion.
-	; MUL sirve para multiplicar cada componente de los dos pixeles que se procesan
-
-	pxor xmm15, xmm15
-	movups xmm14, [shiftf]			; xmm14 = |MUL_S|MUL_S|MUL_S|MUL_S|
-	mulps xmm0, xmm14				; |0|0|0|VALUE*MUL_S|
-	cvttps2dq xmm0, xmm0			; Lo paso a entero
-	
-	pshuflw xmm15, xmm0, MASK_REPEAT ; xmm15 = |00|00|00|00|VALUE*MUL_S|VALUE*MUL_S|VALUE*MUL_S|VALUE*MUL_S|
-	movdqa xmm13, xmm15				; xmm13 = xmm15
-	pslldq xmm15, MASK_MV_W_L2H		; xmm15 = |VALUE*MUL_S|VALUE*MUL_S|VALUE*MUL_S|VALUE*MUL_S|00|00|00|00|
-	paddw xmm15, xmm13				; xmm15 = |VAL*S|VAL*S|VAL*S|VAL*S|VAL*S|VAL*S|VAL*S|VAL*S|
-	
-	movdqu xmm14, [shift]			; xmm14 = |MUL|MUL|MUL|MUL|MUL|MUL|MUL|MUL|
-	psubw xmm14, xmm15				; xmm14 = |MUL-(VALUE*MUL_S)|......
-	
-	; Ahora cuando calcule el value tengo que "dividir" por MUL, realizando un shift

+ 0 - 9
informe/include/diff2_2.asm

@@ -1,9 +0,0 @@
-.calc_merge:
-	pmullw xmm0, xmm15				; Multiplico los pixeles por xmm15 y me quedo con la parte baja
-	pmullw xmm1, xmm15
-	pmullw xmm2, xmm14				; pixel * Value-1 (y cosas raras)
-	pmullw xmm3, xmm14
-	paddw xmm0, xmm2				; Sumo los totales
-	paddw xmm1, xmm3
-	psrlw xmm0, MUL_DIV				; Shifteo (divido) el numero
-	psrlw xmm1, MUL_DIV

+ 1 - 0
informe/include/diff_asm.asm

@@ -0,0 +1 @@
+../../filtros/diff_asm.asm

+ 1 - 0
informe/include/diff_c.c

@@ -0,0 +1 @@
+../../filtros/diff_c.c

+ 52 - 13
informe/informeTP2.tex

@@ -77,9 +77,11 @@
 \renewcommand{\lstlistingname}{C\'odigo}
 \definecolor{DarkGreen}{rgb}{0.0,0.4,0.0} % Comentarios
 % Lenguajes soportados: ftp://ftp.tex.ac.uk/tex-archive/macros/latex/contrib/listings/listings.pdf
-\lstloadlanguages{[x86masm]Assembler} 
-% FIXME: Me robe lo de abajo de otro ejemplo, estaba basado en Perl, ver si hay que cambiar algo
-\lstset{language=[x86masm]Assembler,
+\lstloadlanguages{[x86masm]Assembler, C} 
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Me robe lo de abajo de otro ejemplo, estaba basado en Perl, ver si hay que cambiar algo
+\lstdefinestyle{asmStyle}{language=[x86masm]Assembler,
         frame=single,
         breaklines=true, 					% Saltar de linea si supero el maximo
         basicstyle=\small\ttfamily,
@@ -87,29 +89,66 @@
         keywordstyle=[2]\color{Purple},		% Color de parámetros especiales (registros, etc)
         identifierstyle=,                               
         commentstyle=\usefont{T1}{pcr}{m}{sl}\color{DarkGreen}\small,
-        stringstyle=\color{Purple}, 	% Strings purpuras
+        stringstyle=\color{Purple}, 		% Strings purpuras
         showstringspaces=false,
         tabsize=4,
         %
         % Instrucciones no incluidas en el paquete Assembler
-        morekeywords={global, define, section, .rodata, .text, jl, movd, movdqu, mulss, subss, addss, cmpss, pand, cvtss2si, cvttss2si, cvtsi2ss},
+        morekeywords={global, define, section, .rodata, .text, jl, movd, movdqu, mulss, subss, addss, cmpss, pand, cvtss2si, cvttss2si, cvtsi2ss, pxor, pslldq, movq, pshufb, paddb, pmaxub, punpcklbw, punpckhbw},
         %
         % Registros y esas otras cosas especiales que no son instrucciones
-        morekeywords=[2]{rax,rdx,rcx,rbx,rsi,rdi,rsp,rbp,r8,r9,r10,r11,r12,r13,r14,r15,xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7
+        morekeywords=[2]{rax,al,rdx,rcx,rbx,rsi,rdi,rsp,rbp,r8,r9,r10,r11,r12,r13,r14,r15,xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7
         		xmm8,xmm9,xmm10,xmm11,xmm12,xmm13,xmm14,xmm15,r8b, r9b, r10b, r11b, r8d, r9d, r10d, r11d},
-       	%
         morecomment=[l][\color{Blue}]{...}, % Line continuation (...) like blue comment
-        numbers=left, % Numeros de linea en la izquiera
-        firstnumber=1, % Se arranca en la linea 1
-        numberstyle=\tiny\color{Blue}, % Numeros de linea en azul y chicos
-        stepnumber=5 % Los numerros de linea se muestran cada 5
+        numbers=left,						% Numeros de linea en la izquiera
+        firstnumber=1, 						% Se arranca en la linea 1
+        numberstyle=\tiny\color{Blue}, 		% Numeros de linea en azul y chicos
+        stepnumber=5, 						% Los numerros de linea se muestran cada 5
+        numbers=left	                    % where to put the line-numbers; possible values are (none, left, right)
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Declaro colores y cosas para C
+\lstdefinestyle{cStyle}{language=C,
+        frame=single,
+        breaklines=true, 					% Saltar de linea si supero el maximo
+        basicstyle=\small\ttfamily,
+        keywordstyle=[1]\color{Blue}\bf,	% Color de las funciones de assembler
+        keywordstyle=[2]\color{Purple},		% Color de parámetros especiales (registros, etc)
+        identifierstyle=,                               
+        commentstyle=\usefont{T1}{pcr}{m}{sl}\color{DarkGreen}\small,
+        stringstyle=\color{Purple}, 		% Strings purpuras
+        showstringspaces=false,
+        tabsize=4,
+        %
+        morekeywords={define},
+        %
+        % Cosas especiales
+        morekeywords=[2]{rax},
+        morecomment=[l][\color{Blue}]{...}, % Line continuation (...) like blue comment
+        numbers=left,						% Numeros de linea en la izquiera
+        firstnumber=1, 						% Se arranca en la linea 1
+        numberstyle=\tiny\color{Blue}, 		% Numeros de linea en azul y chicos
+        stepnumber=2, 						% Los numerros de linea se muestran cada 5
+        numbers=left	                    % where to put the line-numbers; possible values are (none, left, right)
 }
 
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % Comando para incluir un archivo de assembler, no hay que poner la extensión
-\newcommand{\asmscript}[2]{
+\newcommand{\asmscript}[5]{
+\\
+\begin{minipage}{\linewidth}
+\lstinputlisting[style=asmStyle,caption=#3,label=#1,firstline=#4,lastline=#5]{include/#2.asm}
+\end{minipage}
+}
+
+% Comando para incluir un archivo C, no hay que poner la extensión
+\newcommand{\cscript}[5]{
 \\
 \begin{minipage}{\linewidth}
-\lstinputlisting[caption=#2,label=#1]{include/#1.asm}
+\lstinputlisting[style=cStyle,caption=#3,label=#1,firstline=#4,lastline=#5]{include/#2.c}
 \end{minipage}
 }
 

Fichier diff supprimé car celui-ci est trop grand
+ 6 - 6
informe/subBlur.tex


Fichier diff supprimé car celui-ci est trop grand
+ 50 - 41
informe/subDiff.tex