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>
29e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <gui/SurfaceTextureClient.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
36e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <ui/FramebufferNativeWindow.h>
37e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
38e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalanamespace android {
39e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
40e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalastruct CpuConsumerTestParams {
41e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t width;
42e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t height;
43e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    int maxLockedBuffers;
44e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    PixelFormat format;
45e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala};
46e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
47e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala::std::ostream& operator<<(::std::ostream& os, const CpuConsumerTestParams& p) {
48e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    return os << "[ (" << p.width << ", " << p.height << "), B:"
49e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala              << p.maxLockedBuffers << ", F:0x"
50e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala              << ::std::hex << p.format << "]";
51e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
52e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
53e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalaclass CpuConsumerTest : public ::testing::TestWithParam<CpuConsumerTestParams> {
54e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalaprotected:
55e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
56e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    virtual void SetUp() {
57e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        const ::testing::TestInfo* const test_info =
58e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                ::testing::UnitTest::GetInstance()->current_test_info();
59e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        CpuConsumerTestParams params = GetParam();
60e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ALOGV("** Starting test %s (%d x %d, %d, 0x%x)",
61e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                test_info->name(),
62e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                params.width, params.height,
63e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                params.maxLockedBuffers, params.format);
64e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mCC = new CpuConsumer(params.maxLockedBuffers);
65e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        String8 name("CpuConsumer_Under_Test");
66e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mCC->setName(name);
67e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mSTC = new SurfaceTextureClient(mCC->getProducerInterface());
68e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mANW = mSTC;
69e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
70e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
71e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    virtual void TearDown() {
72e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mANW.clear();
73e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mSTC.clear();
74e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mCC.clear();
75e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
76e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
77e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    class FrameWaiter : public CpuConsumer::FrameAvailableListener {
78e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    public:
79e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        FrameWaiter():
80e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                mPendingFrames(0) {
81e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
82e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
83e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        void waitForFrame() {
84e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
85e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            while (mPendingFrames == 0) {
86e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                mCondition.wait(mMutex);
87e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            }
88e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mPendingFrames--;
89e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
90e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
91e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        virtual void onFrameAvailable() {
92e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
93e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mPendingFrames++;
94e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mCondition.signal();
95e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
96e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
97e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        int mPendingFrames;
98e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Mutex mMutex;
99e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Condition mCondition;
100e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    };
101e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
102e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Note that SurfaceTexture will lose the notifications
103e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // onBuffersReleased and onFrameAvailable as there is currently
104e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // no way to forward the events.  This DisconnectWaiter will not let the
105e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // disconnect finish until finishDisconnect() is called.  It will
106e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // also block until a disconnect is called
107e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    class DisconnectWaiter : public BufferQueue::ConsumerListener {
108e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    public:
109e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        DisconnectWaiter () :
110e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mWaitForDisconnect(false),
111e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mPendingFrames(0) {
112e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
113e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
114e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        void waitForFrame() {
115e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
116e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            while (mPendingFrames == 0) {
117e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                mFrameCondition.wait(mMutex);
118e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            }
119e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mPendingFrames--;
120e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
121e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
122e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        virtual void onFrameAvailable() {
123e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
124e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mPendingFrames++;
125e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mFrameCondition.signal();
126e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
127e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
128e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        virtual void onBuffersReleased() {
129e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
130e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            while (!mWaitForDisconnect) {
131e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                mDisconnectCondition.wait(mMutex);
132e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            }
133e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
134e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
135e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        void finishDisconnect() {
136e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            Mutex::Autolock lock(mMutex);
137e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mWaitForDisconnect = true;
138e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            mDisconnectCondition.signal();
139e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
140e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
141e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    private:
142e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Mutex mMutex;
143e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
144e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        bool mWaitForDisconnect;
145e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Condition mDisconnectCondition;
146e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
147e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        int mPendingFrames;
148e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        Condition mFrameCondition;
149e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    };
150e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
151e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    sp<CpuConsumer> mCC;
152e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    sp<SurfaceTextureClient> mSTC;
153e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    sp<ANativeWindow> mANW;
154e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala};
155e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
156e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define ASSERT_NO_ERROR(err, msg) \
157e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_EQ(NO_ERROR, err) << msg << strerror(-err)
158e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
159e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid checkPixel(const CpuConsumer::LockedBuffer &buf,
160e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint32_t x, uint32_t y, uint32_t r, uint32_t g, uint32_t b) {
161e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Ignores components that don't exist for given pixel
162e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    switch(buf.format) {
163e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR: {
164e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            String8 msg;
165e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            uint16_t *bPtr = (uint16_t*)buf.data;
166e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            bPtr += y * buf.stride + x;
167e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            // GRBG Bayer mosaic; only check the matching channel
168e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            switch( ((y & 1) << 1) | (x & 1) ) {
169e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                case 0: // G
170e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                case 3: // G
171e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    EXPECT_EQ(g, *bPtr);
172e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    break;
173e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                case 1: // R
174e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    EXPECT_EQ(r, *bPtr);
175e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    break;
176e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                case 2: // B
177e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    EXPECT_EQ(b, *bPtr);
178e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    break;
179e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            }
180e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            break;
181e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
182e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        default: {
183e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            ADD_FAILURE() << "Unknown format for check:" << buf.format;
184e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            break;
185e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
186e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
187e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
188e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
189e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// Fill a YV12 buffer with a multi-colored checkerboard pattern
190d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennisvoid fillYV12Buffer(uint8_t* buf, int w, int h, int stride);
191e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
192e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// Fill a RAW sensor buffer with a multi-colored checkerboard pattern.
193e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// Assumes GRBG mosaic ordering. Result should be a grid in a 2x2 pattern
194e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// of [ R, B; G, W]
195e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid fillBayerRawBuffer(uint8_t* buf, int w, int h, int stride) {
196e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("fillBayerRawBuffer: %p with %d x %d, stride %d", buf, w, h ,stride);
197e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Blocks need to be even-width/height, aim for 8-wide otherwise
198e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockWidth = (w > 16 ? w / 8 : 2) & ~0x1;
199e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockHeight = (h > 16 ? h / 8 : 2) & ~0x1;
200e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int y = 0; y < h; y+=2) {
201e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint16_t *bPtr1 = ((uint16_t*)buf) + stride*y;
202e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        uint16_t *bPtr2 = bPtr1 + stride;
203e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        for (int x = 0; x < w; x+=2) {
204e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            int blockX = (x / blockWidth ) & 1;
205e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            int blockY = (y / blockHeight) & 1;
206e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            unsigned short r = (blockX == blockY) ? 1000 : 200;
207e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            unsigned short g = blockY ? 1000: 200;
208e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            unsigned short b = blockX ? 1000: 200;
209e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            // GR row
210e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            *bPtr1++ = g;
211e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            *bPtr1++ = r;
212e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            // BG row
213e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            *bPtr2++ = b;
214e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            *bPtr2++ = g;
215e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        }
216e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
217e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
218e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
219e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
220e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid checkBayerRawBuffer(const CpuConsumer::LockedBuffer &buf) {
221e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t w = buf.width;
222e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t h = buf.height;
223e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockWidth = (w > 16 ? w / 8 : 2) & ~0x1;
224e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockHeight = (h > 16 ? h / 8 : 2) & ~0x1;
225e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockRows = h / blockHeight;
226e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int blockCols = w / blockWidth;
227e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
228e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Top-left square is red
229e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 0, 0, 1000, 200, 200);
230e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 1, 0, 1000, 200, 200);
231e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 0, 1, 1000, 200, 200);
232e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 1, 1, 1000, 200, 200);
233e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
234e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // One-right square is blue
235e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth,     0, 200, 200, 1000);
236e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth + 1, 0, 200, 200, 1000);
237e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth,     1, 200, 200, 1000);
238e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth + 1, 1, 200, 200, 1000);
239e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
240e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // One-down square is green
241e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 0, blockHeight, 200, 1000, 200);
242e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 1, blockHeight, 200, 1000, 200);
243e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 0, blockHeight + 1, 200, 1000, 200);
244e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, 1, blockHeight + 1, 200, 1000, 200);
245e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
246e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // One-diag square is white
247e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth,     blockHeight, 1000, 1000, 1000);
248e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth + 1, blockHeight, 1000, 1000, 1000);
249e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth,     blockHeight + 1, 1000, 1000, 1000);
250e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, blockWidth + 1, blockHeight + 1, 1000, 1000, 1000);
251e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
252e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Test bottom-right pixel
253e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int maxBlockX = ((w-1) / blockWidth) & 0x1;
254e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int maxBlockY = ((w-1) / blockHeight) & 0x1;
255e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    unsigned short maxR = (maxBlockX == maxBlockY) ? 1000 : 200;
256e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    unsigned short maxG = maxBlockY ? 1000: 200;
257e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    unsigned short maxB = maxBlockX ? 1000: 200;
258e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkPixel(buf, w-1, h-1, maxR, maxG, maxB);
259e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
260e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
261e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid fillYV12BufferRect(uint8_t* buf, int w, int h, int stride,
262d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        const android_native_rect_t& rect);
263e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
264d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennisvoid fillRGBA8Buffer(uint8_t* buf, int w, int h, int stride);
265e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
266e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid fillRGBA8BufferSolid(uint8_t* buf, int w, int h, int stride, uint8_t r,
267d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        uint8_t g, uint8_t b, uint8_t a);
268e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
269e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// Configures the ANativeWindow producer-side interface based on test parameters
270e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid configureANW(const sp<ANativeWindow>& anw,
271e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        const CpuConsumerTestParams& params,
272e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        int maxBufferSlack) {
273e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t err;
274e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = native_window_set_buffers_geometry(anw.get(),
275e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            params.width, params.height, params.format);
276e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "set_buffers_geometry error: ");
277e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
278e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = native_window_set_usage(anw.get(),
279e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            GRALLOC_USAGE_SW_WRITE_OFTEN);
280e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "set_usage error: ");
281e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
282e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    int minUndequeuedBuffers;
283e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = anw.get()->query(anw.get(),
284e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS,
285e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            &minUndequeuedBuffers);
286e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "query error: ");
287e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
288e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Setting buffer count to %d",
289e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            maxBufferSlack + 1 + minUndequeuedBuffers);
290e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = native_window_set_buffer_count(anw.get(),
291e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            maxBufferSlack + 1 + minUndequeuedBuffers);
292e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "set_buffer_count error: ");
293e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
294e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
295e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
296e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// Produce one frame of image data; assumes format and resolution configuration
297e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala// is already done.
298e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid produceOneFrame(const sp<ANativeWindow>& anw,
299e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        const CpuConsumerTestParams& params,
300e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        int64_t timestamp, uint32_t *stride) {
301e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t err;
302e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ANativeWindowBuffer* anb;
303e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Dequeue buffer from %p", anw.get());
304d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    err = native_window_dequeue_buffer_and_wait(anw.get(), &anb);
305e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "dequeueBuffer error: ");
306e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
307e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_TRUE(anb != NULL);
308e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
309e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    sp<GraphicBuffer> buf(new GraphicBuffer(anb, false));
310e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
311e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    *stride = buf->getStride();
312e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint8_t* img = NULL;
313e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
314e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Lock buffer from %p for write", anw.get());
315e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img));
316e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "lock error: ");
317e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
318e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    switch (params.format) {
319e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:
320e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            fillYV12Buffer(img, params.width, params.height, *stride);
321e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            break;
322e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
323e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            fillBayerRawBuffer(img, params.width, params.height, buf->getStride());
324e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            break;
325e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        default:
326e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            FAIL() << "Unknown pixel format under test!";
327e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala            break;
328e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
329e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Unlock buffer from %p", anw.get());
330e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = buf->unlock();
331e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "unlock error: ");
332e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
333e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Set timestamp to %p", anw.get());
334e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = native_window_set_buffers_timestamp(anw.get(), timestamp);
335e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "set_buffers_timestamp error: ");
336e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
337e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGVV("Queue buffer to %p", anw.get());
338d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    err = anw->queueBuffer(anw.get(), buf->getNativeBuffer(), -1);
339e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "queueBuffer error:");
340e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala};
341e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
342fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie Gennis// This test is disabled because the HAL_PIXEL_FORMAT_RAW_SENSOR format is not
343fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie Gennis// supported on all devices.
344fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie GennisTEST_P(CpuConsumerTest, DISABLED_FromCpuSingle) {
345e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t err;
346e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumerTestParams params = GetParam();
347e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
348e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Set up
349e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
350e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, 1));
351e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
352e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Produce
353e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
354e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int64_t time = 12345678L;
355e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t stride;
356e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time,
357e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                    &stride));
358e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
359e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Consume
360e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
361e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumer::LockedBuffer b;
362e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->lockNextBuffer(&b);
363e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "getNextBuffer error: ");
364e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
365e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_TRUE(b.data != NULL);
366e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.width,  b.width);
367e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.height, b.height);
368e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.format, b.format);
369e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(stride, b.stride);
370e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(time, b.timestamp);
371e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
372e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkBayerRawBuffer(b);
373e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    mCC->unlockBuffer(b);
374e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
375e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
376fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie Gennis// This test is disabled because the HAL_PIXEL_FORMAT_RAW_SENSOR format is not
377fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie Gennis// supported on all devices.
378fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie GennisTEST_P(CpuConsumerTest, DISABLED_FromCpuManyInQueue) {
379e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t err;
380e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumerTestParams params = GetParam();
381e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
382e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int numInQueue = 5;
383e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Set up
384e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
385e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, numInQueue));
386e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
387e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Produce
388e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
389e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int64_t time[numInQueue] = { 1L, 2L, 3L, 4L, 5L};
390e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t stride[numInQueue];
391e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
392e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int i = 0; i < numInQueue; i++) {
393e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ALOGV("Producing frame %d", i);
394e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time[i],
395e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                        &stride[i]));
396e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
397e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
398e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Consume
399e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
400e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int i = 0; i < numInQueue; i++) {
401e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ALOGV("Consuming frame %d", i);
402e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        CpuConsumer::LockedBuffer b;
403e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        err = mCC->lockNextBuffer(&b);
404e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_NO_ERROR(err, "getNextBuffer error: ");
405e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
406e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_TRUE(b.data != NULL);
407e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.width,  b.width);
408e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.height, b.height);
409e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.format, b.format);
410e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(stride[i], b.stride);
411e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(time[i], b.timestamp);
412e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
413e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        checkBayerRawBuffer(b);
414e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
415e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mCC->unlockBuffer(b);
416e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
417e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
418e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
419fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie Gennis// This test is disabled because the HAL_PIXEL_FORMAT_RAW_SENSOR format is not
420fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie Gennis// supported on all devices.
421fdb6b49dfa9f1f71b2e564c9f423043f90f9346cJamie GennisTEST_P(CpuConsumerTest, DISABLED_FromCpuLockMax) {
422e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    status_t err;
423e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumerTestParams params = GetParam();
424e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
425e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Set up
426e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
427e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, params.maxLockedBuffers + 1));
428e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
429e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Produce
430e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
431e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    const int64_t time = 1234L;
432e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    uint32_t stride;
433e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
434e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int i = 0; i < params.maxLockedBuffers + 1; i++) {
435e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ALOGV("Producing frame %d", i);
436e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time,
437e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala                        &stride));
438e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
439e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
440e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    // Consume
441e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
442e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumer::LockedBuffer *b = new CpuConsumer::LockedBuffer[params.maxLockedBuffers];
443e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int i = 0; i < params.maxLockedBuffers; i++) {
444e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ALOGV("Locking frame %d", i);
445e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        err = mCC->lockNextBuffer(&b[i]);
446e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_NO_ERROR(err, "getNextBuffer error: ");
447e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
448e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ASSERT_TRUE(b[i].data != NULL);
449e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.width,  b[i].width);
450e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.height, b[i].height);
451e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(params.format, b[i].format);
452e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(stride, b[i].stride);
453e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        EXPECT_EQ(time, b[i].timestamp);
454e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
455e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        checkBayerRawBuffer(b[i]);
456e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
457e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
458e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGV("Locking frame %d (too many)", params.maxLockedBuffers);
459e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    CpuConsumer::LockedBuffer bTooMuch;
460e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->lockNextBuffer(&bTooMuch);
461e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_TRUE(err == INVALID_OPERATION) << "Allowing too many locks";
462e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
463e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGV("Unlocking frame 0");
464e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->unlockBuffer(b[0]);
465e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "Could not unlock buffer 0: ");
466e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
467e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGV("Locking frame %d (should work now)", params.maxLockedBuffers);
468e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->lockNextBuffer(&bTooMuch);
469e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "Did not allow new lock after unlock");
470e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
471e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_TRUE(bTooMuch.data != NULL);
472e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.width,  bTooMuch.width);
473e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.height, bTooMuch.height);
474e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(params.format, bTooMuch.format);
475e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(stride, bTooMuch.stride);
476e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    EXPECT_EQ(time, bTooMuch.timestamp);
477e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
478e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    checkBayerRawBuffer(bTooMuch);
479e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
480e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGV("Unlocking extra buffer");
481e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->unlockBuffer(bTooMuch);
482e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_NO_ERROR(err, "Could not unlock extra buffer: ");
483e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
484e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ALOGV("Locking frame %d (no more available)", params.maxLockedBuffers + 1);
485e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    err = mCC->lockNextBuffer(&b[0]);
486e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    ASSERT_EQ(BAD_VALUE, err) << "Not out of buffers somehow";
487e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
488e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    for (int i = 1; i < params.maxLockedBuffers; i++) {
489e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        mCC->unlockBuffer(b[i]);
490e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    }
491e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
492e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    delete[] b;
493e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
494e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}
495e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
496e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville TalvalaCpuConsumerTestParams rawTestSets[] = {
497e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    { 512,   512, 1, HAL_PIXEL_FORMAT_RAW_SENSOR},
498e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    { 512,   512, 3, HAL_PIXEL_FORMAT_RAW_SENSOR},
499e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    { 2608, 1960, 1, HAL_PIXEL_FORMAT_RAW_SENSOR},
500e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    { 2608, 1960, 3, HAL_PIXEL_FORMAT_RAW_SENSOR},
501e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    { 100,   100, 1, HAL_PIXEL_FORMAT_RAW_SENSOR},
502e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala    { 100,   100, 3, HAL_PIXEL_FORMAT_RAW_SENSOR}
503e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala};
504e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
505e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville TalvalaINSTANTIATE_TEST_CASE_P(RawTests,
506e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        CpuConsumerTest,
507e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala        ::testing::ValuesIn(rawTestSets));
508e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala
509e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} // namespace android
510