1cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza/* 2cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Copyright 2013 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 "SurfaceTextureGLToGL_test" 18cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza//#define LOG_NDEBUG 0 19cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 20cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include "SurfaceTextureGLToGL.h" 21cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 22cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozanamespace android { 23cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 24cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, TransformHintGetsRespected) { 25cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const uint32_t texWidth = 32; 26cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const uint32_t texHeight = 64; 27cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 28cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setDefaultBufferSize(texWidth, texHeight); 29cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setTransformHint(NATIVE_WINDOW_TRANSFORM_ROT_90); 30cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 31cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This test requires 3 buffers to avoid deadlock because we're 3219e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos // both producer and consumer, and only using one thread. Set max dequeued 3319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos // to 2, and max acquired already defaults to 1. 3419e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos ASSERT_EQ(OK, mSTC->setMaxDequeuedBufferCount(2)); 35cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 36b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos SetUpWindowAndContext(); 37b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos 38cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Do the producer side of things 39cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 40cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 41cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 42cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 43cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Start a buffer with our chosen size and transform hint moving 44cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // through the system. 45cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); // give the driver something to do 46cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 47cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->updateTexImage(); // consume it 48cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Swap again. 49cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 50cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 51cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->updateTexImage(); 52cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 53cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // The current buffer should either show the effects of the transform 54cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // hint (in the form of an inverse transform), or show that the 55cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // transform hint has been ignored. 56cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buf = mST->getCurrentBuffer(); 57cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (mST->getCurrentTransform() == NATIVE_WINDOW_TRANSFORM_ROT_270) { 58cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(texWidth, buf->getHeight()); 59cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(texHeight, buf->getWidth()); 60cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } else { 61cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(texWidth, buf->getWidth()); 62cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(texHeight, buf->getHeight()); 63cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 64cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 65cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Reset the transform hint and confirm that it takes. 66cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setTransformHint(0); 67cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 68cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 69cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->updateTexImage(); 70cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 71cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 72cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->updateTexImage(); 73cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 74cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf = mST->getCurrentBuffer(); 75cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ((uint32_t) 0, mST->getCurrentTransform()); 76cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(texWidth, buf->getWidth()); 77cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(texHeight, buf->getHeight()); 78cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 79cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 80cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, TexturingFromGLFilledRGBABufferPow2) { 81cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texWidth = 64; 82cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texHeight = 64; 83cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 84cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setDefaultBufferSize(texWidth, texHeight); 85cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 86cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This test requires 3 buffers to complete run on a single thread. 8719e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos // Set max dequeued to 2, and max acquired already defaults to 1. 8819e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos ASSERT_EQ(OK, mSTC->setMaxDequeuedBufferCount(2)); 89cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 90b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos SetUpWindowAndContext(); 91b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos 92cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Do the producer side of things 93cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 94cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 95cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 96cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 97cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This is needed to ensure we pick up a buffer of the correct size. 98cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 99cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 100cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.6, 0.6, 0.6, 0.6); 101cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 102cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 103cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glEnable(GL_SCISSOR_TEST); 104cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glScissor(4, 4, 4, 4); 105cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(1.0, 0.0, 0.0, 1.0); 106cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 107cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 108cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glScissor(24, 48, 4, 4); 109cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.0, 1.0, 0.0, 1.0); 110cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 111cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 112cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glScissor(37, 17, 4, 4); 113cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.0, 0.0, 1.0, 1.0); 114cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 115cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 116cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 117cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 118cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Do the consumer side of things 119cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 120cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mEglContext)); 121cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 122cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 123cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDisable(GL_SCISSOR_TEST); 124cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 125cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Skip the first frame, which was empty 126cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 127cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 128cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 129cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 130cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 131cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 132cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, texWidth, texHeight); 133cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 134cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 135cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 0, 153, 153, 153, 153)); 136cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 0, 153, 153, 153, 153)); 137cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 63, 153, 153, 153, 153)); 138cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 63, 153, 153, 153, 153)); 139cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 140cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 4, 7, 255, 0, 0, 255)); 141cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(25, 51, 0, 255, 0, 255)); 142cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(40, 19, 0, 0, 255, 255)); 143cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(29, 51, 153, 153, 153, 153)); 144cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 5, 32, 153, 153, 153, 153)); 145cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(13, 8, 153, 153, 153, 153)); 146cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(46, 3, 153, 153, 153, 153)); 147cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(30, 33, 153, 153, 153, 153)); 148cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 6, 52, 153, 153, 153, 153)); 149cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(55, 33, 153, 153, 153, 153)); 150cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(16, 29, 153, 153, 153, 153)); 151cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 1, 30, 153, 153, 153, 153)); 152cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(41, 37, 153, 153, 153, 153)); 153cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(46, 29, 153, 153, 153, 153)); 154cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(15, 25, 153, 153, 153, 153)); 155cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 3, 52, 153, 153, 153, 153)); 156cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 157cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 158cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, EglDestroySurfaceUnrefsBuffers) { 159b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos SetUpWindowAndContext(); 160cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buffers[2]; 161cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 162cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This test requires async mode to run on a single thread. 163cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 164cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 165cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 166cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglSwapInterval(mEglDisplay, 0)); 167cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 168cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 169cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int i = 0; i < 2; i++) { 170cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Produce a frame 171cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 172cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 173cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 174cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 175cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 176cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 177cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Consume a frame 178cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 179cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mEglContext)); 180cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 181cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 182cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 183cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buffers[i] = mST->getCurrentBuffer(); 184cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 185cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 186cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Destroy the GL texture object to release its ref on buffers[2]. 187cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLuint texID = TEX_ID; 188cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDeleteTextures(1, &texID); 189cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 190cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Destroy the EGLSurface 191cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface)); 192cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 193cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface = EGL_NO_SURFACE; 194cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 195cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This test should have the only reference to buffer 0. 196cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(1, buffers[0]->getStrongCount()); 197cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 198d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine // The GLConsumer should hold one reference to buffer 1 in its 199d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine // mCurrentTextureImage member and another reference in mEglSlots. The third 200d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine // reference is in this test. 201d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine EXPECT_EQ(3, buffers[1]->getStrongCount()); 202cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 203cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 204cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, EglDestroySurfaceAfterAbandonUnrefsBuffers) { 205b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos SetUpWindowAndContext(); 206cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buffers[3]; 207cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 208cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This test requires async mode to run on a single thread. 209cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 210cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 211cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 212cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglSwapInterval(mEglDisplay, 0)); 213cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 214cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 215cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int i = 0; i < 3; i++) { 216cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Produce a frame 217cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 218cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 219cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 220cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 221cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglSwapBuffers(mEglDisplay, mProducerEglSurface)); 222cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 223cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 224cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Consume a frame 225cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 226cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mEglContext)); 227cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 228cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mFW->waitForFrame(); 229cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 230cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buffers[i] = mST->getCurrentBuffer(); 231cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 232cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 233cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Abandon the GLConsumer, releasing the ref that the GLConsumer has 234cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // on buffers[2]. 235cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->abandon(); 236cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 237cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Destroy the GL texture object to release its ref on buffers[2]. 238cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLuint texID = TEX_ID; 239cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDeleteTextures(1, &texID); 240cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 241cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Destroy the EGLSurface. 242cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface)); 243cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 244cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface = EGL_NO_SURFACE; 245cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 246cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(1, buffers[1]->getStrongCount()); 247cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 248cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Depending on how lazily the GL driver dequeues buffers, we may end up 249d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine // with either two or three total buffers. If there are three, each entry 250d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine // of the buffers array will be unique and there should only be one 251d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine // reference (the one in this test). If there are two the first and last 252d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine // element in the array will be equal meaning that buffer representing both 253d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine // 0 and 2 will have two references (one for 0 and one for 2). 254cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza if (buffers[2] != buffers[0]) { 255d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine EXPECT_EQ(1, buffers[0]->getStrongCount()); 256cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(1, buffers[2]->getStrongCount()); 257d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine } else { 258d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine EXPECT_EQ(2, buffers[0]->getStrongCount()); 259cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 260cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 261cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 262cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, EglMakeCurrentBeforeConsumerDeathUnrefsBuffers) { 263b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos SetUpWindowAndContext(); 264cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buffer; 265cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 266cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 267cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 268cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 269cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Produce a frame 270cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 271cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglSwapBuffers(mEglDisplay, mProducerEglSurface)); 272cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 273cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 274cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Destroy the EGLSurface. 275cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface)); 276cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 277cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface = EGL_NO_SURFACE; 278cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSTC.clear(); 279cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mANW.clear(); 280cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mTextureRenderer.clear(); 281cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 282cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Consume a frame 283cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 284cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buffer = mST->getCurrentBuffer(); 285cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 286cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Destroy the GL texture object to release its ref 287cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLuint texID = TEX_ID; 288cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDeleteTextures(1, &texID); 289cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 290cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // make un-current, all references to buffer should be gone 291cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, 292cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_NO_SURFACE, EGL_NO_CONTEXT)); 293cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 294cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Destroy consumer 295cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST.clear(); 296cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 297cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(1, buffer->getStrongCount()); 298cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 299cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 300cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, EglMakeCurrentAfterConsumerDeathUnrefsBuffers) { 301b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos SetUpWindowAndContext(); 302cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buffer; 303cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 304cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 305cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 306cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 307cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Produce a frame 308cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 309cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglSwapBuffers(mEglDisplay, mProducerEglSurface)); 310cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 311cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 312cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Destroy the EGLSurface. 313cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface)); 314cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 315cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface = EGL_NO_SURFACE; 316cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSTC.clear(); 317cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mANW.clear(); 318cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mTextureRenderer.clear(); 319cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 320cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Consume a frame 321cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 322cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buffer = mST->getCurrentBuffer(); 323cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 324cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Destroy the GL texture object to release its ref 325cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLuint texID = TEX_ID; 326cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDeleteTextures(1, &texID); 327cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 328cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Destroy consumer 329cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST.clear(); 330cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 331cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // make un-current, all references to buffer should be gone 332cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, 333cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_NO_SURFACE, EGL_NO_CONTEXT)); 334cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 335cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_EQ(1, buffer->getStrongCount()); 336cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 337cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 338cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, TexturingFromUserSizedGLFilledBuffer) { 339cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum { texWidth = 64 }; 340cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum { texHeight = 64 }; 341cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 342cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This test requires 3 buffers to complete run on a single thread. 34319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos // Set max dequeued to 2, and max acquired already defaults to 1. 34419e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos ASSERT_EQ(OK, mSTC->setMaxDequeuedBufferCount(2)); 345cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 346b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos SetUpWindowAndContext(); 347b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos 348cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Set the user buffer size. 349cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_set_buffers_user_dimensions(mANW.get(), texWidth, texHeight); 350cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 351cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Do the producer side of things 352cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 353cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 354cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 355cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 356cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This is needed to ensure we pick up a buffer of the correct size. 357cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 358cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 359cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.6, 0.6, 0.6, 0.6); 360cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 361cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 362cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glEnable(GL_SCISSOR_TEST); 363cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glScissor(4, 4, 1, 1); 364cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(1.0, 0.0, 0.0, 1.0); 365cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 366cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 367cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 368cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 369cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Do the consumer side of things 370cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 371cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mEglContext)); 372cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 373cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 374cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDisable(GL_SCISSOR_TEST); 375cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 376cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Skip the first frame, which was empty 377cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 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, 153, 153, 153, 153)); 387cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 0, 153, 153, 153, 153)); 388cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 63, 153, 153, 153, 153)); 389cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 63, 153, 153, 153, 153)); 390cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 391cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 4, 4, 255, 0, 0, 255)); 392cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 5, 5, 153, 153, 153, 153)); 393cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 3, 3, 153, 153, 153, 153)); 394cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(45, 52, 153, 153, 153, 153)); 395cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(12, 36, 153, 153, 153, 153)); 396cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 397cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 398cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, TexturingFromPreRotatedUserSizedGLFilledBuffer) { 399cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum { texWidth = 64 }; 400cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum { texHeight = 16 }; 401cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 402cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This test requires 3 buffers to complete run on a single thread. 40319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos // Set max dequeued to 2, and max acquired already defaults to 1. 40419e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos ASSERT_EQ(OK, mSTC->setMaxDequeuedBufferCount(2)); 405cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 406b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos SetUpWindowAndContext(); 407b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos 408cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Set the transform hint. 409cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setTransformHint(NATIVE_WINDOW_TRANSFORM_ROT_90); 410cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 411cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Set the user buffer size. 412cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza native_window_set_buffers_user_dimensions(mANW.get(), texWidth, texHeight); 413cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 414cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Do the producer side of things 415cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 416cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 417cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 418cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 419cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This is needed to ensure we pick up a buffer of the correct size and the 420cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // new rotation hint. 421cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 422cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 423cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.6, 0.6, 0.6, 0.6); 424cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 425cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 426cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glEnable(GL_SCISSOR_TEST); 427cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glScissor(24, 4, 1, 1); 428cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(1.0, 0.0, 0.0, 1.0); 429cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 430cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 431cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 432cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 433cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Do the consumer side of things 434cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 435cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mEglContext)); 436cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 437cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 438cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDisable(GL_SCISSOR_TEST); 439cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 440cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Skip the first frame, which was empty 441cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 442cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 443cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 444cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 445cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 446cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 447cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, texWidth, texHeight); 448cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 449cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 450cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 0, 153, 153, 153, 153)); 451cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 0, 153, 153, 153, 153)); 452cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 15, 153, 153, 153, 153)); 453cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 15, 153, 153, 153, 153)); 454cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 455cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(24, 4, 255, 0, 0, 255)); 456cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(25, 5, 153, 153, 153, 153)); 457cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(23, 3, 153, 153, 153, 153)); 458cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(45, 13, 153, 153, 153, 153)); 459cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(12, 8, 153, 153, 153, 153)); 460cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 461cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 462cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, TexturingFromPreRotatedGLFilledBuffer) { 463cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum { texWidth = 64 }; 464cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum { texHeight = 16 }; 465cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 466cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This test requires 3 buffers to complete run on a single thread. 46719e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos // Set max dequeued to 2, and max acquired already defaults to 1. 46819e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos ASSERT_EQ(OK, mSTC->setMaxDequeuedBufferCount(2)); 469cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 470b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos SetUpWindowAndContext(); 471b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos 472cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Set the transform hint. 473cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setTransformHint(NATIVE_WINDOW_TRANSFORM_ROT_90); 474cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 475cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Set the default buffer size. 476cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mST->setDefaultBufferSize(texWidth, texHeight); 477cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 478cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Do the producer side of things 479cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface, 480cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mProducerEglSurface, mProducerEglContext)); 481cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 482cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 483cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // This is needed to ensure we pick up a buffer of the correct size and the 484cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // new rotation hint. 485cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 486cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 487cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.6, 0.6, 0.6, 0.6); 488cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 489cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 490cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glEnable(GL_SCISSOR_TEST); 491cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glScissor(24, 4, 1, 1); 492cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(1.0, 0.0, 0.0, 1.0); 493cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 494cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 495cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza eglSwapBuffers(mEglDisplay, mProducerEglSurface); 496cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 497cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Do the consumer side of things 498cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 499cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mEglContext)); 500cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(EGL_SUCCESS, eglGetError()); 501cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 502cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDisable(GL_SCISSOR_TEST); 503cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 504cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Skip the first frame, which was empty 505cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 506cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 507cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 508cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClearColor(0.2, 0.2, 0.2, 0.2); 509cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 510cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 511cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, texWidth, texHeight); 512cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 513cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 514cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 0, 153, 153, 153, 153)); 515cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 0, 153, 153, 153, 153)); 516cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(63, 15, 153, 153, 153, 153)); 517cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 0, 15, 153, 153, 153, 153)); 518cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 519cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(24, 4, 255, 0, 0, 255)); 520cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(25, 5, 153, 153, 153, 153)); 521cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(23, 3, 153, 153, 153, 153)); 522cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(45, 13, 153, 153, 153, 153)); 523cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(12, 8, 153, 153, 153, 153)); 524cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 525cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 526cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} // namespace android 527