blob: 59d05b673c44be80cb4df82e46a4346e532d5f0e [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() {
Jim Shargod30823a2024-07-27 02:49:39 +000043 mST = new GLConsumer(123, GLConsumer::TEXTURE_EXTERNAL, true, false);
44 mSTC = mST->getSurface();
Jamie Gennis8b69def2011-04-06 15:43:16 -070045 mANW = mSTC;
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070046
47 // We need a valid GL context so we can test updateTexImage()
Peiyong Lind8460c82020-07-28 16:04:22 -070048 // This initializes EGL and create a GL context placeholder with a
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070049 // pbuffer render target.
50 mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
51 ASSERT_EQ(EGL_SUCCESS, eglGetError());
52 ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
53
54 EGLint majorVersion, minorVersion;
55 EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
56 ASSERT_EQ(EGL_SUCCESS, eglGetError());
57
58 EGLConfig myConfig;
59 EGLint numConfigs = 0;
60 EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
61 &myConfig, 1, &numConfigs));
62 ASSERT_EQ(EGL_SUCCESS, eglGetError());
63
Mathias Agopian993e14f2013-02-22 19:34:49 -080064 mEglConfig = myConfig;
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070065 EGLint pbufferAttribs[] = {
66 EGL_WIDTH, 16,
67 EGL_HEIGHT, 16,
68 EGL_NONE };
69 mEglSurface = eglCreatePbufferSurface(mEglDisplay, myConfig, pbufferAttribs);
70 ASSERT_EQ(EGL_SUCCESS, eglGetError());
71 ASSERT_NE(EGL_NO_SURFACE, mEglSurface);
72
Yi Konga03e0442018-07-17 11:16:57 -070073 mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT, nullptr);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070074 ASSERT_EQ(EGL_SUCCESS, eglGetError());
75 ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
76
77 EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext));
78 ASSERT_EQ(EGL_SUCCESS, eglGetError());
Jamie Gennis134f0422011-03-08 12:18:54 -080079 }
80
81 virtual void TearDown() {
82 mST.clear();
83 mSTC.clear();
Jamie Gennis8b69def2011-04-06 15:43:16 -070084 mANW.clear();
85
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070086 eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
87 eglDestroyContext(mEglDisplay, mEglContext);
88 eglDestroySurface(mEglDisplay, mEglSurface);
89 eglTerminate(mEglDisplay);
90 }
91
92 virtual EGLint const* getConfigAttribs() {
93 static EGLint sDefaultConfigAttribs[] = {
Mathias Agopian993e14f2013-02-22 19:34:49 -080094 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT,
Mathias Agopian7a5b22c2011-04-26 14:57:10 -070095 EGL_NONE
96 };
97
98 return sDefaultConfigAttribs;
Jamie Gennis134f0422011-03-08 12:18:54 -080099 }
100
Andy McFadden2adaf042012-12-18 09:49:45 -0800101 sp<GLConsumer> mST;
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800102 sp<Surface> mSTC;
Jamie Gennis8b69def2011-04-06 15:43:16 -0700103 sp<ANativeWindow> mANW;
104
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700105 EGLDisplay mEglDisplay;
106 EGLSurface mEglSurface;
107 EGLContext mEglContext;
Mathias Agopian993e14f2013-02-22 19:34:49 -0800108 EGLConfig mEglConfig;
Jamie Gennis134f0422011-03-08 12:18:54 -0800109};
110
Jamie Gennisbae774e2011-03-14 15:08:53 -0700111TEST_F(SurfaceTextureClientTest, GetISurfaceTextureIsNotNull) {
Mathias Agopiancf0b8c82013-02-19 18:24:40 -0800112 sp<IGraphicBufferProducer> ist(mSTC->getIGraphicBufferProducer());
Yi Konga03e0442018-07-17 11:16:57 -0700113 ASSERT_TRUE(ist != nullptr);
Jamie Gennisbae774e2011-03-14 15:08:53 -0700114}
115
Jamie Gennis134f0422011-03-08 12:18:54 -0800116TEST_F(SurfaceTextureClientTest, QueuesToWindowCompositorIsFalse) {
Jamie Gennis134f0422011-03-08 12:18:54 -0800117 int result = -123;
Jamie Gennis8b69def2011-04-06 15:43:16 -0700118 int err = mANW->query(mANW.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
Jamie Gennis134f0422011-03-08 12:18:54 -0800119 &result);
120 EXPECT_EQ(NO_ERROR, err);
121 EXPECT_EQ(0, result);
122}
123
Jamie Gennis391bbe22011-03-14 15:00:06 -0700124TEST_F(SurfaceTextureClientTest, ConcreteTypeIsSurfaceTextureClient) {
Jamie Gennis391bbe22011-03-14 15:00:06 -0700125 int result = -123;
Jamie Gennis8b69def2011-04-06 15:43:16 -0700126 int err = mANW->query(mANW.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
Jamie Gennis391bbe22011-03-14 15:00:06 -0700127 EXPECT_EQ(NO_ERROR, err);
Mathias Agopiane3c697f2013-02-14 17:11:02 -0800128 EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
Jamie Gennis391bbe22011-03-14 15:00:06 -0700129}
130
Jamie Gennis1b528fb2011-04-25 16:41:11 -0700131TEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) {
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700132 EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
133 ASSERT_EQ(EGL_SUCCESS, eglGetError());
134 ASSERT_NE(EGL_NO_DISPLAY, dpy);
135
136 EGLint majorVersion;
137 EGLint minorVersion;
138 EXPECT_TRUE(eglInitialize(dpy, &majorVersion, &minorVersion));
139 ASSERT_EQ(EGL_SUCCESS, eglGetError());
140
Yi Konga03e0442018-07-17 11:16:57 -0700141 EGLConfig myConfig = {nullptr};
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700142 EGLint numConfigs = 0;
143 EGLint configAttribs[] = {
144 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
145 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
146 EGL_RED_SIZE, 8,
147 EGL_GREEN_SIZE, 8,
148 EGL_BLUE_SIZE, 8,
149 EGL_ALPHA_SIZE, 8,
150 EGL_DEPTH_SIZE, 16,
151 EGL_STENCIL_SIZE, 8,
152 EGL_NONE };
153 EXPECT_TRUE(eglChooseConfig(dpy, configAttribs, &myConfig, 1,
154 &numConfigs));
155 ASSERT_EQ(EGL_SUCCESS, eglGetError());
156
Jamie Gennis8b69def2011-04-06 15:43:16 -0700157 EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, mANW.get(),
Yi Konga03e0442018-07-17 11:16:57 -0700158 nullptr);
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700159 EXPECT_NE(EGL_NO_SURFACE, eglSurface);
160 EXPECT_EQ(EGL_SUCCESS, eglGetError());
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700161
Jamie Gennisfa5b40e2012-03-15 14:01:24 -0700162 if (eglSurface != EGL_NO_SURFACE) {
163 eglDestroySurface(dpy, eglSurface);
164 }
165
Jamie Gennis5c0c93a2011-03-14 15:34:04 -0700166 eglTerminate(dpy);
167}
168
Mathias Agopian993e14f2013-02-22 19:34:49 -0800169TEST_F(SurfaceTextureClientTest, EglSwapBuffersAbandonErrorIsEglBadSurface) {
170
Yi Konga03e0442018-07-17 11:16:57 -0700171 EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig, mANW.get(), nullptr);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800172 EXPECT_NE(EGL_NO_SURFACE, eglSurface);
173 EXPECT_EQ(EGL_SUCCESS, eglGetError());
174
175 EGLBoolean success = eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);
Jamie Gennisad669b02013-04-05 16:41:27 -0700176 EXPECT_TRUE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800177
178 glClear(GL_COLOR_BUFFER_BIT);
179 success = eglSwapBuffers(mEglDisplay, eglSurface);
Jamie Gennisad669b02013-04-05 16:41:27 -0700180 EXPECT_TRUE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800181
182 mST->abandon();
183
184 glClear(GL_COLOR_BUFFER_BIT);
185 success = eglSwapBuffers(mEglDisplay, eglSurface);
Jamie Gennisad669b02013-04-05 16:41:27 -0700186 EXPECT_FALSE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800187 EXPECT_EQ(EGL_BAD_SURFACE, eglGetError());
188
189 success = eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
Jamie Gennisad669b02013-04-05 16:41:27 -0700190 ASSERT_TRUE(success);
Mathias Agopian993e14f2013-02-22 19:34:49 -0800191
192 if (eglSurface != EGL_NO_SURFACE) {
193 eglDestroySurface(mEglDisplay, eglSurface);
194 }
195}
196
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700197TEST_F(SurfaceTextureClientTest, BufferGeometryInvalidSizesFail) {
Dan Stozaf8cebe52015-04-20 12:09:38 -0700198 EXPECT_GT(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 8));
199 EXPECT_GT(OK, native_window_set_buffers_dimensions(mANW.get(), 8, 0));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700200}
201
202TEST_F(SurfaceTextureClientTest, DefaultGeometryValues) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700203 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700204 ANativeWindowBuffer* buf;
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700205 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700206 EXPECT_EQ(1, buf->width);
207 EXPECT_EQ(1, buf->height);
208 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700209 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700210}
211
212TEST_F(SurfaceTextureClientTest, BufferGeometryCanBeSet) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700213 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700214 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700215 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
216 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700217 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700218 EXPECT_EQ(16, buf->width);
219 EXPECT_EQ(8, buf->height);
220 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700221 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700222}
223
224TEST_F(SurfaceTextureClientTest, BufferGeometryDefaultSizeSetFormat) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700225 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700226 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700227 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
228 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700229 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700230 EXPECT_EQ(1, buf->width);
231 EXPECT_EQ(1, buf->height);
232 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700233 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700234}
235
236TEST_F(SurfaceTextureClientTest, BufferGeometrySetSizeDefaultFormat) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700237 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700238 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700239 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
240 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700241 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700242 EXPECT_EQ(16, buf->width);
243 EXPECT_EQ(8, buf->height);
244 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700245 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700246}
247
248TEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeUnset) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700249 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700250 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700251 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
252 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700253 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700254 EXPECT_EQ(16, buf->width);
255 EXPECT_EQ(8, buf->height);
256 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700257 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Dan Stozaf8cebe52015-04-20 12:09:38 -0700258 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
259 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700260 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700261 EXPECT_EQ(1, buf->width);
262 EXPECT_EQ(1, buf->height);
263 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700264 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700265}
266
267TEST_F(SurfaceTextureClientTest, BufferGeometrySizeCanBeChangedWithoutFormat) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700268 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Iliyan Malchev697526b2011-05-01 11:33:26 -0700269 ANativeWindowBuffer* buf;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700270 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 0, 0));
271 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), PIXEL_FORMAT_RGB_565));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700272 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700273 EXPECT_EQ(1, buf->width);
274 EXPECT_EQ(1, buf->height);
275 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700276 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Jamie Gennis46975282012-08-30 18:35:50 -0700277 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700278 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700279 EXPECT_EQ(16, buf->width);
280 EXPECT_EQ(8, buf->height);
281 EXPECT_EQ(PIXEL_FORMAT_RGB_565, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700282 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700283}
284
285TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSize) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700286 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Andy McFadden2adaf042012-12-18 09:49:45 -0800287 sp<GLConsumer> st(mST);
Iliyan Malchev697526b2011-05-01 11:33:26 -0700288 ANativeWindowBuffer* buf;
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700289 EXPECT_EQ(OK, st->setDefaultBufferSize(16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700290 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700291 EXPECT_EQ(16, buf->width);
292 EXPECT_EQ(8, buf->height);
293 EXPECT_EQ(PIXEL_FORMAT_RGBA_8888, buf->format);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700294 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf, -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700295}
296
297TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeAfterDequeue) {
Iliyan Malchev697526b2011-05-01 11:33:26 -0700298 ANativeWindowBuffer* buf[2];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700299 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700300 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700301 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
302 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700303 EXPECT_NE(buf[0], buf[1]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700304 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
305 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700306 EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700307 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
308 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700309 EXPECT_NE(buf[0], buf[1]);
310 EXPECT_EQ(16, buf[0]->width);
311 EXPECT_EQ(16, buf[1]->width);
312 EXPECT_EQ(8, buf[0]->height);
313 EXPECT_EQ(8, buf[1]->height);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700314 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
315 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700316}
317
318TEST_F(SurfaceTextureClientTest, SurfaceTextureSetDefaultSizeVsGeometry) {
Iliyan Malchev697526b2011-05-01 11:33:26 -0700319 ANativeWindowBuffer* buf[2];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700320 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700321 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
322 EXPECT_EQ(OK, mST->setDefaultBufferSize(16, 8));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700323 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
324 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700325 EXPECT_NE(buf[0], buf[1]);
326 EXPECT_EQ(16, buf[0]->width);
327 EXPECT_EQ(16, buf[1]->width);
328 EXPECT_EQ(8, buf[0]->height);
329 EXPECT_EQ(8, buf[1]->height);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700330 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
331 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Dan Stozaf8cebe52015-04-20 12:09:38 -0700332 EXPECT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 12, 24));
333 EXPECT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700334 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
335 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700336 EXPECT_NE(buf[0], buf[1]);
337 EXPECT_EQ(12, buf[0]->width);
338 EXPECT_EQ(12, buf[1]->width);
339 EXPECT_EQ(24, buf[0]->height);
340 EXPECT_EQ(24, buf[1]->height);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700341 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
342 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[1], -1));
Mathias Agopiana5c75c02011-03-31 19:10:24 -0700343}
344
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700345TEST_F(SurfaceTextureClientTest, SurfaceTextureTooManyUpdateTexImage) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700346 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700347 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Mathias Agopian595264f2013-07-16 22:56:09 -0700348 ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 0));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700349 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700350
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700351 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
352 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700353 EXPECT_EQ(OK, mST->updateTexImage());
354 EXPECT_EQ(OK, mST->updateTexImage());
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700355
Mathias Agopian595264f2013-07-16 22:56:09 -0700356 ASSERT_EQ(OK, mANW->setSwapInterval(mANW.get(), 1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700357 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700358
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700359 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
360 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
361 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
362 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700363
Jamie Gennis8b69def2011-04-06 15:43:16 -0700364 EXPECT_EQ(OK, mST->updateTexImage());
365 EXPECT_EQ(OK, mST->updateTexImage());
366 EXPECT_EQ(OK, mST->updateTexImage());
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700367}
368
369TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeSlowRetire) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700370 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700371 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700372 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
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, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
375 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700376 EXPECT_NE(buf[0], buf[1]);
377 EXPECT_NE(buf[1], buf[2]);
378 EXPECT_NE(buf[2], buf[0]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700379 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
380 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
381 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700382 EXPECT_EQ(OK, mST->updateTexImage());
383 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
384 EXPECT_EQ(OK, mST->updateTexImage());
385 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
386 EXPECT_EQ(OK, mST->updateTexImage());
387 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700388}
389
390TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeFastRetire) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700391 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700392 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700393 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700394 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
395 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
396 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700397 EXPECT_NE(buf[0], buf[1]);
398 EXPECT_NE(buf[1], buf[2]);
399 EXPECT_NE(buf[2], buf[0]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700400 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700401 EXPECT_EQ(OK, mST->updateTexImage());
402 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700403 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700404 EXPECT_EQ(OK, mST->updateTexImage());
405 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700406 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700407 EXPECT_EQ(OK, mST->updateTexImage());
408 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700409}
410
411TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDQQR) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700412 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700413 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700414 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700415 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
416 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700417 EXPECT_EQ(OK, mST->updateTexImage());
418 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[0]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700419
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700420 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700421 EXPECT_NE(buf[0], buf[1]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700422 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700423 EXPECT_EQ(OK, mST->updateTexImage());
424 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700425
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700426 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700427 EXPECT_NE(buf[1], buf[2]);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700428 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700429 EXPECT_EQ(OK, mST->updateTexImage());
430 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[2]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700431}
432
Jamie Gennis8cd5ba42011-05-19 13:33:00 -0700433// XXX: We currently have no hardware that properly handles dequeuing the
434// buffer that is currently bound to the texture.
435TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700436 android_native_buffer_t* buf[3];
437 android_native_buffer_t* firstBuf;
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700438 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700439 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700440 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &firstBuf));
441 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), firstBuf, -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700442 EXPECT_EQ(OK, mST->updateTexImage());
443 EXPECT_EQ(mST->getCurrentBuffer().get(), firstBuf);
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700444 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
445 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
446 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
447 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
448 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
449 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700450 EXPECT_NE(buf[0], buf[1]);
451 EXPECT_NE(buf[1], buf[2]);
452 EXPECT_NE(buf[2], buf[0]);
453 EXPECT_EQ(firstBuf, buf[2]);
454}
455
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700456TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700457 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700458 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700459 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Jamie Gennisc2c8dfd2011-05-23 18:44:04 -0700460
Jamie Gennis8b69def2011-04-06 15:43:16 -0700461 // We should be able to dequeue all the buffers before we've queued mANWy.
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700462 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
463 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
464 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700465
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700466 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
467 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700468
Jamie Gennis8b69def2011-04-06 15:43:16 -0700469 EXPECT_EQ(OK, mST->updateTexImage());
470 EXPECT_EQ(mST->getCurrentBuffer().get(), buf[1]);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700471
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700472 EXPECT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700473
Jamie Gennisc2c8dfd2011-05-23 18:44:04 -0700474 // Once we've queued a buffer, however we should not be able to dequeue more
475 // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
Dan Stozaf8cebe52015-04-20 12:09:38 -0700476 EXPECT_EQ(INVALID_OPERATION,
477 native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
Jamie Gennisc2c8dfd2011-05-23 18:44:04 -0700478
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700479 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[0], -1));
480 ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700481}
482
Jamie Gennisd72f2332012-05-07 13:50:11 -0700483TEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700484 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennisd72f2332012-05-07 13:50:11 -0700485 android_native_rect_t rect = {-2, -13, 40, 18};
486 native_window_set_crop(mANW.get(), &rect);
487
488 ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 4, 4));
489
490 android_native_buffer_t* buf;
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700491 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf));
492 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf, -1));
Jamie Gennisd72f2332012-05-07 13:50:11 -0700493 ASSERT_EQ(OK, mST->updateTexImage());
494
495 Rect crop = mST->getCurrentCrop();
496 EXPECT_EQ(0, crop.left);
497 EXPECT_EQ(0, crop.top);
498 EXPECT_EQ(4, crop.right);
499 EXPECT_EQ(4, crop.bottom);
500}
501
Jamie Gennis8dda6b72011-05-24 18:39:46 -0700502// XXX: This is not expected to pass until the synchronization hacks are removed
503// from the SurfaceTexture class.
504TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700505 class MyThread : public Thread {
Andy McFadden2adaf042012-12-18 09:49:45 -0800506 sp<GLConsumer> mST;
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700507 EGLContext ctx;
508 EGLSurface sur;
509 EGLDisplay dpy;
510 bool mBufferRetired;
511 Mutex mLock;
512 virtual bool threadLoop() {
513 eglMakeCurrent(dpy, sur, sur, ctx);
514 usleep(20000);
515 Mutex::Autolock _l(mLock);
Jamie Gennis8b69def2011-04-06 15:43:16 -0700516 mST->updateTexImage();
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700517 mBufferRetired = true;
518 eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
519 return false;
520 }
521 public:
Chih-Hung Hsiehd9cdadb2016-05-03 14:00:39 -0700522 explicit MyThread(const sp<GLConsumer>& mST)
Jamie Gennis8b69def2011-04-06 15:43:16 -0700523 : mST(mST), mBufferRetired(false) {
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700524 ctx = eglGetCurrentContext();
525 sur = eglGetCurrentSurface(EGL_DRAW);
526 dpy = eglGetCurrentDisplay();
527 eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
528 }
529 ~MyThread() {
530 eglMakeCurrent(dpy, sur, sur, ctx);
531 }
532 void bufferDequeued() {
533 Mutex::Autolock _l(mLock);
534 EXPECT_EQ(true, mBufferRetired);
535 }
536 };
537
538 android_native_buffer_t* buf[3];
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700539 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700540 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 3));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700541 // dequeue/queue/update so we have a current buffer
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700542 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
543 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700544 mST->updateTexImage();
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700545
Jamie Gennis8b69def2011-04-06 15:43:16 -0700546 MyThread* thread = new MyThread(mST);
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700547 sp<Thread> threadBase(thread);
548
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700549 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
550 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Brian Carlstrom83b1e682016-03-12 16:07:59 -0800551 thread->run("MyThread");
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700552 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[1]));
553 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[1], -1));
554 //ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[2]));
555 //ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[2], -1));
Mathias Agopian7a5b22c2011-04-26 14:57:10 -0700556 thread->bufferDequeued();
557 thread->requestExitAndWait();
558}
559
Jamie Gennis52226042011-06-07 15:23:23 -0700560TEST_F(SurfaceTextureClientTest, GetTransformMatrixReturnsVerticalFlip) {
Jamie Gennis52226042011-06-07 15:23:23 -0700561 android_native_buffer_t* buf[3];
562 float mtx[16] = {};
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700563 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700564 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700565 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
566 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700567 ASSERT_EQ(OK, mST->updateTexImage());
568 mST->getTransformMatrix(mtx);
Jamie Gennis52226042011-06-07 15:23:23 -0700569
570 EXPECT_EQ(1.f, mtx[0]);
571 EXPECT_EQ(0.f, mtx[1]);
572 EXPECT_EQ(0.f, mtx[2]);
573 EXPECT_EQ(0.f, mtx[3]);
574
575 EXPECT_EQ(0.f, mtx[4]);
576 EXPECT_EQ(-1.f, mtx[5]);
577 EXPECT_EQ(0.f, mtx[6]);
578 EXPECT_EQ(0.f, mtx[7]);
579
580 EXPECT_EQ(0.f, mtx[8]);
581 EXPECT_EQ(0.f, mtx[9]);
582 EXPECT_EQ(1.f, mtx[10]);
583 EXPECT_EQ(0.f, mtx[11]);
584
585 EXPECT_EQ(0.f, mtx[12]);
586 EXPECT_EQ(1.f, mtx[13]);
587 EXPECT_EQ(0.f, mtx[14]);
588 EXPECT_EQ(1.f, mtx[15]);
Jamie Gennis134f0422011-03-08 12:18:54 -0800589}
Jamie Gennis52226042011-06-07 15:23:23 -0700590
591TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffers) {
Jamie Gennis52226042011-06-07 15:23:23 -0700592 android_native_buffer_t* buf[3];
593 float mtx[16] = {};
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700594 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700595 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700596 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
597 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700598 ASSERT_EQ(OK, mST->updateTexImage());
599 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
600 mST->getTransformMatrix(mtx);
Jamie Gennis52226042011-06-07 15:23:23 -0700601
602 EXPECT_EQ(1.f, mtx[0]);
603 EXPECT_EQ(0.f, mtx[1]);
604 EXPECT_EQ(0.f, mtx[2]);
605 EXPECT_EQ(0.f, mtx[3]);
606
607 EXPECT_EQ(0.f, mtx[4]);
608 EXPECT_EQ(-1.f, mtx[5]);
609 EXPECT_EQ(0.f, mtx[6]);
610 EXPECT_EQ(0.f, mtx[7]);
611
612 EXPECT_EQ(0.f, mtx[8]);
613 EXPECT_EQ(0.f, mtx[9]);
614 EXPECT_EQ(1.f, mtx[10]);
615 EXPECT_EQ(0.f, mtx[11]);
616
617 EXPECT_EQ(0.f, mtx[12]);
618 EXPECT_EQ(1.f, mtx[13]);
619 EXPECT_EQ(0.f, mtx[14]);
620 EXPECT_EQ(1.f, mtx[15]);
621}
622
623TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWithCrop) {
Jamie Gennis52226042011-06-07 15:23:23 -0700624 android_native_buffer_t* buf[3];
625 float mtx[16] = {};
626 android_native_rect_t crop;
627 crop.left = 0;
628 crop.top = 0;
629 crop.right = 5;
630 crop.bottom = 5;
631
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700632 ASSERT_EQ(OK, native_window_api_connect(mANW.get(), NATIVE_WINDOW_API_CPU));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700633 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 4));
Dan Stozaf8cebe52015-04-20 12:09:38 -0700634 ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), 8, 8));
635 ASSERT_EQ(OK, native_window_set_buffers_format(mANW.get(), 0));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700636 ASSERT_EQ(OK, native_window_dequeue_buffer_and_wait(mANW.get(), &buf[0]));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700637 ASSERT_EQ(OK, native_window_set_crop(mANW.get(), &crop));
Jamie Gennisd8e812c2012-06-13 16:32:25 -0700638 ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf[0], -1));
Jamie Gennis8b69def2011-04-06 15:43:16 -0700639 ASSERT_EQ(OK, mST->updateTexImage());
640 ASSERT_EQ(OK, native_window_set_buffer_count(mANW.get(), 6)); // frees buffers
641 mST->getTransformMatrix(mtx);
Jamie Gennis52226042011-06-07 15:23:23 -0700642
Krzysztof Kosiński7108c312018-06-27 19:12:54 -0700643 // This accounts for the .5 texel shrink for each edge that's included in
644 // the transform matrix to avoid texturing outside the crop region.
645 EXPECT_EQ(0.5f, mtx[0]);
Jamie Gennis52226042011-06-07 15:23:23 -0700646 EXPECT_EQ(0.f, mtx[1]);
647 EXPECT_EQ(0.f, mtx[2]);
648 EXPECT_EQ(0.f, mtx[3]);
649
650 EXPECT_EQ(0.f, mtx[4]);
Krzysztof Kosiński7108c312018-06-27 19:12:54 -0700651 EXPECT_EQ(-0.5f, mtx[5]);
Jamie Gennis52226042011-06-07 15:23:23 -0700652 EXPECT_EQ(0.f, mtx[6]);
653 EXPECT_EQ(0.f, mtx[7]);
654
655 EXPECT_EQ(0.f, mtx[8]);
656 EXPECT_EQ(0.f, mtx[9]);
657 EXPECT_EQ(1.f, mtx[10]);
658 EXPECT_EQ(0.f, mtx[11]);
659
Krzysztof Kosiński7108c312018-06-27 19:12:54 -0700660 EXPECT_EQ(0.0625f, mtx[12]);
661 EXPECT_EQ(0.5625f, mtx[13]);
Jamie Gennis52226042011-06-07 15:23:23 -0700662 EXPECT_EQ(0.f, mtx[14]);
663 EXPECT_EQ(1.f, mtx[15]);
664}
665
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700666// This test verifies that the buffer format can be queried immediately after
667// it is set.
Jamie Gennis07ed1a92011-06-14 17:04:29 -0700668TEST_F(SurfaceTextureClientTest, QueryFormatAfterSettingWorks) {
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700669 sp<ANativeWindow> anw(mSTC);
670 int fmts[] = {
671 // RGBA_8888 should not come first, as it's the default
672 HAL_PIXEL_FORMAT_RGBX_8888,
673 HAL_PIXEL_FORMAT_RGBA_8888,
674 HAL_PIXEL_FORMAT_RGB_888,
675 HAL_PIXEL_FORMAT_RGB_565,
676 HAL_PIXEL_FORMAT_BGRA_8888,
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700677 HAL_PIXEL_FORMAT_YV12,
678 };
679
680 const int numFmts = (sizeof(fmts) / sizeof(fmts[0]));
681 for (int i = 0; i < numFmts; i++) {
682 int fmt = -1;
Dan Stozaf8cebe52015-04-20 12:09:38 -0700683 ASSERT_EQ(OK, native_window_set_buffers_dimensions(anw.get(), 0, 0));
684 ASSERT_EQ(OK, native_window_set_buffers_format(anw.get(), fmts[i]));
Jamie Gennisa6f35dd2011-06-12 13:56:15 -0700685 ASSERT_EQ(OK, anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &fmt));
686 EXPECT_EQ(fmts[i], fmt);
687 }
688}
689
Jamie Gennisc8251a02011-07-11 19:00:51 -0700690class MultiSurfaceTextureClientTest : public ::testing::Test {
691
692public:
693 MultiSurfaceTextureClientTest() :
694 mEglDisplay(EGL_NO_DISPLAY),
695 mEglContext(EGL_NO_CONTEXT) {
696 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
697 mEglSurfaces[i] = EGL_NO_CONTEXT;
698 }
699 }
700
701protected:
702
703 enum { NUM_SURFACE_TEXTURES = 32 };
704
705 virtual void SetUp() {
706 mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
707 ASSERT_EQ(EGL_SUCCESS, eglGetError());
708 ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
709
710 EGLint majorVersion, minorVersion;
711 EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
712 ASSERT_EQ(EGL_SUCCESS, eglGetError());
713
714 EGLConfig myConfig;
715 EGLint numConfigs = 0;
716 EGLint configAttribs[] = {
717 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
718 EGL_NONE
719 };
720 EXPECT_TRUE(eglChooseConfig(mEglDisplay, configAttribs, &myConfig, 1,
721 &numConfigs));
722 ASSERT_EQ(EGL_SUCCESS, eglGetError());
723
724 mEglContext = eglCreateContext(mEglDisplay, myConfig, EGL_NO_CONTEXT,
Yi Konga03e0442018-07-17 11:16:57 -0700725 nullptr);
Jamie Gennisc8251a02011-07-11 19:00:51 -0700726 ASSERT_EQ(EGL_SUCCESS, eglGetError());
727 ASSERT_NE(EGL_NO_CONTEXT, mEglContext);
728
729 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
Jim Shargod30823a2024-07-27 02:49:39 +0000730 sp<GLConsumer> st(new GLConsumer(i, GLConsumer::TEXTURE_EXTERNAL, true, false));
731 sp<Surface> stc = st->getSurface();
Jamie Gennisc8251a02011-07-11 19:00:51 -0700732 mEglSurfaces[i] = eglCreateWindowSurface(mEglDisplay, myConfig,
Yi Konga03e0442018-07-17 11:16:57 -0700733 static_cast<ANativeWindow*>(stc.get()), nullptr);
Jamie Gennisc8251a02011-07-11 19:00:51 -0700734 ASSERT_EQ(EGL_SUCCESS, eglGetError());
735 ASSERT_NE(EGL_NO_SURFACE, mEglSurfaces[i]);
736 }
737 }
738
739 virtual void TearDown() {
740 eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
741 EGL_NO_CONTEXT);
742
743 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
744 if (mEglSurfaces[i] != EGL_NO_SURFACE) {
745 eglDestroySurface(mEglDisplay, mEglSurfaces[i]);
746 }
747 }
748
749 if (mEglContext != EGL_NO_CONTEXT) {
750 eglDestroyContext(mEglDisplay, mEglContext);
751 }
752
753 if (mEglDisplay != EGL_NO_DISPLAY) {
754 eglTerminate(mEglDisplay);
755 }
756 }
757
758 EGLDisplay mEglDisplay;
759 EGLSurface mEglSurfaces[NUM_SURFACE_TEXTURES];
760 EGLContext mEglContext;
761};
762
763// XXX: This test is disabled because it causes a hang on some devices. See bug
764// 5015672.
765TEST_F(MultiSurfaceTextureClientTest, DISABLED_MakeCurrentBetweenSurfacesWorks) {
766 for (int iter = 0; iter < 8; iter++) {
767 for (int i = 0; i < NUM_SURFACE_TEXTURES; i++) {
768 eglMakeCurrent(mEglDisplay, mEglSurfaces[i], mEglSurfaces[i],
769 mEglContext);
770 glClear(GL_COLOR_BUFFER_BIT);
771 eglSwapBuffers(mEglDisplay, mEglSurfaces[i]);
772 }
773 }
774}
775
Jamie Gennis52226042011-06-07 15:23:23 -0700776} // namespace android