CpuConsumer_test.cpp revision f8cebe54576c8100769e2515d4f67bdd013a6927
10a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/*
29c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu * Copyright (C) 2012 The Android Open Source Project
30a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
40a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Licensed under the Apache License, Version 2.0 (the "License");
50a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * you may not use this file except in compliance with the License.
60a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * You may obtain a copy of the License at
70a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
80a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *      http://www.apache.org/licenses/LICENSE-2.0
90a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Unless required by applicable law or agreed to in writing, software
110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * distributed under the License is distributed on an "AS IS" BASIS,
120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * See the License for the specific language governing permissions and
140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * limitations under the License.
150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */
160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define LOG_TAG "CpuConsumer_test"
180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan//#define LOG_NDEBUG 0
190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan//#define LOG_NNDEBUG 0
200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#ifdef LOG_NNDEBUG
220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define ALOGVV(...) ALOGV(__VA_ARGS__)
230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#else
240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define ALOGVV(...) ((void)0)
250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#endif
2659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#include <gtest/gtest.h>
280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#include <gui/CpuConsumer.h>
29f21d2289021a94fc74023e2b5987d236df354fe1fionaxu#include <gui/Surface.h>
300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#include <ui/GraphicBuffer.h>
310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#include <utils/String8.h>
32ec334adf4017ca172f44612d01456e671f922344Amit Mahajan#include <utils/Thread.h>
330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#include <utils/Mutex.h>
34ec334adf4017ca172f44612d01456e671f922344Amit Mahajan#include <utils/Condition.h>
350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define CPU_CONSUMER_TEST_FORMAT_RAW 0
370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define CPU_CONSUMER_TEST_FORMAT_Y8 0
380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define CPU_CONSUMER_TEST_FORMAT_Y16 0
390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define CPU_CONSUMER_TEST_FORMAT_RGBA_8888 1
400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajannamespace android {
420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanstruct CpuConsumerTestParams {
440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    uint32_t width;
45ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    uint32_t height;
46fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan    int maxLockedBuffers;
4727b650c406018355a88a41528db7859e232728a0Jack Yu    PixelFormat format;
48ec334adf4017ca172f44612d01456e671f922344Amit Mahajan};
49b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan::std::ostream& operator<<(::std::ostream& os, const CpuConsumerTestParams& p) {
510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    return os << "[ (" << p.width << ", " << p.height << "), B:"
520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan              << p.maxLockedBuffers << ", F:0x"
530e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu              << ::std::hex << p.format << "]";
540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
56153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanclass CpuConsumerTest : public ::testing::TestWithParam<CpuConsumerTestParams> {
570ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuprotected:
580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    virtual void SetUp() {
600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        const ::testing::TestInfo* const test_info =
61ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                ::testing::UnitTest::GetInstance()->current_test_info();
62ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        CpuConsumerTestParams params = GetParam();
630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        ALOGV("** Starting test %s (%d x %d, %d, 0x%x)",
640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                test_info->name(),
650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                params.width, params.height,
660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                params.maxLockedBuffers, params.format);
670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        sp<IGraphicBufferProducer> producer;
6805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        sp<IGraphicBufferConsumer> consumer;
690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        BufferQueue::createBufferQueue(&producer, &consumer);
7018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        mCC = new CpuConsumer(consumer, params.maxLockedBuffers);
710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        String8 name("CpuConsumer_Under_Test");
7232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mCC->setName(name);
730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mSTC = new Surface(producer);
740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mANW = mSTC;
750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    virtual void TearDown() {
78b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        mANW.clear();
790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mSTC.clear();
800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mCC.clear();
810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    class FrameWaiter : public CpuConsumer::FrameAvailableListener {
840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public:
850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        FrameWaiter():
860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                mPendingFrames(0) {
870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        void waitForFrame() {
900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            Mutex::Autolock lock(mMutex);
910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            while (mPendingFrames == 0) {
920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                mCondition.wait(mMutex);
930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
9418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            mPendingFrames--;
950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
96ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
97fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        virtual void onFrameAvailable(const BufferItem&) {
98fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            Mutex::Autolock lock(mMutex);
99fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            mPendingFrames++;
100fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            mCondition.signal();
101ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
102ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
103ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        int mPendingFrames;
104ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        Mutex mMutex;
105ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        Condition mCondition;
106ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    };
107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
108fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan    // Note that SurfaceTexture will lose the notifications
109fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan    // onBuffersReleased and onFrameAvailable as there is currently
110fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan    // no way to forward the events.  This DisconnectWaiter will not let the
111fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan    // disconnect finish until finishDisconnect() is called.  It will
112fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan    // also block until a disconnect is called
113fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan    class DisconnectWaiter : public BufferQueue::ConsumerListener {
114fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan    public:
115fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        DisconnectWaiter () :
116fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            mWaitForDisconnect(false),
117ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            mPendingFrames(0) {
118ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
119ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
120ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        void waitForFrame() {
121ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            Mutex::Autolock lock(mMutex);
122fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            while (mPendingFrames == 0) {
123fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                mFrameCondition.wait(mMutex);
124fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
125fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            mPendingFrames--;
126fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        }
127fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan
128fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        virtual void onFrameAvailable(const BufferItem&) {
129ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            Mutex::Autolock lock(mMutex);
130ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            mPendingFrames++;
1310ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu            mFrameCondition.signal();
1320ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        }
1330ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu
134fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        virtual void onBuffersReleased() {
135fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            Mutex::Autolock lock(mMutex);
136fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            while (!mWaitForDisconnect) {
137fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                mDisconnectCondition.wait(mMutex);
138fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
139fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        }
140fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan
141fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        void finishDisconnect() {
142fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            Mutex::Autolock lock(mMutex);
143fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            mWaitForDisconnect = true;
144fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            mDisconnectCondition.signal();
145fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        }
146fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan
147fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan    private:
148fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        Mutex mMutex;
149fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan
150fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        bool mWaitForDisconnect;
151fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        Condition mDisconnectCondition;
152fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan
153fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        int mPendingFrames;
154fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        Condition mFrameCondition;
155fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan    };
1560ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu
1570ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu    sp<CpuConsumer> mCC;
158ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    sp<Surface> mSTC;
159ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    sp<ANativeWindow> mANW;
1606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt};
1616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt#define ASSERT_NO_ERROR(err, msg) \
16318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    ASSERT_EQ(NO_ERROR, err) << msg << strerror(-err)
1646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltvoid checkPixel(const CpuConsumer::LockedBuffer &buf,
1666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        uint32_t x, uint32_t y, uint32_t r, uint32_t g=0, uint32_t b=0) {
1676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    // Ignores components that don't exist for given pixel
1680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    switch(buf.format) {
1690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        case HAL_PIXEL_FORMAT_RAW16: {
1700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            String8 msg;
1710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            uint16_t *bPtr = (uint16_t*)buf.data;
1720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            bPtr += y * buf.stride + x;
1730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            // GRBG Bayer mosaic; only check the matching channel
1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            switch( ((y & 1) << 1) | (x & 1) ) {
1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case 0: // G
1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case 3: // G
1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    EXPECT_EQ(g, *bPtr);
1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    break;
1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case 1: // R
1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    EXPECT_EQ(r, *bPtr);
1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    break;
1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case 2: // B
1830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    EXPECT_EQ(b, *bPtr);
1840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    break;
1850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            break;
1870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        // ignores g,b
1890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        case HAL_PIXEL_FORMAT_Y8: {
1900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            uint8_t *bPtr = (uint8_t*)buf.data;
1910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            bPtr += y * buf.stride + x;
1920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            EXPECT_EQ(r, *bPtr) << "at x = " << x << " y = " << y;
1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            break;
1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        // ignores g,b
1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        case HAL_PIXEL_FORMAT_Y16: {
1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            // stride is in pixels, not in bytes
1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            uint16_t *bPtr = ((uint16_t*)buf.data) + y * buf.stride + x;
1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            EXPECT_EQ(r, *bPtr) << "at x = " << x << " y = " << y;
2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            break;
2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        case HAL_PIXEL_FORMAT_RGBA_8888: {
204f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            const int bytesPerPixel = 4;
205f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            uint8_t *bPtr = (uint8_t*)buf.data;
206f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            bPtr += (y * buf.stride + x) * bytesPerPixel;
207f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt
2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            EXPECT_EQ(r, bPtr[0]) << "at x = " << x << " y = " << y;
2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            EXPECT_EQ(g, bPtr[1]) << "at x = " << x << " y = " << y;
2100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            EXPECT_EQ(b, bPtr[2]) << "at x = " << x << " y = " << y;
2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            break;
2120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        default: {
2140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ADD_FAILURE() << "Unknown format for check:" << buf.format;
2150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            break;
2160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
2190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// Fill a YV12 buffer with a multi-colored checkerboard pattern
2210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid fillYV12Buffer(uint8_t* buf, int w, int h, int stride);
2220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// Fill a Y8/Y16 buffer with a multi-colored checkerboard pattern
224b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yutemplate <typename T> // T == uint8_t or uint16_t
225b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuvoid fillGreyscaleBuffer(T* buf, int w, int h, int stride, int bpp) {
22659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    const int blockWidth = w > 16 ? w / 16 : 1;
22759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    const int blockHeight = h > 16 ? h / 16 : 1;
22827b650c406018355a88a41528db7859e232728a0Jack Yu    const int yuvTexOffsetY = 0;
22927b650c406018355a88a41528db7859e232728a0Jack Yu
230f21d2289021a94fc74023e2b5987d236df354fe1fionaxu    ASSERT_TRUE(bpp == 8 || bpp == 16);
231f21d2289021a94fc74023e2b5987d236df354fe1fionaxu    ASSERT_TRUE(sizeof(T)*8 == bpp);
2320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
233f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt    // stride is in pixels, not in bytes
2340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    int yuvTexStrideY = stride;
2350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    for (int x = 0; x < w; x++) {
2360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        for (int y = 0; y < h; y++) {
2370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            int parityX = (x / blockWidth) & 1;
2380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            int parityY = (y / blockHeight) & 1;
2390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            T intensity = (parityX ^ parityY) ? 63 : 191;
2400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity;
2410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
2430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
2440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajaninline uint8_t chooseColorRgba8888(int blockX, int blockY, uint8_t channel) {
2460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    const int colorVariations = 3;
2470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    uint8_t color = ((blockX % colorVariations) + (blockY % colorVariations))
2480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        % (colorVariations) == channel ? 191: 63;
2490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    return color;
2510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
2520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// Fill a RGBA8888 buffer with a multi-colored checkerboard pattern
254ec334adf4017ca172f44612d01456e671f922344Amit Mahajanvoid fillRgba8888Buffer(uint8_t* buf, int w, int h, int stride)
2550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan{
2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    const int blockWidth = w > 16 ? w / 16 : 1;
2570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    const int blockHeight = h > 16 ? h / 16 : 1;
2585755ef622fec6f3c592467c685503826862a7536fionaxu    const int bytesPerPixel = 4;
2595755ef622fec6f3c592467c685503826862a7536fionaxu
2605755ef622fec6f3c592467c685503826862a7536fionaxu    // stride is in pixels, not in bytes
2615755ef622fec6f3c592467c685503826862a7536fionaxu    for (int x = 0; x < w; ++x) {
2620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        for (int y = 0; y < h; ++y) {
2639b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            int blockX = (x / blockWidth);
2649b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            int blockY = (y / blockHeight);
2659b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan
2669b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            uint8_t r = chooseColorRgba8888(blockX, blockY, 0);
2679b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            uint8_t g = chooseColorRgba8888(blockX, blockY, 1);
2689b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            uint8_t b = chooseColorRgba8888(blockX, blockY, 2);
2699b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan
2709b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            buf[(y*stride + x)*bytesPerPixel + 0] = r;
2719b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            buf[(y*stride + x)*bytesPerPixel + 1] = g;
2729b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            buf[(y*stride + x)*bytesPerPixel + 2] = b;
2739b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            buf[(y*stride + x)*bytesPerPixel + 3] = 255;
2749b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        }
27597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    }
27697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan}
27718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
27897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan// Fill a RAW sensor buffer with a multi-colored checkerboard pattern.
27997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan// Assumes GRBG mosaic ordering. Result should be a grid in a 2x2 pattern
28097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan// of [ R, B; G, W]
28197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajanvoid fillBayerRawBuffer(uint8_t* buf, int w, int h, int stride) {
28297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    ALOGVV("fillBayerRawBuffer: %p with %d x %d, stride %d", buf, w, h ,stride);
2830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // Blocks need to be even-width/height, aim for 8-wide otherwise
28497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    const int blockWidth = (w > 16 ? w / 8 : 2) & ~0x1;
28597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    const int blockHeight = (h > 16 ? h / 8 : 2) & ~0x1;
2860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    for (int y = 0; y < h; y+=2) {
2870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        uint16_t *bPtr1 = ((uint16_t*)buf) + stride*y;
2880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        uint16_t *bPtr2 = bPtr1 + stride;
2890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        for (int x = 0; x < w; x+=2) {
290ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            int blockX = (x / blockWidth ) & 1;
29197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            int blockY = (y / blockHeight) & 1;
29297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            unsigned short r = (blockX == blockY) ? 1000 : 200;
29397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            unsigned short g = blockY ? 1000: 200;
29497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            unsigned short b = blockX ? 1000: 200;
29597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            // GR row
296ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            *bPtr1++ = g;
2970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            *bPtr1++ = r;
2980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            // BG row
2990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            *bPtr2++ = b;
3000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            *bPtr2++ = g;
301ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan        }
302ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan    }
3030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
3050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3062416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajantemplate<typename T> // uint8_t or uint16_t
3072416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajanvoid checkGreyscaleBuffer(const CpuConsumer::LockedBuffer &buf) {
3082416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    uint32_t w = buf.width;
3092416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    uint32_t h = buf.height;
3102416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    const int blockWidth = w > 16 ? w / 16 : 1;
3112416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    const int blockHeight = h > 16 ? h / 16 : 1;
3122416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    const int blockRows = h / blockHeight;
3132416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    const int blockCols = w / blockWidth;
3142416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3152416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    // Top-left square is bright
3162416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    checkPixel(buf, 0, 0, 191);
3172416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    checkPixel(buf, 1, 0, 191);
3182416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    checkPixel(buf, 0, 1, 191);
3192416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    checkPixel(buf, 1, 1, 191);
3202416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3212416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    // One-right square is dark
3222416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    checkPixel(buf, blockWidth,     0, 63);
3230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth + 1, 0, 63);
3240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth,     1, 63);
3250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth + 1, 1, 63);
3263c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
3273c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    // One-down square is dark
3283c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    checkPixel(buf, 0, blockHeight, 63);
32905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    checkPixel(buf, 1, blockHeight, 63);
33005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    checkPixel(buf, 0, blockHeight + 1, 63);
33105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    checkPixel(buf, 1, blockHeight + 1, 63);
3323c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
3330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // One-diag square is bright
3340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth,     blockHeight, 191);
3350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth + 1, blockHeight, 191);
3360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth,     blockHeight + 1, 191);
3370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth + 1, blockHeight + 1, 191);
3380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3393c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    // Test bottom-right pixel
3403c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    const int maxBlockX = ((w-1 + (blockWidth-1)) / blockWidth) & 0x1;
3413c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan    const int maxBlockY = ((h-1 + (blockHeight-1)) / blockHeight) & 0x1;
34205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    uint32_t pixelValue = ((maxBlockX % 2) == (maxBlockY % 2)) ? 191 : 63;
34305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    checkPixel(buf, w-1, h-1, pixelValue);
34405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan}
3453c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan
3460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid checkRgba8888Buffer(const CpuConsumer::LockedBuffer &buf) {
3470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    uint32_t w = buf.width;
3480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    uint32_t h = buf.height;
349ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    const int blockWidth = w > 16 ? w / 16 : 1;
350ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    const int blockHeight = h > 16 ? h / 16 : 1;
351ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    const int blockRows = h / blockHeight;
352ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    const int blockCols = w / blockWidth;
353ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
354ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    // Top-left square is bright red
355ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    checkPixel(buf, 0, 0, 191, 63, 63);
35605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    checkPixel(buf, 1, 0, 191, 63, 63);
35705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    checkPixel(buf, 0, 1, 191, 63, 63);
35805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    checkPixel(buf, 1, 1, 191, 63, 63);
359ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
360ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    // One-right square is bright green
361ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    checkPixel(buf, blockWidth,     0, 63, 191, 63);
362ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    checkPixel(buf, blockWidth + 1, 0, 63, 191, 63);
36397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    checkPixel(buf, blockWidth,     1, 63, 191, 63);
3646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    checkPixel(buf, blockWidth + 1, 1, 63, 191, 63);
36597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
36697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    // One-down square is bright green
36797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    checkPixel(buf, 0, blockHeight, 63, 191, 63);
36897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    checkPixel(buf, 1, blockHeight, 63, 191, 63);
36997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    checkPixel(buf, 0, blockHeight + 1, 63, 191, 63);
37097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    checkPixel(buf, 1, blockHeight + 1, 63, 191, 63);
37197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
37297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    // One-diag square is bright blue
3736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    checkPixel(buf, blockWidth,     blockHeight, 63, 63, 191);
37497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    checkPixel(buf, blockWidth + 1, blockHeight, 63, 63, 191);
375b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    checkPixel(buf, blockWidth,     blockHeight + 1, 63, 63, 191);
376b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    checkPixel(buf, blockWidth + 1, blockHeight + 1, 63, 63, 191);
377b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
3780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // Test bottom-right pixel
3790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    {
3800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        const int maxBlockX = ((w-1) / blockWidth);
3810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        const int maxBlockY = ((h-1) / blockHeight);
3820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        uint8_t r = chooseColorRgba8888(maxBlockX, maxBlockY, 0);
3830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        uint8_t g = chooseColorRgba8888(maxBlockX, maxBlockY, 1);
3840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        uint8_t b = chooseColorRgba8888(maxBlockX, maxBlockY, 2);
38518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        checkPixel(buf, w-1, h-1, r, g, b);
38618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    }
38718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu}
38818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
38918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxuvoid checkBayerRawBuffer(const CpuConsumer::LockedBuffer &buf) {
39018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    uint32_t w = buf.width;
3910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    uint32_t h = buf.height;
3920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    const int blockWidth = (w > 16 ? w / 8 : 2) & ~0x1;
3930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    const int blockHeight = (h > 16 ? h / 8 : 2) & ~0x1;
394ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu    const int blockRows = h / blockHeight;
395ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu    const int blockCols = w / blockWidth;
396ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu
397ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu    // Top-left square is red
398ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu    checkPixel(buf, 0, 0, 1000, 200, 200);
3990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, 1, 0, 1000, 200, 200);
4000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, 0, 1, 1000, 200, 200);
4010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, 1, 1, 1000, 200, 200);
4020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // One-right square is blue
4040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth,     0, 200, 200, 1000);
4050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth + 1, 0, 200, 200, 1000);
4060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth,     1, 200, 200, 1000);
4070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, blockWidth + 1, 1, 200, 200, 1000);
4087a477263108748903cf5a4151a4e8b739f12264aRobert Greenwalt
4097a477263108748903cf5a4151a4e8b739f12264aRobert Greenwalt    // One-down square is green
410ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    checkPixel(buf, 0, blockHeight, 200, 1000, 200);
411ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    checkPixel(buf, 1, blockHeight, 200, 1000, 200);
412de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan    checkPixel(buf, 0, blockHeight + 1, 200, 1000, 200);
413de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan    checkPixel(buf, 1, blockHeight + 1, 200, 1000, 200);
4140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4152416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    // One-diag square is white
4162416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    checkPixel(buf, blockWidth,     blockHeight, 1000, 1000, 1000);
4172416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    checkPixel(buf, blockWidth + 1, blockHeight, 1000, 1000, 1000);
4182416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan    checkPixel(buf, blockWidth,     blockHeight + 1, 1000, 1000, 1000);
4190e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    checkPixel(buf, blockWidth + 1, blockHeight + 1, 1000, 1000, 1000);
4200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // Test bottom-right pixel
4220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    const int maxBlockX = ((w-1) / blockWidth) & 0x1;
4230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    const int maxBlockY = ((w-1) / blockHeight) & 0x1;
4240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    unsigned short maxR = (maxBlockX == maxBlockY) ? 1000 : 200;
4250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    unsigned short maxG = maxBlockY ? 1000: 200;
4260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    unsigned short maxB = maxBlockX ? 1000: 200;
4270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    checkPixel(buf, w-1, h-1, maxR, maxG, maxB);
4280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
4290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid checkAnyBuffer(const CpuConsumer::LockedBuffer &buf, int format) {
4310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    switch (format) {
4320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        case HAL_PIXEL_FORMAT_RAW16:
43397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            checkBayerRawBuffer(buf);
43497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            break;
43505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        case HAL_PIXEL_FORMAT_Y8:
43605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            checkGreyscaleBuffer<uint8_t>(buf);
43718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            break;
43818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        case HAL_PIXEL_FORMAT_Y16:
43918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            checkGreyscaleBuffer<uint16_t>(buf);
4400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            break;
4410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        case HAL_PIXEL_FORMAT_RGBA_8888:
4420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            checkRgba8888Buffer(buf);
4430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            break;
4440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
4450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
4460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid fillYV12BufferRect(uint8_t* buf, int w, int h, int stride,
4480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        const android_native_rect_t& rect);
4490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid fillRGBA8Buffer(uint8_t* buf, int w, int h, int stride);
4510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid fillRGBA8BufferSolid(uint8_t* buf, int w, int h, int stride, uint8_t r,
4530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        uint8_t g, uint8_t b, uint8_t a);
4540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// Configures the ANativeWindow producer-side interface based on test parameters
45659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuvoid configureANW(const sp<ANativeWindow>& anw,
45727b650c406018355a88a41528db7859e232728a0Jack Yu        const CpuConsumerTestParams& params,
458f21d2289021a94fc74023e2b5987d236df354fe1fionaxu        int maxBufferSlack) {
459b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    status_t err;
460153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    err = native_window_set_buffers_dimensions(anw.get(),
461ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            params.width, params.height);
462153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    ASSERT_NO_ERROR(err, "set_buffers_dimensions error: ");
463153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
46418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    err = native_window_set_buffers_format(anw.get(), params.format);
46518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    ASSERT_NO_ERROR(err, "set_buffers_format error: ");
466ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
4670e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    err = native_window_set_usage(anw.get(),
4680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            GRALLOC_USAGE_SW_WRITE_OFTEN);
4690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ASSERT_NO_ERROR(err, "set_usage error: ");
4700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    int minUndequeuedBuffers;
4720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    err = anw.get()->query(anw.get(),
4730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS,
4740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            &minUndequeuedBuffers);
4750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ASSERT_NO_ERROR(err, "query error: ");
4760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ALOGVV("Setting buffer count to %d",
4780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            maxBufferSlack + 1 + minUndequeuedBuffers);
4790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    err = native_window_set_buffer_count(anw.get(),
4800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            maxBufferSlack + 1 + minUndequeuedBuffers);
4810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ASSERT_NO_ERROR(err, "set_buffer_count error: ");
4820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
4840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// Produce one frame of image data; assumes format and resolution configuration
4860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// is already done.
4870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid produceOneFrame(const sp<ANativeWindow>& anw,
4880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        const CpuConsumerTestParams& params,
4890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        int64_t timestamp, uint32_t *stride) {
4900e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    status_t err;
4910e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    ANativeWindowBuffer* anb;
492cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan    ALOGVV("Dequeue buffer from %p", anw.get());
49332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    err = native_window_dequeue_buffer_and_wait(anw.get(), &anb);
49432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    ASSERT_NO_ERROR(err, "dequeueBuffer error: ");
495fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan
49618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    ASSERT_TRUE(anb != NULL);
4970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    sp<GraphicBuffer> buf(new GraphicBuffer(anb, false));
4990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    *stride = buf->getStride();
5010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    uint8_t* img = NULL;
5020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ALOGVV("Lock buffer from %p for write", anw.get());
5040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img));
5050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ASSERT_NO_ERROR(err, "lock error: ");
5060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    switch (params.format) {
5080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        case HAL_PIXEL_FORMAT_YV12:
5090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            fillYV12Buffer(img, params.width, params.height, *stride);
5100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            break;
5110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        case HAL_PIXEL_FORMAT_RAW16:
5120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            fillBayerRawBuffer(img, params.width, params.height, buf->getStride());
5130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            break;
5140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        case HAL_PIXEL_FORMAT_Y8:
5150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            fillGreyscaleBuffer<uint8_t>(img, params.width, params.height,
5160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                                         buf->getStride(), /*bpp*/8);
5170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            break;
5180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        case HAL_PIXEL_FORMAT_Y16:
5190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            fillGreyscaleBuffer<uint16_t>((uint16_t*)img, params.width,
520b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                                          params.height, buf->getStride(),
521b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                                          /*bpp*/16);
522b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu            break;
523b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        case HAL_PIXEL_FORMAT_RGBA_8888:
524655bae990bdd7e4584491def4d30692e6173779cfionaxu            fillRgba8888Buffer(img, params.width, params.height, buf->getStride());
525655bae990bdd7e4584491def4d30692e6173779cfionaxu            break;
526655bae990bdd7e4584491def4d30692e6173779cfionaxu        default:
527655bae990bdd7e4584491def4d30692e6173779cfionaxu            FAIL() << "Unknown pixel format under test!";
5280e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu            break;
5290e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
5300e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    ALOGVV("Unlock buffer from %p", anw.get());
5310e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    err = buf->unlock();
5320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ASSERT_NO_ERROR(err, "unlock error: ");
5330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ALOGVV("Set timestamp to %p", anw.get());
5350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    err = native_window_set_buffers_timestamp(anw.get(), timestamp);
5360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ASSERT_NO_ERROR(err, "set_buffers_timestamp error: ");
5370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ALOGVV("Queue buffer to %p", anw.get());
5390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    err = anw->queueBuffer(anw.get(), buf->getNativeBuffer(), -1);
5400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    ASSERT_NO_ERROR(err, "queueBuffer error:");
5410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan};
5420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// This test is disabled because the HAL_PIXEL_FORMAT_RAW16 format is not
5440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// supported on all devices.
5450a567c9ed954f295df83c753239646c6f6a04128Amit MahajanTEST_P(CpuConsumerTest, FromCpuSingle) {
5460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    status_t err;
5470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    CpuConsumerTestParams params = GetParam();
54805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
54905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    // Set up
55005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
55105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, 1));
55205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
55305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    // Produce
55405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
55505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    const int64_t time = 12345678L;
55605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    uint32_t stride;
55705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time,
55805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    &stride));
55905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
56005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    // Consume
56105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
56218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    CpuConsumer::LockedBuffer b;
56318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    err = mCC->lockNextBuffer(&b);
56418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    ASSERT_NO_ERROR(err, "getNextBuffer error: ");
56518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
56618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    ASSERT_TRUE(b.data != NULL);
56718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    EXPECT_EQ(params.width,  b.width);
56818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    EXPECT_EQ(params.height, b.height);
56918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    EXPECT_EQ(params.format, b.format);
57018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    EXPECT_EQ(stride, b.stride);
57118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    EXPECT_EQ(time, b.timestamp);
57218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
57318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    checkAnyBuffer(b, GetParam().format);
57418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    mCC->unlockBuffer(b);
57518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu}
57618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
57718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu// This test is disabled because the HAL_PIXEL_FORMAT_RAW16 format is not
57818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu// supported on all devices.
579ec334adf4017ca172f44612d01456e671f922344Amit MahajanTEST_P(CpuConsumerTest, FromCpuManyInQueue) {
580ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    status_t err;
5810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    CpuConsumerTestParams params = GetParam();
5820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
583    const int numInQueue = 5;
584    // Set up
585
586    ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, numInQueue));
587
588    // Produce
589
590    const int64_t time[numInQueue] = { 1L, 2L, 3L, 4L, 5L};
591    uint32_t stride[numInQueue];
592
593    for (int i = 0; i < numInQueue; i++) {
594        ALOGV("Producing frame %d", i);
595        ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time[i],
596                        &stride[i]));
597    }
598
599    // Consume
600
601    for (int i = 0; i < numInQueue; i++) {
602        ALOGV("Consuming frame %d", i);
603        CpuConsumer::LockedBuffer b;
604        err = mCC->lockNextBuffer(&b);
605        ASSERT_NO_ERROR(err, "getNextBuffer error: ");
606
607        ASSERT_TRUE(b.data != NULL);
608        EXPECT_EQ(params.width,  b.width);
609        EXPECT_EQ(params.height, b.height);
610        EXPECT_EQ(params.format, b.format);
611        EXPECT_EQ(stride[i], b.stride);
612        EXPECT_EQ(time[i], b.timestamp);
613
614        checkAnyBuffer(b, GetParam().format);
615
616        mCC->unlockBuffer(b);
617    }
618}
619
620// This test is disabled because the HAL_PIXEL_FORMAT_RAW16 format is not
621// supported on all devices.
622TEST_P(CpuConsumerTest, FromCpuLockMax) {
623    status_t err;
624    CpuConsumerTestParams params = GetParam();
625
626    // Set up
627
628    ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, params.maxLockedBuffers + 1));
629
630    // Produce
631
632    const int64_t time = 1234L;
633    uint32_t stride;
634
635    for (int i = 0; i < params.maxLockedBuffers + 1; i++) {
636        ALOGV("Producing frame %d", i);
637        ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time,
638                        &stride));
639    }
640
641    // Consume
642
643    CpuConsumer::LockedBuffer *b = new CpuConsumer::LockedBuffer[params.maxLockedBuffers];
644    for (int i = 0; i < params.maxLockedBuffers; i++) {
645        ALOGV("Locking frame %d", i);
646        err = mCC->lockNextBuffer(&b[i]);
647        ASSERT_NO_ERROR(err, "getNextBuffer error: ");
648
649        ASSERT_TRUE(b[i].data != NULL);
650        EXPECT_EQ(params.width,  b[i].width);
651        EXPECT_EQ(params.height, b[i].height);
652        EXPECT_EQ(params.format, b[i].format);
653        EXPECT_EQ(stride, b[i].stride);
654        EXPECT_EQ(time, b[i].timestamp);
655
656        checkAnyBuffer(b[i], GetParam().format);
657    }
658
659    ALOGV("Locking frame %d (too many)", params.maxLockedBuffers);
660    CpuConsumer::LockedBuffer bTooMuch;
661    err = mCC->lockNextBuffer(&bTooMuch);
662    ASSERT_TRUE(err == NOT_ENOUGH_DATA) << "Allowing too many locks";
663
664    ALOGV("Unlocking frame 0");
665    err = mCC->unlockBuffer(b[0]);
666    ASSERT_NO_ERROR(err, "Could not unlock buffer 0: ");
667
668    ALOGV("Locking frame %d (should work now)", params.maxLockedBuffers);
669    err = mCC->lockNextBuffer(&bTooMuch);
670    ASSERT_NO_ERROR(err, "Did not allow new lock after unlock");
671
672    ASSERT_TRUE(bTooMuch.data != NULL);
673    EXPECT_EQ(params.width,  bTooMuch.width);
674    EXPECT_EQ(params.height, bTooMuch.height);
675    EXPECT_EQ(params.format, bTooMuch.format);
676    EXPECT_EQ(stride, bTooMuch.stride);
677    EXPECT_EQ(time, bTooMuch.timestamp);
678
679    checkAnyBuffer(bTooMuch, GetParam().format);
680
681    ALOGV("Unlocking extra buffer");
682    err = mCC->unlockBuffer(bTooMuch);
683    ASSERT_NO_ERROR(err, "Could not unlock extra buffer: ");
684
685    ALOGV("Locking frame %d (no more available)", params.maxLockedBuffers + 1);
686    err = mCC->lockNextBuffer(&b[0]);
687    ASSERT_EQ(BAD_VALUE, err) << "Not out of buffers somehow";
688
689    for (int i = 1; i < params.maxLockedBuffers; i++) {
690        mCC->unlockBuffer(b[i]);
691    }
692
693    delete[] b;
694
695}
696
697CpuConsumerTestParams y8TestSets[] = {
698    { 512,   512, 1, HAL_PIXEL_FORMAT_Y8},
699    { 512,   512, 3, HAL_PIXEL_FORMAT_Y8},
700    { 2608, 1960, 1, HAL_PIXEL_FORMAT_Y8},
701    { 2608, 1960, 3, HAL_PIXEL_FORMAT_Y8},
702    { 100,   100, 1, HAL_PIXEL_FORMAT_Y8},
703    { 100,   100, 3, HAL_PIXEL_FORMAT_Y8},
704};
705
706CpuConsumerTestParams y16TestSets[] = {
707    { 512,   512, 1, HAL_PIXEL_FORMAT_Y16},
708    { 512,   512, 3, HAL_PIXEL_FORMAT_Y16},
709    { 2608, 1960, 1, HAL_PIXEL_FORMAT_Y16},
710    { 2608, 1960, 3, HAL_PIXEL_FORMAT_Y16},
711    { 100,   100, 1, HAL_PIXEL_FORMAT_Y16},
712    { 100,   100, 3, HAL_PIXEL_FORMAT_Y16},
713};
714
715CpuConsumerTestParams rawTestSets[] = {
716    { 512,   512, 1, HAL_PIXEL_FORMAT_RAW16},
717    { 512,   512, 3, HAL_PIXEL_FORMAT_RAW16},
718    { 2608, 1960, 1, HAL_PIXEL_FORMAT_RAW16},
719    { 2608, 1960, 3, HAL_PIXEL_FORMAT_RAW16},
720    { 100,   100, 1, HAL_PIXEL_FORMAT_RAW16},
721    { 100,   100, 3, HAL_PIXEL_FORMAT_RAW16},
722};
723
724CpuConsumerTestParams rgba8888TestSets[] = {
725    { 512,   512, 1, HAL_PIXEL_FORMAT_RGBA_8888},
726    { 512,   512, 3, HAL_PIXEL_FORMAT_RGBA_8888},
727    { 2608, 1960, 1, HAL_PIXEL_FORMAT_RGBA_8888},
728    { 2608, 1960, 3, HAL_PIXEL_FORMAT_RGBA_8888},
729    { 100,   100, 1, HAL_PIXEL_FORMAT_RGBA_8888},
730    { 100,   100, 3, HAL_PIXEL_FORMAT_RGBA_8888},
731};
732
733#if CPU_CONSUMER_TEST_FORMAT_Y8
734INSTANTIATE_TEST_CASE_P(Y8Tests,
735        CpuConsumerTest,
736        ::testing::ValuesIn(y8TestSets));
737#endif
738
739#if CPU_CONSUMER_TEST_FORMAT_Y16
740INSTANTIATE_TEST_CASE_P(Y16Tests,
741        CpuConsumerTest,
742        ::testing::ValuesIn(y16TestSets));
743#endif
744
745#if CPU_CONSUMER_TEST_FORMAT_RAW
746INSTANTIATE_TEST_CASE_P(RawTests,
747        CpuConsumerTest,
748        ::testing::ValuesIn(rawTestSets));
749#endif
750
751#if CPU_CONSUMER_TEST_FORMAT_RGBA_8888
752INSTANTIATE_TEST_CASE_P(Rgba8888Tests,
753        CpuConsumerTest,
754        ::testing::ValuesIn(rgba8888TestSets));
755#endif
756
757
758
759} // namespace android
760