Доступ к содержимому слоя в Android-surfaceflinger

Я читаю содержимое слоя, чтобы проверить, совпадает ли его содержимое с отображаемым приложением на экране. Я читаю содержимое до того, как оно будет объединено с помощью SurfaceFlinger. Вот блок кода в HWCLayerVersion1::setAcquireFenceFd() в HWComposer.cpp для вывода содержимого слоя/пикселей< /strong> в необработанный файл.

    getLayer()->acquireFenceFd = fenceFd;
    private_handle_t *hnd = (private_handle_t*)getLayer()->handle; // the handle of the layer

    /*code for checking layer contents*/
    if(private_handle_t::validate(getLayer()->handle)==0){
             ALOGD("beta: we are gonna read a valid buffer-> %08x", intptr_t(getLayer()->handle));
             char filename[64];
             memset(filename, 0, 64);
             int name = clock();
             sprintf(filename, "/data/dump.%08x.raw", intptr_t(getLayer()->handle));                
             if(getLayer()->acquireFenceFd >= 0){
                  int ret = sync_wait(getLayer()->acquireFenceFd, -1);
                  if(ret < 0){
                        ALOGD("beta: sync_wait failed");
                  } else{
                      FILE *file = fopen(filename,"w+");
                      //ALOGD("beta: writing pixels");
                      fwrite((void*)hnd->base, hnd->size, 1, file);
                      close(getLayer()->acquireFenceFd);
                      //getLayer()->acquireFenceFd = -1;
                  } 
              } else {
                   ALOGD("beta: fencefd not valid");
              }
    }

Когда я считываю пиксели с помощью IrfanView с соответствующими атрибутами, изображение лишь отдаленно напоминает реальное содержимое, но все цвета размыты. В чем причина этого? Рендерится ли буфер, пока я читаю содержимое? Я совершенно новичок в AOSP, и любая помощь будет оценена по достоинству.


person sg1993    schedule 12.06.2014    source источник
comment
Что вы имеете в виду, говоря, что все цвета размыты? Можете ли вы опубликовать хорошие/плохие образцы изображений? (вам, вероятно, нужно будет сделать это на внешнем сайте и опубликовать ссылку - я думаю, вам нужен более высокий представитель, чтобы включить их в строку) На каком устройстве вы тестируете?   -  person fadden    schedule 12.06.2014
comment
Мне очень жаль, что я публикую этот вопрос. Через несколько минут после публикации я попробовал новое разрешение, и все работает! Оказывается, я использовал неправильное разрешение в IrfanView. Потерял целый день зря! Однако есть один вопрос: нужно ли мне ждать, когда приобретете FenceFd, потому что, похоже, он работает и без него?   -  person sg1993    schedule 13.06.2014


Ответы (1)


Если ваш хост (в случае, если это эмулятор) или устройство поддерживает графическое ускорение, то да, буфер, который вы читаете, еще не полностью обработан. Последние версии Android поддерживают механизм синхронизации, что означает, что буферы (слои) могут быть получены SurfaceFlinger во время их рендеринга. Они защищены механизмом ограждения, который гарантирует, что буфер, который не полностью визуализируется, не будет отображаться.

person EyalBellisha    schedule 12.06.2014
comment
Но sync_wait() должен ждать, пока буфер полностью не отобразится, верно? Или я что-то упускаю? - person sg1993; 13.06.2014
comment
если вы можете помочь, не могли бы вы помочь с этой проблемой: stackoverflow.com/ вопросы/50705858/намерение-не-работает - person Amin; 31.07.2019