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

Commit b73de86f authored by Jesse Hall's avatar Jesse Hall Committed by Gerrit Code Review
Browse files

Merge "Surface: Use async lock/unlock in copyBlt"

parents 64990fc0 7b09e799
Loading
Loading
Loading
Loading
+7 −17
Original line number Original line Diff line number Diff line
@@ -20,13 +20,6 @@


#include <android/native_window.h>
#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 <binder/Parcel.h>


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


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


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


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


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