void Layer::setAcquireFence(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { int fenceFd = -1; // TODO: there is a possible optimization here: we only need to set the // acquire fence the first time a new buffer is acquired on EACH display. #ifdef QCOM_HARDWARE if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_BLIT) { #else if (layer.getCompositionType() == HWC_OVERLAY) { #endif sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence(); if (fence->isValid()) { fenceFd = fence->dup(); if (fenceFd == -1) { ALOGW("failed to dup layer fence, skipping sync: %d", errno); } } } layer.setAcquireFenceFd(fenceFd); } // --------------------------------------------------------------------------- // drawing... // --------------------------------------------------------------------------- void Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const { onDraw(hw, clip); }
void LayerBase::setPerFrameData(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { layer.setPerFrameDefaultState(); // we have to set the visible region on every frame because // we currently free it during onLayerDisplayed(), which is called // after HWComposer::commit() -- every frame. const Transform& tr = hw->getTransform(); layer.setVisibleRegionScreen(tr.transform(visibleRegion)); }
void Layer::setPerFrameData(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { LayerBaseClient::setPerFrameData(hw, layer); // NOTE: buffer can be NULL if the client never drew into this // layer yet, or if we ran out of memory layer.setBuffer(mActiveBuffer); // [MTK] {{{ layer.setConnectedApi(mSurfaceTexture->getConnectedApi()); layer.setDirty((mBufferDirty || mBufferRefCount <= 1 || contentDirty)); // [MTK] }}} }
void Layer::setPerFrameData(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { // we have to set the visible region on every frame because // we currently free it during onLayerDisplayed(), which is called // after HWComposer::commit() -- every frame. // Apply this display's projection's viewport to the visible region // before giving it to the HWC HAL. const Transform& tr = hw->getTransform(); Region visible = tr.transform(visibleRegion.intersect(hw->getViewport())); layer.setVisibleRegionScreen(visible); // NOTE: buffer can be NULL if the client never drew into this // layer yet, or if we ran out of memory layer.setBuffer(mActiveBuffer); }
void Layer::setPerFrameData(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { LayerBaseClient::setPerFrameData(hw, layer); // NOTE: buffer can be NULL if the client never drew into this // layer yet, or if we ran out of memory layer.setBuffer(mActiveBuffer); }
void LayerBase::setGeometry( const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { layer.setDefaultState(); // this gives us only the "orientation" component of the transform const State& s(drawingState()); const uint32_t finalTransform = s.transform.getOrientation(); // we can only handle simple transformation if (finalTransform & Transform::ROT_INVALID) { layer.setTransform(0); } else { layer.setTransform(finalTransform); } if (!isOpaque()) { layer.setBlending(mPremultipliedAlpha ? HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE); } const Transform& tr = hw->getTransform(); Rect transformedBounds(computeBounds()); transformedBounds = tr.transform(transformedBounds); // scaling is already applied in transformedBounds layer.setFrame(transformedBounds); layer.setCrop(transformedBounds.getBounds()); layer.setFormat(0); }
void Layer::setAcquireFence(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { int fenceFd = -1; // TODO: there is a possible optimization here: we only need to set the // acquire fence the first time a new buffer is acquired on EACH display. if (layer.getCompositionType() == HWC_OVERLAY) { sp<Fence> fence = mSurfaceTexture->getCurrentFence(); if (fence.get()) { fenceFd = fence->dup(); if (fenceFd == -1) { ALOGW("failed to dup layer fence, skipping sync: %d", errno); } } } layer.setAcquireFenceFd(fenceFd); }
void Layer::setGeometry( const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { LayerBaseClient::setGeometry(hw, layer); // enable this layer layer.setSkip(false); // we can't do alpha-fade with the hwc HAL const State& s(drawingState()); if (s.alpha < 0xFF) { layer.setSkip(true); } if (isSecure() && !hw->isSecure()) { layer.setSkip(true); } /* * Transformations are applied in this order: * 1) buffer orientation/flip/mirror * 2) state transformation (window manager) * 3) layer orientation (screen orientation) * (NOTE: the matrices are multiplied in reverse order) */ const Transform bufferOrientation(mCurrentTransform); const Transform tr(hw->getTransform() * s.transform * bufferOrientation); // this gives us only the "orientation" component of the transform const uint32_t finalTransform = tr.getOrientation(); // we can only handle simple transformation if (finalTransform & Transform::ROT_INVALID) { layer.setSkip(true); } else { layer.setTransform(finalTransform); } layer.setCrop(computeBufferCrop()); }
void LayerBase::setAcquireFence(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { layer.setAcquireFenceFd(-1); }
void LayerBase::setLayerName(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer, String8 layerName) { // set hardware layer name layer.setLayerName(layerName); }
void LayerScreenshot::setPerFrameData(const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { LayerBaseClient::setPerFrameData(hw, layer); layer.setBuffer(NULL); }
void Layer::setGeometry( const sp<const DisplayDevice>& hw, HWComposer::HWCLayerInterface& layer) { layer.setDefaultState(); // enable this layer layer.setSkip(false); if (isSecure() && !hw->isSecure()) { layer.setSkip(true); } // this gives us only the "orientation" component of the transform const State& s(getDrawingState()); if (!isOpaque() || s.alpha != 0xFF) { layer.setBlending(mPremultipliedAlpha ? HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE); } // apply the layer's transform, followed by the display's global transform // here we're guaranteed that the layer's transform preserves rects Rect frame(s.transform.transform(computeBounds())); frame.intersect(hw->getViewport(), &frame); const Transform& tr(hw->getTransform()); layer.setFrame(tr.transform(frame)); #ifdef QCOM_BSP // set dest_rect to display width and height, if external_only flag // for the layer is enabled or if its yuvLayer in extended mode. uint32_t x = 0, y = 0; uint32_t w = hw->getWidth(); uint32_t h = hw->getHeight(); bool extendedMode = SurfaceFlinger::isExtendedMode(); if(isExtOnly()) { // Position: fullscreen for ext_only Rect r(0, 0, w, h); layer.setFrame(r); } else if(hw->getDisplayType() > 0 && (extendedMode && isYuvLayer())) { // Need to position the video full screen on external with aspect ratio Rect r = getAspectRatio(hw, s.active.w, s.active.h); layer.setFrame(r); } #endif layer.setCrop(computeCrop(hw)); layer.setPlaneAlpha(s.alpha); /* * Transformations are applied in this order: * 1) buffer orientation/flip/mirror * 2) state transformation (window manager) * 3) layer orientation (screen orientation) * (NOTE: the matrices are multiplied in reverse order) */ const Transform bufferOrientation(mCurrentTransform); Transform transform(tr * s.transform * bufferOrientation); if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { /* * the code below applies the display's inverse transform to the buffer */ uint32_t invTransform = hw->getOrientationTransform(); // calculate the inverse transform if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; } // and apply to the current transform transform = transform * Transform(invTransform); } // this gives us only the "orientation" component of the transform const uint32_t orientation = transform.getOrientation(); if (orientation & Transform::ROT_INVALID) { // we can only handle simple transformation layer.setSkip(true); } else { layer.setTransform(orientation); } }