-
-
ссылки почитал,спасибо...вот только сложновато(точнее ничё не понятно).=(в делфи надо что-то доустанавливать? может есть примеры попроще?попробую тогда написать блендинг.^_^ а то даже чтот не пойму никак как в него вообще переменные запихивать.....%(
в одной статье написано что он не заимствует регистры у FPU, а нужно просто чтоб там было одно и тоже - для сохранения мультизадачности...%)
и что выяснить есть ли в системе mmx не совсем просто - то есть его может и не быть на компе? вот эверест сказал про процессор:
> "Наборы инструкций - x86, x86-64, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1"
значит у меня оно есть?)) а SSE тоже что-то тоже такое же?кто лучше?=)
-
> и что выяснить есть ли в системе mmx не совсем просто - > то есть его может и не быть на компе?
да, может не быть, например на P1-133 его нету :) на P2 он уже есть, чтобы определить поддержку надо вытащить CPUID, и это делается по первой ссылке у > homm © (14.10.07 14:44) [12]. CPUID, кстати, тоже может не быть, на еще более древних процессорах :)
> а SSE тоже что-то тоже такое же?кто лучше?=)
смотря как применять...
-
с горем пополам сделал по тем примерам из ссылок такое: procedure TForm1.Button2Click(Sender: TObject);
const mask: int64=$FFFFFFFFFFFFFFFF;
var pt: Pointer; c: Integer;
begin
c:=Image1.Picture.Bitmap.Width*Image1.Picture.Bitmap.Height*3 div 8; pt:=Image1.Picture.Bitmap.ScanLine[Image1.Picture.Bitmap.Height-1]; asm
mov ecx, c
mov esi, [pt]
movq xmm1, mask
@@Cycle_1:
movq xmm0, [esi]
pmullw xmm0, xmm1
movq [esi], xmm0
add esi, 8
loop @@Cycle_1
emms
end;
Image1.Repaint;
end; не очень понимаю что именно и как оно делает, но внешне смахивает на негатив... может есть у кого примеры попонятнее?а то полунаугад не очень результативно выходит...=(
-
не знаю что делалось через pmullw,но теперь мне удалось сделать нормальный негатив(правда скорость кажется пострадала): procedure TForm1.Button3Click(Sender: TObject);
const mask: int64=$FFFFFFFFFFFFFFFF;
var pt: Pointer; c: Integer;
begin
c:=Image1.Picture.Bitmap.Width*Image1.Picture.Bitmap.Height*3 div 8; pt:=Image1.Picture.Bitmap.ScanLine[Image1.Picture.Bitmap.Height-1];
asm
mov ecx, c
mov esi, [pt]
@@Cycle_1:
movq xmm0, [esi]
movq xmm1, mask
psubb xmm1, xmm0
movq [esi], xmm1
add esi, 8
loop @@Cycle_1
emms
end;
Image1.Repaint;
end; я так понял что с MMX циклы только на ассемблере через "loop <метка>" можно делать?а то через "for i:=0 to ..." сразу вылетает нафиг... и почему там xmm0 а не mmx0? вобщем скоро думаю получится реализовать быстрый блендинг...=) > эм...кажется так должно быть: round(SrcColor + DestColor * (1 - SrcAlpha / 255))так я прав что делить тут надо?что-то совсем в формулах на msdn запутался...что их там так много разных про одно бленд-смешивание?
-
xmm - это регистры SSE, mmx - это уже то самое :)
я выше дал ссылки, там в самих темах можно почерпнуть что нужно, либо там же по ссылкам
-
а...я пробовал писать наоборот mmx0,но говорилось неизвестный инентификатор. получается чтоб в MMX было надо mm0 писать?хм...а где я тогда xmm0 взял?о_О
а в чём тогда разница между SSE и MMX если одно и то же получилося?
подскажите хоть наиболее правильный способ скорость выполнения мерить,а то найденные на форумах чтот разные результаты выдают...
-
правильно mm0-mm7, это я так неудачно на автоматизме написал :)
> а в чём тогда разница между SSE и MMX если одно и то же > получилося?
разные инструкции, в SSE (бОльших версий) их больше, базовые почти совпадают (возможно и не "почти", особо не разбирался). К тому же ММХ использует регистры FPU, а значит нельзя одновременно пользоваться fpu и ммх. Почти везде где я тупо заменял mm0 на xmm0 все работало, но скорость была ниже на 5-10%.
Относительную скорость выполнения м/у разными алгоритмами я измеряю с помощью QueryPerformanceCounter().
-
> Почти везде где я тупо заменял mm0 на xmm0 все работало, > но скорость была ниже на 5-10%.
нашел в интернете что в MMX "1 операция за такт", а в SSE "1 операция за 2 такта".мож поэтому?
-
честно - не знаю, не разбирался. Но мне бы SSE пригодился если бы я наконец разобрался как выровнять данные по 16 байт, чтобы использоваться movaps. Но все никак руки не дойдут :)
-
что-то не совсем пойму как картинка в памяти хранится.поисковики настойчиво к спецификациям bmp файлов отсылают,но судя по тестам в памяти битмап вовсе не так же хранится...
а вообще в памяти может не bmp храниться?всмысле если нужно вывести на экран png jpg или там tiff какой-нибудь - всё равно надо будет в bmp конвертировать? во всяком случае все api функции вроде только с hbitmap работают...
-
png - это, грубо, bmp заархивированный :) все переводится в него, 31 байт заголовок, дальше строки в обратном порядке, пиксели в строке в обычном порядке. Мне эта чехарда немного не понравилась и я bmp перегоняю в обычный одномерный массив с "нормальным" порядком строк в один и тот же формат - 32 бита на пиксель (argb). Тогда все операции будут сводиться к указанию первого элемента массива, а дальше к увеличению указателя. Вот тут я рассказывал про такой велосипед: http://forum.vingrad.ru/index.php?showtopic=241113&view=findpost&p=1735682
-
а как выравнивается?что-то не всегда нормально совпадает...так же как в bmp-файле - по 4?
> Мне эта чехарда немного не понравилась и я bmp перегоняю в обычный одномерный массив с "нормальным" порядком строк > в один и тот же формат - 32 бита на пиксель (argb).
а так рационально?потом же обратно придётся переводить,время потратится...
-
Если задать битмапу отрицательную высоту, строки будут в нормальном порядке (фирменный стиль MS - интуитивно ни за что не догадаешься). Хотя на практике это не использовал - c FastLIB перевёрнутость не так мешает, там и данные, и сканлайны одинаково перевёрнуты (TBitmap пытается умничать и разворачивает сканлайны). Если и требуется какие-то координаты переворачивать, то только один раз, при выводе на экран.
-
> а так рационально?потом же обратно придётся переводить,время > потратится...
я по возможности все переворачиваю только один раз, нет привычки при каждом рисовании дергать файл, грузить его и конвертировать. К тому же я применяю это только тогда, когда есть смысл, если у меня для поворота картинки "сканлайном" затратится 3,8 секунды, а поворот "массивом" 0,038 то я ее буду грузить даже перед каждым поворотом из битмапа - скорость все равно будет гораздо выше даже с кучей "support"-функций (загрузка выгрузка в битмап и тп).
-
Удалено модератором
-
Удалено модератором
|