Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bd15c16 authored by Jesse Hall's avatar Jesse Hall Committed by android-build-merger
Browse files

Merge "Surface: Use async lock/unlock in copyBlt" am: b73de86f am: e29dda82

am: 55f599a0

Change-Id: I1f7603e0808a3794d708e788818d83814c10dcb3
parents 84067b39 55f599a0
Loading
Loading
Loading
Loading
+7 −17
Original line number Diff line number Diff line
@@ -20,13 +20,6 @@

#include <android/native_window.h>

// We would eliminate the non-conforming zero-length array, but we can't since
// this is effectively included from the Linux kernel
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wzero-length-array"
#include <sync/sync.h>
#pragma clang diagnostic pop

#include <binder/Parcel.h>

#include <utils/Log.h>
@@ -1179,7 +1172,8 @@ void Surface::setSurfaceDamage(android_native_rect_t* rects, size_t numRects) {
static status_t copyBlt(
        const sp<GraphicBuffer>& dst,
        const sp<GraphicBuffer>& src,
        const Region& reg)
        const Region& reg,
        int *dstFenceFd)
{
    // src and dst with, height and format must be identical. no verification
    // is done here.
@@ -1190,9 +1184,10 @@ static status_t copyBlt(
    ALOGE_IF(err, "error locking src buffer %s", strerror(-err));

    uint8_t* dst_bits = NULL;
    err = dst->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(),
            reinterpret_cast<void**>(&dst_bits));
    err = dst->lockAsync(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(),
            reinterpret_cast<void**>(&dst_bits), *dstFenceFd);
    ALOGE_IF(err, "error locking dst buffer %s", strerror(-err));
    *dstFenceFd = -1;

    Region::const_iterator head(reg.begin());
    Region::const_iterator tail(reg.end());
@@ -1226,7 +1221,7 @@ static status_t copyBlt(
        src->unlock();

    if (dst_bits)
        dst->unlock();
        dst->unlockAsync(dstFenceFd);

    return err;
}
@@ -1277,12 +1272,7 @@ status_t Surface::lock(
            // copy the area that is invalid and not repainted this round
            const Region copyback(mDirtyRegion.subtract(newDirtyRegion));
            if (!copyback.isEmpty()) {
                if (fenceFd >= 0) {
                    sync_wait(fenceFd, -1);
                    close(fenceFd);
                    fenceFd = -1;
                }
                copyBlt(backBuffer, frontBuffer, copyback);
                copyBlt(backBuffer, frontBuffer, copyback, &fenceFd);
            }
        } else {
            // if we can't copy-back anything, modify the user's dirty