OSDN Git Service

Mark libEGL, GLESv1_CM, GLESv2, and GLESv3 as LLNDK
[android-x86/frameworks-native.git] / libs / gui / tests / SurfaceTextureClient_test.cpp
1 /*
2  * Copyright (C) 2011 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 "SurfaceTextureClient_test"
18 //#define LOG_NDEBUG 0
19
20 #include <EGL/egl.h>
21 #include <GLES2/gl2.h>
22
23 #include <gtest/gtest.h>
24 #include <gui/GLConsumer.h>
25 #include <gui/Surface.h>
26 #include <gui/BufferQueue.h>
27 #include <system/graphics.h>
28 #include <utils/Log.h>
29 #include <utils/Thread.h>
30
31 extern "C" EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
32 #define CROP_EXT_STR "EGL_ANDROID_image_crop"
33
34 namespace android {
35
36 class SurfaceTextureClientTest : public ::testing::Test {
37 protected:
38     SurfaceTextureClientTest():
39             mEglDisplay(EGL_NO_DISPLAY),
40             mEglSurface(EGL_NO_SURFACE),
41             mEglContext(EGL_NO_CONTEXT),
42             mEglConfig(NULL) {
43     }
44
45     virtual void SetUp() {
46         const ::testing::TestInfo* const testInfo =
47             ::testing::UnitTest::GetInstance()->current_test_info();
48         ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
49                 testInfo->name());
50
51         sp<IGraphicBufferProducer> producer;
52         sp<IGraphicBufferConsumer> consumer;
53         BufferQueue::createBufferQueue(&producer, &consumer);
54         mST = new GLConsumer(consumer, 123, GLConsumer::TEXTURE_EXTERNAL, true,
55                 false);
56         mSTC = new Surface(producer);
57         mANW = mSTC;
58
59         // We need a valid GL context so we can test updateTexImage()
60         // This initializes EGL and create a dummy GL context with a
61         // pbuffer render target.
62         mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
63         ASSERT_EQ(EGL_SUCCESS, eglGetError());
64         ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
65
66         EGLint majorVersion, minorVersion;
67         EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
68         ASSERT_EQ(EGL_SUCCESS, eglGetError());
69
70         EGLConfig myConfig;
71         EGLint numConfigs = 0;
72         EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
73                 &myConfig, 1, &numConfigs));
74         ASSERT_EQ(EGL_SUCCESS, eglGetError());
75
76         mEglConfig = myConfig;
77         EGLint pbufferAttribs[] = {
78             EGL_WIDTH, 16,
79             EGL_HEIGHT, 16,
80             EGL_NONE };
81         mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
82         ASSERT_EQ(EGL_SUCCESS, eglGetError());
83         ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
84
85         mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, 0);
86         ASSERT_EQ(EGL_SUCCESS, eglGetError());
87         ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
88
89         EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
90         ASSERT_EQ(EGL_SUCCESS, eglGetError());
91     }
92
93     virtual void TearDown() {
94         mST.clear();
95         mSTC.clear();
96         mANW.clear();
97
98         eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
99         eglDestroyContext(mEglDisplay, mEglContext);
100         eglDestroySurface(mEglDisplay, mEglSurface);
101         eglTerminate(mEglDisplay);
102
103         const ::testing::TestInfo* const testInfo =
104             ::testing::UnitTest::GetInstance()->current_test_info();
105         ALOGV("End test:   %s.%s", testInfo->test_case_name(),
106                 testInfo->name());
107     }
108
109     virtual EGLint const* getConfigAttribs() {
110         static EGLint sDefaultConfigAttribs[] = {
111             EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT,
112             EGL_NONE
113         };
114
115         return sDefaultConfigAttribs;
116     }
117
118     sp<GLConsumer> mST;
119     sp<Surface> mSTC;
120     sp<ANativeWindow> mANW;
121
122     EGLDisplay mEglDisplay;
123     EGLSurface mEglSurface;
124     EGLContext mEglContext;
125     EGLConfig  mEglConfig;
126 };
127
128 TEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
129     sp<IGraphicBufferProducer> ist(mSTC->getIGraphicBufferProducer());
130     ASSERT_TRUE(ist != NULL);
131 }
132
133 TEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
134     int result = -123;
135     int err = mANW->query(mANW.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
136             &result);
137     EXPECT_EQ(NO_ERROR, err);
138     EXPECT_EQ(0, result);
139 }
140
141 TEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
142     int result = -123;
143     int err = mANW->query(mANW.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
144     EXPECT_EQ(NO_ERROR, err);
145     EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
146 }
147
148 TEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
149     EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
150     ASSERT_EQ(EGL_SUCCESS, eglGetError());
151     ASSERT_NE(EGL_NO_DISPLAY, dpy);
152
153     EGLint majorVersion;
154     EGLint minorVersion;
155     EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion));
156     ASSERT_EQ(EGL_SUCCESS, eglGetError());
157
158     EGLConfig myConfig = {0};
159     EGLint numConfigs = 0;
160     EGLint configAttribs[] = {
161         EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
162         EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
163         EGL_RED_SIZE, 8,
164         EGL_GREEN_SIZE, 8,
165         EGL_BLUE_SIZE, 8,
166         EGL_ALPHA_SIZE, 8,
167         EGL_DEPTH_SIZE, 16,
168         EGL_STENCIL_SIZE, 8,
169         EGL_NONE };
170     EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1,
171             &numConfigs));
172     ASSERT_EQ(EGL_SUCCESS, eglGetError());
173
174     EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, mANW.get(),
175             NULL);
176     EXPECT_NE(EGL_NO_SURFACE, eglSurface);
177     EXPECT_EQ(EGL_SUCCESS, eglGetError());
178
179     if (eglSurface != EGL_NO_SURFACE) {
180         eglDestroySurface(dpy, eglSurface);
181     }
182
183     eglTerminate(dpy);
184 }
185
186 TEST_F(SurfaceTextureClientTest, EglSwapBuffersAbandonErrorIsEglBadSurface) {
187
188     EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig, mANW.get(), NULL);
189     EXPECT_NE(EGL_NO_SURFACE, eglSurface);
190     EXPECT_EQ(EGL_SUCCESS, eglGetError());
191
192     EGLBoolean success = eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);
193     EXPECT_TRUE(success);
194
195     glClear(GL_COLOR_BUFFER_BIT);
196     success = eglSwapBuffers(mEglDisplay, eglSurface);
197     EXPECT_TRUE(success);
198
199     mST->abandon();
200
201     glClear(GL_COLOR_BUFFER_BIT);
202     success = eglSwapBuffers(mEglDisplay, eglSurface);
203     EXPECT_FALSE(success);
204     EXPECT_EQ(EGL_BAD_SURFACE, eglGetError());
205
206     success = eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
207     ASSERT_TRUE(success);
208
209     if (eglSurface != EGL_NO_SURFACE) {
210         eglDestroySurface(mEglDisplay, eglSurface);
211     }
212 }
213
214 TEST_F(SurfaceTextureClientTest, BufferGeometryInvalidSizesFail) {
215     EXPECT_GT(OK, native_window_set_buffers_dimensions(mANW.get(),  0,  8));
216     EXPECT_GT(OK, native_window_set_buffers_dimensions(mANW.get(),  8,  0));
217 }
218
219 TEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
220     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
221     ANativeWindowBuffer* buf;
222     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
223     EXPECT_EQ(1, buf->width);
224     EXPECT_EQ(1, buf->height);
225     EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
226     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
227 }
228
229 TEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
230     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
231     ANativeWindowBuffer* buf;
232     EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
233     EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
234     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
235     EXPECT_EQ(16, buf->width);
236     EXPECT_EQ(8, buf->height);
237     EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
238     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
239 }
240
241 TEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
242     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
243     ANativeWindowBuffer* buf;
244     EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
245     EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
246     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
247     EXPECT_EQ(1, buf->width);
248     EXPECT_EQ(1, buf->height);
249     EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
250     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
251 }
252
253 TEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
254     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
255     ANativeWindowBuffer* buf;
256     EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
257     EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
258     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
259     EXPECT_EQ(16, buf->width);
260     EXPECT_EQ(8, buf->height);
261     EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
262     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
263 }
264
265 TEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
266     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
267     ANativeWindowBuffer* buf;
268     EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
269     EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
270     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
271     EXPECT_EQ(16, buf->width);
272     EXPECT_EQ(8, buf->height);
273     EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
274     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
275     EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
276     EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
277     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
278     EXPECT_EQ(1, buf->width);
279     EXPECT_EQ(1, buf->height);
280     EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
281     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
282 }
283
284 TEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
285     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
286     ANativeWindowBuffer* buf;
287     EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
288     EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
289     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
290     EXPECT_EQ(1, buf->width);
291     EXPECT_EQ(1, buf->height);
292     EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
293     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
294     EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
295     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
296     EXPECT_EQ(16, buf->width);
297     EXPECT_EQ(8, buf->height);
298     EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
299     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
300 }
301
302 TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
303     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
304     sp<GLConsumer> st(mST);
305     ANativeWindowBuffer* buf;
306     EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
307     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
308     EXPECT_EQ(16, buf->width);
309     EXPECT_EQ(8, buf->height);
310     EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
311     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
312 }
313
314 TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
315     ANativeWindowBuffer* buf[2];
316     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
317     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
318     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
319     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
320     EXPECT_NE(buf[0], buf[1]);
321     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
322     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
323     EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
324     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
325     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
326     EXPECT_NE(buf[0], buf[1]);
327     EXPECT_EQ(16, buf[0]->width);
328     EXPECT_EQ(16, buf[1]->width);
329     EXPECT_EQ(8, buf[0]->height);
330     EXPECT_EQ(8, buf[1]->height);
331     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
332     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
333 }
334
335 TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
336     ANativeWindowBuffer* buf[2];
337     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
338     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
339     EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
340     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
341     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
342     EXPECT_NE(buf[0], buf[1]);
343     EXPECT_EQ(16, buf[0]->width);
344     EXPECT_EQ(16, buf[1]->width);
345     EXPECT_EQ(8, buf[0]->height);
346     EXPECT_EQ(8, buf[1]->height);
347     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
348     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
349     EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 12, 24));
350     EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
351     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
352     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
353     EXPECT_NE(buf[0], buf[1]);
354     EXPECT_EQ(12, buf[0]->width);
355     EXPECT_EQ(12, buf[1]->width);
356     EXPECT_EQ(24, buf[0]->height);
357     EXPECT_EQ(24, buf[1]->height);
358     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
359     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
360 }
361
362 TEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
363     android_native_buffer_t* buf[3];
364     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
365     ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 0));
366     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
367
368     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
369     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
370     EXPECT_EQ(OK, mST->updateTexImage());
371     EXPECT_EQ(OK, mST->updateTexImage());
372
373     ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 1));
374     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
375
376     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
377     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
378     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
379     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
380
381     EXPECT_EQ(OK, mST->updateTexImage());
382     EXPECT_EQ(OK, mST->updateTexImage());
383     EXPECT_EQ(OK, mST->updateTexImage());
384 }
385
386 TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
387     android_native_buffer_t* buf[3];
388     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
389     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
390     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
391     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
392     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
393     EXPECT_NE(buf[0], buf[1]);
394     EXPECT_NE(buf[1], buf[2]);
395     EXPECT_NE(buf[2], buf[0]);
396     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
397     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
398     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
399     EXPECT_EQ(OK, mST->updateTexImage());
400     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
401     EXPECT_EQ(OK, mST->updateTexImage());
402     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
403     EXPECT_EQ(OK, mST->updateTexImage());
404     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
405 }
406
407 TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
408     android_native_buffer_t* buf[3];
409     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
410     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
411     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
412     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
413     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
414     EXPECT_NE(buf[0], buf[1]);
415     EXPECT_NE(buf[1], buf[2]);
416     EXPECT_NE(buf[2], buf[0]);
417     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
418     EXPECT_EQ(OK, mST->updateTexImage());
419     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
420     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
421     EXPECT_EQ(OK, mST->updateTexImage());
422     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
423     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
424     EXPECT_EQ(OK, mST->updateTexImage());
425     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
426 }
427
428 TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
429     android_native_buffer_t* buf[3];
430     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
431     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
432     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
433     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
434     EXPECT_EQ(OK, mST->updateTexImage());
435     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
436
437     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
438     EXPECT_NE(buf[0], buf[1]);
439     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
440     EXPECT_EQ(OK, mST->updateTexImage());
441     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
442
443     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
444     EXPECT_NE(buf[1], buf[2]);
445     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
446     EXPECT_EQ(OK, mST->updateTexImage());
447     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
448 }
449
450 // XXX: We currently have no hardware that properly handles dequeuing the
451 // buffer that is currently bound to the texture.
452 TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
453     android_native_buffer_t* buf[3];
454     android_native_buffer_t* firstBuf;
455     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
456     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
457     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &firstBuf));
458     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), firstBuf, -1));
459     EXPECT_EQ(OK, mST->updateTexImage());
460     EXPECT_EQ(mST->getCurrentBuffer().get(), firstBuf);
461     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
462     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
463     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
464     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
465     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
466     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
467     EXPECT_NE(buf[0], buf[1]);
468     EXPECT_NE(buf[1], buf[2]);
469     EXPECT_NE(buf[2], buf[0]);
470     EXPECT_EQ(firstBuf, buf[2]);
471 }
472
473 TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
474     android_native_buffer_t* buf[3];
475     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
476     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
477
478     // We should be able to dequeue all the buffers before we've queued mANWy.
479     EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
480     EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
481     EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
482
483     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
484     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
485
486     EXPECT_EQ(OK, mST->updateTexImage());
487     EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
488
489     EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
490
491     // Once we've queued a buffer, however we should not be able to dequeue more
492     // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
493     EXPECT_EQ(INVALID_OPERATION,
494             native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
495
496     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
497     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
498 }
499
500 TEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
501     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
502     android_native_rect_t rect = {-2, -13, 40, 18};
503     native_window_set_crop(mANW.get(), &rect);
504
505     ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 4, 4));
506
507     android_native_buffer_t* buf;
508     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
509     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf, -1));
510     ASSERT_EQ(OK, mST->updateTexImage());
511
512     Rect crop = mST->getCurrentCrop();
513     EXPECT_EQ(0, crop.left);
514     EXPECT_EQ(0, crop.top);
515     EXPECT_EQ(4, crop.right);
516     EXPECT_EQ(4, crop.bottom);
517 }
518
519 // XXX: This is not expected to pass until the synchronization hacks are removed
520 // from the SurfaceTexture class.
521 TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
522     class MyThread : public Thread {
523         sp<GLConsumer> mST;
524         EGLContext ctx;
525         EGLSurface sur;
526         EGLDisplay dpy;
527         bool mBufferRetired;
528         Mutex mLock;
529         virtual bool threadLoop() {
530             eglMakeCurrent(dpy, sur, sur, ctx);
531             usleep(20000);
532             Mutex::Autolock _l(mLock);
533             mST->updateTexImage();
534             mBufferRetired = true;
535             eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
536             return false;
537         }
538     public:
539         explicit MyThread(const sp<GLConsumer>& mST)
540             : mST(mST), mBufferRetired(false) {
541             ctx = eglGetCurrentContext();
542             sur = eglGetCurrentSurface(EGL_DRAW);
543             dpy = eglGetCurrentDisplay();
544             eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
545         }
546         ~MyThread() {
547             eglMakeCurrent(dpy, sur, sur, ctx);
548         }
549         void bufferDequeued() {
550             Mutex::Autolock _l(mLock);
551             EXPECT_EQ(true, mBufferRetired);
552         }
553     };
554
555     android_native_buffer_t* buf[3];
556     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
557     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
558     // dequeue/queue/update so we have a current buffer
559     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
560     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
561     mST->updateTexImage();
562
563     MyThread* thread = new MyThread(mST);
564     sp<Thread> threadBase(thread);
565
566     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
567     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
568     thread->run("MyThread");
569     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
570     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
571     //ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
572     //ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
573     thread->bufferDequeued();
574     thread->requestExitAndWait();
575 }
576
577 TEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
578     android_native_buffer_t* buf[3];
579     float mtx[16] = {};
580     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
581     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
582     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
583     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
584     ASSERT_EQ(OK, mST->updateTexImage());
585     mST->getTransformMatrix(mtx);
586
587     EXPECT_EQ(1.f, mtx[0]);
588     EXPECT_EQ(0.f, mtx[1]);
589     EXPECT_EQ(0.f, mtx[2]);
590     EXPECT_EQ(0.f, mtx[3]);
591
592     EXPECT_EQ(0.f, mtx[4]);
593     EXPECT_EQ(-1.f, mtx[5]);
594     EXPECT_EQ(0.f, mtx[6]);
595     EXPECT_EQ(0.f, mtx[7]);
596
597     EXPECT_EQ(0.f, mtx[8]);
598     EXPECT_EQ(0.f, mtx[9]);
599     EXPECT_EQ(1.f, mtx[10]);
600     EXPECT_EQ(0.f, mtx[11]);
601
602     EXPECT_EQ(0.f, mtx[12]);
603     EXPECT_EQ(1.f, mtx[13]);
604     EXPECT_EQ(0.f, mtx[14]);
605     EXPECT_EQ(1.f, mtx[15]);
606 }
607
608 TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
609     android_native_buffer_t* buf[3];
610     float mtx[16] = {};
611     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
612     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
613     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
614     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
615     ASSERT_EQ(OK, mST->updateTexImage());
616     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
617     mST->getTransformMatrix(mtx);
618
619     EXPECT_EQ(1.f, mtx[0]);
620     EXPECT_EQ(0.f, mtx[1]);
621     EXPECT_EQ(0.f, mtx[2]);
622     EXPECT_EQ(0.f, mtx[3]);
623
624     EXPECT_EQ(0.f, mtx[4]);
625     EXPECT_EQ(-1.f, mtx[5]);
626     EXPECT_EQ(0.f, mtx[6]);
627     EXPECT_EQ(0.f, mtx[7]);
628
629     EXPECT_EQ(0.f, mtx[8]);
630     EXPECT_EQ(0.f, mtx[9]);
631     EXPECT_EQ(1.f, mtx[10]);
632     EXPECT_EQ(0.f, mtx[11]);
633
634     EXPECT_EQ(0.f, mtx[12]);
635     EXPECT_EQ(1.f, mtx[13]);
636     EXPECT_EQ(0.f, mtx[14]);
637     EXPECT_EQ(1.f, mtx[15]);
638 }
639
640 TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
641     // Query to see if the image crop extension exists
642     EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
643     const char* exts = eglQueryStringImplementationANDROID(dpy, EGL_EXTENSIONS);
644     size_t cropExtLen = strlen(CROP_EXT_STR);
645     size_t extsLen = strlen(exts);
646     bool equal = !strcmp(CROP_EXT_STR, exts);
647     bool atStart = !strncmp(CROP_EXT_STR " ", exts, cropExtLen+1);
648     bool atEnd = (cropExtLen+1) < extsLen &&
649             !strcmp(" " CROP_EXT_STR, exts + extsLen - (cropExtLen+1));
650     bool inMiddle = strstr(exts, " " CROP_EXT_STR " ");
651     bool hasEglAndroidImageCrop = equal || atStart || atEnd || inMiddle;
652
653     android_native_buffer_t* buf[3];
654     float mtx[16] = {};
655     android_native_rect_t crop;
656     crop.left = 0;
657     crop.top = 0;
658     crop.right = 5;
659     crop.bottom = 5;
660
661     ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
662     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
663     ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 8, 8));
664     ASSERT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
665     ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
666     ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &crop));
667     ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
668     ASSERT_EQ(OK, mST->updateTexImage());
669     ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
670     mST->getTransformMatrix(mtx);
671
672     // If the egl image crop extension is not present, this accounts for the
673     // .5 texel shrink for each edge that's included in the transform matrix
674     // to avoid texturing outside the crop region. Otherwise the crop is not
675     // included in the transform matrix.
676     EXPECT_EQ(hasEglAndroidImageCrop ? 1 : 0.5, mtx[0]);
677     EXPECT_EQ(0.f, mtx[1]);
678     EXPECT_EQ(0.f, mtx[2]);
679     EXPECT_EQ(0.f, mtx[3]);
680
681     EXPECT_EQ(0.f, mtx[4]);
682     EXPECT_EQ(hasEglAndroidImageCrop ? -1 : -0.5, mtx[5]);
683     EXPECT_EQ(0.f, mtx[6]);
684     EXPECT_EQ(0.f, mtx[7]);
685
686     EXPECT_EQ(0.f, mtx[8]);
687     EXPECT_EQ(0.f, mtx[9]);
688     EXPECT_EQ(1.f, mtx[10]);
689     EXPECT_EQ(0.f, mtx[11]);
690
691     EXPECT_EQ(hasEglAndroidImageCrop ? 0 : 0.0625f, mtx[12]);
692     EXPECT_EQ(hasEglAndroidImageCrop ? 1 : 0.5625f, mtx[13]);
693     EXPECT_EQ(0.f, mtx[14]);
694     EXPECT_EQ(1.f, mtx[15]);
695 }
696
697 // This test verifies that the buffer format can be queried immediately after
698 // it is set.
699 TEST_F(SurfaceTextureClientTest, QueryFormatAfterSettingWorks) {
700     sp<ANativeWindow> anw(mSTC);
701     int fmts[] = {
702         // RGBA_8888 should not come first, as it's the default
703         HAL_PIXEL_FORMAT_RGBX_8888,
704         HAL_PIXEL_FORMAT_RGBA_8888,
705         HAL_PIXEL_FORMAT_RGB_888,
706         HAL_PIXEL_FORMAT_RGB_565,
707         HAL_PIXEL_FORMAT_BGRA_8888,
708         HAL_PIXEL_FORMAT_YV12,
709     };
710
711     const int numFmts = (sizeof(fmts) / sizeof(fmts[0]));
712     for (int i = 0; i < numFmts; i++) {
713       int fmt = -1;
714       ASSERT_EQ(OK, native_window_set_buffers_dimensions(anw.get(), 0, 0));
715       ASSERT_EQ(OK, native_window_set_buffers_format(anw.get(), fmts[i]));
716       ASSERT_EQ(OK, anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &fmt));
717       EXPECT_EQ(fmts[i], fmt);
718     }
719 }
720
721 class MultiSurfaceTextureClientTest : public ::testing::Test {
722
723 public:
724     MultiSurfaceTextureClientTest() :
725             mEglDisplay(EGL_NO_DISPLAY),
726             mEglContext(EGL_NO_CONTEXT) {
727         for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
728             mEglSurfaces[i] = EGL_NO_CONTEXT;
729         }
730     }
731
732 protected:
733
734     enum { NUM_SURFACE_TEXTURES = 32 };
735
736     virtual void SetUp() {
737         mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
738         ASSERT_EQ(EGL_SUCCESS, eglGetError());
739         ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
740
741         EGLint majorVersion, minorVersion;
742         EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
743         ASSERT_EQ(EGL_SUCCESS, eglGetError());
744
745         EGLConfig myConfig;
746         EGLint numConfigs = 0;
747         EGLint configAttribs[] = {
748             EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
749             EGL_NONE
750         };
751         EXPECT_TRUE(eglChooseConfig(mEglDisplay, configAttribs, &myConfig, 1,
752                 &numConfigs));
753         ASSERT_EQ(EGL_SUCCESS, eglGetError());
754
755         mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT,
756                 0);
757         ASSERT_EQ(EGL_SUCCESS, eglGetError());
758         ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
759
760         for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
761             sp<IGraphicBufferProducer> producer;
762             sp<IGraphicBufferConsumer> consumer;
763             BufferQueue::createBufferQueue(&producer, &consumer);
764             sp<GLConsumer> st(new GLConsumer(consumer, i,
765                     GLConsumer::TEXTURE_EXTERNAL, true, false));
766             sp<Surface> stc(new Surface(producer));
767             mEglSurfaces[i] = eglCreateWindowSurface(mEglDisplay, myConfig,
768                     static_cast<ANativeWindow*>(stc.get()), NULL);
769             ASSERT_EQ(EGL_SUCCESS, eglGetError());
770             ASSERT_NE(EGL_NO_SURFACE, mEglSurfaces[i]);
771         }
772     }
773
774     virtual void TearDown() {
775         eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
776                 EGL_NO_CONTEXT);
777
778         for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
779             if (mEglSurfaces[i] != EGL_NO_SURFACE) {
780                 eglDestroySurface(mEglDisplay, mEglSurfaces[i]);
781             }
782         }
783
784         if (mEglContext != EGL_NO_CONTEXT) {
785             eglDestroyContext(mEglDisplay, mEglContext);
786         }
787
788         if (mEglDisplay != EGL_NO_DISPLAY) {
789             eglTerminate(mEglDisplay);
790         }
791     }
792
793     EGLDisplay mEglDisplay;
794     EGLSurface mEglSurfaces[NUM_SURFACE_TEXTURES];
795     EGLContext mEglContext;
796 };
797
798 // XXX: This test is disabled because it causes a hang on some devices.  See bug
799 // 5015672.
800 TEST_F(MultiSurfaceTextureClientTest, DISABLED_MakeCurrentBetweenSurfacesWorks) {
801     for (int iter = 0; iter < 8; iter++) {
802         for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
803             eglMakeCurrent(mEglDisplay, mEglSurfaces[i], mEglSurfaces[i],
804                     mEglContext);
805             glClear(GL_COLOR_BUFFER_BIT);
806             eglSwapBuffers(mEglDisplay, mEglSurfaces[i]);
807         }
808     }
809 }
810
811 } // namespace android