美文网首页
dump bufferqueue

dump bufferqueue

作者: Ed_Lannister | 来源:发表于2024-02-20 13:58 被阅读0次
Dump bufferqueue核心代码
1262          void handleMessage(const Message&) override {
1263              if ((mService == nullptr) || (!mService->mFlinger)) {
1264                  ALOGE("dump layer handler null");
1265                  return;
1266              }
1267  
1268              SurfaceFlinger* flinger = mService->mFlinger;
1269              const auto display = OSurfaceFlinger(flinger)->getDefaultDisplayDevice();
1270              Vector<sp<Layer>> layersSortedByZ;
1271              {
1272                  Mutex::Autolock _l(flinger->mStateLock);
1273                  flinger->mCurrentState.traverseInZOrder([&](Layer* layer) {
1274                      if (!layer) {
1275                          return;
1276                      }
1277  
1278                      auto outputLayer = layer->findOutputLayerForDisplay(display.get());
1279                      if (!outputLayer) {
1280                          return;
1281                      }
1282  
1283                      layersSortedByZ.add(layer);
1284                  });
1285              }
1286  
1287              for (auto layer : layersSortedByZ) {
1288                  if (!layer) {
1289                      continue;
1290                  }
1291  
1292                  sp<GraphicBuffer> activeBuffer = layer->getBuffer();
1293                  if (activeBuffer == nullptr) {
1294                      continue;
1295                  }
1296  
1297                  Rect crop;
1298  
1299                  sp<GraphicBuffer> outBuffer = nullptr;
1300  
1301                  status_t ret = OSurfaceFlinger(flinger)->captureLayers(
1302                      layer, &outBuffer, display->getCompositionDataSpace(),
1303                      ui::PixelFormat::RGBA_8888, crop, 1.0f, false);
1304  
1305                  if ((ret == NO_ERROR) && (outBuffer != nullptr)) {
1306                      void *bufferPointer = nullptr;
1307                      ret = outBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
1308                                          &bufferPointer);
1309                      if ((ret != OK) || (bufferPointer == nullptr)) {
1310                          ALOGE("dump layer unable to lock buffer");
1311                          continue;
1312                      }
1313  
1314                      uint32_t stride = outBuffer->getStride();
1315                      uint32_t format = outBuffer->getPixelFormat();
1316                      uint32_t height = outBuffer->getHeight();
1317                      uint32_t bytes  = bytesPerPixel(format);
1318                      uint32_t size   = stride * height * bytes;
1319  
1320                      OplusLayer::dumpToFd(mPath, stride, height, bytes, size,
1321                          layer->sequence, bufferPointer, layer.get());
1322                      outBuffer->unlock();
1323                  } else {
1324                      ALOGI("dump layer ret=%d,%d, name=%s", ret,
1325                          (outBuffer != nullptr), OLayer(layer)->getName().string());
1326                  }
1327              }
1328  
1340          }

相关文章

网友评论

      本文标题:dump bufferqueue

      本文链接:https://www.haomeiwen.com/subject/bslsjdtx.html