Конференция "Media" » Как выводить полупрозрачные битмапы? [D7, WinXP]
 
  • antonn © (26.01.10 15:40) [60]
    ММХ - реализация, а не формула. Это ассемблер, к общим регистрам можно использовать дополнительно 8 регистров заимствуюя их у FPU, со своими командами и отлично подходящие для потоковой обработки.

    http://pda.delphimaster.net/?id=1192295230&n=7
    http://pda.delphimaster.net/?id=1258745999&n=7
  • Вася (27.01.10 19:17) [61]
    ссылки почитал,спасибо...вот только сложновато(точнее ничё не понятно).=(в делфи надо что-то доустанавливать?
    может есть примеры попроще?попробую тогда написать блендинг.^_^
    а то даже чтот не пойму никак как в него вообще переменные запихивать.....%(

    в одной статье написано что он не заимствует регистры у FPU, а нужно просто чтоб там было одно и тоже - для сохранения мультизадачности...%)

    и что выяснить есть ли в системе mmx не совсем просто - то есть его может и не быть на компе?
    вот эверест сказал про процессор:

    > "Наборы инструкций - x86, x86-64, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1"

    значит у меня оно есть?))
    а SSE тоже что-то тоже такое же?кто лучше?=)
  • antonn © (28.01.10 09:24) [62]

    > и что выяснить есть ли в системе mmx не совсем просто -
    > то есть его может и не быть на компе?

    да, может не быть, например на P1-133 его нету :)
    на P2 он уже есть, чтобы определить поддержку надо вытащить CPUID, и это делается по первой ссылке у > homm ©   (14.10.07 14:44) [12].
    CPUID, кстати, тоже может не быть, на еще более древних процессорах :)


    > а SSE тоже что-то тоже такое же?кто лучше?=)

    смотря как применять...
  • Вася (29.01.10 10:03) [63]
    с горем пополам сделал по тем примерам из ссылок такое:

    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; // подобрал чтоб для pf24bit работало не вылетая
    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;



    не очень понимаю что именно и как оно делает, но внешне смахивает на негатив...

    может есть у кого примеры попонятнее?а то полунаугад не очень результативно выходит...=(
  • Вася (30.01.10 18:05) [64]
    не знаю что делалось через 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; // pf24bit
    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 запутался...что их там так много разных про одно бленд-смешивание?
  • antonn © (30.01.10 22:54) [65]
    xmm - это регистры SSE, mmx - это уже то самое :)

    я выше дал ссылки, там в самих темах можно почерпнуть что нужно, либо там же по ссылкам
  • Вася (31.01.10 21:31) [66]
    а...я пробовал писать наоборот mmx0,но говорилось неизвестный инентификатор.
    получается чтоб в MMX было надо mm0 писать?хм...а где я тогда xmm0 взял?о_О

    а в чём тогда разница между SSE и MMX если одно и то же получилося?

    подскажите хоть наиболее правильный способ скорость выполнения мерить,а то найденные на форумах чтот разные результаты выдают...
  • antonn © (01.02.10 01:42) [67]
    правильно mm0-mm7, это я так неудачно на автоматизме написал :)


    > а в чём тогда разница между SSE и MMX если одно и то же
    > получилося?

    разные инструкции, в SSE (бОльших версий) их больше, базовые почти совпадают (возможно и не "почти", особо не разбирался). К тому же ММХ использует регистры FPU, а значит нельзя одновременно пользоваться fpu и ммх. Почти везде где я тупо заменял mm0 на xmm0 все работало, но скорость была ниже на 5-10%.

    Относительную скорость выполнения м/у разными алгоритмами я измеряю с помощью QueryPerformanceCounter().
  • Вася (02.02.10 14:53) [68]
    > Почти везде где я тупо заменял mm0 на xmm0 все работало,
    >  но скорость была ниже на 5-10%.


    нашел в интернете что в MMX "1 операция за такт", а в SSE "1 операция за 2 такта".мож поэтому?
  • antonn © (02.02.10 22:00) [69]
    честно - не знаю, не разбирался. Но мне бы SSE пригодился если бы я наконец разобрался как выровнять данные по 16 байт, чтобы использоваться movaps. Но все никак руки не дойдут :)
  • Вася (04.02.10 09:35) [70]
    что-то не совсем пойму как картинка в памяти хранится.поисковики настойчиво к спецификациям bmp файлов отсылают,но судя по тестам в памяти битмап вовсе не так же хранится...

    а вообще в памяти может не bmp храниться?всмысле если нужно вывести на экран png jpg или там tiff какой-нибудь - всё равно надо будет в bmp конвертировать?
    во всяком случае все api функции вроде только с hbitmap работают...
  • antonn © (04.02.10 12:55) [71]
    png - это, грубо, bmp заархивированный :)
    все переводится в него, 31 байт заголовок, дальше строки в обратном порядке, пиксели в строке в обычном порядке. Мне эта чехарда немного не понравилась и я bmp перегоняю в обычный одномерный массив с "нормальным" порядком строк в один и тот же формат - 32 бита на пиксель (argb). Тогда все операции будут сводиться к указанию первого элемента массива, а дальше к увеличению указателя. Вот тут я рассказывал про такой велосипед: http://forum.vingrad.ru/index.php?showtopic=241113&view=findpost&p=1735682
  • Вася (04.03.10 13:02) [72]
    а как выравнивается?что-то не всегда нормально совпадает...так же как в bmp-файле - по 4?

    > Мне эта чехарда немного не понравилась и я bmp перегоняю в обычный одномерный массив с "нормальным" порядком строк
    > в один и тот же формат - 32 бита на пиксель (argb).


    а так рационально?потом же обратно придётся переводить,время потратится...
  • Sapersky (04.03.10 13:38) [73]
    Если задать битмапу отрицательную высоту, строки будут в нормальном порядке (фирменный стиль MS - интуитивно ни за что не догадаешься).
    Хотя на практике это не использовал - c FastLIB перевёрнутость не так мешает, там и данные, и сканлайны одинаково перевёрнуты (TBitmap пытается умничать и разворачивает сканлайны). Если и требуется какие-то координаты переворачивать, то только один раз, при выводе на экран.
  • antonn © (04.03.10 16:31) [74]

    > а так рационально?потом же обратно придётся переводить,время
    > потратится...

    я по возможности все переворачиваю только один раз, нет привычки при каждом рисовании дергать файл, грузить его и конвертировать.
    К тому же я применяю это только тогда, когда есть смысл, если у меня для поворота картинки "сканлайном" затратится 3,8 секунды, а поворот "массивом" 0,038 то я ее буду грузить даже перед каждым поворотом из битмапа - скорость все равно будет гораздо выше даже с кучей "support"-функций (загрузка выгрузка в битмап и тп).
  • имя (03.05.10 20:18) [75]
    Удалено модератором
  • имя (13.10.11 12:24) [76]
    Удалено модератором
 
Конференция "Media" » Как выводить полупрозрачные битмапы? [D7, WinXP]
Есть новые Нет новых   [134463   +59][b:0][p:0.001]