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