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