访问Android-surfaceflinger中的图层内容

时间:2014-06-12 12:19:43

标签: android android-source surfaceflinger

我正在阅读图层内容,以检查其内容是否与屏幕上应用呈现的内容相同。我正在通过 SurfaceFlinger 进行合成之前阅读内容。以下是 HWComposer.cpp HWCLayerVersion1 :: setAcquireFenceFd ()中的代码块,用于转储图层内容/ 像素< / 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完全不熟悉,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

如果您的主机(如果它是模拟器)或设备支持图形加速,那么是,您正在读取的缓冲区尚未完全渲染。 最新的Android版本支持同步机制,这意味着SurfaceFlinger在渲染时可以获取缓冲区(图层)。它们受到防护机制的保护,可确保不会显示未完全呈现的缓冲区。