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