это очень интересно, что там спрятано внутри

тяжела доля моя консультантская

lock-dynamic-vertex-buffer
copy-data
unlock
draw

внутри там, очевидно, какой-то способ выделить кусок памяти. в который мы скопируем результаты, по unlock-у. теперь фокус (следите за руками). если есть allocate, значит где-то есть free. т-е теоретически когда тот, кто рисует, закончил рисовать – он и делает free.

очередной раз гляжу на код, который делает free 3 кадра спустя – просто потому, что никак иначе не может узнать, когда-же GPU закончил рисовать. ps3. 2010 год. я плакаю, рыдаю.

интересно, а доблестный DirectX тоже такую-же херню делает? на цифру 3 я теперь реагирую как бык на красную тряпку. хочу верить в человечество. буду переписывать.

при написании этого поста пока что никто не пострадал…

  • kas

    не было бы этих трёх кадров пади и консалтить нинадо было бы?

  • look4awhile

    таки надо. я мал-мала побольше умею, чем тупо говна разгребать :)

  • http://aruslan.livejournal.com/ aruslan

    Нормальный такой писишный discard-код.
    Если про alloc/free забыть, есть проще и эффективнее способ узнать что вб/текстура больше не нужна? Скажем, на пс3?

  • vvid

    2aruslan
    if (*render_progress_counter > tex.last_dip_counter)
    вынести_мусор();

    как-то так

  • http://aruslan.livejournal.com/ aruslan

    @vvid – а этот render_progress_counter видимо очень просто и эффективно инкрементируется так, что все предыдущие операции (tex.last_dip_counter) гарантированно закончились на GPU в специально обученном очень линейном порядке?

  • http://aruslan.livejournal.com/ aruslan

    я собственно к тому что проблема скорее в карусели/alloc/free, а не в конкретном механизме ее реализации if (*last_rendered_frame > tex.last_used_frame).

  • look4awhile

    Ref есть, семафоры и, даже, атомики