Page 1 of 1

Быстрая выборка из LUT

Posted: Thu May 07, 2015 7:17 pm
by XProger
Всем привет, ломаю голову над одной задачей, нужен совет гуру 8)
Дан массив данных canvas.data (RGBA) размера canvas.size выровненный по 16 байтам и таблица LUT из 256 байт-элементов
Необходимо максимально быстро заменить значения RGB (A не имеет значения) данными из таблицы по принципу

Code: Select all

NewR := Table[R];
NewG := Table[G];
NewB := Table[B];
Пока в голову пришла только связка xlatb и ror

Code: Select all

Canvas.ApplyLUT:
	mov	ebx, LUT
	mov	edx, [canvas.data]
	mov	ecx, [canvas.size]
	shr	ecx, 2  ; ecx = size / 4
@@:	
	mov	eax, [edx]
	xlatb
	ror	eax, 8
	xlatb
	ror	eax, 8
	xlatb
	ror	eax, 16
	mov	[edx], eax
	add	edx, 4
	dec	ecx
	jnz	@b

	ret
Может кто сталкивался? Интересны любые идеи, была мысль как-то задействовать A-компоненту, но не придумал как :)

Re: Быстрая выборка из LUT

Posted: Thu May 07, 2015 8:40 pm
by CleverMouse
xlat тормозной. Я бы делала банально:

Code: Select all

Canvas.ApplyLUT:
   mov   esi, [canvas.data]
   mov   ecx, [canvas.size]
@@:   
   movzx eax, byte [esi]
   movzx ebx, byte [esi+1]
   movzx edx, byte [esi+2]
   mov   al, [LUT+eax]
   mov   bl, [LUT+ebx]
   mov   dl, [LUT+edx]
   mov   [esi], al
   mov   [esi+1], bl
   mov   [esi+2], dl
   add   esi, 4
   sub   ecx, 4
   jnz   @b

   ret

Re: Быстрая выборка из LUT

Posted: Fri May 08, 2015 6:07 am
by XProger
CleverMouse,
Действительно, +20%! Благодарю.