SurfaceTextureGLThreadToGL_test.cpp revision cb1fcdedaaf95acabeac6a2d5bff423d6ca62296
1/* 2 * Copyright 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "SurfaceTextureGLThreadToGL_test" 18//#define LOG_NDEBUG 0 19 20#include "SurfaceTextureGLThreadToGL.h" 21 22namespace android { 23 24TEST_F(SurfaceTextureGLThreadToGLTest, 25 UpdateTexImageBeforeFrameFinishedCompletes) { 26 class PT : public ProducerThread { 27 virtual void render() { 28 glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 29 glClear(GL_COLOR_BUFFER_BIT); 30 swapBuffers(); 31 } 32 }; 33 34 runProducerThread(new PT()); 35 36 mFC->waitForFrame(); 37 ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 38 mFC->finishFrame(); 39 40 // TODO: Add frame verification once RGB TEX_EXTERNAL_OES is supported! 41} 42 43TEST_F(SurfaceTextureGLThreadToGLTest, 44 UpdateTexImageAfterFrameFinishedCompletes) { 45 class PT : public ProducerThread { 46 virtual void render() { 47 glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 48 glClear(GL_COLOR_BUFFER_BIT); 49 swapBuffers(); 50 } 51 }; 52 53 runProducerThread(new PT()); 54 55 mFC->waitForFrame(); 56 mFC->finishFrame(); 57 ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 58 59 // TODO: Add frame verification once RGB TEX_EXTERNAL_OES is supported! 60} 61 62TEST_F(SurfaceTextureGLThreadToGLTest, 63 RepeatedUpdateTexImageBeforeFrameFinishedCompletes) { 64 enum { NUM_ITERATIONS = 1024 }; 65 66 class PT : public ProducerThread { 67 virtual void render() { 68 for (int i = 0; i < NUM_ITERATIONS; i++) { 69 glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 70 glClear(GL_COLOR_BUFFER_BIT); 71 ALOGV("+swapBuffers"); 72 swapBuffers(); 73 ALOGV("-swapBuffers"); 74 } 75 } 76 }; 77 78 runProducerThread(new PT()); 79 80 for (int i = 0; i < NUM_ITERATIONS; i++) { 81 mFC->waitForFrame(); 82 ALOGV("+updateTexImage"); 83 ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 84 ALOGV("-updateTexImage"); 85 mFC->finishFrame(); 86 87 // TODO: Add frame verification once RGB TEX_EXTERNAL_OES is supported! 88 } 89} 90 91TEST_F(SurfaceTextureGLThreadToGLTest, 92 RepeatedUpdateTexImageAfterFrameFinishedCompletes) { 93 enum { NUM_ITERATIONS = 1024 }; 94 95 class PT : public ProducerThread { 96 virtual void render() { 97 for (int i = 0; i < NUM_ITERATIONS; i++) { 98 glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 99 glClear(GL_COLOR_BUFFER_BIT); 100 ALOGV("+swapBuffers"); 101 swapBuffers(); 102 ALOGV("-swapBuffers"); 103 } 104 } 105 }; 106 107 runProducerThread(new PT()); 108 109 for (int i = 0; i < NUM_ITERATIONS; i++) { 110 mFC->waitForFrame(); 111 mFC->finishFrame(); 112 ALOGV("+updateTexImage"); 113 ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 114 ALOGV("-updateTexImage"); 115 116 // TODO: Add frame verification once RGB TEX_EXTERNAL_OES is supported! 117 } 118} 119 120// XXX: This test is disabled because it is currently hanging on some devices. 121TEST_F(SurfaceTextureGLThreadToGLTest, 122 DISABLED_RepeatedSwapBuffersWhileDequeueStalledCompletes) { 123 enum { NUM_ITERATIONS = 64 }; 124 125 class PT : public ProducerThread { 126 virtual void render() { 127 for (int i = 0; i < NUM_ITERATIONS; i++) { 128 glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 129 glClear(GL_COLOR_BUFFER_BIT); 130 ALOGV("+swapBuffers"); 131 swapBuffers(); 132 ALOGV("-swapBuffers"); 133 } 134 } 135 }; 136 137 ASSERT_EQ(OK, mST->setDefaultMaxBufferCount(2)); 138 139 runProducerThread(new PT()); 140 141 // Allow three frames to be rendered and queued before starting the 142 // rendering in this thread. For the latter two frames we don't call 143 // updateTexImage so the next dequeue from the producer thread will block 144 // waiting for a frame to become available. 145 mFC->waitForFrame(); 146 mFC->finishFrame(); 147 148 // We must call updateTexImage to consume the first frame so that the 149 // SurfaceTexture is able to reduce the buffer count to 2. This is because 150 // the GL driver may dequeue a buffer when the EGLSurface is created, and 151 // that happens before we call setDefaultMaxBufferCount. It's possible that the 152 // driver does not dequeue a buffer at EGLSurface creation time, so we 153 // cannot rely on this to cause the second dequeueBuffer call to block. 154 ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 155 156 mFC->waitForFrame(); 157 mFC->finishFrame(); 158 mFC->waitForFrame(); 159 mFC->finishFrame(); 160 161 // Sleep for 100ms to allow the producer thread's dequeueBuffer call to 162 // block waiting for a buffer to become available. 163 usleep(100000); 164 165 // Render and present a number of images. This thread should not be blocked 166 // by the fact that the producer thread is blocking in dequeue. 167 for (int i = 0; i < NUM_ITERATIONS; i++) { 168 glClear(GL_COLOR_BUFFER_BIT); 169 eglSwapBuffers(mEglDisplay, mEglSurface); 170 } 171 172 // Consume the two pending buffers to unblock the producer thread. 173 ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 174 ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 175 176 // Consume the remaining buffers from the producer thread. 177 for (int i = 0; i < NUM_ITERATIONS-3; i++) { 178 mFC->waitForFrame(); 179 mFC->finishFrame(); 180 ALOGV("+updateTexImage"); 181 ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 182 ALOGV("-updateTexImage"); 183 } 184} 185 186} // namespace android 187