blob: b28dca8ab418aaacd0e96a783c7a8389aadb43f2 [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() {
Dan Stoza5603a2f2014-04-07 13:41:37 -070043 sp<IGraphicBufferProducer> producer;
44 sp<IGraphicBufferConsumer> consumer;
45 BufferQueue::createBufferQueue(&producer, &consumer);
Dan Stozae49ba8e2014-06-24 13:09:19 -070046 mST = new GLConsumer(consumer, 123, GLConsumer::TEXTURE_EXTERNAL, true,
47 false);
Dan Stoza5603a2f2014-04-07 13:41:37 -070048 mSTC = new Surface(producer);
Jamie Gennis8b69def2011-04-06 15:43:16 -070049 mANW = mSTC;
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070050
51 // We need a valid GL context so we can test updateTexImage()
Peiyong Lind8460c82020-07-28 16:04:22 -070052 // This initializes EGL and create a GL context placeholder with a
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070053 // pbuffer render target.
54 mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
55 ASSERT_EQ(EGL_SUCCESS, eglGetError());
56 ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
57
58 EGLint majorVersion, minorVersion;
59 EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
60 ASSERT_EQ(EGL_SUCCESS, eglGetError());
61
62 EGLConfig myConfig;
63 EGLint numConfigs = 0;
64 EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
65 &myConfig, 1, &numConfigs));
66 ASSERT_EQ(EGL_SUCCESS, eglGetError());
67
Mathias Agopian993e14f2013-02-22 19:34:49 -080068 mEglConfig = myConfig;
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070069 EGLint pbufferAttribs[] = {
70 EGL_WIDTH, 16,
71 EGL_HEIGHT, 16,
72 EGL_NONE };
73 mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
74 ASSERT_EQ(EGL_SUCCESS, eglGetError());
75 ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
76
Yi Konga03e0442018-07-17 11:16:57 -070077 mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, nullptr);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070078 ASSERT_EQ(EGL_SUCCESS, eglGetError());
79 ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
80
81 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
82 ASSERT_EQ(EGL_SUCCESS, eglGetError());
Jamie Gennis134f0422011-03-08 12:18:54 -080083 }
84
85 virtual void TearDown() {
86 mST.clear();
87 mSTC.clear();
Jamie Gennis8b69def2011-04-06 15:43:16 -070088 mANW.clear();
89
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070090 eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
91 eglDestroyContext(mEglDisplay, mEglContext);
92 eglDestroySurface(mEglDisplay, mEglSurface);
93 eglTerminate(mEglDisplay);
94 }
95
96 virtual EGLint const* getConfigAttribs() {
97 static EGLint sDefaultConfigAttribs[] = {
Mathias Agopian993e14f2013-02-22 19:34:49 -080098 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT,
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070099 EGL_NONE
100 };
101
102 return sDefaultConfigAttribs;
Jamie Gennis134f0422011-03-08 12:18:54 -0800103 }
104
Andy McFadden2adaf042012-12-18 09:49:45 -0800105 sp<GLConsumer> mST;
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800106 sp<Surface> mSTC;
Jamie Gennis8b69def2011-04-06 15:43:16 -0700107 sp<ANativeWindow> mANW;
108
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700109 EGLDisplay mEglDisplay;
110 EGLSurface mEglSurface;
111 EGLContext mEglContext;
Mathias Agopian993e14f2013-02-22 19:34:49 -0800112 EGLConfig mEglConfig;
Jamie Gennis134f0422011-03-08 12:18:54 -0800113};
114
Jamie Gennisbae774e2011-03-14 15:08:53 -0700115TEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
Mathias Agopiancf0b8c82013-02-19 18:24:40 -0800116 sp<IGraphicBufferProducer> ist(mSTC->getIGraphicBufferProducer());
Yi Konga03e0442018-07-17 11:16:57 -0700117 ASSERT_TRUE(ist != nullptr);
Jamie Gennisbae774e2011-03-14 15:08:53 -0700118}
119
Jamie Gennis134f0422011-03-08 12:18:54 -0800120TEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
Jamie Gennis134f0422011-03-08 12:18:54 -0800121 int result = -123;
Jamie Gennis8b69def2011-04-06 15:43:16 -0700122 int err = mANW->query(mANW.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
Jamie Gennis134f0422011-03-08 12:18:54 -0800123 &result);
124 EXPECT_EQ(NO_ERROR, err);
125 EXPECT_EQ(0, result);
126}
127
Jamie Gennis391bbe22011-03-14 15:00:06 -0700128TEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
Jamie Gennis391bbe22011-03-14 15:00:06 -0700129 int result = -123;
Jamie Gennis8b69def2011-04-06 15:43:16 -0700130 int err = mANW->query(mANW.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
Jamie Gennis391bbe22011-03-14 15:00:06 -0700131 EXPECT_EQ(NO_ERROR, err);
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800132 EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
Jamie Gennis391bbe22011-03-14 15:00:06 -0700133}
134
Jamie Gennis1b528fb2011-04-25 16:41:11 -0700135TEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700136 EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
137 ASSERT_EQ(EGL_SUCCESS, eglGetError());
138 ASSERT_NE(EGL_NO_DISPLAY, dpy);
139
140 EGLint majorVersion;
141 EGLint minorVersion;
142 EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion));
143 ASSERT_EQ(EGL_SUCCESS, eglGetError());
144
Yi Konga03e0442018-07-17 11:16:57 -0700145 EGLConfig myConfig = {nullptr};
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700146 EGLint numConfigs = 0;
147 EGLint configAttribs[] = {
148 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
149 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
150 EGL_RED_SIZE, 8,
151 EGL_GREEN_SIZE, 8,
152 EGL_BLUE_SIZE, 8,
153 EGL_ALPHA_SIZE, 8,
154 EGL_DEPTH_SIZE, 16,
155 EGL_STENCIL_SIZE, 8,
156 EGL_NONE };
157 EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1,
158 &numConfigs));
159 ASSERT_EQ(EGL_SUCCESS, eglGetError());
160
Jamie Gennis8b69def2011-04-06 15:43:16 -0700161 EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, mANW.get(),
Yi Konga03e0442018-07-17 11:16:57 -0700162 nullptr);
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700163 EXPECT_NE(EGL_NO_SURFACE, eglSurface);
164 EXPECT_EQ(EGL_SUCCESS, eglGetError());
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700165
Jamie Gennisfa5b40e2012-03-15 14:01:24 -0700166 if (eglSurface != EGL_NO_SURFACE) {
167 eglDestroySurface(dpy, eglSurface);
168 }
169
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700170 eglTerminate(dpy);
171}
172
Mathias Agopian993e14f2013-02-22 19:34:49 -0800173TEST_F(SurfaceTextureClientTest, EglSwapBuffersAbandonErrorIsEglBadSurface) {
174
Yi Konga03e0442018-07-17 11:16:57 -0700175 EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig, mANW.get(), nullptr);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800176 EXPECT_NE(EGL_NO_SURFACE, eglSurface);
177 EXPECT_EQ(EGL_SUCCESS, eglGetError());
178
179 EGLBoolean success = eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);
Jamie Gennisad669b02013-04-05 16:41:27 -0700180 EXPECT_TRUE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800181
182 glClear(GL_COLOR_BUFFER_BIT);
183 success = eglSwapBuffers(mEglDisplay, eglSurface);
Jamie Gennisad669b02013-04-05 16:41:27 -0700184 EXPECT_TRUE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800185
186 mST->abandon();
187
188 glClear(GL_COLOR_BUFFER_BIT);
189 success = eglSwapBuffers(mEglDisplay, eglSurface);
Jamie Gennisad669b02013-04-05 16:41:27 -0700190 EXPECT_FALSE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800191 EXPECT_EQ(EGL_BAD_SURFACE, eglGetError());
192
193 success = eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
Jamie Gennisad669b02013-04-05 16:41:27 -0700194 ASSERT_TRUE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800195
196 if (eglSurface != EGL_NO_SURFACE) {
197 eglDestroySurface(mEglDisplay, eglSurface);
198 }
199}
200
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700201TEST_F(SurfaceTextureClientTest, BufferGeometryInvalidSizesFail) {
Dan Stozaf8cebe52015-04-20 12:09:38 -0700202 EXPECT_GT(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 8));
203 EXPECT_GT(OK, native_window_set_buffers_dimensions(mANW.get(), 8, 0));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700204}
205
206TEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700207 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700208 ANativeWindowBuffer* buf;
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700209 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700210 EXPECT_EQ(1, buf->width);
211 EXPECT_EQ(1, buf->height);
212 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700213 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700214}
215
216TEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
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;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700219 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
220 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700221 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700222 EXPECT_EQ(16, buf->width);
223 EXPECT_EQ(8, buf->height);
224 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700225 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700226}
227
228TEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700229 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700230 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700231 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
232 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700233 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700234 EXPECT_EQ(1, buf->width);
235 EXPECT_EQ(1, buf->height);
236 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700237 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700238}
239
240TEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700241 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700242 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700243 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
244 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700245 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700246 EXPECT_EQ(16, buf->width);
247 EXPECT_EQ(8, buf->height);
248 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700249 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700250}
251
252TEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700253 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700254 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700255 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
256 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700257 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700258 EXPECT_EQ(16, buf->width);
259 EXPECT_EQ(8, buf->height);
260 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700261 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Dan Stozaf8cebe52015-04-20 12:09:38 -0700262 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
263 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700264 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700265 EXPECT_EQ(1, buf->width);
266 EXPECT_EQ(1, buf->height);
267 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700268 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700269}
270
271TEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700272 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700273 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700274 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
275 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700276 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700277 EXPECT_EQ(1, buf->width);
278 EXPECT_EQ(1, buf->height);
279 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700280 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Jamie Gennis46975282012-08-30 18:35:50 -0700281 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700282 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700283 EXPECT_EQ(16, buf->width);
284 EXPECT_EQ(8, buf->height);
285 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700286 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700287}
288
289TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700290 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Andy McFadden2adaf042012-12-18 09:49:45 -0800291 sp<GLConsumer> st(mST);
Iliyan Malchev697526b2011-05-01 11:33:26 -0700292 ANativeWindowBuffer* buf;
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700293 EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700294 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700295 EXPECT_EQ(16, buf->width);
296 EXPECT_EQ(8, buf->height);
297 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700298 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700299}
300
301TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
Iliyan Malchev697526b2011-05-01 11:33:26 -0700302 ANativeWindowBuffer* buf[2];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700303 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700304 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700305 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
306 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700307 EXPECT_NE(buf[0], buf[1]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700308 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
309 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700310 EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700311 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
312 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700313 EXPECT_NE(buf[0], buf[1]);
314 EXPECT_EQ(16, buf[0]->width);
315 EXPECT_EQ(16, buf[1]->width);
316 EXPECT_EQ(8, buf[0]->height);
317 EXPECT_EQ(8, buf[1]->height);
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));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700320}
321
322TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
Iliyan Malchev697526b2011-05-01 11:33:26 -0700323 ANativeWindowBuffer* buf[2];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700324 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700325 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
326 EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700327 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
328 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700329 EXPECT_NE(buf[0], buf[1]);
330 EXPECT_EQ(16, buf[0]->width);
331 EXPECT_EQ(16, buf[1]->width);
332 EXPECT_EQ(8, buf[0]->height);
333 EXPECT_EQ(8, buf[1]->height);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700334 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
335 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Dan Stozaf8cebe52015-04-20 12:09:38 -0700336 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 12, 24));
337 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700338 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
339 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700340 EXPECT_NE(buf[0], buf[1]);
341 EXPECT_EQ(12, buf[0]->width);
342 EXPECT_EQ(12, buf[1]->width);
343 EXPECT_EQ(24, buf[0]->height);
344 EXPECT_EQ(24, buf[1]->height);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700345 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
346 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700347}
348
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700349TEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700350 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700351 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Mathias Agopian595264f2013-07-16 22:56:09 -0700352 ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 0));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700353 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700354
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700355 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
356 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700357 EXPECT_EQ(OK, mST->updateTexImage());
358 EXPECT_EQ(OK, mST->updateTexImage());
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700359
Mathias Agopian595264f2013-07-16 22:56:09 -0700360 ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700361 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700362
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700363 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
364 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
365 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
366 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700367
Jamie Gennis8b69def2011-04-06 15:43:16 -0700368 EXPECT_EQ(OK, mST->updateTexImage());
369 EXPECT_EQ(OK, mST->updateTexImage());
370 EXPECT_EQ(OK, mST->updateTexImage());
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700371}
372
373TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700374 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700375 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700376 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700377 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
378 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
379 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700380 EXPECT_NE(buf[0], buf[1]);
381 EXPECT_NE(buf[1], buf[2]);
382 EXPECT_NE(buf[2], buf[0]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700383 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
384 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
385 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700386 EXPECT_EQ(OK, mST->updateTexImage());
387 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
388 EXPECT_EQ(OK, mST->updateTexImage());
389 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
390 EXPECT_EQ(OK, mST->updateTexImage());
391 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700392}
393
394TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700395 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700396 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700397 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700398 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
399 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
400 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700401 EXPECT_NE(buf[0], buf[1]);
402 EXPECT_NE(buf[1], buf[2]);
403 EXPECT_NE(buf[2], buf[0]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700404 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700405 EXPECT_EQ(OK, mST->updateTexImage());
406 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700407 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700408 EXPECT_EQ(OK, mST->updateTexImage());
409 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700410 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700411 EXPECT_EQ(OK, mST->updateTexImage());
412 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700413}
414
415TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700416 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700417 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700418 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700419 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
420 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700421 EXPECT_EQ(OK, mST->updateTexImage());
422 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700423
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700424 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700425 EXPECT_NE(buf[0], buf[1]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700426 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700427 EXPECT_EQ(OK, mST->updateTexImage());
428 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700429
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700430 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700431 EXPECT_NE(buf[1], buf[2]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700432 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700433 EXPECT_EQ(OK, mST->updateTexImage());
434 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700435}
436
Jamie Gennis8cd5ba42011-05-19 13:33:00 -0700437// XXX: We currently have no hardware that properly handles dequeuing the
438// buffer that is currently bound to the texture.
439TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700440 android_native_buffer_t* buf[3];
441 android_native_buffer_t* firstBuf;
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700442 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700443 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700444 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &firstBuf));
445 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), firstBuf, -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700446 EXPECT_EQ(OK, mST->updateTexImage());
447 EXPECT_EQ(mST->getCurrentBuffer().get(), firstBuf);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700448 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
449 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
450 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
451 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
452 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
453 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700454 EXPECT_NE(buf[0], buf[1]);
455 EXPECT_NE(buf[1], buf[2]);
456 EXPECT_NE(buf[2], buf[0]);
457 EXPECT_EQ(firstBuf, buf[2]);
458}
459
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700460TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700461 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700462 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700463 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Jamie Gennisc2c8dfd2011-05-23 18:44:04 -0700464
Jamie Gennis8b69def2011-04-06 15:43:16 -0700465 // We should be able to dequeue all the buffers before we've queued mANWy.
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700466 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
467 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
468 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700469
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700470 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
471 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700472
Jamie Gennis8b69def2011-04-06 15:43:16 -0700473 EXPECT_EQ(OK, mST->updateTexImage());
474 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700475
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700476 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700477
Jamie Gennisc2c8dfd2011-05-23 18:44:04 -0700478 // Once we've queued a buffer, however we should not be able to dequeue more
479 // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
Dan Stozaf8cebe52015-04-20 12:09:38 -0700480 EXPECT_EQ(INVALID_OPERATION,
481 native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Jamie Gennisc2c8dfd2011-05-23 18:44:04 -0700482
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700483 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
484 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700485}
486
Jamie Gennisd72f2332012-05-07 13:50:11 -0700487TEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700488 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennisd72f2332012-05-07 13:50:11 -0700489 android_native_rect_t rect = {-2, -13, 40, 18};
490 native_window_set_crop(mANW.get(), &rect);
491
492 ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 4, 4));
493
494 android_native_buffer_t* buf;
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700495 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
496 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf, -1));
Jamie Gennisd72f2332012-05-07 13:50:11 -0700497 ASSERT_EQ(OK, mST->updateTexImage());
498
499 Rect crop = mST->getCurrentCrop();
500 EXPECT_EQ(0, crop.left);
501 EXPECT_EQ(0, crop.top);
502 EXPECT_EQ(4, crop.right);
503 EXPECT_EQ(4, crop.bottom);
504}
505
Jamie Gennis8dda6b72011-05-24 18:39:46 -0700506// XXX: This is not expected to pass until the synchronization hacks are removed
507// from the SurfaceTexture class.
508TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700509 class MyThread : public Thread {
Andy McFadden2adaf042012-12-18 09:49:45 -0800510 sp<GLConsumer> mST;
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700511 EGLContext ctx;
512 EGLSurface sur;
513 EGLDisplay dpy;
514 bool mBufferRetired;
515 Mutex mLock;
516 virtual bool threadLoop() {
517 eglMakeCurrent(dpy, sur, sur, ctx);
518 usleep(20000);
519 Mutex::Autolock _l(mLock);
Jamie Gennis8b69def2011-04-06 15:43:16 -0700520 mST->updateTexImage();
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700521 mBufferRetired = true;
522 eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
523 return false;
524 }
525 public:
Chih-Hung Hsiehd9cdadb2016-05-03 14:00:39 -0700526 explicit MyThread(const sp<GLConsumer>& mST)
Jamie Gennis8b69def2011-04-06 15:43:16 -0700527 : mST(mST), mBufferRetired(false) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700528 ctx = eglGetCurrentContext();
529 sur = eglGetCurrentSurface(EGL_DRAW);
530 dpy = eglGetCurrentDisplay();
531 eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
532 }
533 ~MyThread() {
534 eglMakeCurrent(dpy, sur, sur, ctx);
535 }
536 void bufferDequeued() {
537 Mutex::Autolock _l(mLock);
538 EXPECT_EQ(true, mBufferRetired);
539 }
540 };
541
542 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700543 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700544 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700545 // dequeue/queue/update so we have a current buffer
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700546 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
547 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700548 mST->updateTexImage();
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700549
Jamie Gennis8b69def2011-04-06 15:43:16 -0700550 MyThread* thread = new MyThread(mST);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700551 sp<Thread> threadBase(thread);
552
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700553 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
554 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Brian Carlstrom83b1e682016-03-12 16:07:59 -0800555 thread->run("MyThread");
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700556 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
557 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
558 //ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
559 //ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700560 thread->bufferDequeued();
561 thread->requestExitAndWait();
562}
563
Jamie Gennis52226042011-06-07 15:23:23 -0700564TEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
Jamie Gennis52226042011-06-07 15:23:23 -0700565 android_native_buffer_t* buf[3];
566 float mtx[16] = {};
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700567 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700568 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700569 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
570 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700571 ASSERT_EQ(OK, mST->updateTexImage());
572 mST->getTransformMatrix(mtx);
Jamie Gennis52226042011-06-07 15:23:23 -0700573
574 EXPECT_EQ(1.f, mtx[0]);
575 EXPECT_EQ(0.f, mtx[1]);
576 EXPECT_EQ(0.f, mtx[2]);
577 EXPECT_EQ(0.f, mtx[3]);
578
579 EXPECT_EQ(0.f, mtx[4]);
580 EXPECT_EQ(-1.f, mtx[5]);
581 EXPECT_EQ(0.f, mtx[6]);
582 EXPECT_EQ(0.f, mtx[7]);
583
584 EXPECT_EQ(0.f, mtx[8]);
585 EXPECT_EQ(0.f, mtx[9]);
586 EXPECT_EQ(1.f, mtx[10]);
587 EXPECT_EQ(0.f, mtx[11]);
588
589 EXPECT_EQ(0.f, mtx[12]);
590 EXPECT_EQ(1.f, mtx[13]);
591 EXPECT_EQ(0.f, mtx[14]);
592 EXPECT_EQ(1.f, mtx[15]);
Jamie Gennis134f0422011-03-08 12:18:54 -0800593}
Jamie Gennis52226042011-06-07 15:23:23 -0700594
595TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
Jamie Gennis52226042011-06-07 15:23:23 -0700596 android_native_buffer_t* buf[3];
597 float mtx[16] = {};
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700598 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700599 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700600 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
601 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700602 ASSERT_EQ(OK, mST->updateTexImage());
603 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
604 mST->getTransformMatrix(mtx);
Jamie Gennis52226042011-06-07 15:23:23 -0700605
606 EXPECT_EQ(1.f, mtx[0]);
607 EXPECT_EQ(0.f, mtx[1]);
608 EXPECT_EQ(0.f, mtx[2]);
609 EXPECT_EQ(0.f, mtx[3]);
610
611 EXPECT_EQ(0.f, mtx[4]);
612 EXPECT_EQ(-1.f, mtx[5]);
613 EXPECT_EQ(0.f, mtx[6]);
614 EXPECT_EQ(0.f, mtx[7]);
615
616 EXPECT_EQ(0.f, mtx[8]);
617 EXPECT_EQ(0.f, mtx[9]);
618 EXPECT_EQ(1.f, mtx[10]);
619 EXPECT_EQ(0.f, mtx[11]);
620
621 EXPECT_EQ(0.f, mtx[12]);
622 EXPECT_EQ(1.f, mtx[13]);
623 EXPECT_EQ(0.f, mtx[14]);
624 EXPECT_EQ(1.f, mtx[15]);
625}
626
627TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
Jamie Gennis52226042011-06-07 15:23:23 -0700628 android_native_buffer_t* buf[3];
629 float mtx[16] = {};
630 android_native_rect_t crop;
631 crop.left = 0;
632 crop.top = 0;
633 crop.right = 5;
634 crop.bottom = 5;
635
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700636 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700637 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Dan Stozaf8cebe52015-04-20 12:09:38 -0700638 ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 8, 8));
639 ASSERT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700640 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700641 ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &crop));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700642 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700643 ASSERT_EQ(OK, mST->updateTexImage());
644 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
645 mST->getTransformMatrix(mtx);
Jamie Gennis52226042011-06-07 15:23:23 -0700646
Krzysztof Kosiński7108c312018-06-27 19:12:54 -0700647 // This accounts for the .5 texel shrink for each edge that's included in
648 // the transform matrix to avoid texturing outside the crop region.
649 EXPECT_EQ(0.5f, mtx[0]);
Jamie Gennis52226042011-06-07 15:23:23 -0700650 EXPECT_EQ(0.f, mtx[1]);
651 EXPECT_EQ(0.f, mtx[2]);
652 EXPECT_EQ(0.f, mtx[3]);
653
654 EXPECT_EQ(0.f, mtx[4]);
Krzysztof Kosiński7108c312018-06-27 19:12:54 -0700655 EXPECT_EQ(-0.5f, mtx[5]);
Jamie Gennis52226042011-06-07 15:23:23 -0700656 EXPECT_EQ(0.f, mtx[6]);
657 EXPECT_EQ(0.f, mtx[7]);
658
659 EXPECT_EQ(0.f, mtx[8]);
660 EXPECT_EQ(0.f, mtx[9]);
661 EXPECT_EQ(1.f, mtx[10]);
662 EXPECT_EQ(0.f, mtx[11]);
663
Krzysztof Kosiński7108c312018-06-27 19:12:54 -0700664 EXPECT_EQ(0.0625f, mtx[12]);
665 EXPECT_EQ(0.5625f, mtx[13]);
Jamie Gennis52226042011-06-07 15:23:23 -0700666 EXPECT_EQ(0.f, mtx[14]);
667 EXPECT_EQ(1.f, mtx[15]);
668}
669
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700670// This test verifies that the buffer format can be queried immediately after
671// it is set.
Jamie Gennis07ed1a92011-06-14 17:04:29 -0700672TEST_F(SurfaceTextureClientTest, QueryFormatAfterSettingWorks) {
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700673 sp<ANativeWindow> anw(mSTC);
674 int fmts[] = {
675 // RGBA_8888 should not come first, as it's the default
676 HAL_PIXEL_FORMAT_RGBX_8888,
677 HAL_PIXEL_FORMAT_RGBA_8888,
678 HAL_PIXEL_FORMAT_RGB_888,
679 HAL_PIXEL_FORMAT_RGB_565,
680 HAL_PIXEL_FORMAT_BGRA_8888,
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700681 HAL_PIXEL_FORMAT_YV12,
682 };
683
684 const int numFmts = (sizeof(fmts) / sizeof(fmts[0]));
685 for (int i = 0; i < numFmts; i++) {
686 int fmt = -1;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700687 ASSERT_EQ(OK, native_window_set_buffers_dimensions(anw.get(), 0, 0));
688 ASSERT_EQ(OK, native_window_set_buffers_format(anw.get(), fmts[i]));
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700689 ASSERT_EQ(OK, anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &fmt));
690 EXPECT_EQ(fmts[i], fmt);
691 }
692}
693
Jamie Gennisc8251a02011-07-11 19:00:51 -0700694class MultiSurfaceTextureClientTest : public ::testing::Test {
695
696public:
697 MultiSurfaceTextureClientTest() :
698 mEglDisplay(EGL_NO_DISPLAY),
699 mEglContext(EGL_NO_CONTEXT) {
700 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
701 mEglSurfaces[i] = EGL_NO_CONTEXT;
702 }
703 }
704
705protected:
706
707 enum { NUM_SURFACE_TEXTURES = 32 };
708
709 virtual void SetUp() {
710 mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
711 ASSERT_EQ(EGL_SUCCESS, eglGetError());
712 ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
713
714 EGLint majorVersion, minorVersion;
715 EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
716 ASSERT_EQ(EGL_SUCCESS, eglGetError());
717
718 EGLConfig myConfig;
719 EGLint numConfigs = 0;
720 EGLint configAttribs[] = {
721 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
722 EGL_NONE
723 };
724 EXPECT_TRUE(eglChooseConfig(mEglDisplay, configAttribs, &myConfig, 1,
725 &numConfigs));
726 ASSERT_EQ(EGL_SUCCESS, eglGetError());
727
728 mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT,
Yi Konga03e0442018-07-17 11:16:57 -0700729 nullptr);
Jamie Gennisc8251a02011-07-11 19:00:51 -0700730 ASSERT_EQ(EGL_SUCCESS, eglGetError());
731 ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
732
733 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
Dan Stoza5603a2f2014-04-07 13:41:37 -0700734 sp<IGraphicBufferProducer> producer;
735 sp<IGraphicBufferConsumer> consumer;
736 BufferQueue::createBufferQueue(&producer, &consumer);
Dan Stozae49ba8e2014-06-24 13:09:19 -0700737 sp<GLConsumer> st(new GLConsumer(consumer, i,
738 GLConsumer::TEXTURE_EXTERNAL, true, false));
Dan Stoza5603a2f2014-04-07 13:41:37 -0700739 sp<Surface> stc(new Surface(producer));
Jamie Gennisc8251a02011-07-11 19:00:51 -0700740 mEglSurfaces[i] = eglCreateWindowSurface(mEglDisplay, myConfig,
Yi Konga03e0442018-07-17 11:16:57 -0700741 static_cast<ANativeWindow*>(stc.get()), nullptr);
Jamie Gennisc8251a02011-07-11 19:00:51 -0700742 ASSERT_EQ(EGL_SUCCESS, eglGetError());
743 ASSERT_NE(EGL_NO_SURFACE, mEglSurfaces[i]);
744 }
745 }
746
747 virtual void TearDown() {
748 eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
749 EGL_NO_CONTEXT);
750
751 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
752 if (mEglSurfaces[i] != EGL_NO_SURFACE) {
753 eglDestroySurface(mEglDisplay, mEglSurfaces[i]);
754 }
755 }
756
757 if (mEglContext != EGL_NO_CONTEXT) {
758 eglDestroyContext(mEglDisplay, mEglContext);
759 }
760
761 if (mEglDisplay != EGL_NO_DISPLAY) {
762 eglTerminate(mEglDisplay);
763 }
764 }
765
766 EGLDisplay mEglDisplay;
767 EGLSurface mEglSurfaces[NUM_SURFACE_TEXTURES];
768 EGLContext mEglContext;
769};
770
771// XXX: This test is disabled because it causes a hang on some devices. See bug
772// 5015672.
773TEST_F(MultiSurfaceTextureClientTest, DISABLED_MakeCurrentBetweenSurfacesWorks) {
774 for (int iter = 0; iter < 8; iter++) {
775 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
776 eglMakeCurrent(mEglDisplay, mEglSurfaces[i], mEglSurfaces[i],
777 mEglContext);
778 glClear(GL_COLOR_BUFFER_BIT);
779 eglSwapBuffers(mEglDisplay, mEglSurfaces[i]);
780 }
781 }
782}
783
Jamie Gennis52226042011-06-07 15:23:23 -0700784} // namespace android