void setListStats(hwc_context_t *ctx, const hwc_display_contents_1_t *list, int dpy) { ctx->listStats[dpy].numAppLayers = list->numHwLayers - 1; ctx->listStats[dpy].fbLayerIndex = list->numHwLayers - 1; ctx->listStats[dpy].skipCount = 0; ctx->listStats[dpy].needsAlphaScale = false; ctx->listStats[dpy].yuvCount = 0; for (size_t i = 0; i < list->numHwLayers; i++) { hwc_layer_1_t const* layer = &list->hwLayers[i]; private_handle_t *hnd = (private_handle_t *)layer->handle; //reset stored yuv index ctx->listStats[dpy].yuvIndices[i] = -1; if(list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) { continue; //We disregard FB being skip for now! so the else if } else if (isSkipLayer(&list->hwLayers[i])) { ctx->listStats[dpy].skipCount++; } else if (UNLIKELY(isYuvBuffer(hnd))) { int& yuvCount = ctx->listStats[dpy].yuvCount; ctx->listStats[dpy].yuvIndices[yuvCount] = i; yuvCount++; } if(!ctx->listStats[dpy].needsAlphaScale) ctx->listStats[dpy].needsAlphaScale = isAlphaScaled(layer); } }
void setListStats(hwc_context_t *ctx, const hwc_display_contents_1_t *list, int dpy) { const int prevYuvCount = ctx->listStats[dpy].yuvCount; ctx->listStats[dpy].numAppLayers = list->numHwLayers - 1; ctx->listStats[dpy].fbLayerIndex = list->numHwLayers - 1; ctx->listStats[dpy].skipCount = 0; ctx->listStats[dpy].needsAlphaScale = false; ctx->listStats[dpy].preMultipliedAlpha = false; ctx->listStats[dpy].planeAlpha = false; ctx->listStats[dpy].yuvCount = 0; //reset yuv indices memset(ctx->listStats[dpy].yuvIndices, -1, MAX_NUM_APP_LAYERS); for (size_t i = 0; i < (list->numHwLayers - 1); i++) { hwc_layer_1_t const* layer = &list->hwLayers[i]; private_handle_t *hnd = (private_handle_t *)layer->handle; // continue if i reaches MAX_NUM_APP_LAYERS if(i >= MAX_NUM_APP_LAYERS) continue; if(list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) { continue; //We disregard FB being skip for now! so the else if } else if (isSkipLayer(&list->hwLayers[i])) { ctx->listStats[dpy].skipCount++; } else if (UNLIKELY(isYuvBuffer(hnd))) { int& yuvCount = ctx->listStats[dpy].yuvCount; ctx->listStats[dpy].yuvIndices[yuvCount] = i; yuvCount++; if(layer->transform & HWC_TRANSFORM_ROT_90) ctx->mNeedsRotator = true; } if(layer->blending == HWC_BLENDING_PREMULT) ctx->listStats[dpy].preMultipliedAlpha = true; if(layer->planeAlpha < 0xFF) ctx->listStats[dpy].planeAlpha = true; if(!ctx->listStats[dpy].needsAlphaScale) ctx->listStats[dpy].needsAlphaScale = isAlphaScaled(layer); } //The marking of video begin/end is useful on some targets where we need //to have a padding round to be able to shift pipes across mixers. if(prevYuvCount != ctx->listStats[dpy].yuvCount) { ctx->mVideoTransFlag = true; } if (dpy == HWC_DISPLAY_PRIMARY) configurePPD(ctx, ctx->listStats[dpy].yuvCount); }