1cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza/* 2cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Copyright (C) 2011 The Android Open Source Project 3cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 4cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 5cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * you may not use this file except in compliance with the License. 6cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * You may obtain a copy of the License at 7cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 8cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 9cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 10cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Unless required by applicable law or agreed to in writing, software 11cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 12cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * See the License for the specific language governing permissions and 14cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * limitations under the License. 15cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza */ 16cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 17cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#define LOG_TAG "SurfaceTextureGL_test" 18cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza//#define LOG_NDEBUG 0 19cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 20cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include "SurfaceTextureGL.h" 21cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 22cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include "DisconnectWaiter.h" 23cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include "FillBuffer.h" 24cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 25cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozanamespace android { 26cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 27cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, TexturingFromCpuFilledYV12BufferNpot) { 28cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texWidth = 64; 29cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texHeight = 66; 30cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 31cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 32cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza texWidth, texHeight, HAL_PIXEL_FORMAT_YV12)); 33cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 34cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 35cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 36cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindowBuffer* anb; 37cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), 38cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb)); 39cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(anb != NULL); 40cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 41cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 42cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 43cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Fill the buffer with the a checkerboard pattern 44cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza uint8_t* img = NULL; 45cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 46cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza fillYV12Buffer(img, texWidth, texHeight, buf->getStride()); 47cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->unlock(); 48cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer(), 49cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza -1)); 50cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 51cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 52cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 53cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 54cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 55cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 56cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, texWidth, texHeight); 57cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 58cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 59cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 0, 255, 127, 255, 255, 3)); 60cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 0, 0, 133, 0, 255, 3)); 61cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 65, 0, 133, 0, 255, 3)); 62cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 65, 255, 127, 255, 255, 3)); 63cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 64cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(22, 44, 255, 127, 255, 255, 3)); 65cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(45, 52, 255, 127, 255, 255, 3)); 66cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(52, 51, 98, 255, 73, 255, 3)); 67cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 7, 31, 155, 0, 118, 255, 3)); 68cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(31, 9, 107, 24, 87, 255, 3)); 69cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(29, 35, 255, 127, 255, 255, 3)); 70cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(36, 22, 155, 29, 0, 255, 3)); 71cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 72cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 73cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, TexturingFromCpuFilledYV12BufferPow2) { 74cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texWidth = 64; 75cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texHeight = 64; 76cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 77cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 78cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza texWidth, texHeight, HAL_PIXEL_FORMAT_YV12)); 79cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 80cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 81cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 82cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindowBuffer* anb; 83cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), 84cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb)); 85cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(anb != NULL); 86cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 87cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 88cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 89cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Fill the buffer with the a checkerboard pattern 90cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza uint8_t* img = NULL; 91cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 92cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza fillYV12Buffer(img, texWidth, texHeight, buf->getStride()); 93cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->unlock(); 94cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer(), 95cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza -1)); 96cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 97cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 98cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 99cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 100cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 101cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 102cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, texWidth, texHeight); 103cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 104cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 105cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 0, 0, 133, 0, 255)); 106cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 0, 255, 127, 255, 255)); 107cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 63, 0, 133, 0, 255)); 108cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 63, 255, 127, 255, 255)); 109cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 110cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(22, 19, 100, 255, 74, 255)); 111cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(45, 11, 100, 255, 74, 255)); 112cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(52, 12, 155, 0, 181, 255)); 113cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 7, 32, 150, 237, 170, 255)); 114cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(31, 54, 0, 71, 117, 255)); 115cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(29, 28, 0, 133, 0, 255)); 116cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(36, 41, 100, 232, 255, 255)); 117cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 118cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 119cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, TexturingFromCpuFilledYV12BufferWithCrop) { 120cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texWidth = 64; 121cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texHeight = 66; 122cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 123cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 124cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza texWidth, texHeight, HAL_PIXEL_FORMAT_YV12)); 125cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 126cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 127cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 128cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza android_native_rect_t crops[] = { 129cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza {4, 6, 22, 36}, 130cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza {0, 6, 22, 36}, 131cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza {4, 0, 22, 36}, 132cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza {4, 6, texWidth, 36}, 133cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza {4, 6, 22, texHeight}, 134cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza }; 135cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 136cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int i = 0; i < 5; i++) { 137cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const android_native_rect_t& crop(crops[i]); 138cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza SCOPED_TRACE(String8::format("rect{ l: %d t: %d r: %d b: %d }", 139cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza crop.left, crop.top, crop.right, crop.bottom).string()); 140cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 141cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_crop(mANW.get(), &crop)); 142cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 143cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindowBuffer* anb; 144cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), 145cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb)); 146cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(anb != NULL); 147cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 148cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 149cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 150cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza uint8_t* img = NULL; 151cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 152cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza fillYV12BufferRect(img, texWidth, texHeight, buf->getStride(), crop); 153cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->unlock(); 154cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), 155cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->getNativeBuffer(), -1)); 156cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 157cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 158cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 159cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 160cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 161cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 162cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, 64, 64); 163cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 164cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 165cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 0, 82, 255, 35, 255)); 166cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 0, 82, 255, 35, 255)); 167cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 63, 82, 255, 35, 255)); 168cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 63, 82, 255, 35, 255)); 169cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 170cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(25, 14, 82, 255, 35, 255)); 171cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(35, 31, 82, 255, 35, 255)); 172cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(57, 6, 82, 255, 35, 255)); 173cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 5, 42, 82, 255, 35, 255)); 174cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(32, 33, 82, 255, 35, 255)); 175cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(16, 26, 82, 255, 35, 255)); 176cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(46, 51, 82, 255, 35, 255)); 177cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 178cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 179cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 180cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// This test is intended to catch synchronization bugs between the CPU-written 181cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// and GPU-read buffers. 182cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, TexturingFromCpuFilledYV12BuffersRepeatedly) { 183cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum { texWidth = 16 }; 184cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum { texHeight = 16 }; 185cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum { numFrames = 1024 }; 186cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 187cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->setDefaultMaxBufferCount(2)); 188cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 189cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza texWidth, texHeight, HAL_PIXEL_FORMAT_YV12)); 190cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 191cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GRALLOC_USAGE_SW_WRITE_OFTEN)); 192cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 193cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza struct TestPixel { 194cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int x; 195cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int y; 196cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza }; 197cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const TestPixel testPixels[] = { 198cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza { 4, 11 }, 199cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza { 12, 14 }, 200cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza { 7, 2 }, 201cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza }; 202cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum {numTestPixels = sizeof(testPixels) / sizeof(testPixels[0])}; 203cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 204cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza class ProducerThread : public Thread { 205cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza public: 206cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ProducerThread(const sp<ANativeWindow>& anw, 207cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const TestPixel* testPixels): 208cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mANW(anw), 209cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mTestPixels(testPixels) { 210cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 211cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 212cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza virtual ~ProducerThread() { 213cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 214cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 215cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza virtual bool threadLoop() { 216cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int i = 0; i < numFrames; i++) { 217cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindowBuffer* anb; 218cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (native_window_dequeue_buffer_and_wait(mANW.get(), 219cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb) != NO_ERROR) { 220cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 221cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 222cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (anb == NULL) { 223cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 224cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 225cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 226cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 227cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 228cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int yuvTexOffsetY = 0; 229cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int stride = buf->getStride(); 230cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int yuvTexStrideY = stride; 231cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int yuvTexOffsetV = yuvTexStrideY * texHeight; 232cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 233cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * texHeight/2; 234cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int yuvTexStrideU = yuvTexStrideV; 235cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 236cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza uint8_t* img = NULL; 237cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 238cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 239cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Gray out all the test pixels first, so we're more likely to 240cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // see a failure if GL is still texturing from the buffer we 241cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // just dequeued. 242cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int j = 0; j < numTestPixels; j++) { 243cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int x = mTestPixels[j].x; 244cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int y = mTestPixels[j].y; 245cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza uint8_t value = 128; 246cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza img[y*stride + x] = value; 247cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 248cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 249cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Fill the buffer with gray. 250cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int y = 0; y < texHeight; y++) { 251cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int x = 0; x < texWidth; x++) { 252cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza img[yuvTexOffsetY + y*yuvTexStrideY + x] = 128; 253cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza img[yuvTexOffsetU + (y/2)*yuvTexStrideU + x/2] = 128; 254cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza img[yuvTexOffsetV + (y/2)*yuvTexStrideV + x/2] = 128; 255cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 256cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 257cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 258cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Set the test pixels to either white or black. 259cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int j = 0; j < numTestPixels; j++) { 260cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int x = mTestPixels[j].x; 261cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int y = mTestPixels[j].y; 262cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza uint8_t value = 0; 263cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (j == (i % numTestPixels)) { 264cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza value = 255; 265cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 266cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza img[y*stride + x] = value; 267cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 268cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 269cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->unlock(); 270cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (mANW->queueBuffer(mANW.get(), buf->getNativeBuffer(), -1) 271cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza != NO_ERROR) { 272cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 273cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 274cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 275cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 276cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 277cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 278cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<ANativeWindow> mANW; 279cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const TestPixel* mTestPixels; 280cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza }; 281cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 282cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<Thread> pt(new ProducerThread(mANW, testPixels)); 283cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza pt->run(); 284cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 285cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, texWidth, texHeight); 286cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 287cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 288cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 289cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 290cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // We wait for the first two frames up front so that the producer will be 291cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // likely to dequeue the buffer that's currently being textured from. 292cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 293cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 294cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 295cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int i = 0; i < numFrames; i++) { 296cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza SCOPED_TRACE(String8::format("frame %d", i).string()); 297cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 298cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // We must wait for each frame to come in because if we ever do an 299cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // updateTexImage call that doesn't consume a newly available buffer 300cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // then the producer and consumer will get out of sync, which will cause 301cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // a deadlock. 302cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (i > 1) { 303cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 304cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 305cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 306cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 307cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 308cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int j = 0; j < numTestPixels; j++) { 309cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int x = testPixels[j].x; 310cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int y = testPixels[j].y; 311cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza uint8_t value = 0; 312cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (j == (i % numTestPixels)) { 313cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // We must y-invert the texture coords 314cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(x, texHeight-y-1, 255, 255, 255, 255)); 315cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } else { 316cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // We must y-invert the texture coords 317cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(x, texHeight-y-1, 0, 0, 0, 255)); 318cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 319cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 320cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 321cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 322cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza pt->requestExitAndWait(); 323cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 324cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 325cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, TexturingFromCpuFilledRGBABufferNpot) { 326cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texWidth = 64; 327cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texHeight = 66; 328cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 329cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 330cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza texWidth, texHeight, HAL_PIXEL_FORMAT_RGBA_8888)); 331cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 332cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 333cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 334cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 335cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 336cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 337cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 338cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 339cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 340cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 341cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, texWidth, texHeight); 342cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 343cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 344cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 0, 35, 35, 35, 35)); 345cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 0, 231, 231, 231, 231)); 346cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 65, 231, 231, 231, 231)); 347cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 65, 35, 35, 35, 35)); 348cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 349cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(15, 10, 35, 231, 231, 231)); 350cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(23, 65, 231, 35, 231, 35)); 351cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(19, 40, 35, 231, 35, 35)); 352cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(38, 30, 231, 35, 35, 35)); 353cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(42, 54, 35, 35, 35, 231)); 354cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(37, 34, 35, 231, 231, 231)); 355cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(31, 8, 231, 35, 35, 231)); 356cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(37, 47, 231, 35, 231, 231)); 357cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(25, 38, 35, 35, 35, 35)); 358cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(49, 6, 35, 231, 35, 35)); 359cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(54, 50, 35, 231, 231, 231)); 360cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(27, 26, 231, 231, 231, 231)); 361cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(10, 6, 35, 35, 231, 231)); 362cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(29, 4, 35, 35, 35, 231)); 363cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(55, 28, 35, 35, 231, 35)); 364cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(58, 55, 35, 35, 231, 231)); 365cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 366cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 367cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, TexturingFromCpuFilledRGBABufferPow2) { 368cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texWidth = 64; 369cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texHeight = 64; 370cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 371cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 372cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza texWidth, texHeight, HAL_PIXEL_FORMAT_RGBA_8888)); 373cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 374cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 375cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 376cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NO_FATAL_FAILURE(produceOneRGBA8Frame(mANW)); 377cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 378cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 379cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 380cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 381cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 382cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 383cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, texWidth, texHeight); 384cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 385cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 386cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 0, 231, 231, 231, 231)); 387cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 0, 35, 35, 35, 35)); 388cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 63, 231, 231, 231, 231)); 389cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 63, 35, 35, 35, 35)); 390cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 391cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(12, 46, 231, 231, 231, 35)); 392cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(16, 1, 231, 231, 35, 231)); 393cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(21, 12, 231, 35, 35, 231)); 394cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(26, 51, 231, 35, 231, 35)); 395cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 5, 32, 35, 231, 231, 35)); 396cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(13, 8, 35, 231, 231, 231)); 397cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(46, 3, 35, 35, 231, 35)); 398cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(30, 33, 35, 35, 35, 35)); 399cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 6, 52, 231, 231, 35, 35)); 400cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(55, 33, 35, 231, 35, 231)); 401cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(16, 29, 35, 35, 231, 231)); 402cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 1, 30, 35, 35, 35, 231)); 403cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(41, 37, 35, 35, 231, 231)); 404cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(46, 29, 231, 231, 35, 35)); 405cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(15, 25, 35, 231, 35, 231)); 406cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 3, 52, 35, 231, 35, 35)); 407cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 408cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 409cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// Tests if GLConsumer and BufferQueue are robust enough 410cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// to handle a special case where updateTexImage is called 411cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// in the middle of disconnect. This ordering is enforced 412cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// by blocking in the disconnect callback. 413cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, DisconnectStressTest) { 414cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 415cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza class ProducerThread : public Thread { 416cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza public: 417cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ProducerThread(const sp<ANativeWindow>& anw): 418cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mANW(anw) { 419cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 420cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 421cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza virtual ~ProducerThread() { 422cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 423cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 424cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza virtual bool threadLoop() { 425cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindowBuffer* anb; 426cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 427cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_EGL); 428cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 429cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int numFrames =0 ; numFrames < 2; numFrames ++) { 430cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 431cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (native_window_dequeue_buffer_and_wait(mANW.get(), 432cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb) != NO_ERROR) { 433cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 434cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 435cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (anb == NULL) { 436cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 437cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 438cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (mANW->queueBuffer(mANW.get(), anb, -1) 439cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza != NO_ERROR) { 440cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 441cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 442cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 443cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 444cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_EGL); 445cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 446cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 447cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 448cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 449cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza private: 450cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<ANativeWindow> mANW; 451cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza }; 452cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 453cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<DisconnectWaiter> dw(new DisconnectWaiter()); 4545603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza mConsumer->consumerConnect(dw, false); 455cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 456cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 457cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<Thread> pt(new ProducerThread(mANW)); 458cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza pt->run(); 459cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 460cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // eat a frame so GLConsumer will own an at least one slot 461cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza dw->waitForFrame(); 462cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK,mST->updateTexImage()); 463cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 464cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza dw->waitForFrame(); 465cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Could fail here as GLConsumer thinks it still owns the slot 466cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // but bufferQueue has released all slots 467cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK,mST->updateTexImage()); 468cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 469cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza dw->finishDisconnect(); 470cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 471cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 472cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 473cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// This test ensures that the GLConsumer clears the mCurrentTexture 474cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// when it is disconnected and reconnected. Otherwise it will 475cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// attempt to release a buffer that it does not owned 476cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, DisconnectClearsCurrentTexture) { 477cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_api_connect(mANW.get(), 478cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza NATIVE_WINDOW_API_EGL)); 479cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 480cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindowBuffer *anb; 481cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 482cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ (OK, native_window_dequeue_buffer_and_wait(mANW.get(), &anb)); 483cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mANW->queueBuffer(mANW.get(), anb, -1)); 484cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 485cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ (OK, native_window_dequeue_buffer_and_wait(mANW.get(), &anb)); 486cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mANW->queueBuffer(mANW.get(), anb, -1)); 487cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 488cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK,mST->updateTexImage()); 489cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK,mST->updateTexImage()); 490cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 491cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_api_disconnect(mANW.get(), 492cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza NATIVE_WINDOW_API_EGL)); 493cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_api_connect(mANW.get(), 494cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza NATIVE_WINDOW_API_EGL)); 495cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 496cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &anb)); 497cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mANW->queueBuffer(mANW.get(), anb, -1)); 498cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 499cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Will fail here if mCurrentTexture is not cleared properly 500cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 501cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK,mST->updateTexImage()); 502cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 503cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_api_disconnect(mANW.get(), 504cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza NATIVE_WINDOW_API_EGL)); 505cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 506cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 507cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, ScaleToWindowMode) { 508cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_set_scaling_mode(mANW.get(), 509cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW)); 510cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 511cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // The producer image size 512cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 512, 512)); 513cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 514cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // The consumer image size (16 x 9) ratio 515cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setDefaultBufferSize(1280, 720); 516cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 517cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_api_connect(mANW.get(), 518cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza NATIVE_WINDOW_API_CPU)); 519cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 520cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindowBuffer *anb; 521cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 522cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza android_native_rect_t odd = {23, 78, 123, 477}; 523cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &odd)); 524cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ (OK, native_window_dequeue_buffer_and_wait(mANW.get(), &anb)); 525cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mANW->queueBuffer(mANW.get(), anb, -1)); 526cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 527cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mST->updateTexImage()); 528cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza Rect r = mST->getCurrentCrop(); 529cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza assertRectEq(Rect(23, 78, 123, 477), r); 530cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 531cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_api_disconnect(mANW.get(), 532cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza NATIVE_WINDOW_API_CPU)); 533cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 534cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 535cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// This test ensures the scaling mode does the right thing 536cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// ie NATIVE_WINDOW_SCALING_MODE_CROP should crop 537cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// the image such that it has the same aspect ratio as the 538cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// default buffer size 539cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, CroppedScalingMode) { 540cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_set_scaling_mode(mANW.get(), 541cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza NATIVE_WINDOW_SCALING_MODE_SCALE_CROP)); 542cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 543cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // The producer image size 544cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 512, 512)); 545cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 546cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // The consumer image size (16 x 9) ratio 547cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setDefaultBufferSize(1280, 720); 548cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 549cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU); 550cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 551cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindowBuffer *anb; 552cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 553cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // The crop is in the shape of (320, 180) === 16 x 9 554cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza android_native_rect_t standard = {10, 20, 330, 200}; 555cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &standard)); 556cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ (OK, native_window_dequeue_buffer_and_wait(mANW.get(), &anb)); 557cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mANW->queueBuffer(mANW.get(), anb, -1)); 558cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 559cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mST->updateTexImage()); 560cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza Rect r = mST->getCurrentCrop(); 561cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // crop should be the same as crop (same aspect ratio) 562cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza assertRectEq(Rect(10, 20, 330, 200), r); 563cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 564cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // make this wider then desired aspect 239 x 100 (2.39:1) 565cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza android_native_rect_t wide = {20, 30, 259, 130}; 566cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &wide)); 567cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ (OK, native_window_dequeue_buffer_and_wait(mANW.get(), &anb)); 568cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mANW->queueBuffer(mANW.get(), anb, -1)); 569cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 570cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mST->updateTexImage()); 571cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza r = mST->getCurrentCrop(); 572cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // crop should be the same height, but have cropped left and right borders 573cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // offset is 30.6 px L+, R- 574cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza assertRectEq(Rect(51, 30, 228, 130), r); 575cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 576cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This image is taller then desired aspect 400 x 300 (4:3) 577cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza android_native_rect_t narrow = {0, 0, 400, 300}; 578cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &narrow)); 579cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ (OK, native_window_dequeue_buffer_and_wait(mANW.get(), &anb)); 580cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mANW->queueBuffer(mANW.get(), anb, -1)); 581cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 582cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(OK, mST->updateTexImage()); 583cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza r = mST->getCurrentCrop(); 584cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // crop should be the same width, but have cropped top and bottom borders 585cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // offset is 37.5 px 586cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza assertRectEq(Rect(0, 37, 400, 262), r); 587cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 588cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_api_disconnect(mANW.get(), NATIVE_WINDOW_API_CPU); 589cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 590cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 591cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, AbandonUnblocksDequeueBuffer) { 592cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza class ProducerThread : public Thread { 593cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza public: 594cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ProducerThread(const sp<ANativeWindow>& anw): 595cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mANW(anw), 596cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mDequeueError(NO_ERROR) { 597cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 598cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 599cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza virtual ~ProducerThread() { 600cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 601cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 602cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza virtual bool threadLoop() { 603cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza Mutex::Autolock lock(mMutex); 604cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindowBuffer* anb; 605cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 606cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Frame 1 607cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (native_window_dequeue_buffer_and_wait(mANW.get(), 608cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb) != NO_ERROR) { 609cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 610cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 611cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (anb == NULL) { 612cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 613cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 614cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (mANW->queueBuffer(mANW.get(), anb, -1) 615cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza != NO_ERROR) { 616cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 617cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 618cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 619cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Frame 2 620cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (native_window_dequeue_buffer_and_wait(mANW.get(), 621cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb) != NO_ERROR) { 622cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 623cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 624cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (anb == NULL) { 625cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 626cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 627cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (mANW->queueBuffer(mANW.get(), anb, -1) 628cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza != NO_ERROR) { 629cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 630cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 631cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 632cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Frame 3 - error expected 633cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mDequeueError = native_window_dequeue_buffer_and_wait(mANW.get(), 634cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb); 635cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return false; 636cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 637cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 638cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza status_t getDequeueError() { 639cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza Mutex::Autolock lock(mMutex); 640cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return mDequeueError; 641cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 642cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 643cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza private: 644cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<ANativeWindow> mANW; 645cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza status_t mDequeueError; 646cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza Mutex mMutex; 647cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza }; 648cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 649cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(OK, mST->setDefaultMaxBufferCount(2)); 650cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 651cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<Thread> pt(new ProducerThread(mANW)); 652cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza pt->run(); 653cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 654cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 655cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 656cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 657cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Sleep for 100ms to allow the producer thread's dequeueBuffer call to 658cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // block waiting for a buffer to become available. 659cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza usleep(100000); 660cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 661cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->abandon(); 662cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 663cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza pt->requestExitAndWait(); 664cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_INIT, 665cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza reinterpret_cast<ProducerThread*>(pt.get())->getDequeueError()); 666cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 667cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 668cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLTest, InvalidWidthOrHeightFails) { 669cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int texHeight = 16; 670cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindowBuffer* anb; 671cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 672cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLint maxTextureSize; 673cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); 674cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 675cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // make sure it works with small textures 676cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setDefaultBufferSize(16, texHeight); 677cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), 678cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb)); 679cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(16, anb->width); 680cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(texHeight, anb->height); 681cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), anb, -1)); 682cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(NO_ERROR, mST->updateTexImage()); 683cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 684cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // make sure it works with GL_MAX_TEXTURE_SIZE 685cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setDefaultBufferSize(maxTextureSize, texHeight); 686cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), 687cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb)); 688cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(maxTextureSize, anb->width); 689cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(texHeight, anb->height); 690cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), anb, -1)); 691cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(NO_ERROR, mST->updateTexImage()); 692cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 693cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // make sure it fails with GL_MAX_TEXTURE_SIZE+1 694cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setDefaultBufferSize(maxTextureSize+1, texHeight); 695cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), 696cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb)); 697cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(maxTextureSize+1, anb->width); 698cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(texHeight, anb->height); 699cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), anb, -1)); 700cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_NE(NO_ERROR, mST->updateTexImage()); 701cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 702cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 703cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} // namespace android 704