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

Commit 9a773c71 authored by Scott Randolph's avatar Scott Randolph
Browse files

Buffer transfer and locking workarounds for EVS

These changes get EVS working for 3 frames with validated buffer contents
before HIDL reports a error on the 4th frame when running on Marlin.  More
investigation is required to resolve the HIDL issue.

Test:  Build and run againsgt evs_test
Change-Id: I5096e74aa897e690900620b77a47f79646b0f040
parent 423e2ab2
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -69,7 +69,8 @@ EvsCamera::EvsCamera(const char *id) :
    mHeight = (mDescription.defaultVerResolution) ? mDescription.defaultVerResolution : 480;

    mFormat = HAL_PIXEL_FORMAT_RGBA_8888;
    mUsage  = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_CAMERA_WRITE;
    mUsage  = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_CAMERA_WRITE |
              GRALLOC_USAGE_SW_READ_RARELY | GRALLOC_USAGE_SW_WRITE_RARELY;
}


@@ -440,7 +441,7 @@ void EvsCamera::generateFrames() {
}


void EvsCamera::fillTestFrame(BufferDesc buff) {
void EvsCamera::fillTestFrame(const BufferDesc& buff) {
    // Lock our output buffer for writing
    uint32_t *pixels = nullptr;
    GraphicBufferMapper &mapper = GraphicBufferMapper::get();
@@ -474,7 +475,8 @@ void EvsCamera::fillTestFrame(BufferDesc buff) {
            pixels[col] = expectedPixel;
        }
        // Point to the next row
        pixels = pixels + (buff.stride / sizeof(*pixels));
        // NOTE:  stride retrieved from gralloc is in units of pixels
        pixels = pixels + buff.stride;
    }

    // Release our output buffer
+1 −1
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ private:
    unsigned decreaseAvailableFrames_Locked(unsigned numToRemove);

    void generateFrames();
    void fillTestFrame(BufferDesc buff);
    void fillTestFrame(const BufferDesc& buff);

    CameraDesc                  mDescription = {};  // The properties of this camera

+5 −4
Original line number Diff line number Diff line
@@ -169,7 +169,7 @@ Return<void> EvsDisplay::getTargetBuffer(getTargetBuffer_cb _hidl_cb) {
        mBuffer.memHandle = handle;
        mFrameBusy = false;
        ALOGD("Allocated new buffer %p with stride %u",
              mBuffer.memHandle.getNativeHandle(), mStride);
              mBuffer.memHandle.getNativeHandle(), mBuffer.stride);
    }

    // Do we have a frame available?
@@ -263,7 +263,8 @@ Return<EvsResult> EvsDisplay::returnTargetBufferForDisplay(const BufferDesc& buf
                    continue;
                }
                // Walk across this row (we'll step rows below)
                if (pixels[col] != expectedPixel) {
                uint32_t receivedPixel = pixels[col];
                if (receivedPixel != expectedPixel) {
                    ALOGE("Pixel check mismatch in frame buffer");
                    frameLooksGood = false;
                    break;
@@ -274,8 +275,8 @@ Return<EvsResult> EvsDisplay::returnTargetBufferForDisplay(const BufferDesc& buf
                break;
            }

            // Point to the next row
            pixels = pixels + (mStride / sizeof(*pixels));
            // Point to the next row (NOTE:  gralloc reports stride in units of pixels)
            pixels = pixels + mBuffer.stride;
        }

        // Ensure we don't see the same buffer twice without it being rewritten
+0 −1
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ public:
private:
    DisplayDesc     mInfo           = {};
    BufferDesc      mBuffer         = {};       // A graphics buffer into which we'll store images
    uint32_t        mStride         = 0;        // Bytes per line in the buffer

    bool            mFrameBusy      = false;    // A flag telling us our buffer is in use
    DisplayState    mRequestedState = DisplayState::NOT_VISIBLE;