Конференция "Media" » Спрашивали тут ;)
 
  • antonn © (24.10.07 17:54) [20]
    воблин :(
    а в [15] тогда как сделать максимальную в конечном пикселе? а то там сейчас остается от фона.
  • Sapersky (24.10.07 18:19) [21]
    ИМХО можно, хотя не факт, что будет достаточно быстро работать (хоть и MMX, но слишком много операций на пиксель получается, причём значительное кол-во операций ради одной альфы - принцип SIMD нарушается).

    The PCMPGT (Packed Compare for Greater Than) instructions compare the signed data elements in the destination operand to the signed data elements in the source operand. If the signed data elements in the destination register are greater than those in the source operand, the corresponding data element in the destination operand is set to all ones, otherwise it is set to all zeros. PCMPGT supports packed byte (PCMPGTB), packed word (PCMPGTW) and packed doubleword (PCMPGTD) data types.

    Потом примерно так же, как и в MMXTransPut - одну альфу and с полученной маской, другую andn, и всё вместе or.

    Выражаясь псевдокодом:
    A1 > A2:
    A1 PCMPGT A2 = $FF
    (A1 and $FF) or (A2 and (not $FF)) = A1

    A1 < A2:
    A1 PCMPGT A2 = $00
    дальше сам :)
  • homm © (24.10.07 18:37) [22]
    > [21] Sapersky   (24.10.07 18:19)
    > Потом примерно так же, как и в MMXTransPut - одну альфу
    > and с полученной маской, другую andn, и всё вместе or.

    и получется почти как «В крайнем сучае считать альфу до, запоминать, считать пиксель, писать альфу.»
  • Sapersky (24.10.07 19:09) [23]
    Ну пусть это будет Твоя Гениальная Идея, мне не жалко :)
    Я писал о том, что это можно делать через MMX.

    Кстати, ещё следует учитывать: The PCMPGT instructions compare the signed data elements.
  • homm © (24.10.07 19:43) [24]
    > [23] Sapersky   (24.10.07 19:09)
    > Ну пусть это будет Твоя Гениальная Идея, мне не жалко :)

    Я не об авторстве, а о том, что в обоих случаях считаем альфу отдельно, прибавляем к результирующему пикселу.
  • antonn © (25.10.07 23:03) [25]
    итак, опять я тут %)
    в общем, сделал функцию, которая берет для конечного изображения максимальную альфу из исходного и конечного. Сама функция в [9], после обработки третьего байта (как раз перед @skiptransparent:) вставить это:
       mov   al, [edi+3]
       cmp bl,al
       jb @set_al
       mov [edi+3],bl


    очень буду рад, если кто нибудь предложит более быстрый вариант (я вот подумал, а нет ли такой команды, которая из источника и приемника берет максимальное и кладет в приемник? тогда этот кусок кода можно до двух строк сократить, а то мне cmp и ждамп как то не нравится:))
    но суть не в этом коде, он уже в 7 раз быстрее сканлайна, хочется с ММХ :)
    В [18] есть часть кода, сразу после написаного следует
    movd      [edi-4], mm0
    т.е. в принципе можно запихнуть mm0 в eax, и работать дальше "не с ммх".
    Так вот, подскажите, как быть, в EAX значение байта, где альфа берется фоновая. Теперь нужно сравнить альфу источника и фона, и в [eax+3] записать максимальную альфу. Я уже припух, не могу сообразить:)
    movd      eax, mm0
    ..
    mov   bl, byte ptr [edi+3]
    mov   dl, byte ptr [esi+3]
    cmp bl,dl
    jb @set_al
    //так вот, как в байт eax поместить bl? (или dl, запутался уже)
    //mov [edi+3],bl - ессно так нельзя :)
    //да и вообще мне кажется, что bl и dl зря взял, испортят они дело:)
    @set_al:
    ..
    movd      [edi-4], eax

  • antonn © (25.10.07 23:36) [26]
    сильно не смяться:)
    пишу как в коде [18], просто в конце еще лезу в память, можно как нибудь ускорить?
       mov      [edi-4], eax

       mov       bl, byte ptr [edi-4+3]
       mov       al, byte ptr [esi+3]
       cmp       al,bl
       jb @set_al
       mov      [edi-4+3], al
       @set_al:

  • Sapersky (26.10.07 12:52) [27]
    а нет ли такой команды, которая из источника и приемника берет максимальное и кладет в приемник

    Точно, есть - PMAXUB. Забыл я про неё, видимо, из-за того, что это enhanced MMX, а не обычный.
    http://www.tommesani.com/SSEPrimer.html

    Если без MMX, то CMOV. Правда, она избавляет только от jump, cmp или test всё равно нужны.

    Что касается "как сделать то и это на обычном asm" - напиши на Паскале и см. CPU window.
  • antonn © (26.10.07 20:43) [28]
    а как быстро записать в 4й байт в eax? т.е. для памяти я делаю [esi+3] и пишу 4й байт, а как тоже самое сделать для регистра?
  • homm © (26.10.07 21:30) [29]
    > [28] antonn ©   (26.10.07 20:43)
    > а как быстро записать в 4й байт в eax? т.е. для памяти я
    > делаю [esi+3] и пишу 4й байт, а как тоже самое сделать для
    > регистра?


    rol eax, 8
    mov al, XXX
    ror eax, 8

  • antonn © (26.10.07 22:32) [30]
    Спасибо!
    сделал этот альфаканал, но с ММХ чуть медленней, чем без него получилось :)
       movd      eax, mm0

       rol eax, 8
       mov      bl, byte ptr [esi+3]
       cmp  bl,al
       jb @set_al
       mov al, bl
       @set_al:
       ror eax, 8

       mov      [edi-4], eax

  • homm © (26.10.07 22:48) [31]
    > [30] antonn ©   (26.10.07 22:32)

    обрати внимание не команду PREFETCHT0.

    Расскажи, заодно, чем пользуешся при написании, потому что я действую почти вслепую… В мануалах, которые ест ьу меня нет такой команды, например как pshufw. В идеале хотелось бы подробный справочник с примерами по всем mmx sse и 3dnow до кучи. Если еше и ч86 будет, вообше замечательно.
  • homm © (26.10.07 22:50) [32]
    Ах, да интел.ком не предлагать, хочется на Могучем :)
  • antonn © (26.10.07 23:14) [33]
    PREFETCHT0 - это SSE? встречал пару раз в коде, но не разбирался:)
    пользуюсь всякими исходниками и справочником Зубкова С.В. "Ассемблер" в chm (к великому сожалению нет поиска по нему, зато русский и с картинками:)): http://desksoft.ru/index.php?downloads=attachments&id=34 (524Кб). pshufw в ней нет, странно...
    + метод научного тыка %)

    все таки соврал, ММХ чуть быстрее 1,073832 против 1,10366 "голым кодом" :)
  • Pavia © (27.10.07 00:14) [34]
    PREFETCHT0. - это не SSE и не MMX

    PREFETCHT- выбирать с упреждением. Чтобы не тратиться на загрузку данных в кэш сразу указываем что загрузить.

    Насчет, справочника я использую мануэл от Intel, причем не самый последний. Так как последний разбит на два документа, а в не столь старых все в одном.
  • Sapersky (29.10.07 16:47) [35]
    http://www.codenet.ru/cat/Applications/Optimizations/

    Но на tommesani описание лучше, ИМХО. Учите буржуйский.
    pshufw и т.п.- это enhanced MMX (или integer SSE), соответственно их часто помещают в раздел с SSE.

    сделал этот альфаканал, но с ММХ чуть медленней, чем без него получилось

    А чем всё-таки PMAXUB(W) не нравится? То, что она на 3/4 будет работать "вхолостую" - не имеет значения, гораздо важнее что не будет cmp/jump.
 
Конференция "Media" » Спрашивали тут ;)
Есть новые Нет новых   [134431   +10][b:0.001][p:0.002]