blob: c7458a3755c9b9a6a5b5068fb5c0bcba1c940a45 [file] [log] [blame]
Jamie Gennis134f0422011-03-08 12:18:54 -08001/*
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
Jamie Gennisfa5b40e2012-03-15 14:01:24 -070017#define LOG_TAG "SurfaceTextureClient_test"
18//#define LOG_NDEBUG 0
19
Jamie Gennis5c0c93a2011-03-14 15:34:04 -070020#include <EGL/egl.h>
Mathias Agopianc6bae002013-08-14 16:26:43 -070021#include <GLES2/gl2.h>
22
Jamie Gennis134f0422011-03-08 12:18:54 -080023#include <gtest/gtest.h>
Mathias Agopianc6bae002013-08-14 16:26:43 -070024#include <gui/GLConsumer.h>
Mathias Agopiane3c697f2013-02-14 17:11:02 -080025#include <gui/Surface.h>
Mathias Agopiana9347642017-02-13 16:42:28 -080026#include <gui/BufferQueue.h>
Jamie Gennisd72f2332012-05-07 13:50:11 -070027#include <system/graphics.h>
Jamie Gennisfa5b40e2012-03-15 14:01:24 -070028#include <utils/Log.h>
29#include <utils/Thread.h>
Jamie Gennis134f0422011-03-08 12:18:54 -080030
31namespace android {
32
33class SurfaceTextureClientTest : public ::testing::Test {
34protected:
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070035 SurfaceTextureClientTest():
36 mEglDisplay(EGL_NO_DISPLAY),
37 mEglSurface(EGL_NO_SURFACE),
Pablo Ceballos53390e12015-08-04 11:25:59 -070038 mEglContext(EGL_NO_CONTEXT),
Yi Konga03e0442018-07-17 11:16:57 -070039 mEglConfig(nullptr) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070040 }
41
Jamie Gennis134f0422011-03-08 12:18:54 -080042 virtual void SetUp() {
Jamie Gennisfa5b40e2012-03-15 14:01:24 -070043 const ::testing::TestInfo* const testInfo =
44 ::testing::UnitTest::GetInstance()->current_test_info();
45 ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
46 testInfo->name());
47
Dan Stoza5603a2f2014-04-07 13:41:37 -070048 sp<IGraphicBufferProducer> producer;
49 sp<IGraphicBufferConsumer> consumer;
50 BufferQueue::createBufferQueue(&producer, &consumer);
Dan Stozae49ba8e2014-06-24 13:09:19 -070051 mST = new GLConsumer(consumer, 123, GLConsumer::TEXTURE_EXTERNAL, true,
52 false);
Dan Stoza5603a2f2014-04-07 13:41:37 -070053 mSTC = new Surface(producer);
Jamie Gennis8b69def2011-04-06 15:43:16 -070054 mANW = mSTC;
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070055
56 // We need a valid GL context so we can test updateTexImage()
Peiyong Lind8460c82020-07-28 16:04:22 -070057 // This initializes EGL and create a GL context placeholder with a
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070058 // pbuffer render target.
59 mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
60 ASSERT_EQ(EGL_SUCCESS, eglGetError());
61 ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
62
63 EGLint majorVersion, minorVersion;
64 EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
65 ASSERT_EQ(EGL_SUCCESS, eglGetError());
66
67 EGLConfig myConfig;
68 EGLint numConfigs = 0;
69 EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
70 &myConfig, 1, &numConfigs));
71 ASSERT_EQ(EGL_SUCCESS, eglGetError());
72
Mathias Agopian993e14f2013-02-22 19:34:49 -080073 mEglConfig = myConfig;
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070074 EGLint pbufferAttribs[] = {
75 EGL_WIDTH, 16,
76 EGL_HEIGHT, 16,
77 EGL_NONE };
78 mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
79 ASSERT_EQ(EGL_SUCCESS, eglGetError());
80 ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
81
Yi Konga03e0442018-07-17 11:16:57 -070082 mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, nullptr);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070083 ASSERT_EQ(EGL_SUCCESS, eglGetError());
84 ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
85
86 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
87 ASSERT_EQ(EGL_SUCCESS, eglGetError());
Jamie Gennis134f0422011-03-08 12:18:54 -080088 }
89
90 virtual void TearDown() {
91 mST.clear();
92 mSTC.clear();
Jamie Gennis8b69def2011-04-06 15:43:16 -070093 mANW.clear();
94
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070095 eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
96 eglDestroyContext(mEglDisplay, mEglContext);
97 eglDestroySurface(mEglDisplay, mEglSurface);
98 eglTerminate(mEglDisplay);
Jamie Gennisfa5b40e2012-03-15 14:01:24 -070099
100 const ::testing::TestInfo* const testInfo =
101 ::testing::UnitTest::GetInstance()->current_test_info();
102 ALOGV("End test: %s.%s", testInfo->test_case_name(),
103 testInfo->name());
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700104 }
105
106 virtual EGLint const* getConfigAttribs() {
107 static EGLint sDefaultConfigAttribs[] = {
Mathias Agopian993e14f2013-02-22 19:34:49 -0800108 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT,
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700109 EGL_NONE
110 };
111
112 return sDefaultConfigAttribs;
Jamie Gennis134f0422011-03-08 12:18:54 -0800113 }
114
Andy McFadden2adaf042012-12-18 09:49:45 -0800115 sp<GLConsumer> mST;
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800116 sp<Surface> mSTC;
Jamie Gennis8b69def2011-04-06 15:43:16 -0700117 sp<ANativeWindow> mANW;
118
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700119 EGLDisplay mEglDisplay;
120 EGLSurface mEglSurface;
121 EGLContext mEglContext;
Mathias Agopian993e14f2013-02-22 19:34:49 -0800122 EGLConfig mEglConfig;
Jamie Gennis134f0422011-03-08 12:18:54 -0800123};
124
Jamie Gennisbae774e2011-03-14 15:08:53 -0700125TEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
Mathias Agopiancf0b8c82013-02-19 18:24:40 -0800126 sp<IGraphicBufferProducer> ist(mSTC->getIGraphicBufferProducer());
Yi Konga03e0442018-07-17 11:16:57 -0700127 ASSERT_TRUE(ist != nullptr);
Jamie Gennisbae774e2011-03-14 15:08:53 -0700128}
129
Jamie Gennis134f0422011-03-08 12:18:54 -0800130TEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
Jamie Gennis134f0422011-03-08 12:18:54 -0800131 int result = -123;
Jamie Gennis8b69def2011-04-06 15:43:16 -0700132 int err = mANW->query(mANW.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
Jamie Gennis134f0422011-03-08 12:18:54 -0800133 &result);
134 EXPECT_EQ(NO_ERROR, err);
135 EXPECT_EQ(0, result);
136}
137
Jamie Gennis391bbe22011-03-14 15:00:06 -0700138TEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
Jamie Gennis391bbe22011-03-14 15:00:06 -0700139 int result = -123;
Jamie Gennis8b69def2011-04-06 15:43:16 -0700140 int err = mANW->query(mANW.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
Jamie Gennis391bbe22011-03-14 15:00:06 -0700141 EXPECT_EQ(NO_ERROR, err);
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800142 EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
Jamie Gennis391bbe22011-03-14 15:00:06 -0700143}
144
Jamie Gennis1b528fb2011-04-25 16:41:11 -0700145TEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700146 EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
147 ASSERT_EQ(EGL_SUCCESS, eglGetError());
148 ASSERT_NE(EGL_NO_DISPLAY, dpy);
149
150 EGLint majorVersion;
151 EGLint minorVersion;
152 EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion));
153 ASSERT_EQ(EGL_SUCCESS, eglGetError());
154
Yi Konga03e0442018-07-17 11:16:57 -0700155 EGLConfig myConfig = {nullptr};
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700156 EGLint numConfigs = 0;
157 EGLint configAttribs[] = {
158 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
159 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
160 EGL_RED_SIZE, 8,
161 EGL_GREEN_SIZE, 8,
162 EGL_BLUE_SIZE, 8,
163 EGL_ALPHA_SIZE, 8,
164 EGL_DEPTH_SIZE, 16,
165 EGL_STENCIL_SIZE, 8,
166 EGL_NONE };
167 EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1,
168 &numConfigs));
169 ASSERT_EQ(EGL_SUCCESS, eglGetError());
170
Jamie Gennis8b69def2011-04-06 15:43:16 -0700171 EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, mANW.get(),
Yi Konga03e0442018-07-17 11:16:57 -0700172 nullptr);
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700173 EXPECT_NE(EGL_NO_SURFACE, eglSurface);
174 EXPECT_EQ(EGL_SUCCESS, eglGetError());
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700175
Jamie Gennisfa5b40e2012-03-15 14:01:24 -0700176 if (eglSurface != EGL_NO_SURFACE) {
177 eglDestroySurface(dpy, eglSurface);
178 }
179
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700180 eglTerminate(dpy);
181}
182
Mathias Agopian993e14f2013-02-22 19:34:49 -0800183TEST_F(SurfaceTextureClientTest, EglSwapBuffersAbandonErrorIsEglBadSurface) {
184
Yi Konga03e0442018-07-17 11:16:57 -0700185 EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig, mANW.get(), nullptr);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800186 EXPECT_NE(EGL_NO_SURFACE, eglSurface);
187 EXPECT_EQ(EGL_SUCCESS, eglGetError());
188
189 EGLBoolean success = eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);
Jamie Gennisad669b02013-04-05 16:41:27 -0700190 EXPECT_TRUE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800191
192 glClear(GL_COLOR_BUFFER_BIT);
193 success = eglSwapBuffers(mEglDisplay, eglSurface);
Jamie Gennisad669b02013-04-05 16:41:27 -0700194 EXPECT_TRUE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800195
196 mST->abandon();
197
198 glClear(GL_COLOR_BUFFER_BIT);
199 success = eglSwapBuffers(mEglDisplay, eglSurface);
Jamie Gennisad669b02013-04-05 16:41:27 -0700200 EXPECT_FALSE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800201 EXPECT_EQ(EGL_BAD_SURFACE, eglGetError());
202
203 success = eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
Jamie Gennisad669b02013-04-05 16:41:27 -0700204 ASSERT_TRUE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800205
206 if (eglSurface != EGL_NO_SURFACE) {
207 eglDestroySurface(mEglDisplay, eglSurface);
208 }
209}
210
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700211TEST_F(SurfaceTextureClientTest, BufferGeometryInvalidSizesFail) {
Dan Stozaf8cebe52015-04-20 12:09:38 -0700212 EXPECT_GT(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 8));
213 EXPECT_GT(OK, native_window_set_buffers_dimensions(mANW.get(), 8, 0));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700214}
215
216TEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700217 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700218 ANativeWindowBuffer* buf;
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700219 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700220 EXPECT_EQ(1, buf->width);
221 EXPECT_EQ(1, buf->height);
222 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700223 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700224}
225
226TEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700227 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700228 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700229 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
230 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700231 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700232 EXPECT_EQ(16, buf->width);
233 EXPECT_EQ(8, buf->height);
234 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700235 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700236}
237
238TEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700239 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700240 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700241 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
242 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700243 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700244 EXPECT_EQ(1, buf->width);
245 EXPECT_EQ(1, buf->height);
246 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700247 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700248}
249
250TEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700251 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700252 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700253 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
254 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700255 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700256 EXPECT_EQ(16, buf->width);
257 EXPECT_EQ(8, buf->height);
258 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700259 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700260}
261
262TEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700263 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700264 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700265 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
266 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700267 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700268 EXPECT_EQ(16, buf->width);
269 EXPECT_EQ(8, buf->height);
270 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700271 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Dan Stozaf8cebe52015-04-20 12:09:38 -0700272 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
273 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700274 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700275 EXPECT_EQ(1, buf->width);
276 EXPECT_EQ(1, buf->height);
277 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700278 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700279}
280
281TEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700282 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700283 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700284 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
285 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700286 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700287 EXPECT_EQ(1, buf->width);
288 EXPECT_EQ(1, buf->height);
289 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700290 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Jamie Gennis46975282012-08-30 18:35:50 -0700291 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700292 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700293 EXPECT_EQ(16, buf->width);
294 EXPECT_EQ(8, buf->height);
295 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700296 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700297}
298
299TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700300 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Andy McFadden2adaf042012-12-18 09:49:45 -0800301 sp<GLConsumer> st(mST);
Iliyan Malchev697526b2011-05-01 11:33:26 -0700302 ANativeWindowBuffer* buf;
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700303 EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700304 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700305 EXPECT_EQ(16, buf->width);
306 EXPECT_EQ(8, buf->height);
307 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700308 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700309}
310
311TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
Iliyan Malchev697526b2011-05-01 11:33:26 -0700312 ANativeWindowBuffer* buf[2];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700313 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700314 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700315 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
316 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700317 EXPECT_NE(buf[0], buf[1]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700318 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
319 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700320 EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700321 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
322 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700323 EXPECT_NE(buf[0], buf[1]);
324 EXPECT_EQ(16, buf[0]->width);
325 EXPECT_EQ(16, buf[1]->width);
326 EXPECT_EQ(8, buf[0]->height);
327 EXPECT_EQ(8, buf[1]->height);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700328 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
329 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700330}
331
332TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
Iliyan Malchev697526b2011-05-01 11:33:26 -0700333 ANativeWindowBuffer* buf[2];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700334 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700335 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
336 EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700337 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
338 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700339 EXPECT_NE(buf[0], buf[1]);
340 EXPECT_EQ(16, buf[0]->width);
341 EXPECT_EQ(16, buf[1]->width);
342 EXPECT_EQ(8, buf[0]->height);
343 EXPECT_EQ(8, buf[1]->height);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700344 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
345 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Dan Stozaf8cebe52015-04-20 12:09:38 -0700346 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 12, 24));
347 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700348 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
349 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700350 EXPECT_NE(buf[0], buf[1]);
351 EXPECT_EQ(12, buf[0]->width);
352 EXPECT_EQ(12, buf[1]->width);
353 EXPECT_EQ(24, buf[0]->height);
354 EXPECT_EQ(24, buf[1]->height);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700355 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
356 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700357}
358
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700359TEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700360 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700361 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Mathias Agopian595264f2013-07-16 22:56:09 -0700362 ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 0));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700363 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700364
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700365 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
366 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700367 EXPECT_EQ(OK, mST->updateTexImage());
368 EXPECT_EQ(OK, mST->updateTexImage());
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700369
Mathias Agopian595264f2013-07-16 22:56:09 -0700370 ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700371 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700372
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700373 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
374 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
375 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
376 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700377
Jamie Gennis8b69def2011-04-06 15:43:16 -0700378 EXPECT_EQ(OK, mST->updateTexImage());
379 EXPECT_EQ(OK, mST->updateTexImage());
380 EXPECT_EQ(OK, mST->updateTexImage());
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700381}
382
383TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700384 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700385 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700386 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700387 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
388 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
389 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700390 EXPECT_NE(buf[0], buf[1]);
391 EXPECT_NE(buf[1], buf[2]);
392 EXPECT_NE(buf[2], buf[0]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700393 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
394 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
395 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700396 EXPECT_EQ(OK, mST->updateTexImage());
397 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
398 EXPECT_EQ(OK, mST->updateTexImage());
399 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
400 EXPECT_EQ(OK, mST->updateTexImage());
401 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700402}
403
404TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700405 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700406 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700407 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700408 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
409 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
410 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700411 EXPECT_NE(buf[0], buf[1]);
412 EXPECT_NE(buf[1], buf[2]);
413 EXPECT_NE(buf[2], buf[0]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700414 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700415 EXPECT_EQ(OK, mST->updateTexImage());
416 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700417 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700418 EXPECT_EQ(OK, mST->updateTexImage());
419 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700420 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700421 EXPECT_EQ(OK, mST->updateTexImage());
422 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700423}
424
425TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700426 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700427 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700428 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700429 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
430 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700431 EXPECT_EQ(OK, mST->updateTexImage());
432 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700433
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700434 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700435 EXPECT_NE(buf[0], buf[1]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700436 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700437 EXPECT_EQ(OK, mST->updateTexImage());
438 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700439
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700440 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700441 EXPECT_NE(buf[1], buf[2]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700442 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700443 EXPECT_EQ(OK, mST->updateTexImage());
444 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700445}
446
Jamie Gennis8cd5ba42011-05-19 13:33:00 -0700447// XXX: We currently have no hardware that properly handles dequeuing the
448// buffer that is currently bound to the texture.
449TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700450 android_native_buffer_t* buf[3];
451 android_native_buffer_t* firstBuf;
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700452 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700453 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700454 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &firstBuf));
455 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), firstBuf, -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700456 EXPECT_EQ(OK, mST->updateTexImage());
457 EXPECT_EQ(mST->getCurrentBuffer().get(), firstBuf);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700458 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
459 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
460 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
461 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
462 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
463 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700464 EXPECT_NE(buf[0], buf[1]);
465 EXPECT_NE(buf[1], buf[2]);
466 EXPECT_NE(buf[2], buf[0]);
467 EXPECT_EQ(firstBuf, buf[2]);
468}
469
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700470TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700471 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700472 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700473 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Jamie Gennisc2c8dfd2011-05-23 18:44:04 -0700474
Jamie Gennis8b69def2011-04-06 15:43:16 -0700475 // We should be able to dequeue all the buffers before we've queued mANWy.
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700476 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
477 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
478 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700479
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700480 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
481 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700482
Jamie Gennis8b69def2011-04-06 15:43:16 -0700483 EXPECT_EQ(OK, mST->updateTexImage());
484 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700485
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700486 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700487
Jamie Gennisc2c8dfd2011-05-23 18:44:04 -0700488 // Once we've queued a buffer, however we should not be able to dequeue more
489 // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
Dan Stozaf8cebe52015-04-20 12:09:38 -0700490 EXPECT_EQ(INVALID_OPERATION,
491 native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Jamie Gennisc2c8dfd2011-05-23 18:44:04 -0700492
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700493 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
494 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700495}
496
Jamie Gennisd72f2332012-05-07 13:50:11 -0700497TEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700498 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennisd72f2332012-05-07 13:50:11 -0700499 android_native_rect_t rect = {-2, -13, 40, 18};
500 native_window_set_crop(mANW.get(), &rect);
501
502 ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 4, 4));
503
504 android_native_buffer_t* buf;
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700505 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
506 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf, -1));
Jamie Gennisd72f2332012-05-07 13:50:11 -0700507 ASSERT_EQ(OK, mST->updateTexImage());
508
509 Rect crop = mST->getCurrentCrop();
510 EXPECT_EQ(0, crop.left);
511 EXPECT_EQ(0, crop.top);
512 EXPECT_EQ(4, crop.right);
513 EXPECT_EQ(4, crop.bottom);
514}
515
Jamie Gennis8dda6b72011-05-24 18:39:46 -0700516// XXX: This is not expected to pass until the synchronization hacks are removed
517// from the SurfaceTexture class.
518TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700519 class MyThread : public Thread {
Andy McFadden2adaf042012-12-18 09:49:45 -0800520 sp<GLConsumer> mST;
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700521 EGLContext ctx;
522 EGLSurface sur;
523 EGLDisplay dpy;
524 bool mBufferRetired;
525 Mutex mLock;
526 virtual bool threadLoop() {
527 eglMakeCurrent(dpy, sur, sur, ctx);
528 usleep(20000);
529 Mutex::Autolock _l(mLock);
Jamie Gennis8b69def2011-04-06 15:43:16 -0700530 mST->updateTexImage();
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700531 mBufferRetired = true;
532 eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
533 return false;
534 }
535 public:
Chih-Hung Hsiehd9cdadb2016-05-03 14:00:39 -0700536 explicit MyThread(const sp<GLConsumer>& mST)
Jamie Gennis8b69def2011-04-06 15:43:16 -0700537 : mST(mST), mBufferRetired(false) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700538 ctx = eglGetCurrentContext();
539 sur = eglGetCurrentSurface(EGL_DRAW);
540 dpy = eglGetCurrentDisplay();
541 eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
542 }
543 ~MyThread() {
544 eglMakeCurrent(dpy, sur, sur, ctx);
545 }
546 void bufferDequeued() {
547 Mutex::Autolock _l(mLock);
548 EXPECT_EQ(true, mBufferRetired);
549 }
550 };
551
552 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700553 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700554 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700555 // dequeue/queue/update so we have a current buffer
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700556 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
557 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700558 mST->updateTexImage();
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700559
Jamie Gennis8b69def2011-04-06 15:43:16 -0700560 MyThread* thread = new MyThread(mST);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700561 sp<Thread> threadBase(thread);
562
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700563 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
564 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Brian Carlstrom83b1e682016-03-12 16:07:59 -0800565 thread->run("MyThread");
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700566 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
567 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
568 //ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
569 //ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700570 thread->bufferDequeued();
571 thread->requestExitAndWait();
572}
573
Jamie Gennis52226042011-06-07 15:23:23 -0700574TEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
Jamie Gennis52226042011-06-07 15:23:23 -0700575 android_native_buffer_t* buf[3];
576 float mtx[16] = {};
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700577 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700578 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700579 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
580 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700581 ASSERT_EQ(OK, mST->updateTexImage());
582 mST->getTransformMatrix(mtx);
Jamie Gennis52226042011-06-07 15:23:23 -0700583
584 EXPECT_EQ(1.f, mtx[0]);
585 EXPECT_EQ(0.f, mtx[1]);
586 EXPECT_EQ(0.f, mtx[2]);
587 EXPECT_EQ(0.f, mtx[3]);
588
589 EXPECT_EQ(0.f, mtx[4]);
590 EXPECT_EQ(-1.f, mtx[5]);
591 EXPECT_EQ(0.f, mtx[6]);
592 EXPECT_EQ(0.f, mtx[7]);
593
594 EXPECT_EQ(0.f, mtx[8]);
595 EXPECT_EQ(0.f, mtx[9]);
596 EXPECT_EQ(1.f, mtx[10]);
597 EXPECT_EQ(0.f, mtx[11]);
598
599 EXPECT_EQ(0.f, mtx[12]);
600 EXPECT_EQ(1.f, mtx[13]);
601 EXPECT_EQ(0.f, mtx[14]);
602 EXPECT_EQ(1.f, mtx[15]);
Jamie Gennis134f0422011-03-08 12:18:54 -0800603}
Jamie Gennis52226042011-06-07 15:23:23 -0700604
605TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
Jamie Gennis52226042011-06-07 15:23:23 -0700606 android_native_buffer_t* buf[3];
607 float mtx[16] = {};
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700608 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700609 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700610 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
611 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700612 ASSERT_EQ(OK, mST->updateTexImage());
613 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
614 mST->getTransformMatrix(mtx);
Jamie Gennis52226042011-06-07 15:23:23 -0700615
616 EXPECT_EQ(1.f, mtx[0]);
617 EXPECT_EQ(0.f, mtx[1]);
618 EXPECT_EQ(0.f, mtx[2]);
619 EXPECT_EQ(0.f, mtx[3]);
620
621 EXPECT_EQ(0.f, mtx[4]);
622 EXPECT_EQ(-1.f, mtx[5]);
623 EXPECT_EQ(0.f, mtx[6]);
624 EXPECT_EQ(0.f, mtx[7]);
625
626 EXPECT_EQ(0.f, mtx[8]);
627 EXPECT_EQ(0.f, mtx[9]);
628 EXPECT_EQ(1.f, mtx[10]);
629 EXPECT_EQ(0.f, mtx[11]);
630
631 EXPECT_EQ(0.f, mtx[12]);
632 EXPECT_EQ(1.f, mtx[13]);
633 EXPECT_EQ(0.f, mtx[14]);
634 EXPECT_EQ(1.f, mtx[15]);
635}
636
637TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
Jamie Gennis52226042011-06-07 15:23:23 -0700638 android_native_buffer_t* buf[3];
639 float mtx[16] = {};
640 android_native_rect_t crop;
641 crop.left = 0;
642 crop.top = 0;
643 crop.right = 5;
644 crop.bottom = 5;
645
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700646 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700647 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Dan Stozaf8cebe52015-04-20 12:09:38 -0700648 ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 8, 8));
649 ASSERT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700650 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700651 ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &crop));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700652 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700653 ASSERT_EQ(OK, mST->updateTexImage());
654 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
655 mST->getTransformMatrix(mtx);
Jamie Gennis52226042011-06-07 15:23:23 -0700656
Krzysztof Kosiński7108c312018-06-27 19:12:54 -0700657 // This accounts for the .5 texel shrink for each edge that's included in
658 // the transform matrix to avoid texturing outside the crop region.
659 EXPECT_EQ(0.5f, mtx[0]);
Jamie Gennis52226042011-06-07 15:23:23 -0700660 EXPECT_EQ(0.f, mtx[1]);
661 EXPECT_EQ(0.f, mtx[2]);
662 EXPECT_EQ(0.f, mtx[3]);
663
664 EXPECT_EQ(0.f, mtx[4]);
Krzysztof Kosiński7108c312018-06-27 19:12:54 -0700665 EXPECT_EQ(-0.5f, mtx[5]);
Jamie Gennis52226042011-06-07 15:23:23 -0700666 EXPECT_EQ(0.f, mtx[6]);
667 EXPECT_EQ(0.f, mtx[7]);
668
669 EXPECT_EQ(0.f, mtx[8]);
670 EXPECT_EQ(0.f, mtx[9]);
671 EXPECT_EQ(1.f, mtx[10]);
672 EXPECT_EQ(0.f, mtx[11]);
673
Krzysztof Kosiński7108c312018-06-27 19:12:54 -0700674 EXPECT_EQ(0.0625f, mtx[12]);
675 EXPECT_EQ(0.5625f, mtx[13]);
Jamie Gennis52226042011-06-07 15:23:23 -0700676 EXPECT_EQ(0.f, mtx[14]);
677 EXPECT_EQ(1.f, mtx[15]);
678}
679
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700680// This test verifies that the buffer format can be queried immediately after
681// it is set.
Jamie Gennis07ed1a92011-06-14 17:04:29 -0700682TEST_F(SurfaceTextureClientTest, QueryFormatAfterSettingWorks) {
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700683 sp<ANativeWindow> anw(mSTC);
684 int fmts[] = {
685 // RGBA_8888 should not come first, as it's the default
686 HAL_PIXEL_FORMAT_RGBX_8888,
687 HAL_PIXEL_FORMAT_RGBA_8888,
688 HAL_PIXEL_FORMAT_RGB_888,
689 HAL_PIXEL_FORMAT_RGB_565,
690 HAL_PIXEL_FORMAT_BGRA_8888,
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700691 HAL_PIXEL_FORMAT_YV12,
692 };
693
694 const int numFmts = (sizeof(fmts) / sizeof(fmts[0]));
695 for (int i = 0; i < numFmts; i++) {
696 int fmt = -1;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700697 ASSERT_EQ(OK, native_window_set_buffers_dimensions(anw.get(), 0, 0));
698 ASSERT_EQ(OK, native_window_set_buffers_format(anw.get(), fmts[i]));
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700699 ASSERT_EQ(OK, anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &fmt));
700 EXPECT_EQ(fmts[i], fmt);
701 }
702}
703
Jamie Gennisc8251a02011-07-11 19:00:51 -0700704class MultiSurfaceTextureClientTest : public ::testing::Test {
705
706public:
707 MultiSurfaceTextureClientTest() :
708 mEglDisplay(EGL_NO_DISPLAY),
709 mEglContext(EGL_NO_CONTEXT) {
710 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
711 mEglSurfaces[i] = EGL_NO_CONTEXT;
712 }
713 }
714
715protected:
716
717 enum { NUM_SURFACE_TEXTURES = 32 };
718
719 virtual void SetUp() {
720 mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
721 ASSERT_EQ(EGL_SUCCESS, eglGetError());
722 ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
723
724 EGLint majorVersion, minorVersion;
725 EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
726 ASSERT_EQ(EGL_SUCCESS, eglGetError());
727
728 EGLConfig myConfig;
729 EGLint numConfigs = 0;
730 EGLint configAttribs[] = {
731 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
732 EGL_NONE
733 };
734 EXPECT_TRUE(eglChooseConfig(mEglDisplay, configAttribs, &myConfig, 1,
735 &numConfigs));
736 ASSERT_EQ(EGL_SUCCESS, eglGetError());
737
738 mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT,
Yi Konga03e0442018-07-17 11:16:57 -0700739 nullptr);
Jamie Gennisc8251a02011-07-11 19:00:51 -0700740 ASSERT_EQ(EGL_SUCCESS, eglGetError());
741 ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
742
743 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
Dan Stoza5603a2f2014-04-07 13:41:37 -0700744 sp<IGraphicBufferProducer> producer;
745 sp<IGraphicBufferConsumer> consumer;
746 BufferQueue::createBufferQueue(&producer, &consumer);
Dan Stozae49ba8e2014-06-24 13:09:19 -0700747 sp<GLConsumer> st(new GLConsumer(consumer, i,
748 GLConsumer::TEXTURE_EXTERNAL, true, false));
Dan Stoza5603a2f2014-04-07 13:41:37 -0700749 sp<Surface> stc(new Surface(producer));
Jamie Gennisc8251a02011-07-11 19:00:51 -0700750 mEglSurfaces[i] = eglCreateWindowSurface(mEglDisplay, myConfig,
Yi Konga03e0442018-07-17 11:16:57 -0700751 static_cast<ANativeWindow*>(stc.get()), nullptr);
Jamie Gennisc8251a02011-07-11 19:00:51 -0700752 ASSERT_EQ(EGL_SUCCESS, eglGetError());
753 ASSERT_NE(EGL_NO_SURFACE, mEglSurfaces[i]);
754 }
755 }
756
757 virtual void TearDown() {
758 eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
759 EGL_NO_CONTEXT);
760
761 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
762 if (mEglSurfaces[i] != EGL_NO_SURFACE) {
763 eglDestroySurface(mEglDisplay, mEglSurfaces[i]);
764 }
765 }
766
767 if (mEglContext != EGL_NO_CONTEXT) {
768 eglDestroyContext(mEglDisplay, mEglContext);
769 }
770
771 if (mEglDisplay != EGL_NO_DISPLAY) {
772 eglTerminate(mEglDisplay);
773 }
774 }
775
776 EGLDisplay mEglDisplay;
777 EGLSurface mEglSurfaces[NUM_SURFACE_TEXTURES];
778 EGLContext mEglContext;
779};
780
781// XXX: This test is disabled because it causes a hang on some devices. See bug
782// 5015672.
783TEST_F(MultiSurfaceTextureClientTest, DISABLED_MakeCurrentBetweenSurfacesWorks) {
784 for (int iter = 0; iter < 8; iter++) {
785 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
786 eglMakeCurrent(mEglDisplay, mEglSurfaces[i], mEglSurfaces[i],
787 mEglContext);
788 glClear(GL_COLOR_BUFFER_BIT);
789 eglSwapBuffers(mEglDisplay, mEglSurfaces[i]);
790 }
791 }
792}
793
Jamie Gennis52226042011-06-07 15:23:23 -0700794} // namespace android