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