1e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala/*
2e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
3e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala *
4e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * you may not use this file except in compliance with the License.
6e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * You may obtain a copy of the License at
7e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala *
8e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala *
10e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * See the License for the specific language governing permissions and
14e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * limitations under the License.
15e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala */
16e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
17e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define LOG_TAG "CpuConsumer_test"
18e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala//#define LOG_NDEBUG 0
19e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala//#define LOG_NNDEBUG 0
20e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
21e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#ifdef LOG_NNDEBUG
22e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define ALOGVV(...) ALOGV(__VA_ARGS__)
23e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#else
24e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define ALOGVV(...) ((void)0)
25e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#endif
26e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
27e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <gtest/gtest.h>
28e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <gui/CpuConsumer.h>
29e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h>
30e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <ui/GraphicBuffer.h>
31e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/String8.h>
32e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/Thread.h>
33e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/Mutex.h>
34e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/Condition.h>
35e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
3629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#define CPU_CONSUMER_TEST_FORMAT_RAW 0
3729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#define CPU_CONSUMER_TEST_FORMAT_Y8 0
3829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#define CPU_CONSUMER_TEST_FORMAT_Y16 0
3929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#define CPU_CONSUMER_TEST_FORMAT_RGBA_8888 1
4029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
41e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalanamespace android {
42e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
43e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalastruct CpuConsumerTestParams {
44e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t width;
45e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t height;
46e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    int maxLockedBuffers;
47e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    PixelFormat format;
48e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala};
49e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
50e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala::std::ostream& operator<<(::std::ostream& os, const CpuConsumerTestParams& p) {
51e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    return os << "[ (" << p.width << ", " << p.height << "), B:"
52e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala              << p.maxLockedBuffers << ", F:0x"
53e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala              << ::std::hex << p.format << "]";
54e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
55e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
56e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalaclass CpuConsumerTest : public ::testing::TestWithParam<CpuConsumerTestParams> {
57e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalaprotected:
58e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
59e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    virtual void SetUp() {
60e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        const ::testing::TestInfo* const test_info =
61e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                ::testing::UnitTest::GetInstance()->current_test_info();
62e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        CpuConsumerTestParams params = GetParam();
63e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ALOGV("** Starting test %s (%d x %d, %d, 0x%x)",
64e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                test_info->name(),
65e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                params.width, params.height,
66e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                params.maxLockedBuffers, params.format);
675603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza        sp<IGraphicBufferProducer> producer;
685603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza        sp<IGraphicBufferConsumer> consumer;
695603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza        BufferQueue::createBufferQueue(&producer, &consumer);
705603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza        mCC = new CpuConsumer(consumer, params.maxLockedBuffers);
71e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        String8 name("CpuConsumer_Under_Test");
72e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mCC->setName(name);
735603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza        mSTC = new Surface(producer);
74e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mANW = mSTC;
75e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
76e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
77e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    virtual void TearDown() {
78e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mANW.clear();
79e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mSTC.clear();
80e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mCC.clear();
81e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
82e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
83e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    class FrameWaiter : public CpuConsumer::FrameAvailableListener {
84e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    public:
85e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        FrameWaiter():
86e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                mPendingFrames(0) {
87e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
88e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
89e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        void waitForFrame() {
90e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
91e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            while (mPendingFrames == 0) {
92e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                mCondition.wait(mMutex);
93e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            }
94e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mPendingFrames--;
95e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
96e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
97f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza        virtual void onFrameAvailable(const BufferItem&) {
98e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
99e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mPendingFrames++;
100e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mCondition.signal();
101e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
102e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
103e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        int mPendingFrames;
104e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Mutex mMutex;
105e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Condition mCondition;
106e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    };
107e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
108e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Note that SurfaceTexture will lose the notifications
109e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // onBuffersReleased and onFrameAvailable as there is currently
110e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // no way to forward the events.  This DisconnectWaiter will not let the
111e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // disconnect finish until finishDisconnect() is called.  It will
112e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // also block until a disconnect is called
113e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    class DisconnectWaiter : public BufferQueue::ConsumerListener {
114e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    public:
115e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        DisconnectWaiter () :
116e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mWaitForDisconnect(false),
117e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mPendingFrames(0) {
118e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
119e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
120e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        void waitForFrame() {
121e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
122e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            while (mPendingFrames == 0) {
123e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                mFrameCondition.wait(mMutex);
124e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            }
125e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mPendingFrames--;
126e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
127e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
128f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza        virtual void onFrameAvailable(const BufferItem&) {
129e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
130e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mPendingFrames++;
131e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mFrameCondition.signal();
132e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
133e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
134e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        virtual void onBuffersReleased() {
135e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
136e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            while (!mWaitForDisconnect) {
137e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                mDisconnectCondition.wait(mMutex);
138e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            }
139e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
140e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
141e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        void finishDisconnect() {
142e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
143e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mWaitForDisconnect = true;
144e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mDisconnectCondition.signal();
145e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
146e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
147e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    private:
148e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Mutex mMutex;
149e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
150e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        bool mWaitForDisconnect;
151e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Condition mDisconnectCondition;
152e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
153e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        int mPendingFrames;
154e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Condition mFrameCondition;
155e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    };
156e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
157e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    sp<CpuConsumer> mCC;
158e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<Surface> mSTC;
159e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    sp<ANativeWindow> mANW;
160e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala};
161e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
162e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define ASSERT_NO_ERROR(err, msg) \
1637c5f1090fa1710ab253a2320401f41fb1e4440adChih-Hung Hsieh    ASSERT_EQ(NO_ERROR, err) << (msg) << strerror(-(err))
164e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
165e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid checkPixel(const CpuConsumer::LockedBuffer &buf,
16629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        uint32_t x, uint32_t y, uint32_t r, uint32_t g=0, uint32_t b=0) {
167e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Ignores components that don't exist for given pixel
168e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    switch(buf.format) {
16982c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW16: {
170e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            String8 msg;
171e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            uint16_t *bPtr = (uint16_t*)buf.data;
172e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            bPtr += y * buf.stride + x;
173e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            // GRBG Bayer mosaic; only check the matching channel
174e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            switch( ((y & 1) << 1) | (x & 1) ) {
175e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                case 0: // G
176e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                case 3: // G
177e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    EXPECT_EQ(g, *bPtr);
178e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    break;
179e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                case 1: // R
180e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    EXPECT_EQ(r, *bPtr);
181e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    break;
182e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                case 2: // B
183e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    EXPECT_EQ(b, *bPtr);
184e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    break;
185e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            }
186e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            break;
187e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
18829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        // ignores g,b
18929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        case HAL_PIXEL_FORMAT_Y8: {
19029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            uint8_t *bPtr = (uint8_t*)buf.data;
19129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            bPtr += y * buf.stride + x;
19229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            EXPECT_EQ(r, *bPtr) << "at x = " << x << " y = " << y;
19329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            break;
19429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        }
19529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        // ignores g,b
19629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        case HAL_PIXEL_FORMAT_Y16: {
19729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            // stride is in pixels, not in bytes
19829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            uint16_t *bPtr = ((uint16_t*)buf.data) + y * buf.stride + x;
19929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
20029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            EXPECT_EQ(r, *bPtr) << "at x = " << x << " y = " << y;
20129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            break;
20229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        }
20329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        case HAL_PIXEL_FORMAT_RGBA_8888: {
20429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            const int bytesPerPixel = 4;
20529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            uint8_t *bPtr = (uint8_t*)buf.data;
20629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            bPtr += (y * buf.stride + x) * bytesPerPixel;
20729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
20829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            EXPECT_EQ(r, bPtr[0]) << "at x = " << x << " y = " << y;
20929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            EXPECT_EQ(g, bPtr[1]) << "at x = " << x << " y = " << y;
21029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            EXPECT_EQ(b, bPtr[2]) << "at x = " << x << " y = " << y;
21129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            break;
21229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        }
213e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        default: {
214e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            ADD_FAILURE() << "Unknown format for check:" << buf.format;
215e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            break;
216e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
217e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
218e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
219e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
220e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// Fill a YV12 buffer with a multi-colored checkerboard pattern
221d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennisvoid fillYV12Buffer(uint8_t* buf, int w, int h, int stride);
222e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
22329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin// Fill a Y8/Y16 buffer with a multi-colored checkerboard pattern
22429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkintemplate <typename T> // T == uint8_t or uint16_t
22529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkinvoid fillGreyscaleBuffer(T* buf, int w, int h, int stride, int bpp) {
22629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockWidth = w > 16 ? w / 16 : 1;
22729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockHeight = h > 16 ? h / 16 : 1;
22829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int yuvTexOffsetY = 0;
22929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
23029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    ASSERT_TRUE(bpp == 8 || bpp == 16);
23129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    ASSERT_TRUE(sizeof(T)*8 == bpp);
23229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
23329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // stride is in pixels, not in bytes
23429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    int yuvTexStrideY = stride;
23529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    for (int x = 0; x < w; x++) {
23629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        for (int y = 0; y < h; y++) {
23729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            int parityX = (x / blockWidth) & 1;
23829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            int parityY = (y / blockHeight) & 1;
23929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            T intensity = (parityX ^ parityY) ? 63 : 191;
24029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity;
24129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        }
24229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    }
24329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin}
24429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
24529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkininline uint8_t chooseColorRgba8888(int blockX, int blockY, uint8_t channel) {
24629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int colorVariations = 3;
24729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    uint8_t color = ((blockX % colorVariations) + (blockY % colorVariations))
24829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin                        % (colorVariations) == channel ? 191: 63;
24929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
25029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    return color;
25129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin}
25229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
25329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin// Fill a RGBA8888 buffer with a multi-colored checkerboard pattern
25429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkinvoid fillRgba8888Buffer(uint8_t* buf, int w, int h, int stride)
25529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin{
25629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockWidth = w > 16 ? w / 16 : 1;
25729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockHeight = h > 16 ? h / 16 : 1;
25829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int bytesPerPixel = 4;
25929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
26029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // stride is in pixels, not in bytes
26129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    for (int x = 0; x < w; ++x) {
26229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        for (int y = 0; y < h; ++y) {
26329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            int blockX = (x / blockWidth);
26429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            int blockY = (y / blockHeight);
26529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
26629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            uint8_t r = chooseColorRgba8888(blockX, blockY, 0);
26729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            uint8_t g = chooseColorRgba8888(blockX, blockY, 1);
26829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            uint8_t b = chooseColorRgba8888(blockX, blockY, 2);
26929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
27029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            buf[(y*stride + x)*bytesPerPixel + 0] = r;
27129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            buf[(y*stride + x)*bytesPerPixel + 1] = g;
27229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            buf[(y*stride + x)*bytesPerPixel + 2] = b;
27329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            buf[(y*stride + x)*bytesPerPixel + 3] = 255;
27429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        }
27529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    }
27629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin}
27729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
278e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// Fill a RAW sensor buffer with a multi-colored checkerboard pattern.
279e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// Assumes GRBG mosaic ordering. Result should be a grid in a 2x2 pattern
280e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// of [ R, B; G, W]
281e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid fillBayerRawBuffer(uint8_t* buf, int w, int h, int stride) {
282e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("fillBayerRawBuffer: %p with %d x %d, stride %d", buf, w, h ,stride);
283e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Blocks need to be even-width/height, aim for 8-wide otherwise
284e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockWidth = (w > 16 ? w / 8 : 2) & ~0x1;
285e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockHeight = (h > 16 ? h / 8 : 2) & ~0x1;
286e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int y = 0; y < h; y+=2) {
287e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint16_t *bPtr1 = ((uint16_t*)buf) + stride*y;
288e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint16_t *bPtr2 = bPtr1 + stride;
289e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        for (int x = 0; x < w; x+=2) {
290e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            int blockX = (x / blockWidth ) & 1;
291e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            int blockY = (y / blockHeight) & 1;
292e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            unsigned short r = (blockX == blockY) ? 1000 : 200;
293e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            unsigned short g = blockY ? 1000: 200;
294e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            unsigned short b = blockX ? 1000: 200;
295e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            // GR row
296e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            *bPtr1++ = g;
297e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            *bPtr1++ = r;
298e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            // BG row
299e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            *bPtr2++ = b;
300e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            *bPtr2++ = g;
301e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
302e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
303e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
304e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
305e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
30629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkintemplate<typename T> // uint8_t or uint16_t
30729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkinvoid checkGreyscaleBuffer(const CpuConsumer::LockedBuffer &buf) {
30829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    uint32_t w = buf.width;
30929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    uint32_t h = buf.height;
31029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockWidth = w > 16 ? w / 16 : 1;
31129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockHeight = h > 16 ? h / 16 : 1;
31229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockRows = h / blockHeight;
31329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockCols = w / blockWidth;
31429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
31529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // Top-left square is bright
31629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 0, 0, 191);
31729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 1, 0, 191);
31829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 0, 1, 191);
31929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 1, 1, 191);
32029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
32129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // One-right square is dark
32229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth,     0, 63);
32329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth + 1, 0, 63);
32429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth,     1, 63);
32529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth + 1, 1, 63);
32629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
32729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // One-down square is dark
32829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 0, blockHeight, 63);
32929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 1, blockHeight, 63);
33029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 0, blockHeight + 1, 63);
33129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 1, blockHeight + 1, 63);
33229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
33329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // One-diag square is bright
33429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth,     blockHeight, 191);
33529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth + 1, blockHeight, 191);
33629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth,     blockHeight + 1, 191);
33729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth + 1, blockHeight + 1, 191);
33829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
33929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // Test bottom-right pixel
34029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int maxBlockX = ((w-1 + (blockWidth-1)) / blockWidth) & 0x1;
34129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int maxBlockY = ((h-1 + (blockHeight-1)) / blockHeight) & 0x1;
34229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    uint32_t pixelValue = ((maxBlockX % 2) == (maxBlockY % 2)) ? 191 : 63;
34329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, w-1, h-1, pixelValue);
34429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin}
34529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
34629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkinvoid checkRgba8888Buffer(const CpuConsumer::LockedBuffer &buf) {
34729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    uint32_t w = buf.width;
34829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    uint32_t h = buf.height;
34929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockWidth = w > 16 ? w / 16 : 1;
35029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockHeight = h > 16 ? h / 16 : 1;
35129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockRows = h / blockHeight;
35229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    const int blockCols = w / blockWidth;
35329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
35429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // Top-left square is bright red
35529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 0, 0, 191, 63, 63);
35629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 1, 0, 191, 63, 63);
35729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 0, 1, 191, 63, 63);
35829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 1, 1, 191, 63, 63);
35929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
36029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // One-right square is bright green
36129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth,     0, 63, 191, 63);
36229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth + 1, 0, 63, 191, 63);
36329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth,     1, 63, 191, 63);
36429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth + 1, 1, 63, 191, 63);
36529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
36629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // One-down square is bright green
36729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 0, blockHeight, 63, 191, 63);
36829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 1, blockHeight, 63, 191, 63);
36929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 0, blockHeight + 1, 63, 191, 63);
37029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, 1, blockHeight + 1, 63, 191, 63);
37129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
37229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // One-diag square is bright blue
37329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth,     blockHeight, 63, 63, 191);
37429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth + 1, blockHeight, 63, 63, 191);
37529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth,     blockHeight + 1, 63, 63, 191);
37629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkPixel(buf, blockWidth + 1, blockHeight + 1, 63, 63, 191);
37729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
37829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    // Test bottom-right pixel
37929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    {
38029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        const int maxBlockX = ((w-1) / blockWidth);
38129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        const int maxBlockY = ((h-1) / blockHeight);
38229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        uint8_t r = chooseColorRgba8888(maxBlockX, maxBlockY, 0);
38329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        uint8_t g = chooseColorRgba8888(maxBlockX, maxBlockY, 1);
38429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        uint8_t b = chooseColorRgba8888(maxBlockX, maxBlockY, 2);
38529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        checkPixel(buf, w-1, h-1, r, g, b);
38629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    }
38729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin}
38829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
389e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid checkBayerRawBuffer(const CpuConsumer::LockedBuffer &buf) {
390e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t w = buf.width;
391e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t h = buf.height;
392e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockWidth = (w > 16 ? w / 8 : 2) & ~0x1;
393e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockHeight = (h > 16 ? h / 8 : 2) & ~0x1;
394e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockRows = h / blockHeight;
395e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockCols = w / blockWidth;
396e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
397e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Top-left square is red
398e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 0, 0, 1000, 200, 200);
399e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 1, 0, 1000, 200, 200);
400e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 0, 1, 1000, 200, 200);
401e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 1, 1, 1000, 200, 200);
402e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
403e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // One-right square is blue
404e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth,     0, 200, 200, 1000);
405e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth + 1, 0, 200, 200, 1000);
406e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth,     1, 200, 200, 1000);
407e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth + 1, 1, 200, 200, 1000);
408e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
409e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // One-down square is green
410e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 0, blockHeight, 200, 1000, 200);
411e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 1, blockHeight, 200, 1000, 200);
412e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 0, blockHeight + 1, 200, 1000, 200);
413e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 1, blockHeight + 1, 200, 1000, 200);
414e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
415e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // One-diag square is white
416e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth,     blockHeight, 1000, 1000, 1000);
417e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth + 1, blockHeight, 1000, 1000, 1000);
418e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth,     blockHeight + 1, 1000, 1000, 1000);
419e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth + 1, blockHeight + 1, 1000, 1000, 1000);
420e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
421e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Test bottom-right pixel
422e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int maxBlockX = ((w-1) / blockWidth) & 0x1;
423e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int maxBlockY = ((w-1) / blockHeight) & 0x1;
424e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    unsigned short maxR = (maxBlockX == maxBlockY) ? 1000 : 200;
425e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    unsigned short maxG = maxBlockY ? 1000: 200;
426e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    unsigned short maxB = maxBlockX ? 1000: 200;
427e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, w-1, h-1, maxR, maxG, maxB);
428e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
429e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
43029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkinvoid checkAnyBuffer(const CpuConsumer::LockedBuffer &buf, int format) {
43129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    switch (format) {
43282c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW16:
43329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            checkBayerRawBuffer(buf);
43429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            break;
43529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        case HAL_PIXEL_FORMAT_Y8:
43629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            checkGreyscaleBuffer<uint8_t>(buf);
43729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            break;
43829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        case HAL_PIXEL_FORMAT_Y16:
43929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            checkGreyscaleBuffer<uint16_t>(buf);
44029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            break;
44129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        case HAL_PIXEL_FORMAT_RGBA_8888:
44229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            checkRgba8888Buffer(buf);
44329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            break;
44429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    }
44529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin}
44629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
447e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// Configures the ANativeWindow producer-side interface based on test parameters
448e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid configureANW(const sp<ANativeWindow>& anw,
449e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        const CpuConsumerTestParams& params,
450e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        int maxBufferSlack) {
451e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t err;
452583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    err = native_window_api_connect(anw.get(), NATIVE_WINDOW_API_CPU);
453583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    ASSERT_NO_ERROR(err, "connect error: ");
454583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos
455f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    err = native_window_set_buffers_dimensions(anw.get(),
456f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza            params.width, params.height);
457f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_NO_ERROR(err, "set_buffers_dimensions error: ");
458f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza
459f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    err = native_window_set_buffers_format(anw.get(), params.format);
460f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_NO_ERROR(err, "set_buffers_format error: ");
461e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
462e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = native_window_set_usage(anw.get(),
463e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            GRALLOC_USAGE_SW_WRITE_OFTEN);
464e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "set_usage error: ");
465e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
466e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    int minUndequeuedBuffers;
467e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = anw.get()->query(anw.get(),
468e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS,
469e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            &minUndequeuedBuffers);
470e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "query error: ");
471e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
472e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Setting buffer count to %d",
473e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            maxBufferSlack + 1 + minUndequeuedBuffers);
474e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = native_window_set_buffer_count(anw.get(),
475e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            maxBufferSlack + 1 + minUndequeuedBuffers);
476e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "set_buffer_count error: ");
477e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
478e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
479e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
480e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// Produce one frame of image data; assumes format and resolution configuration
481e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// is already done.
482e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid produceOneFrame(const sp<ANativeWindow>& anw,
483e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        const CpuConsumerTestParams& params,
484e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        int64_t timestamp, uint32_t *stride) {
485e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t err;
486e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ANativeWindowBuffer* anb;
487e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Dequeue buffer from %p", anw.get());
488d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    err = native_window_dequeue_buffer_and_wait(anw.get(), &anb);
489e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "dequeueBuffer error: ");
490e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
491e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_TRUE(anb != NULL);
492e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
493f543e5a7110868647e6dc16788b72ad7de80fa38Mathias Agopian    sp<GraphicBuffer> buf(GraphicBuffer::from(anb));
494e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
495e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    *stride = buf->getStride();
496e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint8_t* img = NULL;
497e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
498e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Lock buffer from %p for write", anw.get());
499e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img));
500e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "lock error: ");
501e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
502e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    switch (params.format) {
503e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:
504e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            fillYV12Buffer(img, params.width, params.height, *stride);
505e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            break;
50682c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW16:
507e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            fillBayerRawBuffer(img, params.width, params.height, buf->getStride());
508e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            break;
50929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        case HAL_PIXEL_FORMAT_Y8:
51029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            fillGreyscaleBuffer<uint8_t>(img, params.width, params.height,
51129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin                                         buf->getStride(), /*bpp*/8);
51229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            break;
51329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        case HAL_PIXEL_FORMAT_Y16:
51429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            fillGreyscaleBuffer<uint16_t>((uint16_t*)img, params.width,
51529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin                                          params.height, buf->getStride(),
51629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin                                          /*bpp*/16);
51729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            break;
51829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        case HAL_PIXEL_FORMAT_RGBA_8888:
51929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            fillRgba8888Buffer(img, params.width, params.height, buf->getStride());
52029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin            break;
521e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        default:
522e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            FAIL() << "Unknown pixel format under test!";
523e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            break;
524e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
525e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Unlock buffer from %p", anw.get());
526e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = buf->unlock();
527e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "unlock error: ");
528e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
529e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Set timestamp to %p", anw.get());
530e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = native_window_set_buffers_timestamp(anw.get(), timestamp);
531e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "set_buffers_timestamp error: ");
532e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
533e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Queue buffer to %p", anw.get());
534d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    err = anw->queueBuffer(anw.get(), buf->getNativeBuffer(), -1);
535e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "queueBuffer error:");
536e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala};
537e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
53882c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala// This test is disabled because the HAL_PIXEL_FORMAT_RAW16 format is not
539fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie Gennis// supported on all devices.
54029e2047cb4335234ddc0575be1bae66d4e2ff691Igor MurashkinTEST_P(CpuConsumerTest, FromCpuSingle) {
541e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t err;
542e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumerTestParams params = GetParam();
543e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
544e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Set up
545e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
546e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, 1));
547e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
548e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Produce
549e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
550e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int64_t time = 12345678L;
551e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t stride;
552e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time,
553e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    &stride));
554e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
555e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Consume
556e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
557e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumer::LockedBuffer b;
558e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->lockNextBuffer(&b);
559e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "getNextBuffer error: ");
560e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
561e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_TRUE(b.data != NULL);
562e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.width,  b.width);
563e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.height, b.height);
564e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.format, b.format);
565e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(stride, b.stride);
566e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(time, b.timestamp);
567e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
56829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkAnyBuffer(b, GetParam().format);
569e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    mCC->unlockBuffer(b);
570e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
571e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
57282c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala// This test is disabled because the HAL_PIXEL_FORMAT_RAW16 format is not
573fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie Gennis// supported on all devices.
57429e2047cb4335234ddc0575be1bae66d4e2ff691Igor MurashkinTEST_P(CpuConsumerTest, FromCpuManyInQueue) {
575e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t err;
576e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumerTestParams params = GetParam();
577e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
578e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int numInQueue = 5;
579e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Set up
580e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
581e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, numInQueue));
582e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
583e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Produce
584e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
585e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int64_t time[numInQueue] = { 1L, 2L, 3L, 4L, 5L};
586e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t stride[numInQueue];
587e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
588e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int i = 0; i < numInQueue; i++) {
589e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ALOGV("Producing frame %d", i);
590e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time[i],
591e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                        &stride[i]));
592e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
593e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
594e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Consume
595e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
596e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int i = 0; i < numInQueue; i++) {
597e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ALOGV("Consuming frame %d", i);
598e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        CpuConsumer::LockedBuffer b;
599e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        err = mCC->lockNextBuffer(&b);
600e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_NO_ERROR(err, "getNextBuffer error: ");
601e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
602e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_TRUE(b.data != NULL);
603e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.width,  b.width);
604e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.height, b.height);
605e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.format, b.format);
606e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(stride[i], b.stride);
607e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(time[i], b.timestamp);
608e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
60929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        checkAnyBuffer(b, GetParam().format);
610e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
611e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mCC->unlockBuffer(b);
612e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
613e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
614e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
61582c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala// This test is disabled because the HAL_PIXEL_FORMAT_RAW16 format is not
616fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie Gennis// supported on all devices.
61729e2047cb4335234ddc0575be1bae66d4e2ff691Igor MurashkinTEST_P(CpuConsumerTest, FromCpuLockMax) {
618e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t err;
619e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumerTestParams params = GetParam();
620e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
621e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Set up
622e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
623e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, params.maxLockedBuffers + 1));
624e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
625e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Produce
626e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
627e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int64_t time = 1234L;
628e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t stride;
629e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
630e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int i = 0; i < params.maxLockedBuffers + 1; i++) {
631e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ALOGV("Producing frame %d", i);
632e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time,
633e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                        &stride));
634e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
635e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
636e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Consume
637e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
638e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumer::LockedBuffer *b = new CpuConsumer::LockedBuffer[params.maxLockedBuffers];
639e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int i = 0; i < params.maxLockedBuffers; i++) {
640e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ALOGV("Locking frame %d", i);
641e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        err = mCC->lockNextBuffer(&b[i]);
642e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_NO_ERROR(err, "getNextBuffer error: ");
643e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
644e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_TRUE(b[i].data != NULL);
645e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.width,  b[i].width);
646e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.height, b[i].height);
647e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.format, b[i].format);
648e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(stride, b[i].stride);
649e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(time, b[i].timestamp);
650e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
65129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        checkAnyBuffer(b[i], GetParam().format);
652e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
653e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
654e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGV("Locking frame %d (too many)", params.maxLockedBuffers);
655e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumer::LockedBuffer bTooMuch;
656e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->lockNextBuffer(&bTooMuch);
6578f76b6bedf5c0b316d02a9f9de3d504c0344cb81Alistair Strachan    ASSERT_TRUE(err == NOT_ENOUGH_DATA) << "Allowing too many locks";
658e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
659e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGV("Unlocking frame 0");
660e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->unlockBuffer(b[0]);
661e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "Could not unlock buffer 0: ");
662e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
663e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGV("Locking frame %d (should work now)", params.maxLockedBuffers);
664e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->lockNextBuffer(&bTooMuch);
665e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "Did not allow new lock after unlock");
666e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
667e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_TRUE(bTooMuch.data != NULL);
668e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.width,  bTooMuch.width);
669e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.height, bTooMuch.height);
670e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.format, bTooMuch.format);
671e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(stride, bTooMuch.stride);
672e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(time, bTooMuch.timestamp);
673e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
67429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    checkAnyBuffer(bTooMuch, GetParam().format);
675e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
676e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGV("Unlocking extra buffer");
677e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->unlockBuffer(bTooMuch);
678e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "Could not unlock extra buffer: ");
679e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
680e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGV("Locking frame %d (no more available)", params.maxLockedBuffers + 1);
681e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->lockNextBuffer(&b[0]);
682e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_EQ(BAD_VALUE, err) << "Not out of buffers somehow";
683e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
684e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int i = 1; i < params.maxLockedBuffers; i++) {
685e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mCC->unlockBuffer(b[i]);
686e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
687e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
688e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    delete[] b;
689e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
690e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
691e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
69229e2047cb4335234ddc0575be1bae66d4e2ff691Igor MurashkinCpuConsumerTestParams y8TestSets[] = {
69329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 512,   512, 1, HAL_PIXEL_FORMAT_Y8},
69429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 512,   512, 3, HAL_PIXEL_FORMAT_Y8},
69529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 2608, 1960, 1, HAL_PIXEL_FORMAT_Y8},
69629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 2608, 1960, 3, HAL_PIXEL_FORMAT_Y8},
69729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 100,   100, 1, HAL_PIXEL_FORMAT_Y8},
69829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 100,   100, 3, HAL_PIXEL_FORMAT_Y8},
69929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin};
70029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
70129e2047cb4335234ddc0575be1bae66d4e2ff691Igor MurashkinCpuConsumerTestParams y16TestSets[] = {
70229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 512,   512, 1, HAL_PIXEL_FORMAT_Y16},
70329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 512,   512, 3, HAL_PIXEL_FORMAT_Y16},
70429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 2608, 1960, 1, HAL_PIXEL_FORMAT_Y16},
70529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 2608, 1960, 3, HAL_PIXEL_FORMAT_Y16},
70629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 100,   100, 1, HAL_PIXEL_FORMAT_Y16},
70729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 100,   100, 3, HAL_PIXEL_FORMAT_Y16},
70829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin};
70929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
710e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville TalvalaCpuConsumerTestParams rawTestSets[] = {
71182c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    { 512,   512, 1, HAL_PIXEL_FORMAT_RAW16},
71282c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    { 512,   512, 3, HAL_PIXEL_FORMAT_RAW16},
71382c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    { 2608, 1960, 1, HAL_PIXEL_FORMAT_RAW16},
71482c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    { 2608, 1960, 3, HAL_PIXEL_FORMAT_RAW16},
71582c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    { 100,   100, 1, HAL_PIXEL_FORMAT_RAW16},
71682c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    { 100,   100, 3, HAL_PIXEL_FORMAT_RAW16},
71729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin};
71829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
71929e2047cb4335234ddc0575be1bae66d4e2ff691Igor MurashkinCpuConsumerTestParams rgba8888TestSets[] = {
72029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 512,   512, 1, HAL_PIXEL_FORMAT_RGBA_8888},
72129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 512,   512, 3, HAL_PIXEL_FORMAT_RGBA_8888},
72229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 2608, 1960, 1, HAL_PIXEL_FORMAT_RGBA_8888},
72329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 2608, 1960, 3, HAL_PIXEL_FORMAT_RGBA_8888},
72429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 100,   100, 1, HAL_PIXEL_FORMAT_RGBA_8888},
72529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin    { 100,   100, 3, HAL_PIXEL_FORMAT_RGBA_8888},
726e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala};
727e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
72829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#if CPU_CONSUMER_TEST_FORMAT_Y8
72929e2047cb4335234ddc0575be1bae66d4e2ff691Igor MurashkinINSTANTIATE_TEST_CASE_P(Y8Tests,
73029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        CpuConsumerTest,
73129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        ::testing::ValuesIn(y8TestSets));
73229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#endif
73329e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
73429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#if CPU_CONSUMER_TEST_FORMAT_Y16
73529e2047cb4335234ddc0575be1bae66d4e2ff691Igor MurashkinINSTANTIATE_TEST_CASE_P(Y16Tests,
73629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        CpuConsumerTest,
73729e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        ::testing::ValuesIn(y16TestSets));
73829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#endif
73929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
74029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#if CPU_CONSUMER_TEST_FORMAT_RAW
741e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville TalvalaINSTANTIATE_TEST_CASE_P(RawTests,
742e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        CpuConsumerTest,
743e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ::testing::ValuesIn(rawTestSets));
74429e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#endif
74529e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
74629e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#if CPU_CONSUMER_TEST_FORMAT_RGBA_8888
74729e2047cb4335234ddc0575be1bae66d4e2ff691Igor MurashkinINSTANTIATE_TEST_CASE_P(Rgba8888Tests,
74829e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        CpuConsumerTest,
74929e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin        ::testing::ValuesIn(rgba8888TestSets));
75029e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin#endif
75129e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
75229e2047cb4335234ddc0575be1bae66d4e2ff691Igor Murashkin
753e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
754e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} // namespace android
755