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