CpuConsumer_test.cpp revision f8cebe54576c8100769e2515d4f67bdd013a6927
10a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/* 29c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu * Copyright (C) 2012 The Android Open Source Project 30a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 40a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Licensed under the Apache License, Version 2.0 (the "License"); 50a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * you may not use this file except in compliance with the License. 60a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * You may obtain a copy of the License at 70a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 80a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * http://www.apache.org/licenses/LICENSE-2.0 90a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Unless required by applicable law or agreed to in writing, software 110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * distributed under the License is distributed on an "AS IS" BASIS, 120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * See the License for the specific language governing permissions and 140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * limitations under the License. 150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */ 160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define LOG_TAG "CpuConsumer_test" 180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan//#define LOG_NDEBUG 0 190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan//#define LOG_NNDEBUG 0 200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#ifdef LOG_NNDEBUG 220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define ALOGVV(...) ALOGV(__VA_ARGS__) 230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#else 240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define ALOGVV(...) ((void)0) 250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#endif 2659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu 270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#include <gtest/gtest.h> 280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#include <gui/CpuConsumer.h> 29f21d2289021a94fc74023e2b5987d236df354fe1fionaxu#include <gui/Surface.h> 300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#include <ui/GraphicBuffer.h> 310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#include <utils/String8.h> 32ec334adf4017ca172f44612d01456e671f922344Amit Mahajan#include <utils/Thread.h> 330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#include <utils/Mutex.h> 34ec334adf4017ca172f44612d01456e671f922344Amit Mahajan#include <utils/Condition.h> 350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define CPU_CONSUMER_TEST_FORMAT_RAW 0 370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define CPU_CONSUMER_TEST_FORMAT_Y8 0 380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define CPU_CONSUMER_TEST_FORMAT_Y16 0 390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan#define CPU_CONSUMER_TEST_FORMAT_RGBA_8888 1 400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajannamespace android { 420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanstruct CpuConsumerTestParams { 440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint32_t width; 45ec334adf4017ca172f44612d01456e671f922344Amit Mahajan uint32_t height; 46fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan int maxLockedBuffers; 4727b650c406018355a88a41528db7859e232728a0Jack Yu PixelFormat format; 48ec334adf4017ca172f44612d01456e671f922344Amit Mahajan}; 49b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan::std::ostream& operator<<(::std::ostream& os, const CpuConsumerTestParams& p) { 510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return os << "[ (" << p.width << ", " << p.height << "), B:" 520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan << p.maxLockedBuffers << ", F:0x" 530e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu << ::std::hex << p.format << "]"; 540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 56153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanclass CpuConsumerTest : public ::testing::TestWithParam<CpuConsumerTestParams> { 570ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuprotected: 580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan virtual void SetUp() { 600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const ::testing::TestInfo* const test_info = 61ec334adf4017ca172f44612d01456e671f922344Amit Mahajan ::testing::UnitTest::GetInstance()->current_test_info(); 62ec334adf4017ca172f44612d01456e671f922344Amit Mahajan CpuConsumerTestParams params = GetParam(); 630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ALOGV("** Starting test %s (%d x %d, %d, 0x%x)", 640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan test_info->name(), 650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan params.width, params.height, 660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan params.maxLockedBuffers, params.format); 670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan sp<IGraphicBufferProducer> producer; 6805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan sp<IGraphicBufferConsumer> consumer; 690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan BufferQueue::createBufferQueue(&producer, &consumer); 7018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mCC = new CpuConsumer(consumer, params.maxLockedBuffers); 710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String8 name("CpuConsumer_Under_Test"); 7232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan mCC->setName(name); 730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mSTC = new Surface(producer); 740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mANW = mSTC; 750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan virtual void TearDown() { 78b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu mANW.clear(); 790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mSTC.clear(); 800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mCC.clear(); 810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan class FrameWaiter : public CpuConsumer::FrameAvailableListener { 840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public: 850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan FrameWaiter(): 860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mPendingFrames(0) { 870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan void waitForFrame() { 900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Mutex::Autolock lock(mMutex); 910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan while (mPendingFrames == 0) { 920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mCondition.wait(mMutex); 930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 9418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPendingFrames--; 950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 96ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 97fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan virtual void onFrameAvailable(const BufferItem&) { 98fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Mutex::Autolock lock(mMutex); 99fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mPendingFrames++; 100fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mCondition.signal(); 101ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 102ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 103ec334adf4017ca172f44612d01456e671f922344Amit Mahajan int mPendingFrames; 104ec334adf4017ca172f44612d01456e671f922344Amit Mahajan Mutex mMutex; 105ec334adf4017ca172f44612d01456e671f922344Amit Mahajan Condition mCondition; 106ec334adf4017ca172f44612d01456e671f922344Amit Mahajan }; 107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 108fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan // Note that SurfaceTexture will lose the notifications 109fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan // onBuffersReleased and onFrameAvailable as there is currently 110fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan // no way to forward the events. This DisconnectWaiter will not let the 111fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan // disconnect finish until finishDisconnect() is called. It will 112fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan // also block until a disconnect is called 113fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan class DisconnectWaiter : public BufferQueue::ConsumerListener { 114fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan public: 115fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan DisconnectWaiter () : 116fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mWaitForDisconnect(false), 117ec334adf4017ca172f44612d01456e671f922344Amit Mahajan mPendingFrames(0) { 118ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 119ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 120ec334adf4017ca172f44612d01456e671f922344Amit Mahajan void waitForFrame() { 121ec334adf4017ca172f44612d01456e671f922344Amit Mahajan Mutex::Autolock lock(mMutex); 122fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan while (mPendingFrames == 0) { 123fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mFrameCondition.wait(mMutex); 124fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 125fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mPendingFrames--; 126fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 127fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan 128fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan virtual void onFrameAvailable(const BufferItem&) { 129ec334adf4017ca172f44612d01456e671f922344Amit Mahajan Mutex::Autolock lock(mMutex); 130ec334adf4017ca172f44612d01456e671f922344Amit Mahajan mPendingFrames++; 1310ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu mFrameCondition.signal(); 1320ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu } 1330ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu 134fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan virtual void onBuffersReleased() { 135fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Mutex::Autolock lock(mMutex); 136fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan while (!mWaitForDisconnect) { 137fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mDisconnectCondition.wait(mMutex); 138fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 139fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 140fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan 141fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan void finishDisconnect() { 142fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Mutex::Autolock lock(mMutex); 143fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mWaitForDisconnect = true; 144fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mDisconnectCondition.signal(); 145fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 146fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan 147fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan private: 148fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Mutex mMutex; 149fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan 150fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan bool mWaitForDisconnect; 151fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Condition mDisconnectCondition; 152fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan 153fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan int mPendingFrames; 154fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Condition mFrameCondition; 155fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan }; 1560ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu 1570ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu sp<CpuConsumer> mCC; 158ec334adf4017ca172f44612d01456e671f922344Amit Mahajan sp<Surface> mSTC; 159ec334adf4017ca172f44612d01456e671f922344Amit Mahajan sp<ANativeWindow> mANW; 1606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt}; 1616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt 1626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt#define ASSERT_NO_ERROR(err, msg) \ 16318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu ASSERT_EQ(NO_ERROR, err) << msg << strerror(-err) 1646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt 1656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltvoid checkPixel(const CpuConsumer::LockedBuffer &buf, 1666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt uint32_t x, uint32_t y, uint32_t r, uint32_t g=0, uint32_t b=0) { 1676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt // Ignores components that don't exist for given pixel 1680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan switch(buf.format) { 1690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case HAL_PIXEL_FORMAT_RAW16: { 1700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String8 msg; 1710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint16_t *bPtr = (uint16_t*)buf.data; 1720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan bPtr += y * buf.stride + x; 1730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // GRBG Bayer mosaic; only check the matching channel 1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan switch( ((y & 1) << 1) | (x & 1) ) { 1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case 0: // G 1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case 3: // G 1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan EXPECT_EQ(g, *bPtr); 1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case 1: // R 1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan EXPECT_EQ(r, *bPtr); 1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case 2: // B 1830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan EXPECT_EQ(b, *bPtr); 1840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 1850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 1870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // ignores g,b 1890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case HAL_PIXEL_FORMAT_Y8: { 1900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint8_t *bPtr = (uint8_t*)buf.data; 1910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan bPtr += y * buf.stride + x; 1920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan EXPECT_EQ(r, *bPtr) << "at x = " << x << " y = " << y; 1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // ignores g,b 1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case HAL_PIXEL_FORMAT_Y16: { 1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // stride is in pixels, not in bytes 1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint16_t *bPtr = ((uint16_t*)buf.data) + y * buf.stride + x; 1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan EXPECT_EQ(r, *bPtr) << "at x = " << x << " y = " << y; 2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case HAL_PIXEL_FORMAT_RGBA_8888: { 204f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt const int bytesPerPixel = 4; 205f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt uint8_t *bPtr = (uint8_t*)buf.data; 206f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt bPtr += (y * buf.stride + x) * bytesPerPixel; 207f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt 2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan EXPECT_EQ(r, bPtr[0]) << "at x = " << x << " y = " << y; 2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan EXPECT_EQ(g, bPtr[1]) << "at x = " << x << " y = " << y; 2100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan EXPECT_EQ(b, bPtr[2]) << "at x = " << x << " y = " << y; 2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 2120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan default: { 2140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ADD_FAILURE() << "Unknown format for check:" << buf.format; 2150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 2160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 2190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// Fill a YV12 buffer with a multi-colored checkerboard pattern 2210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid fillYV12Buffer(uint8_t* buf, int w, int h, int stride); 2220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// Fill a Y8/Y16 buffer with a multi-colored checkerboard pattern 224b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yutemplate <typename T> // T == uint8_t or uint16_t 225b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuvoid fillGreyscaleBuffer(T* buf, int w, int h, int stride, int bpp) { 22659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu const int blockWidth = w > 16 ? w / 16 : 1; 22759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu const int blockHeight = h > 16 ? h / 16 : 1; 22827b650c406018355a88a41528db7859e232728a0Jack Yu const int yuvTexOffsetY = 0; 22927b650c406018355a88a41528db7859e232728a0Jack Yu 230f21d2289021a94fc74023e2b5987d236df354fe1fionaxu ASSERT_TRUE(bpp == 8 || bpp == 16); 231f21d2289021a94fc74023e2b5987d236df354fe1fionaxu ASSERT_TRUE(sizeof(T)*8 == bpp); 2320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 233f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt // stride is in pixels, not in bytes 2340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int yuvTexStrideY = stride; 2350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (int x = 0; x < w; x++) { 2360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (int y = 0; y < h; y++) { 2370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int parityX = (x / blockWidth) & 1; 2380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int parityY = (y / blockHeight) & 1; 2390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan T intensity = (parityX ^ parityY) ? 63 : 191; 2400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity; 2410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 2440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajaninline uint8_t chooseColorRgba8888(int blockX, int blockY, uint8_t channel) { 2460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const int colorVariations = 3; 2470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint8_t color = ((blockX % colorVariations) + (blockY % colorVariations)) 2480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan % (colorVariations) == channel ? 191: 63; 2490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return color; 2510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 2520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// Fill a RGBA8888 buffer with a multi-colored checkerboard pattern 254ec334adf4017ca172f44612d01456e671f922344Amit Mahajanvoid fillRgba8888Buffer(uint8_t* buf, int w, int h, int stride) 2550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan{ 2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const int blockWidth = w > 16 ? w / 16 : 1; 2570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const int blockHeight = h > 16 ? h / 16 : 1; 2585755ef622fec6f3c592467c685503826862a7536fionaxu const int bytesPerPixel = 4; 2595755ef622fec6f3c592467c685503826862a7536fionaxu 2605755ef622fec6f3c592467c685503826862a7536fionaxu // stride is in pixels, not in bytes 2615755ef622fec6f3c592467c685503826862a7536fionaxu for (int x = 0; x < w; ++x) { 2620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (int y = 0; y < h; ++y) { 2639b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan int blockX = (x / blockWidth); 2649b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan int blockY = (y / blockHeight); 2659b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan 2669b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan uint8_t r = chooseColorRgba8888(blockX, blockY, 0); 2679b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan uint8_t g = chooseColorRgba8888(blockX, blockY, 1); 2689b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan uint8_t b = chooseColorRgba8888(blockX, blockY, 2); 2699b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan 2709b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan buf[(y*stride + x)*bytesPerPixel + 0] = r; 2719b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan buf[(y*stride + x)*bytesPerPixel + 1] = g; 2729b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan buf[(y*stride + x)*bytesPerPixel + 2] = b; 2739b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan buf[(y*stride + x)*bytesPerPixel + 3] = 255; 2749b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan } 27597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 27697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan} 27718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 27897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan// Fill a RAW sensor buffer with a multi-colored checkerboard pattern. 27997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan// Assumes GRBG mosaic ordering. Result should be a grid in a 2x2 pattern 28097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan// of [ R, B; G, W] 28197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajanvoid fillBayerRawBuffer(uint8_t* buf, int w, int h, int stride) { 28297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan ALOGVV("fillBayerRawBuffer: %p with %d x %d, stride %d", buf, w, h ,stride); 2830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // Blocks need to be even-width/height, aim for 8-wide otherwise 28497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan const int blockWidth = (w > 16 ? w / 8 : 2) & ~0x1; 28597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan const int blockHeight = (h > 16 ? h / 8 : 2) & ~0x1; 2860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (int y = 0; y < h; y+=2) { 2870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint16_t *bPtr1 = ((uint16_t*)buf) + stride*y; 2880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint16_t *bPtr2 = bPtr1 + stride; 2890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (int x = 0; x < w; x+=2) { 290ec334adf4017ca172f44612d01456e671f922344Amit Mahajan int blockX = (x / blockWidth ) & 1; 29197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan int blockY = (y / blockHeight) & 1; 29297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan unsigned short r = (blockX == blockY) ? 1000 : 200; 29397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan unsigned short g = blockY ? 1000: 200; 29497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan unsigned short b = blockX ? 1000: 200; 29597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan // GR row 296ec334adf4017ca172f44612d01456e671f922344Amit Mahajan *bPtr1++ = g; 2970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *bPtr1++ = r; 2980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // BG row 2990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *bPtr2++ = b; 3000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *bPtr2++ = g; 301ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan } 302ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan } 3030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 3050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3062416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajantemplate<typename T> // uint8_t or uint16_t 3072416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajanvoid checkGreyscaleBuffer(const CpuConsumer::LockedBuffer &buf) { 3082416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan uint32_t w = buf.width; 3092416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan uint32_t h = buf.height; 3102416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan const int blockWidth = w > 16 ? w / 16 : 1; 3112416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan const int blockHeight = h > 16 ? h / 16 : 1; 3122416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan const int blockRows = h / blockHeight; 3132416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan const int blockCols = w / blockWidth; 3142416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan 3152416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan // Top-left square is bright 3162416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan checkPixel(buf, 0, 0, 191); 3172416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan checkPixel(buf, 1, 0, 191); 3182416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan checkPixel(buf, 0, 1, 191); 3192416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan checkPixel(buf, 1, 1, 191); 3202416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan 3212416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan // One-right square is dark 3222416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan checkPixel(buf, blockWidth, 0, 63); 3230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth + 1, 0, 63); 3240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth, 1, 63); 3250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth + 1, 1, 63); 3263c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan 3273c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan // One-down square is dark 3283c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan checkPixel(buf, 0, blockHeight, 63); 32905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan checkPixel(buf, 1, blockHeight, 63); 33005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan checkPixel(buf, 0, blockHeight + 1, 63); 33105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan checkPixel(buf, 1, blockHeight + 1, 63); 3323c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan 3330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // One-diag square is bright 3340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth, blockHeight, 191); 3350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth + 1, blockHeight, 191); 3360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth, blockHeight + 1, 191); 3370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth + 1, blockHeight + 1, 191); 3380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3393c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan // Test bottom-right pixel 3403c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan const int maxBlockX = ((w-1 + (blockWidth-1)) / blockWidth) & 0x1; 3413c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan const int maxBlockY = ((h-1 + (blockHeight-1)) / blockHeight) & 0x1; 34205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan uint32_t pixelValue = ((maxBlockX % 2) == (maxBlockY % 2)) ? 191 : 63; 34305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan checkPixel(buf, w-1, h-1, pixelValue); 34405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan} 3453c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan 3460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid checkRgba8888Buffer(const CpuConsumer::LockedBuffer &buf) { 3470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint32_t w = buf.width; 3480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint32_t h = buf.height; 349ec334adf4017ca172f44612d01456e671f922344Amit Mahajan const int blockWidth = w > 16 ? w / 16 : 1; 350ec334adf4017ca172f44612d01456e671f922344Amit Mahajan const int blockHeight = h > 16 ? h / 16 : 1; 351ec334adf4017ca172f44612d01456e671f922344Amit Mahajan const int blockRows = h / blockHeight; 352ec334adf4017ca172f44612d01456e671f922344Amit Mahajan const int blockCols = w / blockWidth; 353ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 354ec334adf4017ca172f44612d01456e671f922344Amit Mahajan // Top-left square is bright red 355ec334adf4017ca172f44612d01456e671f922344Amit Mahajan checkPixel(buf, 0, 0, 191, 63, 63); 35605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan checkPixel(buf, 1, 0, 191, 63, 63); 35705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan checkPixel(buf, 0, 1, 191, 63, 63); 35805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan checkPixel(buf, 1, 1, 191, 63, 63); 359ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 360ec334adf4017ca172f44612d01456e671f922344Amit Mahajan // One-right square is bright green 361ec334adf4017ca172f44612d01456e671f922344Amit Mahajan checkPixel(buf, blockWidth, 0, 63, 191, 63); 362ec334adf4017ca172f44612d01456e671f922344Amit Mahajan checkPixel(buf, blockWidth + 1, 0, 63, 191, 63); 36397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan checkPixel(buf, blockWidth, 1, 63, 191, 63); 3646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt checkPixel(buf, blockWidth + 1, 1, 63, 191, 63); 36597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 36697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan // One-down square is bright green 36797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan checkPixel(buf, 0, blockHeight, 63, 191, 63); 36897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan checkPixel(buf, 1, blockHeight, 63, 191, 63); 36997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan checkPixel(buf, 0, blockHeight + 1, 63, 191, 63); 37097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan checkPixel(buf, 1, blockHeight + 1, 63, 191, 63); 37197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 37297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan // One-diag square is bright blue 3736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt checkPixel(buf, blockWidth, blockHeight, 63, 63, 191); 37497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan checkPixel(buf, blockWidth + 1, blockHeight, 63, 63, 191); 375b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu checkPixel(buf, blockWidth, blockHeight + 1, 63, 63, 191); 376b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu checkPixel(buf, blockWidth + 1, blockHeight + 1, 63, 63, 191); 377b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 3780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // Test bottom-right pixel 3790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan { 3800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const int maxBlockX = ((w-1) / blockWidth); 3810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const int maxBlockY = ((h-1) / blockHeight); 3820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint8_t r = chooseColorRgba8888(maxBlockX, maxBlockY, 0); 3830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint8_t g = chooseColorRgba8888(maxBlockX, maxBlockY, 1); 3840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint8_t b = chooseColorRgba8888(maxBlockX, maxBlockY, 2); 38518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu checkPixel(buf, w-1, h-1, r, g, b); 38618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 38718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu} 38818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 38918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxuvoid checkBayerRawBuffer(const CpuConsumer::LockedBuffer &buf) { 39018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu uint32_t w = buf.width; 3910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint32_t h = buf.height; 3920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const int blockWidth = (w > 16 ? w / 8 : 2) & ~0x1; 3930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const int blockHeight = (h > 16 ? h / 8 : 2) & ~0x1; 394ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu const int blockRows = h / blockHeight; 395ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu const int blockCols = w / blockWidth; 396ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu 397ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu // Top-left square is red 398ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu checkPixel(buf, 0, 0, 1000, 200, 200); 3990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, 1, 0, 1000, 200, 200); 4000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, 0, 1, 1000, 200, 200); 4010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, 1, 1, 1000, 200, 200); 4020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // One-right square is blue 4040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth, 0, 200, 200, 1000); 4050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth + 1, 0, 200, 200, 1000); 4060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth, 1, 200, 200, 1000); 4070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, blockWidth + 1, 1, 200, 200, 1000); 4087a477263108748903cf5a4151a4e8b739f12264aRobert Greenwalt 4097a477263108748903cf5a4151a4e8b739f12264aRobert Greenwalt // One-down square is green 410ec334adf4017ca172f44612d01456e671f922344Amit Mahajan checkPixel(buf, 0, blockHeight, 200, 1000, 200); 411ec334adf4017ca172f44612d01456e671f922344Amit Mahajan checkPixel(buf, 1, blockHeight, 200, 1000, 200); 412de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan checkPixel(buf, 0, blockHeight + 1, 200, 1000, 200); 413de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan checkPixel(buf, 1, blockHeight + 1, 200, 1000, 200); 4140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4152416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan // One-diag square is white 4162416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan checkPixel(buf, blockWidth, blockHeight, 1000, 1000, 1000); 4172416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan checkPixel(buf, blockWidth + 1, blockHeight, 1000, 1000, 1000); 4182416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan checkPixel(buf, blockWidth, blockHeight + 1, 1000, 1000, 1000); 4190e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu checkPixel(buf, blockWidth + 1, blockHeight + 1, 1000, 1000, 1000); 4200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // Test bottom-right pixel 4220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const int maxBlockX = ((w-1) / blockWidth) & 0x1; 4230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const int maxBlockY = ((w-1) / blockHeight) & 0x1; 4240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan unsigned short maxR = (maxBlockX == maxBlockY) ? 1000 : 200; 4250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan unsigned short maxG = maxBlockY ? 1000: 200; 4260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan unsigned short maxB = maxBlockX ? 1000: 200; 4270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkPixel(buf, w-1, h-1, maxR, maxG, maxB); 4280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 4290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid checkAnyBuffer(const CpuConsumer::LockedBuffer &buf, int format) { 4310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan switch (format) { 4320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case HAL_PIXEL_FORMAT_RAW16: 43397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan checkBayerRawBuffer(buf); 43497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan break; 43505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan case HAL_PIXEL_FORMAT_Y8: 43605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan checkGreyscaleBuffer<uint8_t>(buf); 43718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu break; 43818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu case HAL_PIXEL_FORMAT_Y16: 43918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu checkGreyscaleBuffer<uint16_t>(buf); 4400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 4410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case HAL_PIXEL_FORMAT_RGBA_8888: 4420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan checkRgba8888Buffer(buf); 4430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 4440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 4460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid fillYV12BufferRect(uint8_t* buf, int w, int h, int stride, 4480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const android_native_rect_t& rect); 4490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid fillRGBA8Buffer(uint8_t* buf, int w, int h, int stride); 4510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid fillRGBA8BufferSolid(uint8_t* buf, int w, int h, int stride, uint8_t r, 4530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint8_t g, uint8_t b, uint8_t a); 4540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// Configures the ANativeWindow producer-side interface based on test parameters 45659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuvoid configureANW(const sp<ANativeWindow>& anw, 45727b650c406018355a88a41528db7859e232728a0Jack Yu const CpuConsumerTestParams& params, 458f21d2289021a94fc74023e2b5987d236df354fe1fionaxu int maxBufferSlack) { 459b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu status_t err; 460153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan err = native_window_set_buffers_dimensions(anw.get(), 461ec334adf4017ca172f44612d01456e671f922344Amit Mahajan params.width, params.height); 462153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan ASSERT_NO_ERROR(err, "set_buffers_dimensions error: "); 463153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan 46418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu err = native_window_set_buffers_format(anw.get(), params.format); 46518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu ASSERT_NO_ERROR(err, "set_buffers_format error: "); 466ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 4670e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu err = native_window_set_usage(anw.get(), 4680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan GRALLOC_USAGE_SW_WRITE_OFTEN); 4690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ASSERT_NO_ERROR(err, "set_usage error: "); 4700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int minUndequeuedBuffers; 4720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan err = anw.get()->query(anw.get(), 4730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 4740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan &minUndequeuedBuffers); 4750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ASSERT_NO_ERROR(err, "query error: "); 4760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ALOGVV("Setting buffer count to %d", 4780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan maxBufferSlack + 1 + minUndequeuedBuffers); 4790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan err = native_window_set_buffer_count(anw.get(), 4800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan maxBufferSlack + 1 + minUndequeuedBuffers); 4810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ASSERT_NO_ERROR(err, "set_buffer_count error: "); 4820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 4840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// Produce one frame of image data; assumes format and resolution configuration 4860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// is already done. 4870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanvoid produceOneFrame(const sp<ANativeWindow>& anw, 4880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan const CpuConsumerTestParams& params, 4890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int64_t timestamp, uint32_t *stride) { 4900e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu status_t err; 4910e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu ANativeWindowBuffer* anb; 492cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan ALOGVV("Dequeue buffer from %p", anw.get()); 49332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan err = native_window_dequeue_buffer_and_wait(anw.get(), &anb); 49432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan ASSERT_NO_ERROR(err, "dequeueBuffer error: "); 495fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan 49618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu ASSERT_TRUE(anb != NULL); 4970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 4990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *stride = buf->getStride(); 5010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan uint8_t* img = NULL; 5020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ALOGVV("Lock buffer from %p for write", anw.get()); 5040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 5050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ASSERT_NO_ERROR(err, "lock error: "); 5060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan switch (params.format) { 5080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case HAL_PIXEL_FORMAT_YV12: 5090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan fillYV12Buffer(img, params.width, params.height, *stride); 5100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 5110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case HAL_PIXEL_FORMAT_RAW16: 5120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan fillBayerRawBuffer(img, params.width, params.height, buf->getStride()); 5130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 5140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case HAL_PIXEL_FORMAT_Y8: 5150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan fillGreyscaleBuffer<uint8_t>(img, params.width, params.height, 5160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan buf->getStride(), /*bpp*/8); 5170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan break; 5180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case HAL_PIXEL_FORMAT_Y16: 5190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan fillGreyscaleBuffer<uint16_t>((uint16_t*)img, params.width, 520b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu params.height, buf->getStride(), 521b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu /*bpp*/16); 522b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu break; 523b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu case HAL_PIXEL_FORMAT_RGBA_8888: 524655bae990bdd7e4584491def4d30692e6173779cfionaxu fillRgba8888Buffer(img, params.width, params.height, buf->getStride()); 525655bae990bdd7e4584491def4d30692e6173779cfionaxu break; 526655bae990bdd7e4584491def4d30692e6173779cfionaxu default: 527655bae990bdd7e4584491def4d30692e6173779cfionaxu FAIL() << "Unknown pixel format under test!"; 5280e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu break; 5290e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 5300e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu ALOGVV("Unlock buffer from %p", anw.get()); 5310e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu err = buf->unlock(); 5320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ASSERT_NO_ERROR(err, "unlock error: "); 5330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ALOGVV("Set timestamp to %p", anw.get()); 5350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan err = native_window_set_buffers_timestamp(anw.get(), timestamp); 5360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ASSERT_NO_ERROR(err, "set_buffers_timestamp error: "); 5370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ALOGVV("Queue buffer to %p", anw.get()); 5390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan err = anw->queueBuffer(anw.get(), buf->getNativeBuffer(), -1); 5400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ASSERT_NO_ERROR(err, "queueBuffer error:"); 5410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}; 5420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// This test is disabled because the HAL_PIXEL_FORMAT_RAW16 format is not 5440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan// supported on all devices. 5450a567c9ed954f295df83c753239646c6f6a04128Amit MahajanTEST_P(CpuConsumerTest, FromCpuSingle) { 5460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan status_t err; 5470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan CpuConsumerTestParams params = GetParam(); 54805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan 54905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // Set up 55005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan 55105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, 1)); 55205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan 55305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // Produce 55405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan 55505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan const int64_t time = 12345678L; 55605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan uint32_t stride; 55705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time, 55805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan &stride)); 55905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan 56005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // Consume 56105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan 56218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu CpuConsumer::LockedBuffer b; 56318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu err = mCC->lockNextBuffer(&b); 56418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu ASSERT_NO_ERROR(err, "getNextBuffer error: "); 56518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 56618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu ASSERT_TRUE(b.data != NULL); 56718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu EXPECT_EQ(params.width, b.width); 56818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu EXPECT_EQ(params.height, b.height); 56918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu EXPECT_EQ(params.format, b.format); 57018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu EXPECT_EQ(stride, b.stride); 57118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu EXPECT_EQ(time, b.timestamp); 57218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 57318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu checkAnyBuffer(b, GetParam().format); 57418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mCC->unlockBuffer(b); 57518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu} 57618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 57718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu// This test is disabled because the HAL_PIXEL_FORMAT_RAW16 format is not 57818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu// supported on all devices. 579ec334adf4017ca172f44612d01456e671f922344Amit MahajanTEST_P(CpuConsumerTest, FromCpuManyInQueue) { 580ec334adf4017ca172f44612d01456e671f922344Amit Mahajan status_t err; 5810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan CpuConsumerTestParams params = GetParam(); 5820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 583 const int numInQueue = 5; 584 // Set up 585 586 ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, numInQueue)); 587 588 // Produce 589 590 const int64_t time[numInQueue] = { 1L, 2L, 3L, 4L, 5L}; 591 uint32_t stride[numInQueue]; 592 593 for (int i = 0; i < numInQueue; i++) { 594 ALOGV("Producing frame %d", i); 595 ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time[i], 596 &stride[i])); 597 } 598 599 // Consume 600 601 for (int i = 0; i < numInQueue; i++) { 602 ALOGV("Consuming frame %d", i); 603 CpuConsumer::LockedBuffer b; 604 err = mCC->lockNextBuffer(&b); 605 ASSERT_NO_ERROR(err, "getNextBuffer error: "); 606 607 ASSERT_TRUE(b.data != NULL); 608 EXPECT_EQ(params.width, b.width); 609 EXPECT_EQ(params.height, b.height); 610 EXPECT_EQ(params.format, b.format); 611 EXPECT_EQ(stride[i], b.stride); 612 EXPECT_EQ(time[i], b.timestamp); 613 614 checkAnyBuffer(b, GetParam().format); 615 616 mCC->unlockBuffer(b); 617 } 618} 619 620// This test is disabled because the HAL_PIXEL_FORMAT_RAW16 format is not 621// supported on all devices. 622TEST_P(CpuConsumerTest, FromCpuLockMax) { 623 status_t err; 624 CpuConsumerTestParams params = GetParam(); 625 626 // Set up 627 628 ASSERT_NO_FATAL_FAILURE(configureANW(mANW, params, params.maxLockedBuffers + 1)); 629 630 // Produce 631 632 const int64_t time = 1234L; 633 uint32_t stride; 634 635 for (int i = 0; i < params.maxLockedBuffers + 1; i++) { 636 ALOGV("Producing frame %d", i); 637 ASSERT_NO_FATAL_FAILURE(produceOneFrame(mANW, params, time, 638 &stride)); 639 } 640 641 // Consume 642 643 CpuConsumer::LockedBuffer *b = new CpuConsumer::LockedBuffer[params.maxLockedBuffers]; 644 for (int i = 0; i < params.maxLockedBuffers; i++) { 645 ALOGV("Locking frame %d", i); 646 err = mCC->lockNextBuffer(&b[i]); 647 ASSERT_NO_ERROR(err, "getNextBuffer error: "); 648 649 ASSERT_TRUE(b[i].data != NULL); 650 EXPECT_EQ(params.width, b[i].width); 651 EXPECT_EQ(params.height, b[i].height); 652 EXPECT_EQ(params.format, b[i].format); 653 EXPECT_EQ(stride, b[i].stride); 654 EXPECT_EQ(time, b[i].timestamp); 655 656 checkAnyBuffer(b[i], GetParam().format); 657 } 658 659 ALOGV("Locking frame %d (too many)", params.maxLockedBuffers); 660 CpuConsumer::LockedBuffer bTooMuch; 661 err = mCC->lockNextBuffer(&bTooMuch); 662 ASSERT_TRUE(err == NOT_ENOUGH_DATA) << "Allowing too many locks"; 663 664 ALOGV("Unlocking frame 0"); 665 err = mCC->unlockBuffer(b[0]); 666 ASSERT_NO_ERROR(err, "Could not unlock buffer 0: "); 667 668 ALOGV("Locking frame %d (should work now)", params.maxLockedBuffers); 669 err = mCC->lockNextBuffer(&bTooMuch); 670 ASSERT_NO_ERROR(err, "Did not allow new lock after unlock"); 671 672 ASSERT_TRUE(bTooMuch.data != NULL); 673 EXPECT_EQ(params.width, bTooMuch.width); 674 EXPECT_EQ(params.height, bTooMuch.height); 675 EXPECT_EQ(params.format, bTooMuch.format); 676 EXPECT_EQ(stride, bTooMuch.stride); 677 EXPECT_EQ(time, bTooMuch.timestamp); 678 679 checkAnyBuffer(bTooMuch, GetParam().format); 680 681 ALOGV("Unlocking extra buffer"); 682 err = mCC->unlockBuffer(bTooMuch); 683 ASSERT_NO_ERROR(err, "Could not unlock extra buffer: "); 684 685 ALOGV("Locking frame %d (no more available)", params.maxLockedBuffers + 1); 686 err = mCC->lockNextBuffer(&b[0]); 687 ASSERT_EQ(BAD_VALUE, err) << "Not out of buffers somehow"; 688 689 for (int i = 1; i < params.maxLockedBuffers; i++) { 690 mCC->unlockBuffer(b[i]); 691 } 692 693 delete[] b; 694 695} 696 697CpuConsumerTestParams y8TestSets[] = { 698 { 512, 512, 1, HAL_PIXEL_FORMAT_Y8}, 699 { 512, 512, 3, HAL_PIXEL_FORMAT_Y8}, 700 { 2608, 1960, 1, HAL_PIXEL_FORMAT_Y8}, 701 { 2608, 1960, 3, HAL_PIXEL_FORMAT_Y8}, 702 { 100, 100, 1, HAL_PIXEL_FORMAT_Y8}, 703 { 100, 100, 3, HAL_PIXEL_FORMAT_Y8}, 704}; 705 706CpuConsumerTestParams y16TestSets[] = { 707 { 512, 512, 1, HAL_PIXEL_FORMAT_Y16}, 708 { 512, 512, 3, HAL_PIXEL_FORMAT_Y16}, 709 { 2608, 1960, 1, HAL_PIXEL_FORMAT_Y16}, 710 { 2608, 1960, 3, HAL_PIXEL_FORMAT_Y16}, 711 { 100, 100, 1, HAL_PIXEL_FORMAT_Y16}, 712 { 100, 100, 3, HAL_PIXEL_FORMAT_Y16}, 713}; 714 715CpuConsumerTestParams rawTestSets[] = { 716 { 512, 512, 1, HAL_PIXEL_FORMAT_RAW16}, 717 { 512, 512, 3, HAL_PIXEL_FORMAT_RAW16}, 718 { 2608, 1960, 1, HAL_PIXEL_FORMAT_RAW16}, 719 { 2608, 1960, 3, HAL_PIXEL_FORMAT_RAW16}, 720 { 100, 100, 1, HAL_PIXEL_FORMAT_RAW16}, 721 { 100, 100, 3, HAL_PIXEL_FORMAT_RAW16}, 722}; 723 724CpuConsumerTestParams rgba8888TestSets[] = { 725 { 512, 512, 1, HAL_PIXEL_FORMAT_RGBA_8888}, 726 { 512, 512, 3, HAL_PIXEL_FORMAT_RGBA_8888}, 727 { 2608, 1960, 1, HAL_PIXEL_FORMAT_RGBA_8888}, 728 { 2608, 1960, 3, HAL_PIXEL_FORMAT_RGBA_8888}, 729 { 100, 100, 1, HAL_PIXEL_FORMAT_RGBA_8888}, 730 { 100, 100, 3, HAL_PIXEL_FORMAT_RGBA_8888}, 731}; 732 733#if CPU_CONSUMER_TEST_FORMAT_Y8 734INSTANTIATE_TEST_CASE_P(Y8Tests, 735 CpuConsumerTest, 736 ::testing::ValuesIn(y8TestSets)); 737#endif 738 739#if CPU_CONSUMER_TEST_FORMAT_Y16 740INSTANTIATE_TEST_CASE_P(Y16Tests, 741 CpuConsumerTest, 742 ::testing::ValuesIn(y16TestSets)); 743#endif 744 745#if CPU_CONSUMER_TEST_FORMAT_RAW 746INSTANTIATE_TEST_CASE_P(RawTests, 747 CpuConsumerTest, 748 ::testing::ValuesIn(rawTestSets)); 749#endif 750 751#if CPU_CONSUMER_TEST_FORMAT_RGBA_8888 752INSTANTIATE_TEST_CASE_P(Rgba8888Tests, 753 CpuConsumerTest, 754 ::testing::ValuesIn(rgba8888TestSets)); 755#endif 756 757 758 759} // namespace android 760