xref: /aosp_15_r20/external/angle/src/tests/gl_tests/ImageTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // ImageTest:
7*8975f5c5SAndroid Build Coastguard Worker //   Tests the correctness of eglImage.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/MultiThreadSteps.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "util/EGLWindow.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "util/test_utils.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker #include "common/android_util.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_ANDROID) && __ANDROID_API__ >= 29
19*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_AHARDWARE_BUFFER_SUPPORT
20*8975f5c5SAndroid Build Coastguard Worker // NDK header file for access to Android Hardware Buffers
21*8975f5c5SAndroid Build Coastguard Worker #    include <android/hardware_buffer.h>
22*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
23*8975f5c5SAndroid Build Coastguard Worker #endif
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_ANDROID) && __ANDROID_API__ >= 33
26*8975f5c5SAndroid Build Coastguard Worker constexpr bool kHasAHBFrontBufferUsageSupport = 1;
27*8975f5c5SAndroid Build Coastguard Worker #else
28*8975f5c5SAndroid Build Coastguard Worker [[maybe_unused]] constexpr bool kHasAHBFrontBufferUsageSupport = 0;
29*8975f5c5SAndroid Build Coastguard Worker #endif
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker namespace angle
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker namespace
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker constexpr char kOESExt[]                         = "GL_OES_EGL_image";
36*8975f5c5SAndroid Build Coastguard Worker constexpr char kExternalExt[]                    = "GL_OES_EGL_image_external";
37*8975f5c5SAndroid Build Coastguard Worker constexpr char kExternalESSL3Ext[]               = "GL_OES_EGL_image_external_essl3";
38*8975f5c5SAndroid Build Coastguard Worker constexpr char kYUVInternalFormatExt[]           = "GL_ANGLE_yuv_internal_format";
39*8975f5c5SAndroid Build Coastguard Worker constexpr char kYUVTargetExt[]                   = "GL_EXT_YUV_target";
40*8975f5c5SAndroid Build Coastguard Worker constexpr char kRGBXInternalFormatExt[]          = "GL_ANGLE_rgbx_internal_format";
41*8975f5c5SAndroid Build Coastguard Worker constexpr char kBaseExt[]                        = "EGL_KHR_image_base";
42*8975f5c5SAndroid Build Coastguard Worker constexpr char k2DTextureExt[]                   = "EGL_KHR_gl_texture_2D_image";
43*8975f5c5SAndroid Build Coastguard Worker constexpr char k3DTextureExt[]                   = "EGL_KHR_gl_texture_3D_image";
44*8975f5c5SAndroid Build Coastguard Worker constexpr char kPixmapExt[]                      = "EGL_KHR_image_pixmap";
45*8975f5c5SAndroid Build Coastguard Worker constexpr char kRenderbufferExt[]                = "EGL_KHR_gl_renderbuffer_image";
46*8975f5c5SAndroid Build Coastguard Worker constexpr char kCubemapExt[]                     = "EGL_KHR_gl_texture_cubemap_image";
47*8975f5c5SAndroid Build Coastguard Worker constexpr char kImageGLColorspaceExt[]           = "EGL_EXT_image_gl_colorspace";
48*8975f5c5SAndroid Build Coastguard Worker constexpr char kEGLImageArrayExt[]               = "GL_EXT_EGL_image_array";
49*8975f5c5SAndroid Build Coastguard Worker constexpr char kEGLAndroidImageNativeBufferExt[] = "EGL_ANDROID_image_native_buffer";
50*8975f5c5SAndroid Build Coastguard Worker constexpr char kEGLImageStorageExt[]             = "GL_EXT_EGL_image_storage";
51*8975f5c5SAndroid Build Coastguard Worker constexpr char kEGLImageStorageCompressionExt[]  = "GL_EXT_EGL_image_storage_compression";
52*8975f5c5SAndroid Build Coastguard Worker constexpr char kTextureStorageCompressionExt[]   = "GL_EXT_texture_storage_compression";
53*8975f5c5SAndroid Build Coastguard Worker constexpr EGLint kDefaultAttribs[]               = {
54*8975f5c5SAndroid Build Coastguard Worker     EGL_IMAGE_PRESERVED,
55*8975f5c5SAndroid Build Coastguard Worker     EGL_TRUE,
56*8975f5c5SAndroid Build Coastguard Worker     EGL_NONE,
57*8975f5c5SAndroid Build Coastguard Worker };
58*8975f5c5SAndroid Build Coastguard Worker constexpr EGLint kColorspaceAttribs[] = {
59*8975f5c5SAndroid Build Coastguard Worker     EGL_IMAGE_PRESERVED, EGL_TRUE, EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_SRGB_KHR, EGL_NONE,
60*8975f5c5SAndroid Build Coastguard Worker };
61*8975f5c5SAndroid Build Coastguard Worker constexpr EGLint kNativeClientBufferAttribs_RGBA8_Texture[] = {
62*8975f5c5SAndroid Build Coastguard Worker     EGL_WIDTH,
63*8975f5c5SAndroid Build Coastguard Worker     1,
64*8975f5c5SAndroid Build Coastguard Worker     EGL_HEIGHT,
65*8975f5c5SAndroid Build Coastguard Worker     1,
66*8975f5c5SAndroid Build Coastguard Worker     EGL_RED_SIZE,
67*8975f5c5SAndroid Build Coastguard Worker     8,
68*8975f5c5SAndroid Build Coastguard Worker     EGL_GREEN_SIZE,
69*8975f5c5SAndroid Build Coastguard Worker     8,
70*8975f5c5SAndroid Build Coastguard Worker     EGL_BLUE_SIZE,
71*8975f5c5SAndroid Build Coastguard Worker     8,
72*8975f5c5SAndroid Build Coastguard Worker     EGL_ALPHA_SIZE,
73*8975f5c5SAndroid Build Coastguard Worker     8,
74*8975f5c5SAndroid Build Coastguard Worker     EGL_NATIVE_BUFFER_USAGE_ANDROID,
75*8975f5c5SAndroid Build Coastguard Worker     EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID,
76*8975f5c5SAndroid Build Coastguard Worker     EGL_NONE};
77*8975f5c5SAndroid Build Coastguard Worker constexpr EGLint kNativeClientBufferAttribs_RGBA8_Renderbuffer[] = {
78*8975f5c5SAndroid Build Coastguard Worker     EGL_WIDTH,
79*8975f5c5SAndroid Build Coastguard Worker     1,
80*8975f5c5SAndroid Build Coastguard Worker     EGL_HEIGHT,
81*8975f5c5SAndroid Build Coastguard Worker     1,
82*8975f5c5SAndroid Build Coastguard Worker     EGL_RED_SIZE,
83*8975f5c5SAndroid Build Coastguard Worker     8,
84*8975f5c5SAndroid Build Coastguard Worker     EGL_GREEN_SIZE,
85*8975f5c5SAndroid Build Coastguard Worker     8,
86*8975f5c5SAndroid Build Coastguard Worker     EGL_BLUE_SIZE,
87*8975f5c5SAndroid Build Coastguard Worker     8,
88*8975f5c5SAndroid Build Coastguard Worker     EGL_ALPHA_SIZE,
89*8975f5c5SAndroid Build Coastguard Worker     8,
90*8975f5c5SAndroid Build Coastguard Worker     EGL_NATIVE_BUFFER_USAGE_ANDROID,
91*8975f5c5SAndroid Build Coastguard Worker     EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID,
92*8975f5c5SAndroid Build Coastguard Worker     EGL_NONE};
93*8975f5c5SAndroid Build Coastguard Worker // Color data in linear and sRGB colorspace
94*8975f5c5SAndroid Build Coastguard Worker // 2D texture data
95*8975f5c5SAndroid Build Coastguard Worker GLubyte kLinearColor[] = {132, 55, 219, 255};
96*8975f5c5SAndroid Build Coastguard Worker GLubyte kSrgbColor[]   = {190, 128, 238, 255};
97*8975f5c5SAndroid Build Coastguard Worker // 3D texture data
98*8975f5c5SAndroid Build Coastguard Worker GLubyte kLinearColor3D[] = {131, 242, 100, 255, 201, 89, 133, 255};
99*8975f5c5SAndroid Build Coastguard Worker GLubyte kSrgbColor3D[]   = {190, 249, 168, 255, 230, 159, 191, 255};
100*8975f5c5SAndroid Build Coastguard Worker // Cubemap texture data
101*8975f5c5SAndroid Build Coastguard Worker GLubyte kLinearColorCube[] = {75, 135, 205, 255, 201, 89,  133, 255, 111, 201, 108, 255,
102*8975f5c5SAndroid Build Coastguard Worker                               30, 90,  230, 255, 180, 210, 70,  255, 77,  111, 99,  255};
103*8975f5c5SAndroid Build Coastguard Worker GLubyte kSrgbColorCube[]   = {148, 192, 232, 255, 230, 159, 191, 255, 176, 230, 174, 255,
104*8975f5c5SAndroid Build Coastguard Worker                               96,  160, 244, 255, 219, 234, 143, 255, 149, 176, 167, 255};
105*8975f5c5SAndroid Build Coastguard Worker GLfloat kCubeFaceX[]       = {1.0, -1.0, 0.0, 0.0, 0.0, 0.0};
106*8975f5c5SAndroid Build Coastguard Worker GLfloat kCubeFaceY[]       = {0.0, 0.0, 1.0, -1.0, 0.0, 0.0};
107*8975f5c5SAndroid Build Coastguard Worker GLfloat kCubeFaceZ[]       = {0.0, 0.0, 0.0, 0.0, 1.0, -1.0};
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker constexpr int kColorspaceAttributeIndex     = 2;
110*8975f5c5SAndroid Build Coastguard Worker constexpr int k3DColorspaceAttributeIndex   = 4;
111*8975f5c5SAndroid Build Coastguard Worker constexpr int kTextureZOffsetAttributeIndex = 1;
112*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kCubeFaceCount             = 6;
113*8975f5c5SAndroid Build Coastguard Worker 
114*8975f5c5SAndroid Build Coastguard Worker constexpr int AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM  = 1;
115*8975f5c5SAndroid Build Coastguard Worker constexpr int AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM  = 2;
116*8975f5c5SAndroid Build Coastguard Worker constexpr int AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM    = 3;
117*8975f5c5SAndroid Build Coastguard Worker constexpr int AHARDWAREBUFFER_FORMAT_D24_UNORM       = 0x31;
118*8975f5c5SAndroid Build Coastguard Worker constexpr int AHARDWAREBUFFER_FORMAT_Y8Cr8Cb8_420_SP = 0x11;
119*8975f5c5SAndroid Build Coastguard Worker constexpr int AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420    = 0x23;
120*8975f5c5SAndroid Build Coastguard Worker constexpr int AHARDWAREBUFFER_FORMAT_YV12            = 0x32315659;
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker [[maybe_unused]] constexpr uint64_t ANGLE_AHARDWAREBUFFER_USAGE_FRONT_BUFFER = (1ULL << 32);
123*8975f5c5SAndroid Build Coastguard Worker 
124*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker class ImageTest : public ANGLETest<>
127*8975f5c5SAndroid Build Coastguard Worker {
128*8975f5c5SAndroid Build Coastguard Worker   protected:
ImageTest()129*8975f5c5SAndroid Build Coastguard Worker     ImageTest()
130*8975f5c5SAndroid Build Coastguard Worker     {
131*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
132*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
133*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
134*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
135*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
136*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
137*8975f5c5SAndroid Build Coastguard Worker         setConfigDepthBits(24);
138*8975f5c5SAndroid Build Coastguard Worker     }
139*8975f5c5SAndroid Build Coastguard Worker 
getVS() const140*8975f5c5SAndroid Build Coastguard Worker     const char *getVS() const
141*8975f5c5SAndroid Build Coastguard Worker     {
142*8975f5c5SAndroid Build Coastguard Worker         return R"(precision highp float;
143*8975f5c5SAndroid Build Coastguard Worker attribute vec4 position;
144*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
145*8975f5c5SAndroid Build Coastguard Worker 
146*8975f5c5SAndroid Build Coastguard Worker void main()
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker     gl_Position = position;
149*8975f5c5SAndroid Build Coastguard Worker     texcoord = (position.xy * 0.5) + 0.5;
150*8975f5c5SAndroid Build Coastguard Worker     texcoord.y = 1.0 - texcoord.y;
151*8975f5c5SAndroid Build Coastguard Worker })";
152*8975f5c5SAndroid Build Coastguard Worker     }
153*8975f5c5SAndroid Build Coastguard Worker 
getVS2DArray() const154*8975f5c5SAndroid Build Coastguard Worker     const char *getVS2DArray() const
155*8975f5c5SAndroid Build Coastguard Worker     {
156*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
157*8975f5c5SAndroid Build Coastguard Worker out vec2 texcoord;
158*8975f5c5SAndroid Build Coastguard Worker in vec4 position;
159*8975f5c5SAndroid Build Coastguard Worker void main()
160*8975f5c5SAndroid Build Coastguard Worker {
161*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position.xy, 0.0, 1.0);
162*8975f5c5SAndroid Build Coastguard Worker     texcoord = (position.xy * 0.5) + 0.5;
163*8975f5c5SAndroid Build Coastguard Worker })";
164*8975f5c5SAndroid Build Coastguard Worker     }
165*8975f5c5SAndroid Build Coastguard Worker 
getVSCube() const166*8975f5c5SAndroid Build Coastguard Worker     const char *getVSCube() const
167*8975f5c5SAndroid Build Coastguard Worker     {
168*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
169*8975f5c5SAndroid Build Coastguard Worker in vec4 position;
170*8975f5c5SAndroid Build Coastguard Worker void main()
171*8975f5c5SAndroid Build Coastguard Worker {
172*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position.xy, 0.0, 1.0);
173*8975f5c5SAndroid Build Coastguard Worker })";
174*8975f5c5SAndroid Build Coastguard Worker     }
175*8975f5c5SAndroid Build Coastguard Worker 
getVSCubeArray() const176*8975f5c5SAndroid Build Coastguard Worker     const char *getVSCubeArray() const
177*8975f5c5SAndroid Build Coastguard Worker     {
178*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 310 es
179*8975f5c5SAndroid Build Coastguard Worker in vec4 position;
180*8975f5c5SAndroid Build Coastguard Worker void main()
181*8975f5c5SAndroid Build Coastguard Worker {
182*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position.xy, 0.0, 1.0);
183*8975f5c5SAndroid Build Coastguard Worker })";
184*8975f5c5SAndroid Build Coastguard Worker     }
185*8975f5c5SAndroid Build Coastguard Worker 
getVSESSL3() const186*8975f5c5SAndroid Build Coastguard Worker     const char *getVSESSL3() const
187*8975f5c5SAndroid Build Coastguard Worker     {
188*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
189*8975f5c5SAndroid Build Coastguard Worker precision highp float;
190*8975f5c5SAndroid Build Coastguard Worker in vec4 position;
191*8975f5c5SAndroid Build Coastguard Worker out vec2 texcoord;
192*8975f5c5SAndroid Build Coastguard Worker 
193*8975f5c5SAndroid Build Coastguard Worker void main()
194*8975f5c5SAndroid Build Coastguard Worker {
195*8975f5c5SAndroid Build Coastguard Worker     gl_Position = position;
196*8975f5c5SAndroid Build Coastguard Worker     texcoord = (position.xy * 0.5) + 0.5;
197*8975f5c5SAndroid Build Coastguard Worker     texcoord.y = 1.0 - texcoord.y;
198*8975f5c5SAndroid Build Coastguard Worker })";
199*8975f5c5SAndroid Build Coastguard Worker     }
200*8975f5c5SAndroid Build Coastguard Worker 
getTextureFS() const201*8975f5c5SAndroid Build Coastguard Worker     const char *getTextureFS() const
202*8975f5c5SAndroid Build Coastguard Worker     {
203*8975f5c5SAndroid Build Coastguard Worker         return R"(precision highp float;
204*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
205*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker void main()
208*8975f5c5SAndroid Build Coastguard Worker {
209*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = texture2D(tex, texcoord);
210*8975f5c5SAndroid Build Coastguard Worker })";
211*8975f5c5SAndroid Build Coastguard Worker     }
212*8975f5c5SAndroid Build Coastguard Worker 
getTexture2DArrayFS() const213*8975f5c5SAndroid Build Coastguard Worker     const char *getTexture2DArrayFS() const
214*8975f5c5SAndroid Build Coastguard Worker     {
215*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
216*8975f5c5SAndroid Build Coastguard Worker precision highp float;
217*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2DArray tex2DArray;
218*8975f5c5SAndroid Build Coastguard Worker uniform uint layer;
219*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
220*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
221*8975f5c5SAndroid Build Coastguard Worker void main()
222*8975f5c5SAndroid Build Coastguard Worker {
223*8975f5c5SAndroid Build Coastguard Worker     fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.y, float(layer)));
224*8975f5c5SAndroid Build Coastguard Worker })";
225*8975f5c5SAndroid Build Coastguard Worker     }
226*8975f5c5SAndroid Build Coastguard Worker 
getTextureCubeFS() const227*8975f5c5SAndroid Build Coastguard Worker     const char *getTextureCubeFS() const
228*8975f5c5SAndroid Build Coastguard Worker     {
229*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
230*8975f5c5SAndroid Build Coastguard Worker precision highp float;
231*8975f5c5SAndroid Build Coastguard Worker uniform highp samplerCube texCube;
232*8975f5c5SAndroid Build Coastguard Worker uniform vec3 faceCoord;
233*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
234*8975f5c5SAndroid Build Coastguard Worker void main()
235*8975f5c5SAndroid Build Coastguard Worker {
236*8975f5c5SAndroid Build Coastguard Worker     fragColor = texture(texCube, faceCoord);
237*8975f5c5SAndroid Build Coastguard Worker })";
238*8975f5c5SAndroid Build Coastguard Worker     }
239*8975f5c5SAndroid Build Coastguard Worker 
getTextureCubeArrayFS() const240*8975f5c5SAndroid Build Coastguard Worker     const char *getTextureCubeArrayFS() const
241*8975f5c5SAndroid Build Coastguard Worker     {
242*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 310 es
243*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_texture_cube_map_array : require
244*8975f5c5SAndroid Build Coastguard Worker precision highp float;
245*8975f5c5SAndroid Build Coastguard Worker uniform highp samplerCubeArray texCubeArray;
246*8975f5c5SAndroid Build Coastguard Worker uniform vec3 faceCoord;
247*8975f5c5SAndroid Build Coastguard Worker uniform uint layer;
248*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
249*8975f5c5SAndroid Build Coastguard Worker void main()
250*8975f5c5SAndroid Build Coastguard Worker {
251*8975f5c5SAndroid Build Coastguard Worker     fragColor = texture(texCubeArray, vec4(faceCoord, float(layer)));
252*8975f5c5SAndroid Build Coastguard Worker })";
253*8975f5c5SAndroid Build Coastguard Worker     }
254*8975f5c5SAndroid Build Coastguard Worker 
getTextureExternalFS() const255*8975f5c5SAndroid Build Coastguard Worker     const char *getTextureExternalFS() const
256*8975f5c5SAndroid Build Coastguard Worker     {
257*8975f5c5SAndroid Build Coastguard Worker         return R"(#extension GL_OES_EGL_image_external : require
258*8975f5c5SAndroid Build Coastguard Worker precision highp float;
259*8975f5c5SAndroid Build Coastguard Worker uniform samplerExternalOES tex;
260*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
261*8975f5c5SAndroid Build Coastguard Worker 
262*8975f5c5SAndroid Build Coastguard Worker void main()
263*8975f5c5SAndroid Build Coastguard Worker {
264*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = texture2D(tex, texcoord);
265*8975f5c5SAndroid Build Coastguard Worker })";
266*8975f5c5SAndroid Build Coastguard Worker     }
267*8975f5c5SAndroid Build Coastguard Worker 
getTextureExternalESSL3FS() const268*8975f5c5SAndroid Build Coastguard Worker     const char *getTextureExternalESSL3FS() const
269*8975f5c5SAndroid Build Coastguard Worker     {
270*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
271*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_EGL_image_external_essl3 : require
272*8975f5c5SAndroid Build Coastguard Worker precision highp float;
273*8975f5c5SAndroid Build Coastguard Worker uniform samplerExternalOES tex;
274*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
275*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
276*8975f5c5SAndroid Build Coastguard Worker 
277*8975f5c5SAndroid Build Coastguard Worker void main()
278*8975f5c5SAndroid Build Coastguard Worker {
279*8975f5c5SAndroid Build Coastguard Worker     color = texture(tex, texcoord);
280*8975f5c5SAndroid Build Coastguard Worker })";
281*8975f5c5SAndroid Build Coastguard Worker     }
282*8975f5c5SAndroid Build Coastguard Worker 
getTextureYUVFS() const283*8975f5c5SAndroid Build Coastguard Worker     const char *getTextureYUVFS() const
284*8975f5c5SAndroid Build Coastguard Worker     {
285*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
286*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_YUV_target : require
287*8975f5c5SAndroid Build Coastguard Worker precision highp float;
288*8975f5c5SAndroid Build Coastguard Worker uniform __samplerExternal2DY2YEXT tex;
289*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
290*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
291*8975f5c5SAndroid Build Coastguard Worker 
292*8975f5c5SAndroid Build Coastguard Worker void main()
293*8975f5c5SAndroid Build Coastguard Worker {
294*8975f5c5SAndroid Build Coastguard Worker     color = texture(tex, texcoord);
295*8975f5c5SAndroid Build Coastguard Worker })";
296*8975f5c5SAndroid Build Coastguard Worker     }
297*8975f5c5SAndroid Build Coastguard Worker 
getRenderYUVFS() const298*8975f5c5SAndroid Build Coastguard Worker     const char *getRenderYUVFS() const
299*8975f5c5SAndroid Build Coastguard Worker     {
300*8975f5c5SAndroid Build Coastguard Worker         return R"(#version 300 es
301*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_YUV_target : require
302*8975f5c5SAndroid Build Coastguard Worker precision highp float;
303*8975f5c5SAndroid Build Coastguard Worker uniform vec4 u_color;
304*8975f5c5SAndroid Build Coastguard Worker layout (yuv) out vec4 color;
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker void main()
307*8975f5c5SAndroid Build Coastguard Worker {
308*8975f5c5SAndroid Build Coastguard Worker     color = u_color;
309*8975f5c5SAndroid Build Coastguard Worker })";
310*8975f5c5SAndroid Build Coastguard Worker     }
311*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()312*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
313*8975f5c5SAndroid Build Coastguard Worker     {
314*8975f5c5SAndroid Build Coastguard Worker         mTextureProgram = CompileProgram(getVS(), getTextureFS());
315*8975f5c5SAndroid Build Coastguard Worker         if (mTextureProgram == 0)
316*8975f5c5SAndroid Build Coastguard Worker         {
317*8975f5c5SAndroid Build Coastguard Worker             FAIL() << "shader compilation failed.";
318*8975f5c5SAndroid Build Coastguard Worker         }
319*8975f5c5SAndroid Build Coastguard Worker 
320*8975f5c5SAndroid Build Coastguard Worker         mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex");
321*8975f5c5SAndroid Build Coastguard Worker 
322*8975f5c5SAndroid Build Coastguard Worker         if (getClientMajorVersion() >= 3)
323*8975f5c5SAndroid Build Coastguard Worker         {
324*8975f5c5SAndroid Build Coastguard Worker             m2DArrayTextureProgram = CompileProgram(getVS2DArray(), getTexture2DArrayFS());
325*8975f5c5SAndroid Build Coastguard Worker             if (m2DArrayTextureProgram == 0)
326*8975f5c5SAndroid Build Coastguard Worker             {
327*8975f5c5SAndroid Build Coastguard Worker                 FAIL() << "shader compilation failed.";
328*8975f5c5SAndroid Build Coastguard Worker             }
329*8975f5c5SAndroid Build Coastguard Worker 
330*8975f5c5SAndroid Build Coastguard Worker             m2DArrayTextureUniformLocation =
331*8975f5c5SAndroid Build Coastguard Worker                 glGetUniformLocation(m2DArrayTextureProgram, "tex2DArray");
332*8975f5c5SAndroid Build Coastguard Worker             m2DArrayTextureLayerUniformLocation =
333*8975f5c5SAndroid Build Coastguard Worker                 glGetUniformLocation(m2DArrayTextureProgram, "layer");
334*8975f5c5SAndroid Build Coastguard Worker         }
335*8975f5c5SAndroid Build Coastguard Worker 
336*8975f5c5SAndroid Build Coastguard Worker         if (IsGLExtensionEnabled("GL_OES_EGL_image_external"))
337*8975f5c5SAndroid Build Coastguard Worker         {
338*8975f5c5SAndroid Build Coastguard Worker             mTextureExternalProgram = CompileProgram(getVS(), getTextureExternalFS());
339*8975f5c5SAndroid Build Coastguard Worker             ASSERT_NE(0u, mTextureExternalProgram) << "shader compilation failed.";
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker             mTextureExternalUniformLocation = glGetUniformLocation(mTextureExternalProgram, "tex");
342*8975f5c5SAndroid Build Coastguard Worker         }
343*8975f5c5SAndroid Build Coastguard Worker 
344*8975f5c5SAndroid Build Coastguard Worker         if (IsGLExtensionEnabled("GL_OES_EGL_image_external_essl3"))
345*8975f5c5SAndroid Build Coastguard Worker         {
346*8975f5c5SAndroid Build Coastguard Worker             mTextureExternalESSL3Program =
347*8975f5c5SAndroid Build Coastguard Worker                 CompileProgram(getVSESSL3(), getTextureExternalESSL3FS());
348*8975f5c5SAndroid Build Coastguard Worker             ASSERT_NE(0u, mTextureExternalESSL3Program) << "shader compilation failed.";
349*8975f5c5SAndroid Build Coastguard Worker 
350*8975f5c5SAndroid Build Coastguard Worker             mTextureExternalESSL3UniformLocation =
351*8975f5c5SAndroid Build Coastguard Worker                 glGetUniformLocation(mTextureExternalESSL3Program, "tex");
352*8975f5c5SAndroid Build Coastguard Worker         }
353*8975f5c5SAndroid Build Coastguard Worker 
354*8975f5c5SAndroid Build Coastguard Worker         if (IsGLExtensionEnabled(kYUVTargetExt))
355*8975f5c5SAndroid Build Coastguard Worker         {
356*8975f5c5SAndroid Build Coastguard Worker             mTextureYUVProgram = CompileProgram(getVSESSL3(), getTextureYUVFS());
357*8975f5c5SAndroid Build Coastguard Worker             ASSERT_NE(0u, mTextureYUVProgram) << "shader compilation failed.";
358*8975f5c5SAndroid Build Coastguard Worker 
359*8975f5c5SAndroid Build Coastguard Worker             mTextureYUVUniformLocation = glGetUniformLocation(mTextureYUVProgram, "tex");
360*8975f5c5SAndroid Build Coastguard Worker 
361*8975f5c5SAndroid Build Coastguard Worker             mRenderYUVProgram = CompileProgram(getVSESSL3(), getRenderYUVFS());
362*8975f5c5SAndroid Build Coastguard Worker             ASSERT_NE(0u, mRenderYUVProgram) << "shader compilation failed.";
363*8975f5c5SAndroid Build Coastguard Worker 
364*8975f5c5SAndroid Build Coastguard Worker             mRenderYUVUniformLocation = glGetUniformLocation(mRenderYUVProgram, "u_color");
365*8975f5c5SAndroid Build Coastguard Worker         }
366*8975f5c5SAndroid Build Coastguard Worker 
367*8975f5c5SAndroid Build Coastguard Worker         if (IsGLExtensionEnabled(kEGLImageStorageExt))
368*8975f5c5SAndroid Build Coastguard Worker         {
369*8975f5c5SAndroid Build Coastguard Worker             mCubeTextureProgram = CompileProgram(getVSCube(), getTextureCubeFS());
370*8975f5c5SAndroid Build Coastguard Worker             if (mCubeTextureProgram == 0)
371*8975f5c5SAndroid Build Coastguard Worker             {
372*8975f5c5SAndroid Build Coastguard Worker                 FAIL() << "shader compilation failed.";
373*8975f5c5SAndroid Build Coastguard Worker             }
374*8975f5c5SAndroid Build Coastguard Worker             mCubeTextureUniformLocation = glGetUniformLocation(mCubeTextureProgram, "texCube");
375*8975f5c5SAndroid Build Coastguard Worker             mCubeTextureFaceCoordUniformLocation =
376*8975f5c5SAndroid Build Coastguard Worker                 glGetUniformLocation(mCubeTextureProgram, "faceCoord");
377*8975f5c5SAndroid Build Coastguard Worker 
378*8975f5c5SAndroid Build Coastguard Worker             if ((getClientMajorVersion() >= 3 && getClientMinorVersion() >= 1) &&
379*8975f5c5SAndroid Build Coastguard Worker                 IsGLExtensionEnabled("GL_EXT_texture_cube_map_array"))
380*8975f5c5SAndroid Build Coastguard Worker             {
381*8975f5c5SAndroid Build Coastguard Worker                 mCubeArrayTextureProgram =
382*8975f5c5SAndroid Build Coastguard Worker                     CompileProgram(getVSCubeArray(), getTextureCubeArrayFS());
383*8975f5c5SAndroid Build Coastguard Worker                 if (mCubeArrayTextureProgram == 0)
384*8975f5c5SAndroid Build Coastguard Worker                 {
385*8975f5c5SAndroid Build Coastguard Worker                     FAIL() << "shader compilation failed.";
386*8975f5c5SAndroid Build Coastguard Worker                 }
387*8975f5c5SAndroid Build Coastguard Worker                 mCubeArrayTextureUniformLocation =
388*8975f5c5SAndroid Build Coastguard Worker                     glGetUniformLocation(mCubeArrayTextureProgram, "texCubeArray");
389*8975f5c5SAndroid Build Coastguard Worker                 mCubeArrayTextureFaceCoordUniformLocation =
390*8975f5c5SAndroid Build Coastguard Worker                     glGetUniformLocation(mCubeArrayTextureProgram, "faceCoord");
391*8975f5c5SAndroid Build Coastguard Worker                 mCubeArrayTextureLayerUniformLocation =
392*8975f5c5SAndroid Build Coastguard Worker                     glGetUniformLocation(mCubeArrayTextureProgram, "layer");
393*8975f5c5SAndroid Build Coastguard Worker             }
394*8975f5c5SAndroid Build Coastguard Worker         }
395*8975f5c5SAndroid Build Coastguard Worker 
396*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
397*8975f5c5SAndroid Build Coastguard Worker     }
398*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()399*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
400*8975f5c5SAndroid Build Coastguard Worker     {
401*8975f5c5SAndroid Build Coastguard Worker         glDeleteProgram(mTextureProgram);
402*8975f5c5SAndroid Build Coastguard Worker         glDeleteProgram(mTextureExternalProgram);
403*8975f5c5SAndroid Build Coastguard Worker         glDeleteProgram(mTextureExternalESSL3Program);
404*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0, 0, 0, 0);
405*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
406*8975f5c5SAndroid Build Coastguard Worker 
407*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
408*8975f5c5SAndroid Build Coastguard Worker     }
409*8975f5c5SAndroid Build Coastguard Worker 
410*8975f5c5SAndroid Build Coastguard Worker     // 1) For tests that sample from EGLImages with colorspace override -
411*8975f5c5SAndroid Build Coastguard Worker     //    1) Always upload color values in sRGB colorspace
412*8975f5c5SAndroid Build Coastguard Worker     //    2) The image should be treated as if it was an sRGB image resulting in
413*8975f5c5SAndroid Build Coastguard Worker     //       the sampled value to be to decoded to linear colorspace
414*8975f5c5SAndroid Build Coastguard Worker     //
415*8975f5c5SAndroid Build Coastguard Worker     // 2) For tests that render to EGLImages with colorspace override -
416*8975f5c5SAndroid Build Coastguard Worker     //    1) Always upload color values in linear colorspace
417*8975f5c5SAndroid Build Coastguard Worker     //    2) The image should be treated as if it was an sRGB image resulting in
418*8975f5c5SAndroid Build Coastguard Worker     //       the rendered color to be encoded in sRGB colorspace
419*8975f5c5SAndroid Build Coastguard Worker 
420*8975f5c5SAndroid Build Coastguard Worker     enum class EglImageUsage
421*8975f5c5SAndroid Build Coastguard Worker     {
422*8975f5c5SAndroid Build Coastguard Worker         Sampling,
423*8975f5c5SAndroid Build Coastguard Worker         Rendering
424*8975f5c5SAndroid Build Coastguard Worker     };
425*8975f5c5SAndroid Build Coastguard Worker 
attribListHasSrgbColorspace(const EGLint * attribs,const int colorspaceAttributeIndex) const426*8975f5c5SAndroid Build Coastguard Worker     bool attribListHasSrgbColorspace(const EGLint *attribs,
427*8975f5c5SAndroid Build Coastguard Worker                                      const int colorspaceAttributeIndex) const
428*8975f5c5SAndroid Build Coastguard Worker     {
429*8975f5c5SAndroid Build Coastguard Worker         return (attribs[colorspaceAttributeIndex] == EGL_GL_COLORSPACE &&
430*8975f5c5SAndroid Build Coastguard Worker                 attribs[colorspaceAttributeIndex + 1] == EGL_GL_COLORSPACE_SRGB_KHR);
431*8975f5c5SAndroid Build Coastguard Worker     }
432*8975f5c5SAndroid Build Coastguard Worker 
getExpected2DColorForAttribList(const EGLint * attribs,EglImageUsage usage=EglImageUsage::Sampling) const433*8975f5c5SAndroid Build Coastguard Worker     GLubyte *getExpected2DColorForAttribList(const EGLint *attribs,
434*8975f5c5SAndroid Build Coastguard Worker                                              EglImageUsage usage = EglImageUsage::Sampling) const
435*8975f5c5SAndroid Build Coastguard Worker     {
436*8975f5c5SAndroid Build Coastguard Worker         const bool srgbColorspace = attribListHasSrgbColorspace(attribs, kColorspaceAttributeIndex);
437*8975f5c5SAndroid Build Coastguard Worker         return (usage == EglImageUsage::Sampling) ? (srgbColorspace ? kLinearColor : kSrgbColor)
438*8975f5c5SAndroid Build Coastguard Worker                                                   : (srgbColorspace ? kSrgbColor : kLinearColor);
439*8975f5c5SAndroid Build Coastguard Worker     }
440*8975f5c5SAndroid Build Coastguard Worker 
getExpected3DColorForAttribList(const EGLint * attribs,EglImageUsage usage=EglImageUsage::Sampling) const441*8975f5c5SAndroid Build Coastguard Worker     GLubyte *getExpected3DColorForAttribList(const EGLint *attribs,
442*8975f5c5SAndroid Build Coastguard Worker                                              EglImageUsage usage = EglImageUsage::Sampling) const
443*8975f5c5SAndroid Build Coastguard Worker     {
444*8975f5c5SAndroid Build Coastguard Worker         const bool srgbColorspace =
445*8975f5c5SAndroid Build Coastguard Worker             attribListHasSrgbColorspace(attribs, k3DColorspaceAttributeIndex);
446*8975f5c5SAndroid Build Coastguard Worker         return (usage == EglImageUsage::Sampling)
447*8975f5c5SAndroid Build Coastguard Worker                    ? (srgbColorspace ? kLinearColor3D : kSrgbColor3D)
448*8975f5c5SAndroid Build Coastguard Worker                    : (srgbColorspace ? kSrgbColor3D : kLinearColor3D);
449*8975f5c5SAndroid Build Coastguard Worker     }
450*8975f5c5SAndroid Build Coastguard Worker 
getExpectedCubeColorForAttribList(const EGLint * attribs,EglImageUsage usage=EglImageUsage::Sampling) const451*8975f5c5SAndroid Build Coastguard Worker     GLubyte *getExpectedCubeColorForAttribList(const EGLint *attribs,
452*8975f5c5SAndroid Build Coastguard Worker                                                EglImageUsage usage = EglImageUsage::Sampling) const
453*8975f5c5SAndroid Build Coastguard Worker     {
454*8975f5c5SAndroid Build Coastguard Worker         const bool srgbColorspace = attribListHasSrgbColorspace(attribs, kColorspaceAttributeIndex);
455*8975f5c5SAndroid Build Coastguard Worker         return (usage == EglImageUsage::Sampling)
456*8975f5c5SAndroid Build Coastguard Worker                    ? (srgbColorspace ? kLinearColorCube : kSrgbColorCube)
457*8975f5c5SAndroid Build Coastguard Worker                    : (srgbColorspace ? kSrgbColorCube : kLinearColorCube);
458*8975f5c5SAndroid Build Coastguard Worker     }
459*8975f5c5SAndroid Build Coastguard Worker 
createEGLImage2DTextureStorage(size_t width,size_t height,GLenum format,const GLint * attribs,GLTexture & sourceTexture,EGLImageKHR * outSourceImage)460*8975f5c5SAndroid Build Coastguard Worker     void createEGLImage2DTextureStorage(size_t width,
461*8975f5c5SAndroid Build Coastguard Worker                                         size_t height,
462*8975f5c5SAndroid Build Coastguard Worker                                         GLenum format,
463*8975f5c5SAndroid Build Coastguard Worker                                         const GLint *attribs,
464*8975f5c5SAndroid Build Coastguard Worker                                         GLTexture &sourceTexture,
465*8975f5c5SAndroid Build Coastguard Worker                                         EGLImageKHR *outSourceImage)
466*8975f5c5SAndroid Build Coastguard Worker     {
467*8975f5c5SAndroid Build Coastguard Worker 
468*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, sourceTexture);
469*8975f5c5SAndroid Build Coastguard Worker         glTexStorageAttribs2DEXT(GL_TEXTURE_2D, 1, format, static_cast<GLsizei>(width),
470*8975f5c5SAndroid Build Coastguard Worker                                  static_cast<GLsizei>(height), attribs);
471*8975f5c5SAndroid Build Coastguard Worker 
472*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
473*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
474*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
475*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
476*8975f5c5SAndroid Build Coastguard Worker 
477*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
478*8975f5c5SAndroid Build Coastguard Worker 
479*8975f5c5SAndroid Build Coastguard Worker         // Create an image from the source texture
480*8975f5c5SAndroid Build Coastguard Worker         EGLWindow *window = getEGLWindow();
481*8975f5c5SAndroid Build Coastguard Worker 
482*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image =
483*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
484*8975f5c5SAndroid Build Coastguard Worker                               reinterpretHelper<EGLClientBuffer>(sourceTexture), nullptr);
485*8975f5c5SAndroid Build Coastguard Worker 
486*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
487*8975f5c5SAndroid Build Coastguard Worker 
488*8975f5c5SAndroid Build Coastguard Worker         *outSourceImage = image;
489*8975f5c5SAndroid Build Coastguard Worker     }
490*8975f5c5SAndroid Build Coastguard Worker 
createEGLImage2DTextureSource(size_t width,size_t height,GLenum format,GLenum type,const EGLint * attribs,void * data,GLTexture & sourceTexture,EGLImageKHR * outSourceImage)491*8975f5c5SAndroid Build Coastguard Worker     void createEGLImage2DTextureSource(size_t width,
492*8975f5c5SAndroid Build Coastguard Worker                                        size_t height,
493*8975f5c5SAndroid Build Coastguard Worker                                        GLenum format,
494*8975f5c5SAndroid Build Coastguard Worker                                        GLenum type,
495*8975f5c5SAndroid Build Coastguard Worker                                        const EGLint *attribs,
496*8975f5c5SAndroid Build Coastguard Worker                                        void *data,
497*8975f5c5SAndroid Build Coastguard Worker                                        GLTexture &sourceTexture,
498*8975f5c5SAndroid Build Coastguard Worker                                        EGLImageKHR *outSourceImage)
499*8975f5c5SAndroid Build Coastguard Worker     {
500*8975f5c5SAndroid Build Coastguard Worker         // Create a source 2D texture
501*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, sourceTexture);
502*8975f5c5SAndroid Build Coastguard Worker 
503*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, format, static_cast<GLsizei>(width),
504*8975f5c5SAndroid Build Coastguard Worker                      static_cast<GLsizei>(height), 0, format, type, data);
505*8975f5c5SAndroid Build Coastguard Worker 
506*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
507*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
508*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
509*8975f5c5SAndroid Build Coastguard Worker 
510*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
511*8975f5c5SAndroid Build Coastguard Worker 
512*8975f5c5SAndroid Build Coastguard Worker         // Create an image from the source texture
513*8975f5c5SAndroid Build Coastguard Worker         EGLWindow *window = getEGLWindow();
514*8975f5c5SAndroid Build Coastguard Worker 
515*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image =
516*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
517*8975f5c5SAndroid Build Coastguard Worker                               reinterpretHelper<EGLClientBuffer>(sourceTexture), attribs);
518*8975f5c5SAndroid Build Coastguard Worker 
519*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
520*8975f5c5SAndroid Build Coastguard Worker 
521*8975f5c5SAndroid Build Coastguard Worker         *outSourceImage = image;
522*8975f5c5SAndroid Build Coastguard Worker     }
523*8975f5c5SAndroid Build Coastguard Worker 
createEGLImageCubemapTextureSource(size_t width,size_t height,GLenum format,GLenum type,const EGLint * attribs,uint8_t * data,size_t dataStride,EGLenum imageTarget,GLTexture & sourceTexture,EGLImageKHR * outSourceImage)524*8975f5c5SAndroid Build Coastguard Worker     void createEGLImageCubemapTextureSource(size_t width,
525*8975f5c5SAndroid Build Coastguard Worker                                             size_t height,
526*8975f5c5SAndroid Build Coastguard Worker                                             GLenum format,
527*8975f5c5SAndroid Build Coastguard Worker                                             GLenum type,
528*8975f5c5SAndroid Build Coastguard Worker                                             const EGLint *attribs,
529*8975f5c5SAndroid Build Coastguard Worker                                             uint8_t *data,
530*8975f5c5SAndroid Build Coastguard Worker                                             size_t dataStride,
531*8975f5c5SAndroid Build Coastguard Worker                                             EGLenum imageTarget,
532*8975f5c5SAndroid Build Coastguard Worker                                             GLTexture &sourceTexture,
533*8975f5c5SAndroid Build Coastguard Worker                                             EGLImageKHR *outSourceImage)
534*8975f5c5SAndroid Build Coastguard Worker     {
535*8975f5c5SAndroid Build Coastguard Worker         // Create a source cube map texture
536*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, sourceTexture);
537*8975f5c5SAndroid Build Coastguard Worker 
538*8975f5c5SAndroid Build Coastguard Worker         for (GLenum faceIdx = 0; faceIdx < 6; faceIdx++)
539*8975f5c5SAndroid Build Coastguard Worker         {
540*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(faceIdx + GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, format,
541*8975f5c5SAndroid Build Coastguard Worker                          static_cast<GLsizei>(width), static_cast<GLsizei>(height), 0, format, type,
542*8975f5c5SAndroid Build Coastguard Worker                          data + (faceIdx * dataStride));
543*8975f5c5SAndroid Build Coastguard Worker         }
544*8975f5c5SAndroid Build Coastguard Worker 
545*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
546*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
547*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
548*8975f5c5SAndroid Build Coastguard Worker 
549*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
550*8975f5c5SAndroid Build Coastguard Worker 
551*8975f5c5SAndroid Build Coastguard Worker         // Create an image from the source texture
552*8975f5c5SAndroid Build Coastguard Worker         EGLWindow *window = getEGLWindow();
553*8975f5c5SAndroid Build Coastguard Worker 
554*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image =
555*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), window->getContext(), imageTarget,
556*8975f5c5SAndroid Build Coastguard Worker                               reinterpretHelper<EGLClientBuffer>(sourceTexture), attribs);
557*8975f5c5SAndroid Build Coastguard Worker 
558*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
559*8975f5c5SAndroid Build Coastguard Worker 
560*8975f5c5SAndroid Build Coastguard Worker         *outSourceImage = image;
561*8975f5c5SAndroid Build Coastguard Worker     }
562*8975f5c5SAndroid Build Coastguard Worker 
createEGLImage3DTextureSource(size_t width,size_t height,size_t depth,GLenum format,GLenum type,const EGLint * attribs,void * data,GLTexture & sourceTexture,EGLImageKHR * outSourceImage)563*8975f5c5SAndroid Build Coastguard Worker     void createEGLImage3DTextureSource(size_t width,
564*8975f5c5SAndroid Build Coastguard Worker                                        size_t height,
565*8975f5c5SAndroid Build Coastguard Worker                                        size_t depth,
566*8975f5c5SAndroid Build Coastguard Worker                                        GLenum format,
567*8975f5c5SAndroid Build Coastguard Worker                                        GLenum type,
568*8975f5c5SAndroid Build Coastguard Worker                                        const EGLint *attribs,
569*8975f5c5SAndroid Build Coastguard Worker                                        void *data,
570*8975f5c5SAndroid Build Coastguard Worker                                        GLTexture &sourceTexture,
571*8975f5c5SAndroid Build Coastguard Worker                                        EGLImageKHR *outSourceImage)
572*8975f5c5SAndroid Build Coastguard Worker     {
573*8975f5c5SAndroid Build Coastguard Worker         // Create a source 3D texture
574*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, sourceTexture);
575*8975f5c5SAndroid Build Coastguard Worker 
576*8975f5c5SAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, format, static_cast<GLsizei>(width),
577*8975f5c5SAndroid Build Coastguard Worker                      static_cast<GLsizei>(height), static_cast<GLsizei>(depth), 0, format, type,
578*8975f5c5SAndroid Build Coastguard Worker                      data);
579*8975f5c5SAndroid Build Coastguard Worker 
580*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
581*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
582*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
583*8975f5c5SAndroid Build Coastguard Worker 
584*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
585*8975f5c5SAndroid Build Coastguard Worker 
586*8975f5c5SAndroid Build Coastguard Worker         // Create an image from the source texture
587*8975f5c5SAndroid Build Coastguard Worker         EGLWindow *window = getEGLWindow();
588*8975f5c5SAndroid Build Coastguard Worker 
589*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image =
590*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_3D_KHR,
591*8975f5c5SAndroid Build Coastguard Worker                               reinterpretHelper<EGLClientBuffer>(sourceTexture), attribs);
592*8975f5c5SAndroid Build Coastguard Worker 
593*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
594*8975f5c5SAndroid Build Coastguard Worker 
595*8975f5c5SAndroid Build Coastguard Worker         *outSourceImage = image;
596*8975f5c5SAndroid Build Coastguard Worker     }
597*8975f5c5SAndroid Build Coastguard Worker 
createEGLImageRenderbufferSource(size_t width,size_t height,GLenum internalFormat,const EGLint * attribs,GLRenderbuffer & sourceRenderbuffer,EGLImageKHR * outSourceImage)598*8975f5c5SAndroid Build Coastguard Worker     void createEGLImageRenderbufferSource(size_t width,
599*8975f5c5SAndroid Build Coastguard Worker                                           size_t height,
600*8975f5c5SAndroid Build Coastguard Worker                                           GLenum internalFormat,
601*8975f5c5SAndroid Build Coastguard Worker                                           const EGLint *attribs,
602*8975f5c5SAndroid Build Coastguard Worker                                           GLRenderbuffer &sourceRenderbuffer,
603*8975f5c5SAndroid Build Coastguard Worker                                           EGLImageKHR *outSourceImage)
604*8975f5c5SAndroid Build Coastguard Worker     {
605*8975f5c5SAndroid Build Coastguard Worker         // Create a source renderbuffer
606*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, sourceRenderbuffer);
607*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, internalFormat, static_cast<GLsizei>(width),
608*8975f5c5SAndroid Build Coastguard Worker                               static_cast<GLsizei>(height));
609*8975f5c5SAndroid Build Coastguard Worker 
610*8975f5c5SAndroid Build Coastguard Worker         // Create an image from the source renderbuffer
611*8975f5c5SAndroid Build Coastguard Worker         EGLWindow *window = getEGLWindow();
612*8975f5c5SAndroid Build Coastguard Worker 
613*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image =
614*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_RENDERBUFFER_KHR,
615*8975f5c5SAndroid Build Coastguard Worker                               reinterpretHelper<EGLClientBuffer>(sourceRenderbuffer), attribs);
616*8975f5c5SAndroid Build Coastguard Worker 
617*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
618*8975f5c5SAndroid Build Coastguard Worker 
619*8975f5c5SAndroid Build Coastguard Worker         *outSourceImage = image;
620*8975f5c5SAndroid Build Coastguard Worker     }
621*8975f5c5SAndroid Build Coastguard Worker 
createEGLImageTargetTexture2D(EGLImageKHR image,GLTexture & targetTexture)622*8975f5c5SAndroid Build Coastguard Worker     void createEGLImageTargetTexture2D(EGLImageKHR image, GLTexture &targetTexture)
623*8975f5c5SAndroid Build Coastguard Worker     {
624*8975f5c5SAndroid Build Coastguard Worker         // Create a target texture from the image
625*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, targetTexture);
626*8975f5c5SAndroid Build Coastguard Worker         glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
627*8975f5c5SAndroid Build Coastguard Worker 
628*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
629*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
630*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
631*8975f5c5SAndroid Build Coastguard Worker 
632*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
633*8975f5c5SAndroid Build Coastguard Worker     }
634*8975f5c5SAndroid Build Coastguard Worker 
createEGLImageTargetTexture2DArray(EGLImageKHR image,GLTexture & targetTexture)635*8975f5c5SAndroid Build Coastguard Worker     void createEGLImageTargetTexture2DArray(EGLImageKHR image, GLTexture &targetTexture)
636*8975f5c5SAndroid Build Coastguard Worker     {
637*8975f5c5SAndroid Build Coastguard Worker         // Create a target texture from the image
638*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_ARRAY, targetTexture);
639*8975f5c5SAndroid Build Coastguard Worker         glEGLImageTargetTexture2DOES(GL_TEXTURE_2D_ARRAY, image);
640*8975f5c5SAndroid Build Coastguard Worker 
641*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
642*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
643*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
644*8975f5c5SAndroid Build Coastguard Worker 
645*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
646*8975f5c5SAndroid Build Coastguard Worker     }
647*8975f5c5SAndroid Build Coastguard Worker 
createEGLImageTargetTextureExternal(EGLImageKHR image,GLuint targetTexture)648*8975f5c5SAndroid Build Coastguard Worker     void createEGLImageTargetTextureExternal(EGLImageKHR image, GLuint targetTexture)
649*8975f5c5SAndroid Build Coastguard Worker     {
650*8975f5c5SAndroid Build Coastguard Worker         // Create a target texture from the image
651*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_EXTERNAL_OES, targetTexture);
652*8975f5c5SAndroid Build Coastguard Worker         glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image);
653*8975f5c5SAndroid Build Coastguard Worker 
654*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
655*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
656*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
657*8975f5c5SAndroid Build Coastguard Worker 
658*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
659*8975f5c5SAndroid Build Coastguard Worker     }
660*8975f5c5SAndroid Build Coastguard Worker 
createEGLImageTargetTextureStorage(EGLImageKHR image,GLenum targetType,GLuint targetTexture,const GLint * attribs)661*8975f5c5SAndroid Build Coastguard Worker     void createEGLImageTargetTextureStorage(EGLImageKHR image,
662*8975f5c5SAndroid Build Coastguard Worker                                             GLenum targetType,
663*8975f5c5SAndroid Build Coastguard Worker                                             GLuint targetTexture,
664*8975f5c5SAndroid Build Coastguard Worker                                             const GLint *attribs)
665*8975f5c5SAndroid Build Coastguard Worker     {
666*8975f5c5SAndroid Build Coastguard Worker         // Create a target texture from the image
667*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(targetType, targetTexture);
668*8975f5c5SAndroid Build Coastguard Worker         glEGLImageTargetTexStorageEXT(targetType, image, attribs);
669*8975f5c5SAndroid Build Coastguard Worker 
670*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
671*8975f5c5SAndroid Build Coastguard Worker 
672*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
673*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(targetType, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
674*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(targetType, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
675*8975f5c5SAndroid Build Coastguard Worker 
676*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
677*8975f5c5SAndroid Build Coastguard Worker     }
678*8975f5c5SAndroid Build Coastguard Worker 
getLayerPitch(size_t height,size_t rowStride)679*8975f5c5SAndroid Build Coastguard Worker     size_t getLayerPitch(size_t height, size_t rowStride)
680*8975f5c5SAndroid Build Coastguard Worker     {
681*8975f5c5SAndroid Build Coastguard Worker         // Undocumented alignment of layer stride.  This is potentially platform dependent, but
682*8975f5c5SAndroid Build Coastguard Worker         // allows functionality to be tested.
683*8975f5c5SAndroid Build Coastguard Worker         constexpr size_t kLayerAlignment = 4096;
684*8975f5c5SAndroid Build Coastguard Worker 
685*8975f5c5SAndroid Build Coastguard Worker         const size_t layerSize = height * rowStride;
686*8975f5c5SAndroid Build Coastguard Worker         return (layerSize + kLayerAlignment - 1) & ~(kLayerAlignment - 1);
687*8975f5c5SAndroid Build Coastguard Worker     }
688*8975f5c5SAndroid Build Coastguard Worker 
689*8975f5c5SAndroid Build Coastguard Worker     struct AHBPlaneData
690*8975f5c5SAndroid Build Coastguard Worker     {
691*8975f5c5SAndroid Build Coastguard Worker         const GLubyte *data;
692*8975f5c5SAndroid Build Coastguard Worker         size_t bytesPerPixel;
693*8975f5c5SAndroid Build Coastguard Worker     };
694*8975f5c5SAndroid Build Coastguard Worker 
695*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_SUPPORT)
writeAHBData(AHardwareBuffer * aHardwareBuffer,size_t width,size_t height,size_t depth,bool isYUV,const std::vector<AHBPlaneData> & data)696*8975f5c5SAndroid Build Coastguard Worker     bool writeAHBData(AHardwareBuffer *aHardwareBuffer,
697*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
698*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
699*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
700*8975f5c5SAndroid Build Coastguard Worker                       bool isYUV,
701*8975f5c5SAndroid Build Coastguard Worker                       const std::vector<AHBPlaneData> &data)
702*8975f5c5SAndroid Build Coastguard Worker     {
703*8975f5c5SAndroid Build Coastguard Worker         ASSERT(!data.empty());
704*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT)
705*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer_Planes planeInfo;
706*8975f5c5SAndroid Build Coastguard Worker         int res = AHardwareBuffer_lockPlanes(
707*8975f5c5SAndroid Build Coastguard Worker             aHardwareBuffer, AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY, -1, nullptr, &planeInfo);
708*8975f5c5SAndroid Build Coastguard Worker         if (res != 0)
709*8975f5c5SAndroid Build Coastguard Worker         {
710*8975f5c5SAndroid Build Coastguard Worker             WARN() << "AHardwareBuffer_lockPlanes failed";
711*8975f5c5SAndroid Build Coastguard Worker             return false;
712*8975f5c5SAndroid Build Coastguard Worker         }
713*8975f5c5SAndroid Build Coastguard Worker 
714*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(data.size(), planeInfo.planeCount);
715*8975f5c5SAndroid Build Coastguard Worker 
716*8975f5c5SAndroid Build Coastguard Worker         for (size_t planeIdx = 0; planeIdx < data.size(); planeIdx++)
717*8975f5c5SAndroid Build Coastguard Worker         {
718*8975f5c5SAndroid Build Coastguard Worker             const AHBPlaneData &planeData      = data[planeIdx];
719*8975f5c5SAndroid Build Coastguard Worker             const AHardwareBuffer_Plane &plane = planeInfo.planes[planeIdx];
720*8975f5c5SAndroid Build Coastguard Worker 
721*8975f5c5SAndroid Build Coastguard Worker             size_t planeHeight = (isYUV && planeIdx > 0) ? (height / 2) : height;
722*8975f5c5SAndroid Build Coastguard Worker             size_t planeWidth  = (isYUV && planeIdx > 0) ? (width / 2) : width;
723*8975f5c5SAndroid Build Coastguard Worker             size_t layerPitch  = getLayerPitch(planeHeight, plane.rowStride);
724*8975f5c5SAndroid Build Coastguard Worker 
725*8975f5c5SAndroid Build Coastguard Worker             for (size_t z = 0; z < depth; z++)
726*8975f5c5SAndroid Build Coastguard Worker             {
727*8975f5c5SAndroid Build Coastguard Worker                 const uint8_t *srcDepthSlice =
728*8975f5c5SAndroid Build Coastguard Worker                     reinterpret_cast<const uint8_t *>(planeData.data) +
729*8975f5c5SAndroid Build Coastguard Worker                     z * planeHeight * planeWidth * planeData.bytesPerPixel;
730*8975f5c5SAndroid Build Coastguard Worker 
731*8975f5c5SAndroid Build Coastguard Worker                 for (size_t y = 0; y < planeHeight; y++)
732*8975f5c5SAndroid Build Coastguard Worker                 {
733*8975f5c5SAndroid Build Coastguard Worker                     const uint8_t *srcRow =
734*8975f5c5SAndroid Build Coastguard Worker                         srcDepthSlice + y * planeWidth * planeData.bytesPerPixel;
735*8975f5c5SAndroid Build Coastguard Worker 
736*8975f5c5SAndroid Build Coastguard Worker                     for (size_t x = 0; x < planeWidth; x++)
737*8975f5c5SAndroid Build Coastguard Worker                     {
738*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *src = srcRow + x * planeData.bytesPerPixel;
739*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *dst = reinterpret_cast<uint8_t *>(plane.data) + z * layerPitch +
740*8975f5c5SAndroid Build Coastguard Worker                                        y * plane.rowStride + x * plane.pixelStride;
741*8975f5c5SAndroid Build Coastguard Worker                         memcpy(dst, src, planeData.bytesPerPixel);
742*8975f5c5SAndroid Build Coastguard Worker                     }
743*8975f5c5SAndroid Build Coastguard Worker                 }
744*8975f5c5SAndroid Build Coastguard Worker             }
745*8975f5c5SAndroid Build Coastguard Worker         }
746*8975f5c5SAndroid Build Coastguard Worker 
747*8975f5c5SAndroid Build Coastguard Worker         res = AHardwareBuffer_unlock(aHardwareBuffer, nullptr);
748*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(res, 0);
749*8975f5c5SAndroid Build Coastguard Worker #    else
750*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(1u, data.size());
751*8975f5c5SAndroid Build Coastguard Worker         void *mappedMemory = nullptr;
752*8975f5c5SAndroid Build Coastguard Worker         int res = AHardwareBuffer_lock(aHardwareBuffer, AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY, -1,
753*8975f5c5SAndroid Build Coastguard Worker                                        nullptr, &mappedMemory);
754*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(res, 0);
755*8975f5c5SAndroid Build Coastguard Worker 
756*8975f5c5SAndroid Build Coastguard Worker         // Need to grab the stride the implementation might have enforced
757*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer_Desc aHardwareBufferDescription = {};
758*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer_describe(aHardwareBuffer, &aHardwareBufferDescription);
759*8975f5c5SAndroid Build Coastguard Worker         const size_t stride = aHardwareBufferDescription.stride * data[0].bytesPerPixel;
760*8975f5c5SAndroid Build Coastguard Worker         size_t layerPitch   = getLayerPitch(height, stride);
761*8975f5c5SAndroid Build Coastguard Worker 
762*8975f5c5SAndroid Build Coastguard Worker         uint32_t rowSize = stride * height;
763*8975f5c5SAndroid Build Coastguard Worker         for (size_t z = 0; z < depth; z++)
764*8975f5c5SAndroid Build Coastguard Worker         {
765*8975f5c5SAndroid Build Coastguard Worker             for (uint32_t y = 0; y < height; y++)
766*8975f5c5SAndroid Build Coastguard Worker             {
767*8975f5c5SAndroid Build Coastguard Worker                 size_t dstPtrOffset = z * layerPitch + y * stride;
768*8975f5c5SAndroid Build Coastguard Worker                 size_t srcPtrOffset = (z * height + y) * width * data[0].bytesPerPixel;
769*8975f5c5SAndroid Build Coastguard Worker 
770*8975f5c5SAndroid Build Coastguard Worker                 uint8_t *dst = reinterpret_cast<uint8_t *>(mappedMemory) + dstPtrOffset;
771*8975f5c5SAndroid Build Coastguard Worker                 memcpy(dst, data[0].data + srcPtrOffset, rowSize);
772*8975f5c5SAndroid Build Coastguard Worker             }
773*8975f5c5SAndroid Build Coastguard Worker         }
774*8975f5c5SAndroid Build Coastguard Worker 
775*8975f5c5SAndroid Build Coastguard Worker         res = AHardwareBuffer_unlock(aHardwareBuffer, nullptr);
776*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(res, 0);
777*8975f5c5SAndroid Build Coastguard Worker #    endif
778*8975f5c5SAndroid Build Coastguard Worker         return true;
779*8975f5c5SAndroid Build Coastguard Worker     }
780*8975f5c5SAndroid Build Coastguard Worker #endif
781*8975f5c5SAndroid Build Coastguard Worker 
782*8975f5c5SAndroid Build Coastguard Worker     enum AHBUsage
783*8975f5c5SAndroid Build Coastguard Worker     {
784*8975f5c5SAndroid Build Coastguard Worker         kAHBUsageGPUSampledImage   = 1 << 0,
785*8975f5c5SAndroid Build Coastguard Worker         kAHBUsageGPUFramebuffer    = 1 << 1,
786*8975f5c5SAndroid Build Coastguard Worker         kAHBUsageGPUCubeMap        = 1 << 2,
787*8975f5c5SAndroid Build Coastguard Worker         kAHBUsageGPUMipMapComplete = 1 << 3,
788*8975f5c5SAndroid Build Coastguard Worker         kAHBUsageFrontBuffer       = 1 << 4,
789*8975f5c5SAndroid Build Coastguard Worker     };
790*8975f5c5SAndroid Build Coastguard Worker 
791*8975f5c5SAndroid Build Coastguard Worker     constexpr static uint32_t kDefaultAHBUsage = kAHBUsageGPUSampledImage | kAHBUsageGPUFramebuffer;
792*8975f5c5SAndroid Build Coastguard Worker     constexpr static uint32_t kDefaultAHBYUVUsage = kAHBUsageGPUSampledImage;
793*8975f5c5SAndroid Build Coastguard Worker 
794*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_SUPPORT)
createAndroidHardwareBufferDesc(size_t width,size_t height,size_t depth,int androidFormat,uint32_t usage)795*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer_Desc createAndroidHardwareBufferDesc(size_t width,
796*8975f5c5SAndroid Build Coastguard Worker                                                          size_t height,
797*8975f5c5SAndroid Build Coastguard Worker                                                          size_t depth,
798*8975f5c5SAndroid Build Coastguard Worker                                                          int androidFormat,
799*8975f5c5SAndroid Build Coastguard Worker                                                          uint32_t usage)
800*8975f5c5SAndroid Build Coastguard Worker     {
801*8975f5c5SAndroid Build Coastguard Worker         // The height and width are number of pixels of size format
802*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer_Desc aHardwareBufferDescription = {};
803*8975f5c5SAndroid Build Coastguard Worker         aHardwareBufferDescription.width                = width;
804*8975f5c5SAndroid Build Coastguard Worker         aHardwareBufferDescription.height               = height;
805*8975f5c5SAndroid Build Coastguard Worker         aHardwareBufferDescription.layers               = depth;
806*8975f5c5SAndroid Build Coastguard Worker         aHardwareBufferDescription.format               = androidFormat;
807*8975f5c5SAndroid Build Coastguard Worker         aHardwareBufferDescription.usage                = AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY;
808*8975f5c5SAndroid Build Coastguard Worker         if ((usage & kAHBUsageGPUSampledImage) != 0)
809*8975f5c5SAndroid Build Coastguard Worker         {
810*8975f5c5SAndroid Build Coastguard Worker             aHardwareBufferDescription.usage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
811*8975f5c5SAndroid Build Coastguard Worker         }
812*8975f5c5SAndroid Build Coastguard Worker         if ((usage & kAHBUsageGPUFramebuffer) != 0)
813*8975f5c5SAndroid Build Coastguard Worker         {
814*8975f5c5SAndroid Build Coastguard Worker             aHardwareBufferDescription.usage |= AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER;
815*8975f5c5SAndroid Build Coastguard Worker         }
816*8975f5c5SAndroid Build Coastguard Worker         if ((usage & kAHBUsageGPUCubeMap) != 0)
817*8975f5c5SAndroid Build Coastguard Worker         {
818*8975f5c5SAndroid Build Coastguard Worker             aHardwareBufferDescription.usage |= AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP;
819*8975f5c5SAndroid Build Coastguard Worker         }
820*8975f5c5SAndroid Build Coastguard Worker         if ((usage & kAHBUsageGPUMipMapComplete) != 0)
821*8975f5c5SAndroid Build Coastguard Worker         {
822*8975f5c5SAndroid Build Coastguard Worker             aHardwareBufferDescription.usage |= AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE;
823*8975f5c5SAndroid Build Coastguard Worker         }
824*8975f5c5SAndroid Build Coastguard Worker         if ((usage & kAHBUsageFrontBuffer) != 0)
825*8975f5c5SAndroid Build Coastguard Worker         {
826*8975f5c5SAndroid Build Coastguard Worker             aHardwareBufferDescription.usage |= ANGLE_AHARDWAREBUFFER_USAGE_FRONT_BUFFER;
827*8975f5c5SAndroid Build Coastguard Worker         }
828*8975f5c5SAndroid Build Coastguard Worker         aHardwareBufferDescription.stride = 0;
829*8975f5c5SAndroid Build Coastguard Worker         aHardwareBufferDescription.rfu0   = 0;
830*8975f5c5SAndroid Build Coastguard Worker         aHardwareBufferDescription.rfu1   = 0;
831*8975f5c5SAndroid Build Coastguard Worker         return aHardwareBufferDescription;
832*8975f5c5SAndroid Build Coastguard Worker     }
833*8975f5c5SAndroid Build Coastguard Worker #endif
834*8975f5c5SAndroid Build Coastguard Worker 
isAndroidHardwareBufferConfigurationSupported(size_t width,size_t height,size_t depth,int androidFormat,uint32_t usage)835*8975f5c5SAndroid Build Coastguard Worker     bool isAndroidHardwareBufferConfigurationSupported(size_t width,
836*8975f5c5SAndroid Build Coastguard Worker                                                        size_t height,
837*8975f5c5SAndroid Build Coastguard Worker                                                        size_t depth,
838*8975f5c5SAndroid Build Coastguard Worker                                                        int androidFormat,
839*8975f5c5SAndroid Build Coastguard Worker                                                        uint32_t usage)
840*8975f5c5SAndroid Build Coastguard Worker     {
841*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_SUPPORT)
842*8975f5c5SAndroid Build Coastguard Worker         const AHardwareBuffer_Desc aHardwareBufferDescription =
843*8975f5c5SAndroid Build Coastguard Worker             createAndroidHardwareBufferDesc(width, height, depth, androidFormat, usage);
844*8975f5c5SAndroid Build Coastguard Worker         return AHardwareBuffer_isSupported(&aHardwareBufferDescription);
845*8975f5c5SAndroid Build Coastguard Worker #else
846*8975f5c5SAndroid Build Coastguard Worker         return false;
847*8975f5c5SAndroid Build Coastguard Worker #endif
848*8975f5c5SAndroid Build Coastguard Worker     }
849*8975f5c5SAndroid Build Coastguard Worker 
createAndroidHardwareBuffer(size_t width,size_t height,size_t depth,int androidFormat,uint32_t usage,const std::vector<AHBPlaneData> & data)850*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *createAndroidHardwareBuffer(size_t width,
851*8975f5c5SAndroid Build Coastguard Worker                                                  size_t height,
852*8975f5c5SAndroid Build Coastguard Worker                                                  size_t depth,
853*8975f5c5SAndroid Build Coastguard Worker                                                  int androidFormat,
854*8975f5c5SAndroid Build Coastguard Worker                                                  uint32_t usage,
855*8975f5c5SAndroid Build Coastguard Worker                                                  const std::vector<AHBPlaneData> &data)
856*8975f5c5SAndroid Build Coastguard Worker     {
857*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_SUPPORT)
858*8975f5c5SAndroid Build Coastguard Worker         const AHardwareBuffer_Desc aHardwareBufferDescription =
859*8975f5c5SAndroid Build Coastguard Worker             createAndroidHardwareBufferDesc(width, height, depth, androidFormat, usage);
860*8975f5c5SAndroid Build Coastguard Worker 
861*8975f5c5SAndroid Build Coastguard Worker         // Allocate memory from Android Hardware Buffer
862*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer *aHardwareBuffer = nullptr;
863*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(0, AHardwareBuffer_allocate(&aHardwareBufferDescription, &aHardwareBuffer));
864*8975f5c5SAndroid Build Coastguard Worker 
865*8975f5c5SAndroid Build Coastguard Worker         if (!data.empty())
866*8975f5c5SAndroid Build Coastguard Worker         {
867*8975f5c5SAndroid Build Coastguard Worker             const bool isYUV = androidFormat == AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 ||
868*8975f5c5SAndroid Build Coastguard Worker                                androidFormat == AHARDWAREBUFFER_FORMAT_YV12;
869*8975f5c5SAndroid Build Coastguard Worker             writeAHBData(aHardwareBuffer, width, height, depth, isYUV, data);
870*8975f5c5SAndroid Build Coastguard Worker         }
871*8975f5c5SAndroid Build Coastguard Worker 
872*8975f5c5SAndroid Build Coastguard Worker         return aHardwareBuffer;
873*8975f5c5SAndroid Build Coastguard Worker #else
874*8975f5c5SAndroid Build Coastguard Worker         return nullptr;
875*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLE_PLATFORM_ANDROID
876*8975f5c5SAndroid Build Coastguard Worker     }
877*8975f5c5SAndroid Build Coastguard Worker 
destroyAndroidHardwareBuffer(AHardwareBuffer * aHardwarebuffer)878*8975f5c5SAndroid Build Coastguard Worker     void destroyAndroidHardwareBuffer(AHardwareBuffer *aHardwarebuffer)
879*8975f5c5SAndroid Build Coastguard Worker     {
880*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_SUPPORT)
881*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer_release(aHardwarebuffer);
882*8975f5c5SAndroid Build Coastguard Worker #endif
883*8975f5c5SAndroid Build Coastguard Worker     }
884*8975f5c5SAndroid Build Coastguard Worker 
createEGLImageAndroidHardwareBufferSource(size_t width,size_t height,size_t depth,int androidPixelFormat,uint32_t usage,const EGLint * attribs,const std::vector<AHBPlaneData> & data,AHardwareBuffer ** outSourceAHB,EGLImageKHR * outSourceImage)885*8975f5c5SAndroid Build Coastguard Worker     void createEGLImageAndroidHardwareBufferSource(size_t width,
886*8975f5c5SAndroid Build Coastguard Worker                                                    size_t height,
887*8975f5c5SAndroid Build Coastguard Worker                                                    size_t depth,
888*8975f5c5SAndroid Build Coastguard Worker                                                    int androidPixelFormat,
889*8975f5c5SAndroid Build Coastguard Worker                                                    uint32_t usage,
890*8975f5c5SAndroid Build Coastguard Worker                                                    const EGLint *attribs,
891*8975f5c5SAndroid Build Coastguard Worker                                                    const std::vector<AHBPlaneData> &data,
892*8975f5c5SAndroid Build Coastguard Worker                                                    AHardwareBuffer **outSourceAHB,
893*8975f5c5SAndroid Build Coastguard Worker                                                    EGLImageKHR *outSourceImage)
894*8975f5c5SAndroid Build Coastguard Worker     {
895*8975f5c5SAndroid Build Coastguard Worker         // Set Android Memory
896*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer *aHardwareBuffer =
897*8975f5c5SAndroid Build Coastguard Worker             createAndroidHardwareBuffer(width, height, depth, androidPixelFormat, usage, data);
898*8975f5c5SAndroid Build Coastguard Worker         EXPECT_NE(aHardwareBuffer, nullptr);
899*8975f5c5SAndroid Build Coastguard Worker 
900*8975f5c5SAndroid Build Coastguard Worker         // Create an image from the source AHB
901*8975f5c5SAndroid Build Coastguard Worker         EGLWindow *window = getEGLWindow();
902*8975f5c5SAndroid Build Coastguard Worker 
903*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image = eglCreateImageKHR(
904*8975f5c5SAndroid Build Coastguard Worker             window->getDisplay(), EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
905*8975f5c5SAndroid Build Coastguard Worker             angle::android::AHardwareBufferToClientBuffer(aHardwareBuffer), attribs);
906*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
907*8975f5c5SAndroid Build Coastguard Worker 
908*8975f5c5SAndroid Build Coastguard Worker         *outSourceAHB   = aHardwareBuffer;
909*8975f5c5SAndroid Build Coastguard Worker         *outSourceImage = image;
910*8975f5c5SAndroid Build Coastguard Worker     }
911*8975f5c5SAndroid Build Coastguard Worker 
createEGLImageANWBClientBufferSource(size_t width,size_t height,size_t depth,const EGLint * attribsANWB,const EGLint * attribsImage,const std::vector<AHBPlaneData> & data,EGLImageKHR * outSourceImage)912*8975f5c5SAndroid Build Coastguard Worker     void createEGLImageANWBClientBufferSource(size_t width,
913*8975f5c5SAndroid Build Coastguard Worker                                               size_t height,
914*8975f5c5SAndroid Build Coastguard Worker                                               size_t depth,
915*8975f5c5SAndroid Build Coastguard Worker                                               const EGLint *attribsANWB,
916*8975f5c5SAndroid Build Coastguard Worker                                               const EGLint *attribsImage,
917*8975f5c5SAndroid Build Coastguard Worker                                               const std::vector<AHBPlaneData> &data,
918*8975f5c5SAndroid Build Coastguard Worker                                               EGLImageKHR *outSourceImage)
919*8975f5c5SAndroid Build Coastguard Worker     {
920*8975f5c5SAndroid Build Coastguard Worker         // Set Android Memory
921*8975f5c5SAndroid Build Coastguard Worker 
922*8975f5c5SAndroid Build Coastguard Worker         EGLClientBuffer eglClientBuffer = eglCreateNativeClientBufferANDROID(attribsANWB);
923*8975f5c5SAndroid Build Coastguard Worker         EXPECT_NE(eglClientBuffer, nullptr);
924*8975f5c5SAndroid Build Coastguard Worker 
925*8975f5c5SAndroid Build Coastguard Worker         // allocate AHB memory
926*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_SUPPORT)
927*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer *pAHardwareBuffer = angle::android::ANativeWindowBufferToAHardwareBuffer(
928*8975f5c5SAndroid Build Coastguard Worker             angle::android::ClientBufferToANativeWindowBuffer(eglClientBuffer));
929*8975f5c5SAndroid Build Coastguard Worker         if (!data.empty())
930*8975f5c5SAndroid Build Coastguard Worker         {
931*8975f5c5SAndroid Build Coastguard Worker             bool success = writeAHBData(pAHardwareBuffer, width, height, depth, false, data);
932*8975f5c5SAndroid Build Coastguard Worker             if (!success)
933*8975f5c5SAndroid Build Coastguard Worker             {
934*8975f5c5SAndroid Build Coastguard Worker                 return;
935*8975f5c5SAndroid Build Coastguard Worker             }
936*8975f5c5SAndroid Build Coastguard Worker         }
937*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLE_AHARDWARE_BUFFER_SUPPORT
938*8975f5c5SAndroid Build Coastguard Worker 
939*8975f5c5SAndroid Build Coastguard Worker         // Create an image from the source eglClientBuffer
940*8975f5c5SAndroid Build Coastguard Worker         EGLWindow *window = getEGLWindow();
941*8975f5c5SAndroid Build Coastguard Worker 
942*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image =
943*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
944*8975f5c5SAndroid Build Coastguard Worker                               eglClientBuffer, attribsImage);
945*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
946*8975f5c5SAndroid Build Coastguard Worker 
947*8975f5c5SAndroid Build Coastguard Worker         *outSourceImage = image;
948*8975f5c5SAndroid Build Coastguard Worker     }
949*8975f5c5SAndroid Build Coastguard Worker 
createEGLImageTargetRenderbuffer(EGLImageKHR image,GLuint targetRenderbuffer)950*8975f5c5SAndroid Build Coastguard Worker     void createEGLImageTargetRenderbuffer(EGLImageKHR image, GLuint targetRenderbuffer)
951*8975f5c5SAndroid Build Coastguard Worker     {
952*8975f5c5SAndroid Build Coastguard Worker         // Create a target texture from the image
953*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, targetRenderbuffer);
954*8975f5c5SAndroid Build Coastguard Worker         glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, image);
955*8975f5c5SAndroid Build Coastguard Worker 
956*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
957*8975f5c5SAndroid Build Coastguard Worker     }
958*8975f5c5SAndroid Build Coastguard Worker 
959*8975f5c5SAndroid Build Coastguard Worker     void ValidationGLEGLImage_helper(const EGLint *attribs);
960*8975f5c5SAndroid Build Coastguard Worker     void SourceAHBTarget2D_helper(const EGLint *attribs);
961*8975f5c5SAndroid Build Coastguard Worker     void SourceAHBTarget2DImageStorageGenerateMipmap_helper(const EGLint *attribs);
962*8975f5c5SAndroid Build Coastguard Worker     void SourceAHBTarget2DArray_helper(const EGLint *attribs);
963*8975f5c5SAndroid Build Coastguard Worker     void SourceAHBTargetExternal_helper(const EGLint *attribs);
964*8975f5c5SAndroid Build Coastguard Worker     void SourceAHBTargetExternalESSL3_helper(const EGLint *attribs);
965*8975f5c5SAndroid Build Coastguard Worker     void SourceNativeClientBufferTargetExternal_helper(const EGLint *attribs);
966*8975f5c5SAndroid Build Coastguard Worker     void SourceNativeClientBufferTargetRenderbuffer_helper(const EGLint *attribs);
967*8975f5c5SAndroid Build Coastguard Worker     void Source2DTarget2D_helper(const EGLint *attribs);
968*8975f5c5SAndroid Build Coastguard Worker     void Source2DTarget2DArray_helper(const EGLint *attribs);
969*8975f5c5SAndroid Build Coastguard Worker     void Source2DTargetRenderbuffer_helper(const EGLint *attribs);
970*8975f5c5SAndroid Build Coastguard Worker     void Source2DTargetExternal_helper(const EGLint *attribs);
971*8975f5c5SAndroid Build Coastguard Worker     void Source2DTargetExternalESSL3_helper(const EGLint *attribs);
972*8975f5c5SAndroid Build Coastguard Worker     void SourceCubeTarget2D_helper(const EGLint *attribs);
973*8975f5c5SAndroid Build Coastguard Worker     void SourceCubeTargetRenderbuffer_helper(const EGLint *attribs);
974*8975f5c5SAndroid Build Coastguard Worker     void SourceCubeTargetExternal_helper(const EGLint *attribs);
975*8975f5c5SAndroid Build Coastguard Worker     void SourceCubeTargetExternalESSL3_helper(const EGLint *attribs);
976*8975f5c5SAndroid Build Coastguard Worker     void Source3DTargetTexture_helper(EGLint *attribs);
977*8975f5c5SAndroid Build Coastguard Worker     void Source3DTargetRenderbuffer_helper(EGLint *attribs);
978*8975f5c5SAndroid Build Coastguard Worker     void Source3DTargetExternal_helper(EGLint *attribs);
979*8975f5c5SAndroid Build Coastguard Worker     void Source3DTargetExternalESSL3_helper(EGLint *attribs);
980*8975f5c5SAndroid Build Coastguard Worker     void SourceRenderbufferTargetTexture_helper(const EGLint *attribs);
981*8975f5c5SAndroid Build Coastguard Worker     void SourceRenderbufferTargetTextureExternal_helper(const EGLint *attribs);
982*8975f5c5SAndroid Build Coastguard Worker     void SourceRenderbufferTargetRenderbuffer_helper(const EGLint *attribs);
983*8975f5c5SAndroid Build Coastguard Worker     void FixedRatedCompressionBasicHelper(const GLint *attribs);
984*8975f5c5SAndroid Build Coastguard Worker     void FixedRatedCompressionImageAttribCheck(EGLImageKHR image,
985*8975f5c5SAndroid Build Coastguard Worker                                                const GLint *attribs,
986*8975f5c5SAndroid Build Coastguard Worker                                                const GLint expectResult);
987*8975f5c5SAndroid Build Coastguard Worker     void SourceRenderbufferTargetTextureExternalESSL3_helper(const EGLint *attribs);
988*8975f5c5SAndroid Build Coastguard Worker     void ImageStorageGenerateMipmap_helper(const EGLint *attribs,
989*8975f5c5SAndroid Build Coastguard Worker                                            const GLsizei width,
990*8975f5c5SAndroid Build Coastguard Worker                                            const GLsizei height,
991*8975f5c5SAndroid Build Coastguard Worker                                            AHardwareBuffer *srcAhb,
992*8975f5c5SAndroid Build Coastguard Worker                                            GLuint srcTexture,
993*8975f5c5SAndroid Build Coastguard Worker                                            EGLImageKHR *imageOut);
994*8975f5c5SAndroid Build Coastguard Worker     void verifyImageStorageMipmap(const EGLint *attribs,
995*8975f5c5SAndroid Build Coastguard Worker                                   EGLImageKHR image,
996*8975f5c5SAndroid Build Coastguard Worker                                   const GLsizei mipLevelCount);
997*8975f5c5SAndroid Build Coastguard Worker     void verifyImageStorageMipmapWithBlend(const EGLint *attribs,
998*8975f5c5SAndroid Build Coastguard Worker                                            EGLImageKHR image,
999*8975f5c5SAndroid Build Coastguard Worker                                            const GLsizei mipLevelCount);
verifyResultsTexture(GLuint texture,const GLubyte referenceColor[4],GLenum textureTarget,GLuint program,GLuint textureUniform)1000*8975f5c5SAndroid Build Coastguard Worker     void verifyResultsTexture(GLuint texture,
1001*8975f5c5SAndroid Build Coastguard Worker                               const GLubyte referenceColor[4],
1002*8975f5c5SAndroid Build Coastguard Worker                               GLenum textureTarget,
1003*8975f5c5SAndroid Build Coastguard Worker                               GLuint program,
1004*8975f5c5SAndroid Build Coastguard Worker                               GLuint textureUniform)
1005*8975f5c5SAndroid Build Coastguard Worker     {
1006*8975f5c5SAndroid Build Coastguard Worker         // Draw a quad with the target texture
1007*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
1008*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(textureTarget, texture);
1009*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(textureUniform, 0);
1010*8975f5c5SAndroid Build Coastguard Worker 
1011*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "position", 0.5f);
1012*8975f5c5SAndroid Build Coastguard Worker 
1013*8975f5c5SAndroid Build Coastguard Worker         // Expect that the rendered quad's color is the same as the reference color with a tolerance
1014*8975f5c5SAndroid Build Coastguard Worker         // of 2
1015*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(0, 0, referenceColor[0], referenceColor[1], referenceColor[2],
1016*8975f5c5SAndroid Build Coastguard Worker                           referenceColor[3], 2);
1017*8975f5c5SAndroid Build Coastguard Worker     }
1018*8975f5c5SAndroid Build Coastguard Worker 
verifyResultsTextureLeftAndRight(GLuint texture,const GLubyte leftColor[4],const GLubyte rightColor[4],GLenum textureTarget,GLuint program,GLuint textureUniform)1019*8975f5c5SAndroid Build Coastguard Worker     void verifyResultsTextureLeftAndRight(GLuint texture,
1020*8975f5c5SAndroid Build Coastguard Worker                                           const GLubyte leftColor[4],
1021*8975f5c5SAndroid Build Coastguard Worker                                           const GLubyte rightColor[4],
1022*8975f5c5SAndroid Build Coastguard Worker                                           GLenum textureTarget,
1023*8975f5c5SAndroid Build Coastguard Worker                                           GLuint program,
1024*8975f5c5SAndroid Build Coastguard Worker                                           GLuint textureUniform)
1025*8975f5c5SAndroid Build Coastguard Worker     {
1026*8975f5c5SAndroid Build Coastguard Worker         verifyResultsTexture(texture, leftColor, textureTarget, program, textureUniform);
1027*8975f5c5SAndroid Build Coastguard Worker 
1028*8975f5c5SAndroid Build Coastguard Worker         // verifyResultsTexture only verifies top-left. Here also verifies top-right.
1029*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(getWindowWidth() - 1, 0, rightColor[0], rightColor[1], rightColor[2],
1030*8975f5c5SAndroid Build Coastguard Worker                           rightColor[3], 1);
1031*8975f5c5SAndroid Build Coastguard Worker     }
1032*8975f5c5SAndroid Build Coastguard Worker 
verifyResults2D(GLuint texture,const GLubyte data[4])1033*8975f5c5SAndroid Build Coastguard Worker     void verifyResults2D(GLuint texture, const GLubyte data[4])
1034*8975f5c5SAndroid Build Coastguard Worker     {
1035*8975f5c5SAndroid Build Coastguard Worker         verifyResultsTexture(texture, data, GL_TEXTURE_2D, mTextureProgram,
1036*8975f5c5SAndroid Build Coastguard Worker                              mTextureUniformLocation);
1037*8975f5c5SAndroid Build Coastguard Worker     }
1038*8975f5c5SAndroid Build Coastguard Worker 
verifyResults2DLeftAndRight(GLuint texture,const GLubyte left[4],const GLubyte right[4])1039*8975f5c5SAndroid Build Coastguard Worker     void verifyResults2DLeftAndRight(GLuint texture, const GLubyte left[4], const GLubyte right[4])
1040*8975f5c5SAndroid Build Coastguard Worker     {
1041*8975f5c5SAndroid Build Coastguard Worker         verifyResultsTextureLeftAndRight(texture, left, right, GL_TEXTURE_2D, mTextureProgram,
1042*8975f5c5SAndroid Build Coastguard Worker                                          mTextureUniformLocation);
1043*8975f5c5SAndroid Build Coastguard Worker     }
1044*8975f5c5SAndroid Build Coastguard Worker 
verifyResults2DArray(GLuint texture,const GLubyte data[4],uint32_t layerIndex=0)1045*8975f5c5SAndroid Build Coastguard Worker     void verifyResults2DArray(GLuint texture, const GLubyte data[4], uint32_t layerIndex = 0)
1046*8975f5c5SAndroid Build Coastguard Worker     {
1047*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(m2DArrayTextureProgram);
1048*8975f5c5SAndroid Build Coastguard Worker         glUniform1ui(m2DArrayTextureLayerUniformLocation, layerIndex);
1049*8975f5c5SAndroid Build Coastguard Worker 
1050*8975f5c5SAndroid Build Coastguard Worker         verifyResultsTexture(texture, data, GL_TEXTURE_2D_ARRAY, m2DArrayTextureProgram,
1051*8975f5c5SAndroid Build Coastguard Worker                              m2DArrayTextureUniformLocation);
1052*8975f5c5SAndroid Build Coastguard Worker     }
1053*8975f5c5SAndroid Build Coastguard Worker 
verifyResultsCube(GLuint texture,const GLubyte data[4],uint32_t faceIndex=0)1054*8975f5c5SAndroid Build Coastguard Worker     void verifyResultsCube(GLuint texture, const GLubyte data[4], uint32_t faceIndex = 0)
1055*8975f5c5SAndroid Build Coastguard Worker     {
1056*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mCubeTextureProgram);
1057*8975f5c5SAndroid Build Coastguard Worker         glUniform3f(mCubeTextureFaceCoordUniformLocation, kCubeFaceX[faceIndex],
1058*8975f5c5SAndroid Build Coastguard Worker                     kCubeFaceY[faceIndex], kCubeFaceZ[faceIndex]);
1059*8975f5c5SAndroid Build Coastguard Worker 
1060*8975f5c5SAndroid Build Coastguard Worker         verifyResultsTexture(texture, data, GL_TEXTURE_CUBE_MAP, mCubeTextureProgram,
1061*8975f5c5SAndroid Build Coastguard Worker                              mCubeTextureUniformLocation);
1062*8975f5c5SAndroid Build Coastguard Worker     }
1063*8975f5c5SAndroid Build Coastguard Worker 
verifyResultsCubeArray(GLuint texture,const GLubyte data[4],uint32_t faceIndex=0,uint32_t layerIndex=0)1064*8975f5c5SAndroid Build Coastguard Worker     void verifyResultsCubeArray(GLuint texture,
1065*8975f5c5SAndroid Build Coastguard Worker                                 const GLubyte data[4],
1066*8975f5c5SAndroid Build Coastguard Worker                                 uint32_t faceIndex  = 0,
1067*8975f5c5SAndroid Build Coastguard Worker                                 uint32_t layerIndex = 0)
1068*8975f5c5SAndroid Build Coastguard Worker     {
1069*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mCubeArrayTextureProgram);
1070*8975f5c5SAndroid Build Coastguard Worker         glUniform1ui(mCubeArrayTextureLayerUniformLocation, layerIndex);
1071*8975f5c5SAndroid Build Coastguard Worker         glUniform3f(mCubeArrayTextureFaceCoordUniformLocation, kCubeFaceX[faceIndex],
1072*8975f5c5SAndroid Build Coastguard Worker                     kCubeFaceY[faceIndex], kCubeFaceZ[faceIndex]);
1073*8975f5c5SAndroid Build Coastguard Worker 
1074*8975f5c5SAndroid Build Coastguard Worker         verifyResultsTexture(texture, data, GL_TEXTURE_CUBE_MAP_ARRAY, mCubeArrayTextureProgram,
1075*8975f5c5SAndroid Build Coastguard Worker                              mCubeArrayTextureUniformLocation);
1076*8975f5c5SAndroid Build Coastguard Worker     }
1077*8975f5c5SAndroid Build Coastguard Worker 
verifyResultsExternal(GLuint texture,const GLubyte data[4])1078*8975f5c5SAndroid Build Coastguard Worker     void verifyResultsExternal(GLuint texture, const GLubyte data[4])
1079*8975f5c5SAndroid Build Coastguard Worker     {
1080*8975f5c5SAndroid Build Coastguard Worker         verifyResultsTexture(texture, data, GL_TEXTURE_EXTERNAL_OES, mTextureExternalProgram,
1081*8975f5c5SAndroid Build Coastguard Worker                              mTextureExternalUniformLocation);
1082*8975f5c5SAndroid Build Coastguard Worker     }
1083*8975f5c5SAndroid Build Coastguard Worker 
verifyResultsExternalESSL3(GLuint texture,const GLubyte data[4])1084*8975f5c5SAndroid Build Coastguard Worker     void verifyResultsExternalESSL3(GLuint texture, const GLubyte data[4])
1085*8975f5c5SAndroid Build Coastguard Worker     {
1086*8975f5c5SAndroid Build Coastguard Worker         verifyResultsTexture(texture, data, GL_TEXTURE_EXTERNAL_OES, mTextureExternalESSL3Program,
1087*8975f5c5SAndroid Build Coastguard Worker                              mTextureExternalESSL3UniformLocation);
1088*8975f5c5SAndroid Build Coastguard Worker     }
1089*8975f5c5SAndroid Build Coastguard Worker 
verifyResultsExternalYUV(GLuint texture,const GLubyte data[4])1090*8975f5c5SAndroid Build Coastguard Worker     void verifyResultsExternalYUV(GLuint texture, const GLubyte data[4])
1091*8975f5c5SAndroid Build Coastguard Worker     {
1092*8975f5c5SAndroid Build Coastguard Worker         verifyResultsTexture(texture, data, GL_TEXTURE_EXTERNAL_OES, mTextureYUVProgram,
1093*8975f5c5SAndroid Build Coastguard Worker                              mTextureYUVUniformLocation);
1094*8975f5c5SAndroid Build Coastguard Worker     }
1095*8975f5c5SAndroid Build Coastguard Worker 
verifyResultsRenderbuffer(GLuint renderbuffer,GLubyte referenceColor[4])1096*8975f5c5SAndroid Build Coastguard Worker     void verifyResultsRenderbuffer(GLuint renderbuffer, GLubyte referenceColor[4])
1097*8975f5c5SAndroid Build Coastguard Worker     {
1098*8975f5c5SAndroid Build Coastguard Worker         // Bind the renderbuffer to a framebuffer
1099*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer framebuffer;
1100*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1101*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
1102*8975f5c5SAndroid Build Coastguard Worker                                   renderbuffer);
1103*8975f5c5SAndroid Build Coastguard Worker 
1104*8975f5c5SAndroid Build Coastguard Worker         // Expect renderbuffer to match referenceColor with a tolerance of 1.
1105*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(0, 0, referenceColor[0], referenceColor[1], referenceColor[2],
1106*8975f5c5SAndroid Build Coastguard Worker                           referenceColor[3], 1);
1107*8975f5c5SAndroid Build Coastguard Worker     }
1108*8975f5c5SAndroid Build Coastguard Worker 
verifyResultsRenderbufferWithClearAndDraw(GLuint texture,GLuint renderbuffer,GLubyte clearColor[4],GLubyte referenceColor[4])1109*8975f5c5SAndroid Build Coastguard Worker     void verifyResultsRenderbufferWithClearAndDraw(GLuint texture,
1110*8975f5c5SAndroid Build Coastguard Worker                                                    GLuint renderbuffer,
1111*8975f5c5SAndroid Build Coastguard Worker                                                    GLubyte clearColor[4],
1112*8975f5c5SAndroid Build Coastguard Worker                                                    GLubyte referenceColor[4])
1113*8975f5c5SAndroid Build Coastguard Worker     {
1114*8975f5c5SAndroid Build Coastguard Worker         // Bind the renderbuffer to a framebuffer
1115*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer framebuffer;
1116*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1117*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
1118*8975f5c5SAndroid Build Coastguard Worker                                   renderbuffer);
1119*8975f5c5SAndroid Build Coastguard Worker 
1120*8975f5c5SAndroid Build Coastguard Worker         // Clear the renderbuffer with the clear color
1121*8975f5c5SAndroid Build Coastguard Worker         glClearColor(clearColor[0] / 255.0f, clearColor[1] / 255.0f, clearColor[2] / 255.0f,
1122*8975f5c5SAndroid Build Coastguard Worker                      clearColor[3] / 255.0f);
1123*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1124*8975f5c5SAndroid Build Coastguard Worker 
1125*8975f5c5SAndroid Build Coastguard Worker         // Expect renderbuffer to match referenceColor with a tolerance of 1.
1126*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_NEAR(0, 0, referenceColor[0], referenceColor[1], referenceColor[2],
1127*8975f5c5SAndroid Build Coastguard Worker                           referenceColor[3], 1);
1128*8975f5c5SAndroid Build Coastguard Worker 
1129*8975f5c5SAndroid Build Coastguard Worker         // Sample source texture and draw onto renderbuffer and expect rendered quad's color
1130*8975f5c5SAndroid Build Coastguard Worker         // is the same as the reference color with a tolerance of 1
1131*8975f5c5SAndroid Build Coastguard Worker         verifyResultsTexture(texture, referenceColor, GL_TEXTURE_2D, mTextureProgram,
1132*8975f5c5SAndroid Build Coastguard Worker                              mTextureUniformLocation);
1133*8975f5c5SAndroid Build Coastguard Worker     }
1134*8975f5c5SAndroid Build Coastguard Worker 
1135*8975f5c5SAndroid Build Coastguard Worker     enum class AHBVerifyRegion
1136*8975f5c5SAndroid Build Coastguard Worker     {
1137*8975f5c5SAndroid Build Coastguard Worker         Entire,
1138*8975f5c5SAndroid Build Coastguard Worker         LeftHalf,
1139*8975f5c5SAndroid Build Coastguard Worker         RightHalf,
1140*8975f5c5SAndroid Build Coastguard Worker     };
1141*8975f5c5SAndroid Build Coastguard Worker 
verifyResultAHB(AHardwareBuffer * source,const std::vector<AHBPlaneData> & data,AHBVerifyRegion verifyRegion=AHBVerifyRegion::Entire)1142*8975f5c5SAndroid Build Coastguard Worker     void verifyResultAHB(AHardwareBuffer *source,
1143*8975f5c5SAndroid Build Coastguard Worker                          const std::vector<AHBPlaneData> &data,
1144*8975f5c5SAndroid Build Coastguard Worker                          AHBVerifyRegion verifyRegion = AHBVerifyRegion::Entire)
1145*8975f5c5SAndroid Build Coastguard Worker     {
1146*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_SUPPORT)
1147*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer_Desc aHardwareBufferDescription;
1148*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer_describe(source, &aHardwareBufferDescription);
1149*8975f5c5SAndroid Build Coastguard Worker         bool isYUV = (aHardwareBufferDescription.format == AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420);
1150*8975f5c5SAndroid Build Coastguard Worker         const uint32_t width  = aHardwareBufferDescription.width;
1151*8975f5c5SAndroid Build Coastguard Worker         const uint32_t height = aHardwareBufferDescription.height;
1152*8975f5c5SAndroid Build Coastguard Worker         const uint32_t depth  = aHardwareBufferDescription.layers;
1153*8975f5c5SAndroid Build Coastguard Worker 
1154*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT)
1155*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer_Planes planeInfo;
1156*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(0, AHardwareBuffer_lockPlanes(source, AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY, -1,
1157*8975f5c5SAndroid Build Coastguard Worker                                                 nullptr, &planeInfo));
1158*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(data.size(), planeInfo.planeCount);
1159*8975f5c5SAndroid Build Coastguard Worker 
1160*8975f5c5SAndroid Build Coastguard Worker         for (size_t planeIdx = 0; planeIdx < data.size(); planeIdx++)
1161*8975f5c5SAndroid Build Coastguard Worker         {
1162*8975f5c5SAndroid Build Coastguard Worker             const AHBPlaneData &planeData      = data[planeIdx];
1163*8975f5c5SAndroid Build Coastguard Worker             const AHardwareBuffer_Plane &plane = planeInfo.planes[planeIdx];
1164*8975f5c5SAndroid Build Coastguard Worker 
1165*8975f5c5SAndroid Build Coastguard Worker             const size_t planeHeight = (isYUV && planeIdx > 0) ? (height / 2) : height;
1166*8975f5c5SAndroid Build Coastguard Worker             const size_t planeWidth  = (isYUV && planeIdx > 0) ? (width / 2) : width;
1167*8975f5c5SAndroid Build Coastguard Worker             size_t layerPitch        = getLayerPitch(planeHeight, plane.rowStride);
1168*8975f5c5SAndroid Build Coastguard Worker 
1169*8975f5c5SAndroid Build Coastguard Worker             uint32_t xStart = 0;
1170*8975f5c5SAndroid Build Coastguard Worker             uint32_t xEnd   = planeWidth;
1171*8975f5c5SAndroid Build Coastguard Worker 
1172*8975f5c5SAndroid Build Coastguard Worker             switch (verifyRegion)
1173*8975f5c5SAndroid Build Coastguard Worker             {
1174*8975f5c5SAndroid Build Coastguard Worker                 case AHBVerifyRegion::Entire:
1175*8975f5c5SAndroid Build Coastguard Worker                     break;
1176*8975f5c5SAndroid Build Coastguard Worker                 case AHBVerifyRegion::LeftHalf:
1177*8975f5c5SAndroid Build Coastguard Worker                     xEnd = planeWidth / 2;
1178*8975f5c5SAndroid Build Coastguard Worker                     break;
1179*8975f5c5SAndroid Build Coastguard Worker                 case AHBVerifyRegion::RightHalf:
1180*8975f5c5SAndroid Build Coastguard Worker                     xStart = planeWidth / 2;
1181*8975f5c5SAndroid Build Coastguard Worker                     break;
1182*8975f5c5SAndroid Build Coastguard Worker             }
1183*8975f5c5SAndroid Build Coastguard Worker 
1184*8975f5c5SAndroid Build Coastguard Worker             for (size_t z = 0; z < depth; z++)
1185*8975f5c5SAndroid Build Coastguard Worker             {
1186*8975f5c5SAndroid Build Coastguard Worker                 const uint8_t *referenceDepthSlice =
1187*8975f5c5SAndroid Build Coastguard Worker                     reinterpret_cast<const uint8_t *>(planeData.data) +
1188*8975f5c5SAndroid Build Coastguard Worker                     z * planeHeight * (xEnd - xStart) * planeData.bytesPerPixel;
1189*8975f5c5SAndroid Build Coastguard Worker                 for (size_t y = 0; y < planeHeight; y++)
1190*8975f5c5SAndroid Build Coastguard Worker                 {
1191*8975f5c5SAndroid Build Coastguard Worker                     const uint8_t *referenceRow =
1192*8975f5c5SAndroid Build Coastguard Worker                         referenceDepthSlice + y * (xEnd - xStart) * planeData.bytesPerPixel;
1193*8975f5c5SAndroid Build Coastguard Worker                     for (size_t x = xStart; x < xEnd; x++)
1194*8975f5c5SAndroid Build Coastguard Worker                     {
1195*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *referenceData =
1196*8975f5c5SAndroid Build Coastguard Worker                             referenceRow + (x - xStart) * planeData.bytesPerPixel;
1197*8975f5c5SAndroid Build Coastguard Worker                         std::vector<uint8_t> reference(referenceData,
1198*8975f5c5SAndroid Build Coastguard Worker                                                        referenceData + planeData.bytesPerPixel);
1199*8975f5c5SAndroid Build Coastguard Worker 
1200*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *ahbData = reinterpret_cast<uint8_t *>(plane.data) +
1201*8975f5c5SAndroid Build Coastguard Worker                                                  z * layerPitch + y * plane.rowStride +
1202*8975f5c5SAndroid Build Coastguard Worker                                                  x * plane.pixelStride;
1203*8975f5c5SAndroid Build Coastguard Worker                         std::vector<uint8_t> ahb(ahbData, ahbData + planeData.bytesPerPixel);
1204*8975f5c5SAndroid Build Coastguard Worker 
1205*8975f5c5SAndroid Build Coastguard Worker                         EXPECT_EQ(reference, ahb)
1206*8975f5c5SAndroid Build Coastguard Worker                             << "at (" << x << ", " << y << ") on plane " << planeIdx;
1207*8975f5c5SAndroid Build Coastguard Worker                     }
1208*8975f5c5SAndroid Build Coastguard Worker                 }
1209*8975f5c5SAndroid Build Coastguard Worker             }
1210*8975f5c5SAndroid Build Coastguard Worker         }
1211*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(0, AHardwareBuffer_unlock(source, nullptr));
1212*8975f5c5SAndroid Build Coastguard Worker #    else
1213*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(1u, data.size());
1214*8975f5c5SAndroid Build Coastguard Worker         ASSERT_FALSE(isYUV);
1215*8975f5c5SAndroid Build Coastguard Worker 
1216*8975f5c5SAndroid Build Coastguard Worker         const uint32_t rowStride = aHardwareBufferDescription.stride * data[0].bytesPerPixel;
1217*8975f5c5SAndroid Build Coastguard Worker         size_t layerPitch        = getLayerPitch(height, rowStride);
1218*8975f5c5SAndroid Build Coastguard Worker 
1219*8975f5c5SAndroid Build Coastguard Worker         void *mappedMemory = nullptr;
1220*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(0, AHardwareBuffer_lock(source, AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY, -1,
1221*8975f5c5SAndroid Build Coastguard Worker                                           nullptr, &mappedMemory));
1222*8975f5c5SAndroid Build Coastguard Worker 
1223*8975f5c5SAndroid Build Coastguard Worker         uint32_t xStart = 0;
1224*8975f5c5SAndroid Build Coastguard Worker         uint32_t xEnd   = width;
1225*8975f5c5SAndroid Build Coastguard Worker 
1226*8975f5c5SAndroid Build Coastguard Worker         switch (verifyRegion)
1227*8975f5c5SAndroid Build Coastguard Worker         {
1228*8975f5c5SAndroid Build Coastguard Worker             case AHBVerifyRegion::Entire:
1229*8975f5c5SAndroid Build Coastguard Worker                 break;
1230*8975f5c5SAndroid Build Coastguard Worker             case AHBVerifyRegion::LeftHalf:
1231*8975f5c5SAndroid Build Coastguard Worker                 xEnd = width / 2;
1232*8975f5c5SAndroid Build Coastguard Worker                 break;
1233*8975f5c5SAndroid Build Coastguard Worker             case AHBVerifyRegion::RightHalf:
1234*8975f5c5SAndroid Build Coastguard Worker                 xStart = width / 2;
1235*8975f5c5SAndroid Build Coastguard Worker                 break;
1236*8975f5c5SAndroid Build Coastguard Worker         }
1237*8975f5c5SAndroid Build Coastguard Worker         for (size_t z = 0; z < depth; z++)
1238*8975f5c5SAndroid Build Coastguard Worker         {
1239*8975f5c5SAndroid Build Coastguard Worker             const uint8_t *referenceDepthSlice =
1240*8975f5c5SAndroid Build Coastguard Worker                 reinterpret_cast<const uint8_t *>(data[0].data) +
1241*8975f5c5SAndroid Build Coastguard Worker                 z * height * (xEnd - xStart) * data[0].bytesPerPixel;
1242*8975f5c5SAndroid Build Coastguard Worker             for (size_t y = 0; y < height; y++)
1243*8975f5c5SAndroid Build Coastguard Worker             {
1244*8975f5c5SAndroid Build Coastguard Worker                 const uint8_t *referenceRow =
1245*8975f5c5SAndroid Build Coastguard Worker                     referenceDepthSlice + y * (xEnd - xStart) * data[0].bytesPerPixel;
1246*8975f5c5SAndroid Build Coastguard Worker                 for (size_t x = xStart; x < xEnd; x++)
1247*8975f5c5SAndroid Build Coastguard Worker                 {
1248*8975f5c5SAndroid Build Coastguard Worker                     const uint8_t *referenceData =
1249*8975f5c5SAndroid Build Coastguard Worker                         referenceRow + (x - xStart) * data[0].bytesPerPixel;
1250*8975f5c5SAndroid Build Coastguard Worker                     std::vector<uint8_t> reference(referenceData,
1251*8975f5c5SAndroid Build Coastguard Worker                                                    referenceData + data[0].bytesPerPixel);
1252*8975f5c5SAndroid Build Coastguard Worker 
1253*8975f5c5SAndroid Build Coastguard Worker                     const uint8_t *ahbData = reinterpret_cast<uint8_t *>(mappedMemory) +
1254*8975f5c5SAndroid Build Coastguard Worker                                              z * layerPitch + y * rowStride +
1255*8975f5c5SAndroid Build Coastguard Worker                                              x * data[0].bytesPerPixel;
1256*8975f5c5SAndroid Build Coastguard Worker                     std::vector<uint8_t> ahb(ahbData, ahbData + data[0].bytesPerPixel);
1257*8975f5c5SAndroid Build Coastguard Worker 
1258*8975f5c5SAndroid Build Coastguard Worker                     EXPECT_EQ(reference, ahb) << "at (" << x << ", " << y << ")";
1259*8975f5c5SAndroid Build Coastguard Worker                 }
1260*8975f5c5SAndroid Build Coastguard Worker             }
1261*8975f5c5SAndroid Build Coastguard Worker         }
1262*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(0, AHardwareBuffer_unlock(source, nullptr));
1263*8975f5c5SAndroid Build Coastguard Worker #    endif
1264*8975f5c5SAndroid Build Coastguard Worker #endif
1265*8975f5c5SAndroid Build Coastguard Worker     }
1266*8975f5c5SAndroid Build Coastguard Worker 
1267*8975f5c5SAndroid Build Coastguard Worker     template <typename destType, typename sourcetype>
reinterpretHelper(const sourcetype & source)1268*8975f5c5SAndroid Build Coastguard Worker     destType reinterpretHelper(const sourcetype &source)
1269*8975f5c5SAndroid Build Coastguard Worker     {
1270*8975f5c5SAndroid Build Coastguard Worker         static_assert(sizeof(destType) == sizeof(size_t),
1271*8975f5c5SAndroid Build Coastguard Worker                       "destType should be the same size as a size_t");
1272*8975f5c5SAndroid Build Coastguard Worker         size_t sourceSizeT = static_cast<size_t>(source.get());
1273*8975f5c5SAndroid Build Coastguard Worker         return reinterpret_cast<destType>(sourceSizeT);
1274*8975f5c5SAndroid Build Coastguard Worker     }
1275*8975f5c5SAndroid Build Coastguard Worker 
hasImageGLColorspaceExt() const1276*8975f5c5SAndroid Build Coastguard Worker     bool hasImageGLColorspaceExt() const
1277*8975f5c5SAndroid Build Coastguard Worker     {
1278*8975f5c5SAndroid Build Coastguard Worker         // Possible GLES driver bug on Pixel2 devices: http://anglebug.com/42263865
1279*8975f5c5SAndroid Build Coastguard Worker         if (IsPixel2() && IsOpenGLES())
1280*8975f5c5SAndroid Build Coastguard Worker         {
1281*8975f5c5SAndroid Build Coastguard Worker             return false;
1282*8975f5c5SAndroid Build Coastguard Worker         }
1283*8975f5c5SAndroid Build Coastguard Worker         return IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(), kImageGLColorspaceExt);
1284*8975f5c5SAndroid Build Coastguard Worker     }
1285*8975f5c5SAndroid Build Coastguard Worker 
hasAndroidImageNativeBufferExt() const1286*8975f5c5SAndroid Build Coastguard Worker     bool hasAndroidImageNativeBufferExt() const
1287*8975f5c5SAndroid Build Coastguard Worker     {
1288*8975f5c5SAndroid Build Coastguard Worker         return IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(),
1289*8975f5c5SAndroid Build Coastguard Worker                                             kEGLAndroidImageNativeBufferExt);
1290*8975f5c5SAndroid Build Coastguard Worker     }
1291*8975f5c5SAndroid Build Coastguard Worker 
hasEglImageStorageExt() const1292*8975f5c5SAndroid Build Coastguard Worker     bool hasEglImageStorageExt() const { return IsGLExtensionEnabled(kEGLImageStorageExt); }
1293*8975f5c5SAndroid Build Coastguard Worker 
hasEglImageStorageCompressionExt() const1294*8975f5c5SAndroid Build Coastguard Worker     bool hasEglImageStorageCompressionExt() const
1295*8975f5c5SAndroid Build Coastguard Worker     {
1296*8975f5c5SAndroid Build Coastguard Worker         return IsGLExtensionEnabled(kEGLImageStorageCompressionExt);
1297*8975f5c5SAndroid Build Coastguard Worker     }
1298*8975f5c5SAndroid Build Coastguard Worker 
hasTextureStorageCompressionExt() const1299*8975f5c5SAndroid Build Coastguard Worker     bool hasTextureStorageCompressionExt() const
1300*8975f5c5SAndroid Build Coastguard Worker     {
1301*8975f5c5SAndroid Build Coastguard Worker         return IsGLExtensionEnabled(kTextureStorageCompressionExt);
1302*8975f5c5SAndroid Build Coastguard Worker     }
1303*8975f5c5SAndroid Build Coastguard Worker 
hasAndroidHardwareBufferSupport() const1304*8975f5c5SAndroid Build Coastguard Worker     bool hasAndroidHardwareBufferSupport() const
1305*8975f5c5SAndroid Build Coastguard Worker     {
1306*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_SUPPORT)
1307*8975f5c5SAndroid Build Coastguard Worker         return true;
1308*8975f5c5SAndroid Build Coastguard Worker #else
1309*8975f5c5SAndroid Build Coastguard Worker         return false;
1310*8975f5c5SAndroid Build Coastguard Worker #endif
1311*8975f5c5SAndroid Build Coastguard Worker     }
1312*8975f5c5SAndroid Build Coastguard Worker 
hasAhbLockPlanesSupport() const1313*8975f5c5SAndroid Build Coastguard Worker     bool hasAhbLockPlanesSupport() const
1314*8975f5c5SAndroid Build Coastguard Worker     {
1315*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT)
1316*8975f5c5SAndroid Build Coastguard Worker         return true;
1317*8975f5c5SAndroid Build Coastguard Worker #else
1318*8975f5c5SAndroid Build Coastguard Worker         return false;
1319*8975f5c5SAndroid Build Coastguard Worker #endif
1320*8975f5c5SAndroid Build Coastguard Worker     }
1321*8975f5c5SAndroid Build Coastguard Worker 
hasEglImageArrayExt() const1322*8975f5c5SAndroid Build Coastguard Worker     bool hasEglImageArrayExt() const { return IsGLExtensionEnabled(kEGLImageArrayExt); }
1323*8975f5c5SAndroid Build Coastguard Worker 
hasOESExt() const1324*8975f5c5SAndroid Build Coastguard Worker     bool hasOESExt() const { return IsGLExtensionEnabled(kOESExt); }
1325*8975f5c5SAndroid Build Coastguard Worker 
hasExternalExt() const1326*8975f5c5SAndroid Build Coastguard Worker     bool hasExternalExt() const { return IsGLExtensionEnabled(kExternalExt); }
1327*8975f5c5SAndroid Build Coastguard Worker 
hasExternalESSL3Ext() const1328*8975f5c5SAndroid Build Coastguard Worker     bool hasExternalESSL3Ext() const { return IsGLExtensionEnabled(kExternalESSL3Ext); }
1329*8975f5c5SAndroid Build Coastguard Worker 
hasYUVInternalFormatExt() const1330*8975f5c5SAndroid Build Coastguard Worker     bool hasYUVInternalFormatExt() const { return IsGLExtensionEnabled(kYUVInternalFormatExt); }
1331*8975f5c5SAndroid Build Coastguard Worker 
hasYUVTargetExt() const1332*8975f5c5SAndroid Build Coastguard Worker     bool hasYUVTargetExt() const { return IsGLExtensionEnabled(kYUVTargetExt); }
1333*8975f5c5SAndroid Build Coastguard Worker 
hasRGBXInternalFormatExt() const1334*8975f5c5SAndroid Build Coastguard Worker     bool hasRGBXInternalFormatExt() const { return IsGLExtensionEnabled(kRGBXInternalFormatExt); }
1335*8975f5c5SAndroid Build Coastguard Worker 
hasBaseExt() const1336*8975f5c5SAndroid Build Coastguard Worker     bool hasBaseExt() const
1337*8975f5c5SAndroid Build Coastguard Worker     {
1338*8975f5c5SAndroid Build Coastguard Worker         return IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(), kBaseExt);
1339*8975f5c5SAndroid Build Coastguard Worker     }
1340*8975f5c5SAndroid Build Coastguard Worker 
has2DTextureExt() const1341*8975f5c5SAndroid Build Coastguard Worker     bool has2DTextureExt() const
1342*8975f5c5SAndroid Build Coastguard Worker     {
1343*8975f5c5SAndroid Build Coastguard Worker         return IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(), k2DTextureExt);
1344*8975f5c5SAndroid Build Coastguard Worker     }
1345*8975f5c5SAndroid Build Coastguard Worker 
has3DTextureExt() const1346*8975f5c5SAndroid Build Coastguard Worker     bool has3DTextureExt() const
1347*8975f5c5SAndroid Build Coastguard Worker     {
1348*8975f5c5SAndroid Build Coastguard Worker         return IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(), k3DTextureExt);
1349*8975f5c5SAndroid Build Coastguard Worker     }
1350*8975f5c5SAndroid Build Coastguard Worker 
hasPixmapExt() const1351*8975f5c5SAndroid Build Coastguard Worker     bool hasPixmapExt() const
1352*8975f5c5SAndroid Build Coastguard Worker     {
1353*8975f5c5SAndroid Build Coastguard Worker         return IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(), kPixmapExt);
1354*8975f5c5SAndroid Build Coastguard Worker     }
1355*8975f5c5SAndroid Build Coastguard Worker 
hasRenderbufferExt() const1356*8975f5c5SAndroid Build Coastguard Worker     bool hasRenderbufferExt() const
1357*8975f5c5SAndroid Build Coastguard Worker     {
1358*8975f5c5SAndroid Build Coastguard Worker         return IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(), kRenderbufferExt);
1359*8975f5c5SAndroid Build Coastguard Worker     }
1360*8975f5c5SAndroid Build Coastguard Worker 
hasCubemapExt() const1361*8975f5c5SAndroid Build Coastguard Worker     bool hasCubemapExt() const
1362*8975f5c5SAndroid Build Coastguard Worker     {
1363*8975f5c5SAndroid Build Coastguard Worker         return IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(), kCubemapExt);
1364*8975f5c5SAndroid Build Coastguard Worker     }
1365*8975f5c5SAndroid Build Coastguard Worker 
getPerfCounters()1366*8975f5c5SAndroid Build Coastguard Worker     angle::VulkanPerfCounters getPerfCounters()
1367*8975f5c5SAndroid Build Coastguard Worker     {
1368*8975f5c5SAndroid Build Coastguard Worker         ASSERT(IsVulkan());
1369*8975f5c5SAndroid Build Coastguard Worker 
1370*8975f5c5SAndroid Build Coastguard Worker         if (mCounterNameToIndexMap.empty())
1371*8975f5c5SAndroid Build Coastguard Worker         {
1372*8975f5c5SAndroid Build Coastguard Worker             mCounterNameToIndexMap = BuildCounterNameToIndexMap();
1373*8975f5c5SAndroid Build Coastguard Worker         }
1374*8975f5c5SAndroid Build Coastguard Worker 
1375*8975f5c5SAndroid Build Coastguard Worker         return GetPerfCounters(mCounterNameToIndexMap);
1376*8975f5c5SAndroid Build Coastguard Worker     }
1377*8975f5c5SAndroid Build Coastguard Worker 
externalTextureTracerTestHelper(const EGLint * attribsToRecoverInMEC)1378*8975f5c5SAndroid Build Coastguard Worker     void externalTextureTracerTestHelper(const EGLint *attribsToRecoverInMEC)
1379*8975f5c5SAndroid Build Coastguard Worker     {
1380*8975f5c5SAndroid Build Coastguard Worker         const EGLWindow *eglWindow = getEGLWindow();
1381*8975f5c5SAndroid Build Coastguard Worker         // Frame 1 begins
1382*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
1383*8975f5c5SAndroid Build Coastguard Worker         GLTexture sourceTexture1;
1384*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image1;
1385*8975f5c5SAndroid Build Coastguard Worker 
1386*8975f5c5SAndroid Build Coastguard Worker         GLubyte data[] = {132, 55, 219, 255};
1387*8975f5c5SAndroid Build Coastguard Worker         // Create a source 2D texture
1388*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, sourceTexture1);
1389*8975f5c5SAndroid Build Coastguard Worker 
1390*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, static_cast<GLsizei>(1), static_cast<GLsizei>(1), 0,
1391*8975f5c5SAndroid Build Coastguard Worker                      GL_RGBA, GL_UNSIGNED_BYTE, data);
1392*8975f5c5SAndroid Build Coastguard Worker 
1393*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
1394*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1395*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1396*8975f5c5SAndroid Build Coastguard Worker 
1397*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1398*8975f5c5SAndroid Build Coastguard Worker 
1399*8975f5c5SAndroid Build Coastguard Worker         image1 = eglCreateImageKHR(
1400*8975f5c5SAndroid Build Coastguard Worker             eglWindow->getDisplay(), eglWindow->getContext(), EGL_GL_TEXTURE_2D_KHR,
1401*8975f5c5SAndroid Build Coastguard Worker             reinterpretHelper<EGLClientBuffer>(sourceTexture1), attribsToRecoverInMEC);
1402*8975f5c5SAndroid Build Coastguard Worker 
1403*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
1404*8975f5c5SAndroid Build Coastguard Worker 
1405*8975f5c5SAndroid Build Coastguard Worker         // Create the target
1406*8975f5c5SAndroid Build Coastguard Worker         GLTexture targetTexture1;
1407*8975f5c5SAndroid Build Coastguard Worker         // Create a target texture from the image
1408*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_EXTERNAL_OES, targetTexture1);
1409*8975f5c5SAndroid Build Coastguard Worker         glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image1);
1410*8975f5c5SAndroid Build Coastguard Worker 
1411*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
1412*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1413*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1414*8975f5c5SAndroid Build Coastguard Worker 
1415*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1416*8975f5c5SAndroid Build Coastguard Worker 
1417*8975f5c5SAndroid Build Coastguard Worker         // Calls On EndFrame(), with MidExecutionSetup to restore external texture targetTexture1
1418*8975f5c5SAndroid Build Coastguard Worker         // above
1419*8975f5c5SAndroid Build Coastguard Worker         EGLDisplay display = eglWindow->getDisplay();
1420*8975f5c5SAndroid Build Coastguard Worker         EGLSurface surface = eglWindow->getSurface();
1421*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(display, surface);
1422*8975f5c5SAndroid Build Coastguard Worker         // Frame 1 ends
1423*8975f5c5SAndroid Build Coastguard Worker 
1424*8975f5c5SAndroid Build Coastguard Worker         // Frame 2 begins
1425*8975f5c5SAndroid Build Coastguard Worker         // Create another eglImage with another associated texture
1426*8975f5c5SAndroid Build Coastguard Worker         // Draw using the eglImage texture targetTexture1 created in frame 1
1427*8975f5c5SAndroid Build Coastguard Worker         GLTexture sourceTexture2;
1428*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image2;
1429*8975f5c5SAndroid Build Coastguard Worker 
1430*8975f5c5SAndroid Build Coastguard Worker         // Create a source 2D texture
1431*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, sourceTexture2);
1432*8975f5c5SAndroid Build Coastguard Worker 
1433*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, static_cast<GLsizei>(1), static_cast<GLsizei>(1), 0,
1434*8975f5c5SAndroid Build Coastguard Worker                      GL_RGBA, GL_UNSIGNED_BYTE, data);
1435*8975f5c5SAndroid Build Coastguard Worker 
1436*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
1437*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1438*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1439*8975f5c5SAndroid Build Coastguard Worker 
1440*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1441*8975f5c5SAndroid Build Coastguard Worker 
1442*8975f5c5SAndroid Build Coastguard Worker         constexpr EGLint defaultAttribs[] = {
1443*8975f5c5SAndroid Build Coastguard Worker             EGL_IMAGE_PRESERVED,
1444*8975f5c5SAndroid Build Coastguard Worker             EGL_TRUE,
1445*8975f5c5SAndroid Build Coastguard Worker             EGL_NONE,
1446*8975f5c5SAndroid Build Coastguard Worker         };
1447*8975f5c5SAndroid Build Coastguard Worker         image2 = eglCreateImageKHR(
1448*8975f5c5SAndroid Build Coastguard Worker             eglWindow->getDisplay(), eglWindow->getContext(), EGL_GL_TEXTURE_2D_KHR,
1449*8975f5c5SAndroid Build Coastguard Worker             reinterpretHelper<EGLClientBuffer>(sourceTexture2), defaultAttribs);
1450*8975f5c5SAndroid Build Coastguard Worker 
1451*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
1452*8975f5c5SAndroid Build Coastguard Worker 
1453*8975f5c5SAndroid Build Coastguard Worker         // Create the target
1454*8975f5c5SAndroid Build Coastguard Worker         GLTexture targetTexture2;
1455*8975f5c5SAndroid Build Coastguard Worker         // Create a target texture from the image
1456*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_EXTERNAL_OES, targetTexture2);
1457*8975f5c5SAndroid Build Coastguard Worker         glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image2);
1458*8975f5c5SAndroid Build Coastguard Worker 
1459*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
1460*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1461*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1462*8975f5c5SAndroid Build Coastguard Worker 
1463*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1464*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mTextureExternalProgram);
1465*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_EXTERNAL_OES, targetTexture1);
1466*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTextureExternalUniformLocation, 0);
1467*8975f5c5SAndroid Build Coastguard Worker 
1468*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mTextureExternalProgram, "position", 0.5f);
1469*8975f5c5SAndroid Build Coastguard Worker 
1470*8975f5c5SAndroid Build Coastguard Worker         // Calls On EndFrame() to save the gl calls creating external texture targetTexture2;
1471*8975f5c5SAndroid Build Coastguard Worker         // We use this as a reference to check the gl calls we restore for targetTexture1
1472*8975f5c5SAndroid Build Coastguard Worker         // in MidExecutionSetup
1473*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(display, surface);
1474*8975f5c5SAndroid Build Coastguard Worker         // Frame 2 ends
1475*8975f5c5SAndroid Build Coastguard Worker 
1476*8975f5c5SAndroid Build Coastguard Worker         // Frame 3 begins
1477*8975f5c5SAndroid Build Coastguard Worker         // Draw a quad with the targetTexture2
1478*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mTextureExternalProgram);
1479*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_EXTERNAL_OES, targetTexture2);
1480*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTextureExternalUniformLocation, 0);
1481*8975f5c5SAndroid Build Coastguard Worker 
1482*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mTextureExternalProgram, "position", 0.5f);
1483*8975f5c5SAndroid Build Coastguard Worker 
1484*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(display, surface);
1485*8975f5c5SAndroid Build Coastguard Worker         // Frame 3 ends
1486*8975f5c5SAndroid Build Coastguard Worker 
1487*8975f5c5SAndroid Build Coastguard Worker         // Clean up
1488*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(eglWindow->getDisplay(), image1);
1489*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(eglWindow->getDisplay(), image2);
1490*8975f5c5SAndroid Build Coastguard Worker     }
1491*8975f5c5SAndroid Build Coastguard Worker 
1492*8975f5c5SAndroid Build Coastguard Worker     void FramebufferAttachmentDeletedWhileInUseHelper(bool useTextureAttachment,
1493*8975f5c5SAndroid Build Coastguard Worker                                                       bool deleteSourceTextureLast);
1494*8975f5c5SAndroid Build Coastguard Worker     void FramebufferResolveAttachmentDeletedWhileInUseHelper(bool useTextureAttachment,
1495*8975f5c5SAndroid Build Coastguard Worker                                                              bool deleteSourceTextureLast);
1496*8975f5c5SAndroid Build Coastguard Worker 
1497*8975f5c5SAndroid Build Coastguard Worker     EGLint default3DAttribs[5] = {
1498*8975f5c5SAndroid Build Coastguard Worker         EGL_GL_TEXTURE_ZOFFSET_KHR, static_cast<EGLint>(0), EGL_IMAGE_PRESERVED, EGL_TRUE, EGL_NONE,
1499*8975f5c5SAndroid Build Coastguard Worker     };
1500*8975f5c5SAndroid Build Coastguard Worker     EGLint colorspace3DAttribs[7] = {
1501*8975f5c5SAndroid Build Coastguard Worker         EGL_GL_TEXTURE_ZOFFSET_KHR,
1502*8975f5c5SAndroid Build Coastguard Worker         static_cast<EGLint>(0),
1503*8975f5c5SAndroid Build Coastguard Worker         EGL_IMAGE_PRESERVED,
1504*8975f5c5SAndroid Build Coastguard Worker         EGL_TRUE,
1505*8975f5c5SAndroid Build Coastguard Worker         EGL_GL_COLORSPACE,
1506*8975f5c5SAndroid Build Coastguard Worker         EGL_GL_COLORSPACE_SRGB_KHR,
1507*8975f5c5SAndroid Build Coastguard Worker         EGL_NONE,
1508*8975f5c5SAndroid Build Coastguard Worker     };
1509*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureProgram;
1510*8975f5c5SAndroid Build Coastguard Worker     GLuint m2DArrayTextureProgram;
1511*8975f5c5SAndroid Build Coastguard Worker     GLuint mCubeTextureProgram;
1512*8975f5c5SAndroid Build Coastguard Worker     GLuint mCubeArrayTextureProgram;
1513*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureUniformLocation;
1514*8975f5c5SAndroid Build Coastguard Worker     GLuint m2DArrayTextureUniformLocation;
1515*8975f5c5SAndroid Build Coastguard Worker     GLuint m2DArrayTextureLayerUniformLocation;
1516*8975f5c5SAndroid Build Coastguard Worker     GLuint mCubeTextureUniformLocation;
1517*8975f5c5SAndroid Build Coastguard Worker     GLuint mCubeTextureFaceCoordUniformLocation;
1518*8975f5c5SAndroid Build Coastguard Worker     GLuint mCubeArrayTextureUniformLocation;
1519*8975f5c5SAndroid Build Coastguard Worker     GLuint mCubeArrayTextureFaceCoordUniformLocation;
1520*8975f5c5SAndroid Build Coastguard Worker     GLuint mCubeArrayTextureLayerUniformLocation;
1521*8975f5c5SAndroid Build Coastguard Worker 
1522*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureExternalProgram        = 0;
1523*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureExternalUniformLocation = -1;
1524*8975f5c5SAndroid Build Coastguard Worker 
1525*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureExternalESSL3Program        = 0;
1526*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureExternalESSL3UniformLocation = -1;
1527*8975f5c5SAndroid Build Coastguard Worker 
1528*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureYUVProgram        = 0;
1529*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureYUVUniformLocation = -1;
1530*8975f5c5SAndroid Build Coastguard Worker 
1531*8975f5c5SAndroid Build Coastguard Worker     GLuint mRenderYUVProgram        = 0;
1532*8975f5c5SAndroid Build Coastguard Worker     GLint mRenderYUVUniformLocation = -1;
1533*8975f5c5SAndroid Build Coastguard Worker 
1534*8975f5c5SAndroid Build Coastguard Worker     CounterNameToIndexMap mCounterNameToIndexMap;
1535*8975f5c5SAndroid Build Coastguard Worker };
1536*8975f5c5SAndroid Build Coastguard Worker 
1537*8975f5c5SAndroid Build Coastguard Worker class ImageTestES3 : public ImageTest
1538*8975f5c5SAndroid Build Coastguard Worker {};
1539*8975f5c5SAndroid Build Coastguard Worker 
1540*8975f5c5SAndroid Build Coastguard Worker class ImageTestES31 : public ImageTest
1541*8975f5c5SAndroid Build Coastguard Worker {};
1542*8975f5c5SAndroid Build Coastguard Worker 
1543*8975f5c5SAndroid Build Coastguard Worker // Tests that the extension is exposed on the platforms we think it should be. Please modify this as
1544*8975f5c5SAndroid Build Coastguard Worker // you change extension availability.
TEST_P(ImageTest,ANGLEExtensionAvailability)1545*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, ANGLEExtensionAvailability)
1546*8975f5c5SAndroid Build Coastguard Worker {
1547*8975f5c5SAndroid Build Coastguard Worker     // EGL support is based on driver extension availability.
1548*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGLES() && IsAndroid());
1549*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOpenGLES() && IsOzone());
1550*8975f5c5SAndroid Build Coastguard Worker 
1551*8975f5c5SAndroid Build Coastguard Worker     if (IsD3D11() || IsD3D9())
1552*8975f5c5SAndroid Build Coastguard Worker     {
1553*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasOESExt());
1554*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasExternalExt());
1555*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasBaseExt());
1556*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(has2DTextureExt());
1557*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasRenderbufferExt());
1558*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(has3DTextureExt());
1559*8975f5c5SAndroid Build Coastguard Worker 
1560*8975f5c5SAndroid Build Coastguard Worker         if (IsD3D11())
1561*8975f5c5SAndroid Build Coastguard Worker         {
1562*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(hasCubemapExt());
1563*8975f5c5SAndroid Build Coastguard Worker 
1564*8975f5c5SAndroid Build Coastguard Worker             if (getClientMajorVersion() >= 3)
1565*8975f5c5SAndroid Build Coastguard Worker             {
1566*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_TRUE(hasExternalESSL3Ext());
1567*8975f5c5SAndroid Build Coastguard Worker             }
1568*8975f5c5SAndroid Build Coastguard Worker             else
1569*8975f5c5SAndroid Build Coastguard Worker             {
1570*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_FALSE(hasExternalESSL3Ext());
1571*8975f5c5SAndroid Build Coastguard Worker             }
1572*8975f5c5SAndroid Build Coastguard Worker         }
1573*8975f5c5SAndroid Build Coastguard Worker         else
1574*8975f5c5SAndroid Build Coastguard Worker         {
1575*8975f5c5SAndroid Build Coastguard Worker             EXPECT_FALSE(hasCubemapExt());
1576*8975f5c5SAndroid Build Coastguard Worker             EXPECT_FALSE(hasExternalESSL3Ext());
1577*8975f5c5SAndroid Build Coastguard Worker         }
1578*8975f5c5SAndroid Build Coastguard Worker     }
1579*8975f5c5SAndroid Build Coastguard Worker     else if (IsVulkan())
1580*8975f5c5SAndroid Build Coastguard Worker     {
1581*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasOESExt());
1582*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasExternalExt());
1583*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasBaseExt());
1584*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(has2DTextureExt());
1585*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasCubemapExt());
1586*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasRenderbufferExt());
1587*8975f5c5SAndroid Build Coastguard Worker         if (getClientMajorVersion() >= 3)
1588*8975f5c5SAndroid Build Coastguard Worker         {
1589*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(hasExternalESSL3Ext());
1590*8975f5c5SAndroid Build Coastguard Worker         }
1591*8975f5c5SAndroid Build Coastguard Worker         else
1592*8975f5c5SAndroid Build Coastguard Worker         {
1593*8975f5c5SAndroid Build Coastguard Worker             EXPECT_FALSE(hasExternalESSL3Ext());
1594*8975f5c5SAndroid Build Coastguard Worker         }
1595*8975f5c5SAndroid Build Coastguard Worker     }
1596*8975f5c5SAndroid Build Coastguard Worker     else if (IsMetal())
1597*8975f5c5SAndroid Build Coastguard Worker     {
1598*8975f5c5SAndroid Build Coastguard Worker         // NOTE(hqle): Metal currently doesn't implement any image extensions besides
1599*8975f5c5SAndroid Build Coastguard Worker         // EGL_ANGLE_metal_texture_client_buffer
1600*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasOESExt());
1601*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(hasBaseExt());
1602*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(hasExternalExt());
1603*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(hasExternalESSL3Ext());
1604*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(has2DTextureExt());
1605*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(has3DTextureExt());
1606*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(hasRenderbufferExt());
1607*8975f5c5SAndroid Build Coastguard Worker     }
1608*8975f5c5SAndroid Build Coastguard Worker     else
1609*8975f5c5SAndroid Build Coastguard Worker     {
1610*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(hasOESExt());
1611*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(hasExternalExt());
1612*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(hasExternalESSL3Ext());
1613*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(hasBaseExt());
1614*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(has2DTextureExt());
1615*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(has3DTextureExt());
1616*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(hasRenderbufferExt());
1617*8975f5c5SAndroid Build Coastguard Worker     }
1618*8975f5c5SAndroid Build Coastguard Worker 
1619*8975f5c5SAndroid Build Coastguard Worker     // These extensions are not yet available on any platform.
1620*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(hasPixmapExt());
1621*8975f5c5SAndroid Build Coastguard Worker }
1622*8975f5c5SAndroid Build Coastguard Worker 
1623*8975f5c5SAndroid Build Coastguard Worker // Check validation from the EGL_KHR_image_base extension
TEST_P(ImageTest,ValidationImageBase)1624*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, ValidationImageBase)
1625*8975f5c5SAndroid Build Coastguard Worker {
1626*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
1627*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
1628*8975f5c5SAndroid Build Coastguard Worker 
1629*8975f5c5SAndroid Build Coastguard Worker     GLTexture glTexture2D;
1630*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, glTexture2D);
1631*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1632*8975f5c5SAndroid Build Coastguard Worker 
1633*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay display        = window->getDisplay();
1634*8975f5c5SAndroid Build Coastguard Worker     EGLContext context        = window->getContext();
1635*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config          = window->getConfig();
1636*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image         = EGL_NO_IMAGE_KHR;
1637*8975f5c5SAndroid Build Coastguard Worker     EGLClientBuffer texture2D = reinterpretHelper<EGLClientBuffer>(glTexture2D);
1638*8975f5c5SAndroid Build Coastguard Worker 
1639*8975f5c5SAndroid Build Coastguard Worker     // Test validation of eglCreateImageKHR
1640*8975f5c5SAndroid Build Coastguard Worker 
1641*8975f5c5SAndroid Build Coastguard Worker     // If <dpy> is not the handle of a valid EGLDisplay object, the error EGL_BAD_DISPLAY is
1642*8975f5c5SAndroid Build Coastguard Worker     // generated.
1643*8975f5c5SAndroid Build Coastguard Worker     image = eglCreateImageKHR(reinterpret_cast<EGLDisplay>(0xBAADF00D), context,
1644*8975f5c5SAndroid Build Coastguard Worker                               EGL_GL_TEXTURE_2D_KHR, texture2D, nullptr);
1645*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1646*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_BAD_DISPLAY);
1647*8975f5c5SAndroid Build Coastguard Worker 
1648*8975f5c5SAndroid Build Coastguard Worker     // If <ctx> is neither the handle of a valid EGLContext object on <dpy> nor EGL_NO_CONTEXT, the
1649*8975f5c5SAndroid Build Coastguard Worker     // error EGL_BAD_CONTEXT is generated.
1650*8975f5c5SAndroid Build Coastguard Worker     image = eglCreateImageKHR(display, reinterpret_cast<EGLContext>(0xBAADF00D),
1651*8975f5c5SAndroid Build Coastguard Worker                               EGL_GL_TEXTURE_2D_KHR, texture2D, nullptr);
1652*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1653*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_BAD_CONTEXT);
1654*8975f5c5SAndroid Build Coastguard Worker 
1655*8975f5c5SAndroid Build Coastguard Worker     // Test EGL_NO_CONTEXT with a 2D texture target which does require a context.
1656*8975f5c5SAndroid Build Coastguard Worker     image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_GL_TEXTURE_2D_KHR, texture2D, nullptr);
1657*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1658*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_BAD_CONTEXT);
1659*8975f5c5SAndroid Build Coastguard Worker 
1660*8975f5c5SAndroid Build Coastguard Worker     // If an attribute specified in <attrib_list> is not one of the attributes listed in Table bbb,
1661*8975f5c5SAndroid Build Coastguard Worker     // the error EGL_BAD_PARAMETER is generated.
1662*8975f5c5SAndroid Build Coastguard Worker     EGLint badAttributes[] = {
1663*8975f5c5SAndroid Build Coastguard Worker         static_cast<EGLint>(0xDEADBEEF),
1664*8975f5c5SAndroid Build Coastguard Worker         0,
1665*8975f5c5SAndroid Build Coastguard Worker         EGL_NONE,
1666*8975f5c5SAndroid Build Coastguard Worker     };
1667*8975f5c5SAndroid Build Coastguard Worker 
1668*8975f5c5SAndroid Build Coastguard Worker     image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, texture2D, badAttributes);
1669*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1670*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1671*8975f5c5SAndroid Build Coastguard Worker 
1672*8975f5c5SAndroid Build Coastguard Worker     // If the resource specified by <dpy>, <ctx>, <target>, <buffer> and <attrib_list> has an off -
1673*8975f5c5SAndroid Build Coastguard Worker     // screen buffer bound to it(e.g., by a
1674*8975f5c5SAndroid Build Coastguard Worker     // previous call to eglBindTexImage), the error EGL_BAD_ACCESS is generated.
1675*8975f5c5SAndroid Build Coastguard Worker     EGLint surfaceType = 0;
1676*8975f5c5SAndroid Build Coastguard Worker     eglGetConfigAttrib(display, config, EGL_SURFACE_TYPE, &surfaceType);
1677*8975f5c5SAndroid Build Coastguard Worker 
1678*8975f5c5SAndroid Build Coastguard Worker     EGLint bindToTextureRGBA = 0;
1679*8975f5c5SAndroid Build Coastguard Worker     eglGetConfigAttrib(display, config, EGL_BIND_TO_TEXTURE_RGBA, &bindToTextureRGBA);
1680*8975f5c5SAndroid Build Coastguard Worker     if ((surfaceType & EGL_PBUFFER_BIT) != 0 && bindToTextureRGBA == EGL_TRUE)
1681*8975f5c5SAndroid Build Coastguard Worker     {
1682*8975f5c5SAndroid Build Coastguard Worker         EGLint pbufferAttributes[] = {
1683*8975f5c5SAndroid Build Coastguard Worker             EGL_WIDTH,          1,
1684*8975f5c5SAndroid Build Coastguard Worker             EGL_HEIGHT,         1,
1685*8975f5c5SAndroid Build Coastguard Worker             EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
1686*8975f5c5SAndroid Build Coastguard Worker             EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
1687*8975f5c5SAndroid Build Coastguard Worker             EGL_NONE,           EGL_NONE,
1688*8975f5c5SAndroid Build Coastguard Worker         };
1689*8975f5c5SAndroid Build Coastguard Worker         EGLSurface pbuffer = eglCreatePbufferSurface(display, config, pbufferAttributes);
1690*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(pbuffer, EGL_NO_SURFACE);
1691*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_SUCCESS();
1692*8975f5c5SAndroid Build Coastguard Worker 
1693*8975f5c5SAndroid Build Coastguard Worker         eglBindTexImage(display, pbuffer, EGL_BACK_BUFFER);
1694*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_SUCCESS();
1695*8975f5c5SAndroid Build Coastguard Worker 
1696*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, texture2D, nullptr);
1697*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1698*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_ACCESS);
1699*8975f5c5SAndroid Build Coastguard Worker 
1700*8975f5c5SAndroid Build Coastguard Worker         eglReleaseTexImage(display, pbuffer, EGL_BACK_BUFFER);
1701*8975f5c5SAndroid Build Coastguard Worker         eglDestroySurface(display, pbuffer);
1702*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1703*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_SUCCESS();
1704*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
1705*8975f5c5SAndroid Build Coastguard Worker     }
1706*8975f5c5SAndroid Build Coastguard Worker 
1707*8975f5c5SAndroid Build Coastguard Worker     // If the resource specified by <dpy>, <ctx>, <target>, <buffer> and
1708*8975f5c5SAndroid Build Coastguard Worker     // <attrib_list> is itself an EGLImage sibling, the error EGL_BAD_ACCESS is generated.
1709*8975f5c5SAndroid Build Coastguard Worker     image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, texture2D, nullptr);
1710*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(image, EGL_NO_IMAGE_KHR);
1711*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_SUCCESS();
1712*8975f5c5SAndroid Build Coastguard Worker 
1713*8975f5c5SAndroid Build Coastguard Worker     /* TODO(geofflang): Enable this validation when it passes.
1714*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image2 = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR,
1715*8975f5c5SAndroid Build Coastguard Worker     reinterpret_cast<EGLClientBuffer>(texture2D), nullptr);
1716*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(image2, EGL_NO_IMAGE_KHR);
1717*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_BAD_ACCESS);
1718*8975f5c5SAndroid Build Coastguard Worker     */
1719*8975f5c5SAndroid Build Coastguard Worker 
1720*8975f5c5SAndroid Build Coastguard Worker     // Test validation of eglDestroyImageKHR
1721*8975f5c5SAndroid Build Coastguard Worker     // Note: image is now a valid EGL image
1722*8975f5c5SAndroid Build Coastguard Worker     EGLBoolean result = EGL_FALSE;
1723*8975f5c5SAndroid Build Coastguard Worker 
1724*8975f5c5SAndroid Build Coastguard Worker     // If <dpy> is not the handle of a valid EGLDisplay object, the error EGL_BAD_DISPLAY is
1725*8975f5c5SAndroid Build Coastguard Worker     // generated.
1726*8975f5c5SAndroid Build Coastguard Worker     result = eglDestroyImageKHR(reinterpret_cast<EGLDisplay>(0xBAADF00D), image);
1727*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(result, static_cast<EGLBoolean>(EGL_FALSE));
1728*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_BAD_DISPLAY);
1729*8975f5c5SAndroid Build Coastguard Worker 
1730*8975f5c5SAndroid Build Coastguard Worker     // If <image> is not a valid EGLImageKHR object created with respect to <dpy>, the error
1731*8975f5c5SAndroid Build Coastguard Worker     // EGL_BAD_PARAMETER is generated.
1732*8975f5c5SAndroid Build Coastguard Worker     result = eglDestroyImageKHR(display, reinterpret_cast<EGLImageKHR>(0xBAADF00D));
1733*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(result, static_cast<EGLBoolean>(EGL_FALSE));
1734*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1735*8975f5c5SAndroid Build Coastguard Worker 
1736*8975f5c5SAndroid Build Coastguard Worker     // Clean up and validate image is destroyed
1737*8975f5c5SAndroid Build Coastguard Worker     result = eglDestroyImageKHR(display, image);
1738*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(result, static_cast<EGLBoolean>(EGL_TRUE));
1739*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_SUCCESS();
1740*8975f5c5SAndroid Build Coastguard Worker 
1741*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
1742*8975f5c5SAndroid Build Coastguard Worker }
1743*8975f5c5SAndroid Build Coastguard Worker 
1744*8975f5c5SAndroid Build Coastguard Worker // Check validation from the EGL_KHR_gl_texture_2D_image, EGL_KHR_gl_texture_cubemap_image,
1745*8975f5c5SAndroid Build Coastguard Worker // EGL_KHR_gl_texture_3D_image and EGL_KHR_gl_renderbuffer_image extensions
TEST_P(ImageTest,ValidationGLImage)1746*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, ValidationGLImage)
1747*8975f5c5SAndroid Build Coastguard Worker {
1748*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
1749*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt());
1750*8975f5c5SAndroid Build Coastguard Worker 
1751*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay display = window->getDisplay();
1752*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = window->getContext();
1753*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image  = EGL_NO_IMAGE_KHR;
1754*8975f5c5SAndroid Build Coastguard Worker 
1755*8975f5c5SAndroid Build Coastguard Worker     if (has2DTextureExt())
1756*8975f5c5SAndroid Build Coastguard Worker     {
1757*8975f5c5SAndroid Build Coastguard Worker         // If <target> is EGL_GL_TEXTURE_2D_KHR, EGL_GL_TEXTURE_CUBE_MAP_*_KHR or
1758*8975f5c5SAndroid Build Coastguard Worker         // EGL_GL_TEXTURE_3D_KHR and <buffer> is not the name of a texture object of type <target>,
1759*8975f5c5SAndroid Build Coastguard Worker         // the error EGL_BAD_PARAMETER is generated.
1760*8975f5c5SAndroid Build Coastguard Worker         GLTexture textureCube;
1761*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, textureCube);
1762*8975f5c5SAndroid Build Coastguard Worker         for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1763*8975f5c5SAndroid Build Coastguard Worker              face++)
1764*8975f5c5SAndroid Build Coastguard Worker         {
1765*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1766*8975f5c5SAndroid Build Coastguard Worker         }
1767*8975f5c5SAndroid Build Coastguard Worker 
1768*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR,
1769*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(textureCube), nullptr);
1770*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1771*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1772*8975f5c5SAndroid Build Coastguard Worker 
1773*8975f5c5SAndroid Build Coastguard Worker         // If EGL_GL_TEXTURE_LEVEL_KHR is 0, <target> is EGL_GL_TEXTURE_2D_KHR,
1774*8975f5c5SAndroid Build Coastguard Worker         // EGL_GL_TEXTURE_CUBE_MAP_*_KHR or EGL_GL_TEXTURE_3D_KHR, <buffer> is the name of an
1775*8975f5c5SAndroid Build Coastguard Worker         // incomplete GL texture object, and any mipmap levels other than mipmap level 0 are
1776*8975f5c5SAndroid Build Coastguard Worker         // specified, the error EGL_BAD_PARAMETER is generated.
1777*8975f5c5SAndroid Build Coastguard Worker         GLTexture incompleteTexture;
1778*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, incompleteTexture);
1779*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1780*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1781*8975f5c5SAndroid Build Coastguard Worker 
1782*8975f5c5SAndroid Build Coastguard Worker         EGLint level0Attribute[] = {
1783*8975f5c5SAndroid Build Coastguard Worker             EGL_GL_TEXTURE_LEVEL_KHR,
1784*8975f5c5SAndroid Build Coastguard Worker             0,
1785*8975f5c5SAndroid Build Coastguard Worker             EGL_NONE,
1786*8975f5c5SAndroid Build Coastguard Worker         };
1787*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR,
1788*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(incompleteTexture),
1789*8975f5c5SAndroid Build Coastguard Worker                                   level0Attribute);
1790*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1791*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1792*8975f5c5SAndroid Build Coastguard Worker 
1793*8975f5c5SAndroid Build Coastguard Worker         // If EGL_GL_TEXTURE_LEVEL_KHR is 0, <target> is EGL_GL_TEXTURE_2D_KHR or
1794*8975f5c5SAndroid Build Coastguard Worker         // EGL_GL_TEXTURE_3D_KHR, <buffer> is not the name of a complete GL texture object, and
1795*8975f5c5SAndroid Build Coastguard Worker         // mipmap level 0 is not specified, the error EGL_BAD_PARAMETER is generated.
1796*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1797*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR,
1798*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(incompleteTexture), nullptr);
1799*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1800*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1801*8975f5c5SAndroid Build Coastguard Worker 
1802*8975f5c5SAndroid Build Coastguard Worker         // If <target> is EGL_GL_TEXTURE_2D_KHR, EGL_GL_TEXTURE_CUBE_MAP_*_KHR,
1803*8975f5c5SAndroid Build Coastguard Worker         // EGL_GL_RENDERBUFFER_KHR or EGL_GL_TEXTURE_3D_KHR and <buffer> refers to the default GL
1804*8975f5c5SAndroid Build Coastguard Worker         // texture object(0) for the corresponding GL target, the error EGL_BAD_PARAMETER is
1805*8975f5c5SAndroid Build Coastguard Worker         // generated.
1806*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, 0, nullptr);
1807*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1808*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1809*8975f5c5SAndroid Build Coastguard Worker 
1810*8975f5c5SAndroid Build Coastguard Worker         // If <target> is EGL_GL_TEXTURE_2D_KHR, EGL_GL_TEXTURE_CUBE_MAP_*_KHR, or
1811*8975f5c5SAndroid Build Coastguard Worker         // EGL_GL_TEXTURE_3D_KHR, and the value specified in <attr_list> for
1812*8975f5c5SAndroid Build Coastguard Worker         // EGL_GL_TEXTURE_LEVEL_KHR is not a valid mipmap level for the specified GL texture object
1813*8975f5c5SAndroid Build Coastguard Worker         // <buffer>, the error EGL_BAD_MATCH is generated.
1814*8975f5c5SAndroid Build Coastguard Worker         EGLint level2Attribute[] = {
1815*8975f5c5SAndroid Build Coastguard Worker             EGL_GL_TEXTURE_LEVEL_KHR,
1816*8975f5c5SAndroid Build Coastguard Worker             2,
1817*8975f5c5SAndroid Build Coastguard Worker             EGL_NONE,
1818*8975f5c5SAndroid Build Coastguard Worker         };
1819*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR,
1820*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(incompleteTexture),
1821*8975f5c5SAndroid Build Coastguard Worker                                   level2Attribute);
1822*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1823*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1824*8975f5c5SAndroid Build Coastguard Worker     }
1825*8975f5c5SAndroid Build Coastguard Worker     else
1826*8975f5c5SAndroid Build Coastguard Worker     {
1827*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture2D;
1828*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture2D);
1829*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1830*8975f5c5SAndroid Build Coastguard Worker 
1831*8975f5c5SAndroid Build Coastguard Worker         // From EGL_KHR_image_base:
1832*8975f5c5SAndroid Build Coastguard Worker         // If <target> is not one of the values in Table aaa, the error EGL_BAD_PARAMETER is
1833*8975f5c5SAndroid Build Coastguard Worker         // generated.
1834*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR,
1835*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(texture2D), nullptr);
1836*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1837*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1838*8975f5c5SAndroid Build Coastguard Worker     }
1839*8975f5c5SAndroid Build Coastguard Worker 
1840*8975f5c5SAndroid Build Coastguard Worker     if (hasCubemapExt())
1841*8975f5c5SAndroid Build Coastguard Worker     {
1842*8975f5c5SAndroid Build Coastguard Worker         // If EGL_GL_TEXTURE_LEVEL_KHR is 0, <target> is EGL_GL_TEXTURE_CUBE_MAP_*_KHR, <buffer> is
1843*8975f5c5SAndroid Build Coastguard Worker         // not the name of a complete GL texture object, and one or more faces do not have mipmap
1844*8975f5c5SAndroid Build Coastguard Worker         // level 0 specified, the error EGL_BAD_PARAMETER is generated.
1845*8975f5c5SAndroid Build Coastguard Worker         GLTexture incompleteTextureCube;
1846*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, incompleteTextureCube);
1847*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1848*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
1849*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1850*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
1851*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1852*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
1853*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1854*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
1855*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1856*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
1857*8975f5c5SAndroid Build Coastguard Worker 
1858*8975f5c5SAndroid Build Coastguard Worker         EGLint level0Attribute[] = {
1859*8975f5c5SAndroid Build Coastguard Worker             EGL_GL_TEXTURE_LEVEL_KHR,
1860*8975f5c5SAndroid Build Coastguard Worker             0,
1861*8975f5c5SAndroid Build Coastguard Worker             EGL_NONE,
1862*8975f5c5SAndroid Build Coastguard Worker         };
1863*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR,
1864*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(incompleteTextureCube),
1865*8975f5c5SAndroid Build Coastguard Worker                                   level0Attribute);
1866*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1867*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1868*8975f5c5SAndroid Build Coastguard Worker     }
1869*8975f5c5SAndroid Build Coastguard Worker     else
1870*8975f5c5SAndroid Build Coastguard Worker     {
1871*8975f5c5SAndroid Build Coastguard Worker         GLTexture textureCube;
1872*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP, textureCube);
1873*8975f5c5SAndroid Build Coastguard Worker         for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1874*8975f5c5SAndroid Build Coastguard Worker              face++)
1875*8975f5c5SAndroid Build Coastguard Worker         {
1876*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1877*8975f5c5SAndroid Build Coastguard Worker         }
1878*8975f5c5SAndroid Build Coastguard Worker 
1879*8975f5c5SAndroid Build Coastguard Worker         // From EGL_KHR_image_base:
1880*8975f5c5SAndroid Build Coastguard Worker         // If <target> is not one of the values in Table aaa, the error EGL_BAD_PARAMETER is
1881*8975f5c5SAndroid Build Coastguard Worker         // generated.
1882*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR,
1883*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(textureCube), nullptr);
1884*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1885*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1886*8975f5c5SAndroid Build Coastguard Worker     }
1887*8975f5c5SAndroid Build Coastguard Worker 
1888*8975f5c5SAndroid Build Coastguard Worker     if (has3DTextureExt() && getClientMajorVersion() >= 3)
1889*8975f5c5SAndroid Build Coastguard Worker     {
1890*8975f5c5SAndroid Build Coastguard Worker         // If <target> is EGL_GL_TEXTURE_3D_KHR, and the value specified in <attr_list> for
1891*8975f5c5SAndroid Build Coastguard Worker         // EGL_GL_TEXTURE_ZOFFSET_KHR exceeds the depth of the specified mipmap level - of - detail
1892*8975f5c5SAndroid Build Coastguard Worker         // in <buffer>, the error EGL_BAD_PARAMETER is generated.
1893*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture3D;
1894*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_3D, texture3D);
1895*8975f5c5SAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1896*8975f5c5SAndroid Build Coastguard Worker 
1897*8975f5c5SAndroid Build Coastguard Worker         EGLint zOffset3Parameter[] = {
1898*8975f5c5SAndroid Build Coastguard Worker             EGL_GL_TEXTURE_ZOFFSET_KHR,
1899*8975f5c5SAndroid Build Coastguard Worker             3,
1900*8975f5c5SAndroid Build Coastguard Worker             EGL_NONE,
1901*8975f5c5SAndroid Build Coastguard Worker         };
1902*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_3D_KHR,
1903*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(texture3D), zOffset3Parameter);
1904*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1905*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1906*8975f5c5SAndroid Build Coastguard Worker 
1907*8975f5c5SAndroid Build Coastguard Worker         EGLint zOffsetNegative1Parameter[] = {
1908*8975f5c5SAndroid Build Coastguard Worker             EGL_GL_TEXTURE_ZOFFSET_KHR,
1909*8975f5c5SAndroid Build Coastguard Worker             -1,
1910*8975f5c5SAndroid Build Coastguard Worker             EGL_NONE,
1911*8975f5c5SAndroid Build Coastguard Worker         };
1912*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_3D_KHR,
1913*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(texture3D),
1914*8975f5c5SAndroid Build Coastguard Worker                                   zOffsetNegative1Parameter);
1915*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1916*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1917*8975f5c5SAndroid Build Coastguard Worker     }
1918*8975f5c5SAndroid Build Coastguard Worker     else
1919*8975f5c5SAndroid Build Coastguard Worker     {
1920*8975f5c5SAndroid Build Coastguard Worker         if (has2DTextureExt())
1921*8975f5c5SAndroid Build Coastguard Worker         {
1922*8975f5c5SAndroid Build Coastguard Worker             GLTexture texture2D;
1923*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, texture2D);
1924*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1925*8975f5c5SAndroid Build Coastguard Worker 
1926*8975f5c5SAndroid Build Coastguard Worker             // Verify EGL_GL_TEXTURE_ZOFFSET_KHR is not a valid parameter
1927*8975f5c5SAndroid Build Coastguard Worker             EGLint zOffset0Parameter[] = {
1928*8975f5c5SAndroid Build Coastguard Worker                 EGL_GL_TEXTURE_ZOFFSET_KHR,
1929*8975f5c5SAndroid Build Coastguard Worker                 0,
1930*8975f5c5SAndroid Build Coastguard Worker                 EGL_NONE,
1931*8975f5c5SAndroid Build Coastguard Worker             };
1932*8975f5c5SAndroid Build Coastguard Worker 
1933*8975f5c5SAndroid Build Coastguard Worker             image =
1934*8975f5c5SAndroid Build Coastguard Worker                 eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR,
1935*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(texture2D), zOffset0Parameter);
1936*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1937*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1938*8975f5c5SAndroid Build Coastguard Worker         }
1939*8975f5c5SAndroid Build Coastguard Worker 
1940*8975f5c5SAndroid Build Coastguard Worker         if (getClientMajorVersion() >= 3)
1941*8975f5c5SAndroid Build Coastguard Worker         {
1942*8975f5c5SAndroid Build Coastguard Worker             GLTexture texture3D;
1943*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_3D, texture3D);
1944*8975f5c5SAndroid Build Coastguard Worker             glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1945*8975f5c5SAndroid Build Coastguard Worker 
1946*8975f5c5SAndroid Build Coastguard Worker             // From EGL_KHR_image_base:
1947*8975f5c5SAndroid Build Coastguard Worker             // If <target> is not one of the values in Table aaa, the error EGL_BAD_PARAMETER is
1948*8975f5c5SAndroid Build Coastguard Worker             // generated.
1949*8975f5c5SAndroid Build Coastguard Worker             image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_3D_KHR,
1950*8975f5c5SAndroid Build Coastguard Worker                                       reinterpretHelper<EGLClientBuffer>(texture3D), nullptr);
1951*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1952*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1953*8975f5c5SAndroid Build Coastguard Worker         }
1954*8975f5c5SAndroid Build Coastguard Worker     }
1955*8975f5c5SAndroid Build Coastguard Worker 
1956*8975f5c5SAndroid Build Coastguard Worker     if (hasRenderbufferExt())
1957*8975f5c5SAndroid Build Coastguard Worker     {
1958*8975f5c5SAndroid Build Coastguard Worker         // If <target> is EGL_GL_RENDERBUFFER_KHR and <buffer> is not the name of a renderbuffer
1959*8975f5c5SAndroid Build Coastguard Worker         // object, or if <buffer> is the name of a multisampled renderbuffer object, the error
1960*8975f5c5SAndroid Build Coastguard Worker         // EGL_BAD_PARAMETER is generated.
1961*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_RENDERBUFFER_KHR,
1962*8975f5c5SAndroid Build Coastguard Worker                                   reinterpret_cast<EGLClientBuffer>(0), nullptr);
1963*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1964*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1965*8975f5c5SAndroid Build Coastguard Worker 
1966*8975f5c5SAndroid Build Coastguard Worker         if (IsGLExtensionEnabled("GL_ANGLE_framebuffer_multisample"))
1967*8975f5c5SAndroid Build Coastguard Worker         {
1968*8975f5c5SAndroid Build Coastguard Worker             GLRenderbuffer renderbuffer;
1969*8975f5c5SAndroid Build Coastguard Worker             glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
1970*8975f5c5SAndroid Build Coastguard Worker             glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_RGBA8, 1, 1);
1971*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_NO_ERROR();
1972*8975f5c5SAndroid Build Coastguard Worker 
1973*8975f5c5SAndroid Build Coastguard Worker             image = eglCreateImageKHR(display, context, EGL_GL_RENDERBUFFER_KHR,
1974*8975f5c5SAndroid Build Coastguard Worker                                       reinterpret_cast<EGLClientBuffer>(0), nullptr);
1975*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1976*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1977*8975f5c5SAndroid Build Coastguard Worker         }
1978*8975f5c5SAndroid Build Coastguard Worker     }
1979*8975f5c5SAndroid Build Coastguard Worker     else
1980*8975f5c5SAndroid Build Coastguard Worker     {
1981*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer renderbuffer;
1982*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
1983*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 1, 1);
1984*8975f5c5SAndroid Build Coastguard Worker 
1985*8975f5c5SAndroid Build Coastguard Worker         // From EGL_KHR_image_base:
1986*8975f5c5SAndroid Build Coastguard Worker         // If <target> is not one of the values in Table aaa, the error EGL_BAD_PARAMETER is
1987*8975f5c5SAndroid Build Coastguard Worker         // generated.
1988*8975f5c5SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, context, EGL_GL_RENDERBUFFER_KHR,
1989*8975f5c5SAndroid Build Coastguard Worker                                   reinterpretHelper<EGLClientBuffer>(renderbuffer), nullptr);
1990*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
1991*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_ERROR(EGL_BAD_PARAMETER);
1992*8975f5c5SAndroid Build Coastguard Worker     }
1993*8975f5c5SAndroid Build Coastguard Worker }
1994*8975f5c5SAndroid Build Coastguard Worker 
1995*8975f5c5SAndroid Build Coastguard Worker // Check validation from the GL_OES_EGL_image extension
TEST_P(ImageTest,ValidationGLEGLImage)1996*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, ValidationGLEGLImage)
1997*8975f5c5SAndroid Build Coastguard Worker {
1998*8975f5c5SAndroid Build Coastguard Worker     ValidationGLEGLImage_helper(kDefaultAttribs);
1999*8975f5c5SAndroid Build Coastguard Worker }
2000*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,ValidationGLEGLImage_Colorspace)2001*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, ValidationGLEGLImage_Colorspace)
2002*8975f5c5SAndroid Build Coastguard Worker {
2003*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
2004*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
2005*8975f5c5SAndroid Build Coastguard Worker     ValidationGLEGLImage_helper(kColorspaceAttribs);
2006*8975f5c5SAndroid Build Coastguard Worker }
2007*8975f5c5SAndroid Build Coastguard Worker 
ValidationGLEGLImage_helper(const EGLint * attribs)2008*8975f5c5SAndroid Build Coastguard Worker void ImageTest::ValidationGLEGLImage_helper(const EGLint *attribs)
2009*8975f5c5SAndroid Build Coastguard Worker {
2010*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2011*8975f5c5SAndroid Build Coastguard Worker 
2012*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2013*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
2014*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
2015*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, attribs, kLinearColor, source,
2016*8975f5c5SAndroid Build Coastguard Worker                                   &image);
2017*8975f5c5SAndroid Build Coastguard Worker 
2018*8975f5c5SAndroid Build Coastguard Worker     // If <target> is not TEXTURE_2D, the error INVALID_ENUM is generated.
2019*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_CUBE_MAP_POSITIVE_X, image);
2020*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
2021*8975f5c5SAndroid Build Coastguard Worker 
2022*8975f5c5SAndroid Build Coastguard Worker     // If <image> does not refer to a valid eglImageOES object, the error INVALID_VALUE is
2023*8975f5c5SAndroid Build Coastguard Worker     // generated.
2024*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
2025*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
2026*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, reinterpret_cast<GLeglImageOES>(0xBAADF00D));
2027*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
2028*8975f5c5SAndroid Build Coastguard Worker 
2029*8975f5c5SAndroid Build Coastguard Worker     // <target> must be RENDERBUFFER_OES, and <image> must be the handle of a valid EGLImage
2030*8975f5c5SAndroid Build Coastguard Worker     // resource, cast into the type
2031*8975f5c5SAndroid Build Coastguard Worker     // eglImageOES.
2032*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetRenderbufferStorageOES(GL_TEXTURE_2D, image);
2033*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
2034*8975f5c5SAndroid Build Coastguard Worker 
2035*8975f5c5SAndroid Build Coastguard Worker     // If the GL is unable to create a renderbuffer using the specified eglImageOES, the error
2036*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated.If <image>
2037*8975f5c5SAndroid Build Coastguard Worker     // does not refer to a valid eglImageOES object, the error INVALID_VALUE is generated.
2038*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
2039*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
2040*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER,
2041*8975f5c5SAndroid Build Coastguard Worker                                            reinterpret_cast<GLeglImageOES>(0xBAADF00D));
2042*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
2043*8975f5c5SAndroid Build Coastguard Worker 
2044*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2045*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(getEGLWindow()->getDisplay(), image);
2046*8975f5c5SAndroid Build Coastguard Worker }
2047*8975f5c5SAndroid Build Coastguard Worker 
2048*8975f5c5SAndroid Build Coastguard Worker // Check validation from the GL_OES_EGL_image_external extension
TEST_P(ImageTest,ValidationGLEGLImageExternal)2049*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, ValidationGLEGLImageExternal)
2050*8975f5c5SAndroid Build Coastguard Worker {
2051*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasExternalExt());
2052*8975f5c5SAndroid Build Coastguard Worker 
2053*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
2054*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture);
2055*8975f5c5SAndroid Build Coastguard Worker 
2056*8975f5c5SAndroid Build Coastguard Worker     // In the initial state of a TEXTURE_EXTERNAL_OES texture object, the value assigned to
2057*8975f5c5SAndroid Build Coastguard Worker     // TEXTURE_MIN_FILTER and TEXTURE_MAG_FILTER is LINEAR, and the s and t wrap modes are both set
2058*8975f5c5SAndroid Build Coastguard Worker     // to CLAMP_TO_EDGE
2059*8975f5c5SAndroid Build Coastguard Worker     auto getTexParam = [](GLenum target, GLenum pname) {
2060*8975f5c5SAndroid Build Coastguard Worker         GLint value = 0;
2061*8975f5c5SAndroid Build Coastguard Worker         glGetTexParameteriv(target, pname, &value);
2062*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
2063*8975f5c5SAndroid Build Coastguard Worker         return value;
2064*8975f5c5SAndroid Build Coastguard Worker     };
2065*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_LINEAR, getTexParam(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER));
2066*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_LINEAR, getTexParam(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER));
2067*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_CLAMP_TO_EDGE, getTexParam(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S));
2068*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_CLAMP_TO_EDGE, getTexParam(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T));
2069*8975f5c5SAndroid Build Coastguard Worker 
2070*8975f5c5SAndroid Build Coastguard Worker     // "When <target> is TEXTURE_EXTERNAL_OES only NEAREST and LINEAR are accepted as
2071*8975f5c5SAndroid Build Coastguard Worker     // TEXTURE_MIN_FILTER, only CLAMP_TO_EDGE is accepted as TEXTURE_WRAP_S and TEXTURE_WRAP_T, and
2072*8975f5c5SAndroid Build Coastguard Worker     // only FALSE is accepted as GENERATE_MIPMAP. Attempting to set other values for
2073*8975f5c5SAndroid Build Coastguard Worker     // TEXTURE_MIN_FILTER, TEXTURE_WRAP_S, TEXTURE_WRAP_T, or GENERATE_MIPMAP will result in an
2074*8975f5c5SAndroid Build Coastguard Worker     // INVALID_ENUM error.
2075*8975f5c5SAndroid Build Coastguard Worker     GLenum validMinFilters[]{
2076*8975f5c5SAndroid Build Coastguard Worker         GL_NEAREST,
2077*8975f5c5SAndroid Build Coastguard Worker         GL_LINEAR,
2078*8975f5c5SAndroid Build Coastguard Worker     };
2079*8975f5c5SAndroid Build Coastguard Worker     for (auto minFilter : validMinFilters)
2080*8975f5c5SAndroid Build Coastguard Worker     {
2081*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, minFilter);
2082*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
2083*8975f5c5SAndroid Build Coastguard Worker     }
2084*8975f5c5SAndroid Build Coastguard Worker 
2085*8975f5c5SAndroid Build Coastguard Worker     GLenum invalidMinFilters[]{
2086*8975f5c5SAndroid Build Coastguard Worker         GL_NEAREST_MIPMAP_LINEAR,
2087*8975f5c5SAndroid Build Coastguard Worker         GL_NEAREST_MIPMAP_NEAREST,
2088*8975f5c5SAndroid Build Coastguard Worker         GL_LINEAR_MIPMAP_LINEAR,
2089*8975f5c5SAndroid Build Coastguard Worker         GL_LINEAR_MIPMAP_NEAREST,
2090*8975f5c5SAndroid Build Coastguard Worker     };
2091*8975f5c5SAndroid Build Coastguard Worker     for (auto minFilter : invalidMinFilters)
2092*8975f5c5SAndroid Build Coastguard Worker     {
2093*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, minFilter);
2094*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
2095*8975f5c5SAndroid Build Coastguard Worker     }
2096*8975f5c5SAndroid Build Coastguard Worker 
2097*8975f5c5SAndroid Build Coastguard Worker     GLenum validWrapModes[]{
2098*8975f5c5SAndroid Build Coastguard Worker         GL_CLAMP_TO_EDGE,
2099*8975f5c5SAndroid Build Coastguard Worker     };
2100*8975f5c5SAndroid Build Coastguard Worker     for (auto wrapMode : validWrapModes)
2101*8975f5c5SAndroid Build Coastguard Worker     {
2102*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, wrapMode);
2103*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
2104*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, wrapMode);
2105*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
2106*8975f5c5SAndroid Build Coastguard Worker     }
2107*8975f5c5SAndroid Build Coastguard Worker 
2108*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_EGL_image_external_wrap_modes"))
2109*8975f5c5SAndroid Build Coastguard Worker     {
2110*8975f5c5SAndroid Build Coastguard Worker         GLenum validWrapModesEXT[]{GL_REPEAT, GL_MIRRORED_REPEAT};
2111*8975f5c5SAndroid Build Coastguard Worker         for (auto wrapMode : validWrapModesEXT)
2112*8975f5c5SAndroid Build Coastguard Worker         {
2113*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, wrapMode);
2114*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_NO_ERROR();
2115*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, wrapMode);
2116*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_NO_ERROR();
2117*8975f5c5SAndroid Build Coastguard Worker         }
2118*8975f5c5SAndroid Build Coastguard Worker     }
2119*8975f5c5SAndroid Build Coastguard Worker     else
2120*8975f5c5SAndroid Build Coastguard Worker     {
2121*8975f5c5SAndroid Build Coastguard Worker         GLenum invalidWrapModes[]{
2122*8975f5c5SAndroid Build Coastguard Worker             GL_REPEAT,
2123*8975f5c5SAndroid Build Coastguard Worker             GL_MIRRORED_REPEAT,
2124*8975f5c5SAndroid Build Coastguard Worker         };
2125*8975f5c5SAndroid Build Coastguard Worker         for (auto wrapMode : invalidWrapModes)
2126*8975f5c5SAndroid Build Coastguard Worker         {
2127*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, wrapMode);
2128*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_ERROR(GL_INVALID_ENUM);
2129*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, wrapMode);
2130*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_ERROR(GL_INVALID_ENUM);
2131*8975f5c5SAndroid Build Coastguard Worker         }
2132*8975f5c5SAndroid Build Coastguard Worker     }
2133*8975f5c5SAndroid Build Coastguard Worker 
2134*8975f5c5SAndroid Build Coastguard Worker     // When <target> is set to TEXTURE_EXTERNAL_OES, GenerateMipmap always fails and generates an
2135*8975f5c5SAndroid Build Coastguard Worker     // INVALID_ENUM error.
2136*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_EXTERNAL_OES);
2137*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
2138*8975f5c5SAndroid Build Coastguard Worker }
2139*8975f5c5SAndroid Build Coastguard Worker 
2140*8975f5c5SAndroid Build Coastguard Worker // Check validation from the GL_OES_EGL_image_external_essl3 extension
TEST_P(ImageTest,ValidationGLEGLImageExternalESSL3)2141*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, ValidationGLEGLImageExternalESSL3)
2142*8975f5c5SAndroid Build Coastguard Worker {
2143*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasExternalESSL3Ext());
2144*8975f5c5SAndroid Build Coastguard Worker 
2145*8975f5c5SAndroid Build Coastguard Worker     // Make sure this extension is not exposed without ES3.
2146*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(getClientMajorVersion(), 3);
2147*8975f5c5SAndroid Build Coastguard Worker 
2148*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
2149*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture);
2150*8975f5c5SAndroid Build Coastguard Worker 
2151*8975f5c5SAndroid Build Coastguard Worker     // It is an INVALID_OPERATION error to set the TEXTURE_BASE_LEVEL to a value other than zero.
2152*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_BASE_LEVEL, 1);
2153*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
2154*8975f5c5SAndroid Build Coastguard Worker 
2155*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_BASE_LEVEL, 10);
2156*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
2157*8975f5c5SAndroid Build Coastguard Worker 
2158*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_BASE_LEVEL, 0);
2159*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
2160*8975f5c5SAndroid Build Coastguard Worker }
2161*8975f5c5SAndroid Build Coastguard Worker 
2162*8975f5c5SAndroid Build Coastguard Worker // Check validation from the GL_EXT_EGL_image_storage extension
TEST_P(ImageTest,ValidationGLEGLImageStorage)2163*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, ValidationGLEGLImageStorage)
2164*8975f5c5SAndroid Build Coastguard Worker {
2165*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasEglImageStorageExt());
2166*8975f5c5SAndroid Build Coastguard Worker 
2167*8975f5c5SAndroid Build Coastguard Worker     // Make sure this extension is not exposed without ES3.
2168*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(getClientMajorVersion(), 3);
2169*8975f5c5SAndroid Build Coastguard Worker 
2170*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2171*8975f5c5SAndroid Build Coastguard Worker 
2172*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2173*8975f5c5SAndroid Build Coastguard Worker     GLTexture source2D;
2174*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image2D;
2175*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs, kLinearColor,
2176*8975f5c5SAndroid Build Coastguard Worker                                   source2D, &image2D);
2177*8975f5c5SAndroid Build Coastguard Worker 
2178*8975f5c5SAndroid Build Coastguard Worker     // <target> must be one of GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D,
2179*8975f5c5SAndroid Build Coastguard Worker     // GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_ARRAY.  On OpenGL implementations
2180*8975f5c5SAndroid Build Coastguard Worker     // (non-ES), <target> can also be GL_TEXTURE_1D or GL_TEXTURE_1D_ARRAY.
2181*8975f5c5SAndroid Build Coastguard Worker     // If the implementation supports OES_EGL_image_external, <target> can be
2182*8975f5c5SAndroid Build Coastguard Worker     // GL_TEXTURE_EXTERNAL_OES
2183*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexStorageEXT(GL_TEXTURE_CUBE_MAP_POSITIVE_X, image2D, nullptr);
2184*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
2185*8975f5c5SAndroid Build Coastguard Worker 
2186*8975f5c5SAndroid Build Coastguard Worker     // If <image> is NULL, the error INVALID_VALUE is generated.  If <image> is
2187*8975f5c5SAndroid Build Coastguard Worker     // neither NULL nor a valid value, the behavior is undefined, up to and
2188*8975f5c5SAndroid Build Coastguard Worker     // including program termination.
2189*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexStorageEXT(GL_TEXTURE_2D, nullptr, nullptr);
2190*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
2191*8975f5c5SAndroid Build Coastguard Worker 
2192*8975f5c5SAndroid Build Coastguard Worker     // If the GL is unable to specify a texture object using the supplied
2193*8975f5c5SAndroid Build Coastguard Worker     // eglImageOES <image> the error INVALID_OPERATION is generated.
2194*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexStorageEXT(GL_TEXTURE_3D, image2D, nullptr);
2195*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
2196*8975f5c5SAndroid Build Coastguard Worker 
2197*8975f5c5SAndroid Build Coastguard Worker     GLint nonNullAttrib[1] = {GL_TEXTURE_2D};
2198*8975f5c5SAndroid Build Coastguard Worker 
2199*8975f5c5SAndroid Build Coastguard Worker     // If <attrib_list> is neither NULL nor a pointer to the value GL_NONE, the
2200*8975f5c5SAndroid Build Coastguard Worker     // error INVALID_VALUE is generated.
2201*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexStorageEXT(GL_TEXTURE_2D, image2D, nonNullAttrib);
2202*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_VALUE);
2203*8975f5c5SAndroid Build Coastguard Worker 
2204*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2205*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(getEGLWindow()->getDisplay(), image2D);
2206*8975f5c5SAndroid Build Coastguard Worker }
2207*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source2DTarget2D)2208*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source2DTarget2D)
2209*8975f5c5SAndroid Build Coastguard Worker {
2210*8975f5c5SAndroid Build Coastguard Worker     Source2DTarget2D_helper(kDefaultAttribs);
2211*8975f5c5SAndroid Build Coastguard Worker }
2212*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source2DTarget2D_Colorspace)2213*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source2DTarget2D_Colorspace)
2214*8975f5c5SAndroid Build Coastguard Worker {
2215*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
2216*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
2217*8975f5c5SAndroid Build Coastguard Worker     Source2DTarget2D_helper(kColorspaceAttribs);
2218*8975f5c5SAndroid Build Coastguard Worker }
2219*8975f5c5SAndroid Build Coastguard Worker 
Source2DTarget2D_helper(const EGLint * attribs)2220*8975f5c5SAndroid Build Coastguard Worker void ImageTest::Source2DTarget2D_helper(const EGLint *attribs)
2221*8975f5c5SAndroid Build Coastguard Worker {
2222*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2223*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2224*8975f5c5SAndroid Build Coastguard Worker 
2225*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2226*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
2227*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
2228*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, attribs,
2229*8975f5c5SAndroid Build Coastguard Worker                                   static_cast<void *>(kSrgbColor), source, &image);
2230*8975f5c5SAndroid Build Coastguard Worker 
2231*8975f5c5SAndroid Build Coastguard Worker     // Create the target
2232*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2233*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
2234*8975f5c5SAndroid Build Coastguard Worker 
2235*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
2236*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, getExpected2DColorForAttribList(attribs));
2237*8975f5c5SAndroid Build Coastguard Worker 
2238*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2239*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
2240*8975f5c5SAndroid Build Coastguard Worker }
2241*8975f5c5SAndroid Build Coastguard Worker 
ImageStorageGenerateMipmap_helper(const EGLint * attribs,const GLsizei width,const GLsizei height,AHardwareBuffer * srcAhb,GLuint srcTexture,EGLImageKHR * imageOut)2242*8975f5c5SAndroid Build Coastguard Worker void ImageTest::ImageStorageGenerateMipmap_helper(const EGLint *attribs,
2243*8975f5c5SAndroid Build Coastguard Worker                                                   const GLsizei width,
2244*8975f5c5SAndroid Build Coastguard Worker                                                   const GLsizei height,
2245*8975f5c5SAndroid Build Coastguard Worker                                                   AHardwareBuffer *srcAhb,
2246*8975f5c5SAndroid Build Coastguard Worker                                                   GLuint srcTexture,
2247*8975f5c5SAndroid Build Coastguard Worker                                                   EGLImageKHR *imageOut)
2248*8975f5c5SAndroid Build Coastguard Worker {
2249*8975f5c5SAndroid Build Coastguard Worker     ASSERT(srcAhb != nullptr || glIsTexture(srcTexture));
2250*8975f5c5SAndroid Build Coastguard Worker 
2251*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
2252*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
2253*8975f5c5SAndroid Build Coastguard Worker 
2254*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2255*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasEglImageStorageExt());
2256*8975f5c5SAndroid Build Coastguard Worker 
2257*8975f5c5SAndroid Build Coastguard Worker     constexpr int kNumTiles = 8;
2258*8975f5c5SAndroid Build Coastguard Worker     const int tileWidth     = width / kNumTiles;
2259*8975f5c5SAndroid Build Coastguard Worker     const int tileHeight    = height / kNumTiles;
2260*8975f5c5SAndroid Build Coastguard Worker 
2261*8975f5c5SAndroid Build Coastguard Worker     // Create EGLImage and then a target texture from that image
2262*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2263*8975f5c5SAndroid Build Coastguard Worker     if (srcAhb != nullptr)
2264*8975f5c5SAndroid Build Coastguard Worker     {
2265*8975f5c5SAndroid Build Coastguard Worker         *imageOut =
2266*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
2267*8975f5c5SAndroid Build Coastguard Worker                               angle::android::AHardwareBufferToClientBuffer(srcAhb), attribs);
2268*8975f5c5SAndroid Build Coastguard Worker     }
2269*8975f5c5SAndroid Build Coastguard Worker     else
2270*8975f5c5SAndroid Build Coastguard Worker     {
2271*8975f5c5SAndroid Build Coastguard Worker         *imageOut =
2272*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
2273*8975f5c5SAndroid Build Coastguard Worker                               reinterpret_cast<EGLClientBuffer>(srcTexture), attribs);
2274*8975f5c5SAndroid Build Coastguard Worker     }
2275*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
2276*8975f5c5SAndroid Build Coastguard Worker 
2277*8975f5c5SAndroid Build Coastguard Worker     GLTexture dstTexture;
2278*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, dstTexture);
2279*8975f5c5SAndroid Build Coastguard Worker     // Setup for mipmapping
2280*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2281*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2282*8975f5c5SAndroid Build Coastguard Worker 
2283*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexStorageEXT(GL_TEXTURE_2D, *imageOut, nullptr);
2284*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2285*8975f5c5SAndroid Build Coastguard Worker 
2286*8975f5c5SAndroid Build Coastguard Worker     // Create framebuffer, attach level 0 of target texture and render pattern
2287*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2288*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2289*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstTexture, 0);
2290*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2291*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
2292*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < kNumTiles; ++i)
2293*8975f5c5SAndroid Build Coastguard Worker     {
2294*8975f5c5SAndroid Build Coastguard Worker         for (int j = 0; j < kNumTiles; ++j)
2295*8975f5c5SAndroid Build Coastguard Worker         {
2296*8975f5c5SAndroid Build Coastguard Worker             const float v = (i & 1) ^ (j & 1) ? 0.5f : 0.f;
2297*8975f5c5SAndroid Build Coastguard Worker             glClearColor(v, 0.f, v, v);
2298*8975f5c5SAndroid Build Coastguard Worker             glScissor(i * tileWidth, j * tileHeight, tileWidth, tileHeight);
2299*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
2300*8975f5c5SAndroid Build Coastguard Worker         }
2301*8975f5c5SAndroid Build Coastguard Worker     }
2302*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
2303*8975f5c5SAndroid Build Coastguard Worker 
2304*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmap for target texture
2305*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
2306*8975f5c5SAndroid Build Coastguard Worker }
2307*8975f5c5SAndroid Build Coastguard Worker 
verifyImageStorageMipmap(const EGLint * attribs,EGLImageKHR image,const GLsizei mipLevelCount)2308*8975f5c5SAndroid Build Coastguard Worker void ImageTest::verifyImageStorageMipmap(const EGLint *attribs,
2309*8975f5c5SAndroid Build Coastguard Worker                                          EGLImageKHR image,
2310*8975f5c5SAndroid Build Coastguard Worker                                          const GLsizei mipLevelCount)
2311*8975f5c5SAndroid Build Coastguard Worker {
2312*8975f5c5SAndroid Build Coastguard Worker     if (image == EGL_NO_IMAGE_KHR)
2313*8975f5c5SAndroid Build Coastguard Worker     {
2314*8975f5c5SAndroid Build Coastguard Worker         // Early return if image isn't valid
2315*8975f5c5SAndroid Build Coastguard Worker         return;
2316*8975f5c5SAndroid Build Coastguard Worker     }
2317*8975f5c5SAndroid Build Coastguard Worker 
2318*8975f5c5SAndroid Build Coastguard Worker     GLubyte linearColor[] = {64, 0, 64, 64};
2319*8975f5c5SAndroid Build Coastguard Worker     GLubyte srgbColor[]   = {137, 0, 137, 64};
2320*8975f5c5SAndroid Build Coastguard Worker     GLubyte *expectedColor =
2321*8975f5c5SAndroid Build Coastguard Worker         attribListHasSrgbColorspace(attribs, kColorspaceAttributeIndex) ? srgbColor : linearColor;
2322*8975f5c5SAndroid Build Coastguard Worker 
2323*8975f5c5SAndroid Build Coastguard Worker     GLTexture targetTexture;
2324*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, targetTexture);
2325*8975f5c5SAndroid Build Coastguard Worker     // Setup for mipmapping
2326*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2327*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2328*8975f5c5SAndroid Build Coastguard Worker 
2329*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexStorageEXT(GL_TEXTURE_2D, image, nullptr);
2330*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2331*8975f5c5SAndroid Build Coastguard Worker 
2332*8975f5c5SAndroid Build Coastguard Worker     // Create target framebuffer, attach "(mipLevelCount - 1)" level of target texture and verify
2333*8975f5c5SAndroid Build Coastguard Worker     // data
2334*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2335*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2336*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture,
2337*8975f5c5SAndroid Build Coastguard Worker                            mipLevelCount - 1);
2338*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2339*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, expectedColor[0], expectedColor[1], expectedColor[2], expectedColor[3],
2340*8975f5c5SAndroid Build Coastguard Worker                       1);
2341*8975f5c5SAndroid Build Coastguard Worker 
2342*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture generates linear color when sampled
2343*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
2344*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
2345*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, targetTexture);
2346*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, mipLevelCount - 1);
2347*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipLevelCount - 1);
2348*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2349*8975f5c5SAndroid Build Coastguard Worker 
2350*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(targetTexture, linearColor);
2351*8975f5c5SAndroid Build Coastguard Worker }
2352*8975f5c5SAndroid Build Coastguard Worker 
verifyImageStorageMipmapWithBlend(const EGLint * attribs,EGLImageKHR image,const GLsizei mipLevelCount)2353*8975f5c5SAndroid Build Coastguard Worker void ImageTest::verifyImageStorageMipmapWithBlend(const EGLint *attribs,
2354*8975f5c5SAndroid Build Coastguard Worker                                                   EGLImageKHR image,
2355*8975f5c5SAndroid Build Coastguard Worker                                                   const GLsizei mipLevelCount)
2356*8975f5c5SAndroid Build Coastguard Worker {
2357*8975f5c5SAndroid Build Coastguard Worker     if (image == EGL_NO_IMAGE_KHR)
2358*8975f5c5SAndroid Build Coastguard Worker     {
2359*8975f5c5SAndroid Build Coastguard Worker         // Early return if image isn't valid
2360*8975f5c5SAndroid Build Coastguard Worker         return;
2361*8975f5c5SAndroid Build Coastguard Worker     }
2362*8975f5c5SAndroid Build Coastguard Worker 
2363*8975f5c5SAndroid Build Coastguard Worker     // Need to have atleast miplevel 1
2364*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mipLevelCount >= 1);
2365*8975f5c5SAndroid Build Coastguard Worker     // Verification used by only those tests with colorspace overrides
2366*8975f5c5SAndroid Build Coastguard Worker     ASSERT(attribListHasSrgbColorspace(attribs, kColorspaceAttributeIndex));
2367*8975f5c5SAndroid Build Coastguard Worker 
2368*8975f5c5SAndroid Build Coastguard Worker     GLTexture targetTexture;
2369*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, targetTexture);
2370*8975f5c5SAndroid Build Coastguard Worker     // Setup for mipmapping
2371*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
2372*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2373*8975f5c5SAndroid Build Coastguard Worker 
2374*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexStorageEXT(GL_TEXTURE_2D, image, nullptr);
2375*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2376*8975f5c5SAndroid Build Coastguard Worker 
2377*8975f5c5SAndroid Build Coastguard Worker     // Create target framebuffer, attach mipLevel == 1 of target texture and verify
2378*8975f5c5SAndroid Build Coastguard Worker     // data with blending enabled.
2379*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
2380*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2381*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture, 1);
2382*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2383*8975f5c5SAndroid Build Coastguard Worker 
2384*8975f5c5SAndroid Build Coastguard Worker     // Blend green color with contents of mipLevel 1
2385*8975f5c5SAndroid Build Coastguard Worker     // source color at (7, 11) of mipLevel 1 = [137, 0, 137, 64]
2386*8975f5c5SAndroid Build Coastguard Worker     GLubyte blendedColor[] = {137, 255, 137, 255};
2387*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
2388*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
2389*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
2390*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
2391*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
2392*8975f5c5SAndroid Build Coastguard Worker 
2393*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(7, 11, blendedColor[0], blendedColor[1], blendedColor[2], blendedColor[3], 1);
2394*8975f5c5SAndroid Build Coastguard Worker }
2395*8975f5c5SAndroid Build Coastguard Worker 
SourceAHBTarget2DImageStorageGenerateMipmap_helper(const EGLint * attribs)2396*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceAHBTarget2DImageStorageGenerateMipmap_helper(const EGLint *attribs)
2397*8975f5c5SAndroid Build Coastguard Worker {
2398*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
2399*8975f5c5SAndroid Build Coastguard Worker 
2400*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kWidth    = 40;
2401*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kHeight   = 32;
2402*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kDepth    = 1;
2403*8975f5c5SAndroid Build Coastguard Worker     const GLsizei mipLevelCount = static_cast<GLsizei>(std::log2(std::max(kWidth, kHeight)) + 1);
2404*8975f5c5SAndroid Build Coastguard Worker 
2405*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
2406*8975f5c5SAndroid Build Coastguard Worker         kWidth, kHeight, kDepth, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
2407*8975f5c5SAndroid Build Coastguard Worker         kDefaultAHBUsage | kAHBUsageGPUMipMapComplete));
2408*8975f5c5SAndroid Build Coastguard Worker 
2409*8975f5c5SAndroid Build Coastguard Worker     // Create source AHB
2410*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *aHardwareBuffer =
2411*8975f5c5SAndroid Build Coastguard Worker         createAndroidHardwareBuffer(kWidth, kHeight, kDepth, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
2412*8975f5c5SAndroid Build Coastguard Worker                                     kDefaultAHBUsage | kAHBUsageGPUMipMapComplete, {});
2413*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(aHardwareBuffer, nullptr);
2414*8975f5c5SAndroid Build Coastguard Worker 
2415*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image = EGL_NO_IMAGE_KHR;
2416*8975f5c5SAndroid Build Coastguard Worker     ImageStorageGenerateMipmap_helper(attribs, kWidth, kHeight, aHardwareBuffer, 0, &image);
2417*8975f5c5SAndroid Build Coastguard Worker     verifyImageStorageMipmap(attribs, image, mipLevelCount);
2418*8975f5c5SAndroid Build Coastguard Worker 
2419*8975f5c5SAndroid Build Coastguard Worker     // Clean up image
2420*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(getEGLWindow()->getDisplay(), image);
2421*8975f5c5SAndroid Build Coastguard Worker 
2422*8975f5c5SAndroid Build Coastguard Worker     // Clean up AHB
2423*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(aHardwareBuffer);
2424*8975f5c5SAndroid Build Coastguard Worker }
2425*8975f5c5SAndroid Build Coastguard Worker 
2426*8975f5c5SAndroid Build Coastguard Worker // Test interaction between AHB, GL_EXT_EGL_image_storage and glGenerateMipmap
TEST_P(ImageTestES3,SourceAHBTarget2DGenerateMipmap)2427*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceAHBTarget2DGenerateMipmap)
2428*8975f5c5SAndroid Build Coastguard Worker {
2429*8975f5c5SAndroid Build Coastguard Worker     SourceAHBTarget2DImageStorageGenerateMipmap_helper(kDefaultAttribs);
2430*8975f5c5SAndroid Build Coastguard Worker }
2431*8975f5c5SAndroid Build Coastguard Worker 
2432*8975f5c5SAndroid Build Coastguard Worker // Test interaction between AHB, GL_EXT_EGL_image_storage and glGenerateMipmap with colorspace
2433*8975f5c5SAndroid Build Coastguard Worker // overrides This mirrors the SingleLayer_ColorTest_MipmapComplete_R8G8B8A8_UNORM_sRGB Android CTS
2434*8975f5c5SAndroid Build Coastguard Worker // test
TEST_P(ImageTestES3,SourceAHBTarget2DGenerateMipmap_Colorspace)2435*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceAHBTarget2DGenerateMipmap_Colorspace)
2436*8975f5c5SAndroid Build Coastguard Worker {
2437*8975f5c5SAndroid Build Coastguard Worker     SourceAHBTarget2DImageStorageGenerateMipmap_helper(kColorspaceAttribs);
2438*8975f5c5SAndroid Build Coastguard Worker }
2439*8975f5c5SAndroid Build Coastguard Worker 
2440*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that Vulkan backend's LOAD_OP is correct for non-0 miplevels. A bug in
2441*8975f5c5SAndroid Build Coastguard Worker // content tracking of mip levels will cause rendering artifacts and result in test failure.
TEST_P(ImageTestES3,SourceAHBTarget2DGenerateMipmapColorspaceBlend)2442*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceAHBTarget2DGenerateMipmapColorspaceBlend)
2443*8975f5c5SAndroid Build Coastguard Worker {
2444*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
2445*8975f5c5SAndroid Build Coastguard Worker 
2446*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kWidth    = 40;
2447*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kHeight   = 32;
2448*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kDepth    = 1;
2449*8975f5c5SAndroid Build Coastguard Worker     const GLsizei mipLevelCount = static_cast<GLsizei>(std::log2(std::max(kWidth, kHeight)) + 1);
2450*8975f5c5SAndroid Build Coastguard Worker 
2451*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
2452*8975f5c5SAndroid Build Coastguard Worker         kWidth, kHeight, kDepth, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
2453*8975f5c5SAndroid Build Coastguard Worker         kDefaultAHBUsage | kAHBUsageGPUMipMapComplete));
2454*8975f5c5SAndroid Build Coastguard Worker 
2455*8975f5c5SAndroid Build Coastguard Worker     // Create source AHB
2456*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *aHardwareBuffer =
2457*8975f5c5SAndroid Build Coastguard Worker         createAndroidHardwareBuffer(kWidth, kHeight, kDepth, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
2458*8975f5c5SAndroid Build Coastguard Worker                                     kDefaultAHBUsage | kAHBUsageGPUMipMapComplete, {});
2459*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(aHardwareBuffer, nullptr);
2460*8975f5c5SAndroid Build Coastguard Worker 
2461*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image = EGL_NO_IMAGE_KHR;
2462*8975f5c5SAndroid Build Coastguard Worker     ImageStorageGenerateMipmap_helper(kColorspaceAttribs, kWidth, kHeight, aHardwareBuffer, 0,
2463*8975f5c5SAndroid Build Coastguard Worker                                       &image);
2464*8975f5c5SAndroid Build Coastguard Worker     verifyImageStorageMipmapWithBlend(kColorspaceAttribs, image, mipLevelCount);
2465*8975f5c5SAndroid Build Coastguard Worker 
2466*8975f5c5SAndroid Build Coastguard Worker     // Clean up image
2467*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(getEGLWindow()->getDisplay(), image);
2468*8975f5c5SAndroid Build Coastguard Worker 
2469*8975f5c5SAndroid Build Coastguard Worker     // Clean up AHB
2470*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(aHardwareBuffer);
2471*8975f5c5SAndroid Build Coastguard Worker }
2472*8975f5c5SAndroid Build Coastguard Worker 
2473*8975f5c5SAndroid Build Coastguard Worker // Try to orphan image created with the GL_EXT_EGL_image_storage extension
TEST_P(ImageTestES3,Source2DTarget2DStorageOrphan)2474*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, Source2DTarget2DStorageOrphan)
2475*8975f5c5SAndroid Build Coastguard Worker {
2476*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2477*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2478*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasEglImageStorageExt());
2479*8975f5c5SAndroid Build Coastguard Worker 
2480*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2481*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
2482*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
2483*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs,
2484*8975f5c5SAndroid Build Coastguard Worker                                   static_cast<void *>(&kLinearColor), source, &image);
2485*8975f5c5SAndroid Build Coastguard Worker 
2486*8975f5c5SAndroid Build Coastguard Worker     // Create the target
2487*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2488*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureStorage(image, GL_TEXTURE_2D, target, nullptr);
2489*8975f5c5SAndroid Build Coastguard Worker 
2490*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the same color as the source texture
2491*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, kLinearColor);
2492*8975f5c5SAndroid Build Coastguard Worker 
2493*8975f5c5SAndroid Build Coastguard Worker     // Try to orphan this target texture
2494*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, target);
2495*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, kLinearColor);
2496*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
2497*8975f5c5SAndroid Build Coastguard Worker 
2498*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2499*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
2500*8975f5c5SAndroid Build Coastguard Worker }
2501*8975f5c5SAndroid Build Coastguard Worker 
2502*8975f5c5SAndroid Build Coastguard Worker // Create target texture from EGL image and then trigger texture respecification.
TEST_P(ImageTest,Source2DTarget2DTargetTextureRespecifyColorspace)2503*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source2DTarget2DTargetTextureRespecifyColorspace)
2504*8975f5c5SAndroid Build Coastguard Worker {
2505*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2506*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2507*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_format_sRGB_override"));
2508*8975f5c5SAndroid Build Coastguard Worker 
2509*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2510*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
2511*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
2512*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs,
2513*8975f5c5SAndroid Build Coastguard Worker                                   static_cast<void *>(&kSrgbColor), source, &image);
2514*8975f5c5SAndroid Build Coastguard Worker 
2515*8975f5c5SAndroid Build Coastguard Worker     // Create the target
2516*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2517*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
2518*8975f5c5SAndroid Build Coastguard Worker 
2519*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the same color as the source texture
2520*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, kSrgbColor);
2521*8975f5c5SAndroid Build Coastguard Worker 
2522*8975f5c5SAndroid Build Coastguard Worker     // Respecify texture colorspace and verify results
2523*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, target);
2524*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT, GL_SRGB);
2525*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2526*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture decodes the sRGB color to linear when sampling
2527*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, kLinearColor);
2528*8975f5c5SAndroid Build Coastguard Worker 
2529*8975f5c5SAndroid Build Coastguard Worker     // Reset texture parameter and verify results again
2530*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT, GL_NONE);
2531*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2532*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the same color as the source texture
2533*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, kSrgbColor);
2534*8975f5c5SAndroid Build Coastguard Worker 
2535*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2536*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
2537*8975f5c5SAndroid Build Coastguard Worker }
2538*8975f5c5SAndroid Build Coastguard Worker 
2539*8975f5c5SAndroid Build Coastguard Worker // Create target texture from EGL image and then trigger texture respecification.
TEST_P(ImageTest,Source2DTarget2DTargetTextureRespecifySize)2540*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source2DTarget2DTargetTextureRespecifySize)
2541*8975f5c5SAndroid Build Coastguard Worker {
2542*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2543*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2544*8975f5c5SAndroid Build Coastguard Worker 
2545*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2546*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
2547*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
2548*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs,
2549*8975f5c5SAndroid Build Coastguard Worker                                   static_cast<void *>(&kLinearColor), source, &image);
2550*8975f5c5SAndroid Build Coastguard Worker 
2551*8975f5c5SAndroid Build Coastguard Worker     // Create the target
2552*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2553*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
2554*8975f5c5SAndroid Build Coastguard Worker 
2555*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the same color as the source texture
2556*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, kLinearColor);
2557*8975f5c5SAndroid Build Coastguard Worker 
2558*8975f5c5SAndroid Build Coastguard Worker     // Respecify texture size and verify results
2559*8975f5c5SAndroid Build Coastguard Worker     std::array<GLubyte, 16> referenceColor;
2560*8975f5c5SAndroid Build Coastguard Worker     referenceColor.fill(127);
2561*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, target);
2562*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2563*8975f5c5SAndroid Build Coastguard Worker                  referenceColor.data());
2564*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2565*8975f5c5SAndroid Build Coastguard Worker 
2566*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the reference color values
2567*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, referenceColor.data());
2568*8975f5c5SAndroid Build Coastguard Worker 
2569*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2570*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
2571*8975f5c5SAndroid Build Coastguard Worker }
2572*8975f5c5SAndroid Build Coastguard Worker 
2573*8975f5c5SAndroid Build Coastguard Worker // Create target texture from EGL image and then trigger texture respecification.
TEST_P(ImageTestES3,Source2DTarget2DTargetTextureRespecifyLevel)2574*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, Source2DTarget2DTargetTextureRespecifyLevel)
2575*8975f5c5SAndroid Build Coastguard Worker {
2576*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2577*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2578*8975f5c5SAndroid Build Coastguard Worker 
2579*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2580*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
2581*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
2582*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs,
2583*8975f5c5SAndroid Build Coastguard Worker                                   static_cast<void *>(&kLinearColor), source, &image);
2584*8975f5c5SAndroid Build Coastguard Worker 
2585*8975f5c5SAndroid Build Coastguard Worker     // Create the target
2586*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2587*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
2588*8975f5c5SAndroid Build Coastguard Worker 
2589*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the same color as the source texture
2590*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, kLinearColor);
2591*8975f5c5SAndroid Build Coastguard Worker 
2592*8975f5c5SAndroid Build Coastguard Worker     // Respecify texture levels and verify results
2593*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, target);
2594*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
2595*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);
2596*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2597*8975f5c5SAndroid Build Coastguard Worker 
2598*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the reference color values
2599*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, kLinearColor);
2600*8975f5c5SAndroid Build Coastguard Worker 
2601*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2602*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
2603*8975f5c5SAndroid Build Coastguard Worker }
2604*8975f5c5SAndroid Build Coastguard Worker 
2605*8975f5c5SAndroid Build Coastguard Worker // Create target texture from EGL image and then trigger texture respecification which releases the
2606*8975f5c5SAndroid Build Coastguard Worker // last image ref.
TEST_P(ImageTest,ImageOrphanRefCountingBug)2607*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, ImageOrphanRefCountingBug)
2608*8975f5c5SAndroid Build Coastguard Worker {
2609*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2610*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2611*8975f5c5SAndroid Build Coastguard Worker 
2612*8975f5c5SAndroid Build Coastguard Worker     // Create the first Image
2613*8975f5c5SAndroid Build Coastguard Worker     GLTexture source1;
2614*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image1;
2615*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs,
2616*8975f5c5SAndroid Build Coastguard Worker                                   static_cast<void *>(&kLinearColor), source1, &image1);
2617*8975f5c5SAndroid Build Coastguard Worker 
2618*8975f5c5SAndroid Build Coastguard Worker     // Create the target
2619*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2620*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image1, target);
2621*8975f5c5SAndroid Build Coastguard Worker 
2622*8975f5c5SAndroid Build Coastguard Worker     // Delete the source and image. A ref is still held by the target texture
2623*8975f5c5SAndroid Build Coastguard Worker     source1.reset();
2624*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image1);
2625*8975f5c5SAndroid Build Coastguard Worker 
2626*8975f5c5SAndroid Build Coastguard Worker     // Create the second Image
2627*8975f5c5SAndroid Build Coastguard Worker     GLTexture source2;
2628*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image2;
2629*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs,
2630*8975f5c5SAndroid Build Coastguard Worker                                   static_cast<void *>(&kLinearColor), source2, &image2);
2631*8975f5c5SAndroid Build Coastguard Worker 
2632*8975f5c5SAndroid Build Coastguard Worker     // Respecify the target with the second image.
2633*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, target);
2634*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image2);
2635*8975f5c5SAndroid Build Coastguard Worker 
2636*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2637*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image2);
2638*8975f5c5SAndroid Build Coastguard Worker }
2639*8975f5c5SAndroid Build Coastguard Worker 
2640*8975f5c5SAndroid Build Coastguard Worker // Testing source 2D texture, target 2D array texture
TEST_P(ImageTest,Source2DTarget2DArray)2641*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source2DTarget2DArray)
2642*8975f5c5SAndroid Build Coastguard Worker {
2643*8975f5c5SAndroid Build Coastguard Worker     Source2DTarget2DArray_helper(kDefaultAttribs);
2644*8975f5c5SAndroid Build Coastguard Worker }
2645*8975f5c5SAndroid Build Coastguard Worker 
2646*8975f5c5SAndroid Build Coastguard Worker // Testing source 2D texture with colorspace, target 2D array texture
TEST_P(ImageTest,Source2DTarget2DArray_Colorspace)2647*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source2DTarget2DArray_Colorspace)
2648*8975f5c5SAndroid Build Coastguard Worker {
2649*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
2650*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
2651*8975f5c5SAndroid Build Coastguard Worker     Source2DTarget2DArray_helper(kColorspaceAttribs);
2652*8975f5c5SAndroid Build Coastguard Worker }
2653*8975f5c5SAndroid Build Coastguard Worker 
Source2DTarget2DArray_helper(const EGLint * attribs)2654*8975f5c5SAndroid Build Coastguard Worker void ImageTest::Source2DTarget2DArray_helper(const EGLint *attribs)
2655*8975f5c5SAndroid Build Coastguard Worker {
2656*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
2657*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2658*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
2659*8975f5c5SAndroid Build Coastguard Worker                        !hasEglImageArrayExt());
2660*8975f5c5SAndroid Build Coastguard Worker 
2661*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2662*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
2663*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
2664*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, attribs, kSrgbColor, source,
2665*8975f5c5SAndroid Build Coastguard Worker                                   &image);
2666*8975f5c5SAndroid Build Coastguard Worker 
2667*8975f5c5SAndroid Build Coastguard Worker     // Create the target
2668*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2669*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2DArray(image, target);
2670*8975f5c5SAndroid Build Coastguard Worker 
2671*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
2672*8975f5c5SAndroid Build Coastguard Worker     verifyResults2DArray(target, getExpected2DColorForAttribList(attribs));
2673*8975f5c5SAndroid Build Coastguard Worker 
2674*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2675*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
2676*8975f5c5SAndroid Build Coastguard Worker }
2677*8975f5c5SAndroid Build Coastguard Worker 
2678*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image, if the client buffer is null, the test will not crash
TEST_P(ImageTest,SourceAHBInvalid)2679*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBInvalid)
2680*8975f5c5SAndroid Build Coastguard Worker {
2681*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2682*8975f5c5SAndroid Build Coastguard Worker 
2683*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !IsVulkan());
2684*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
2685*8975f5c5SAndroid Build Coastguard Worker 
2686*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2687*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image = eglCreateImageKHR(window->getDisplay(), EGL_NO_CONTEXT,
2688*8975f5c5SAndroid Build Coastguard Worker                                           EGL_NATIVE_BUFFER_ANDROID, nullptr, nullptr);
2689*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
2690*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(image, EGL_NO_IMAGE_KHR);
2691*8975f5c5SAndroid Build Coastguard Worker }
2692*8975f5c5SAndroid Build Coastguard Worker 
2693*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image, target 2D texture and delete when in use
2694*8975f5c5SAndroid Build Coastguard Worker // If refcounted correctly, the test should pass without issues
TEST_P(ImageTest,SourceAHBTarget2DEarlyDelete)2695*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2DEarlyDelete)
2696*8975f5c5SAndroid Build Coastguard Worker {
2697*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2698*8975f5c5SAndroid Build Coastguard Worker 
2699*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2700*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
2701*8975f5c5SAndroid Build Coastguard Worker 
2702*8975f5c5SAndroid Build Coastguard Worker     GLubyte data[4] = {7, 51, 197, 231};
2703*8975f5c5SAndroid Build Coastguard Worker 
2704*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2705*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
2706*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
2707*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
2708*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{data, 4}},
2709*8975f5c5SAndroid Build Coastguard Worker                                               &source, &image);
2710*8975f5c5SAndroid Build Coastguard Worker 
2711*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
2712*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2713*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
2714*8975f5c5SAndroid Build Coastguard Worker 
2715*8975f5c5SAndroid Build Coastguard Worker     // Delete the source AHB when in use
2716*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
2717*8975f5c5SAndroid Build Coastguard Worker 
2718*8975f5c5SAndroid Build Coastguard Worker     // Use texture target bound to egl image as source and render to framebuffer
2719*8975f5c5SAndroid Build Coastguard Worker     // Verify that data in framebuffer matches that in the egl image
2720*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, data);
2721*8975f5c5SAndroid Build Coastguard Worker 
2722*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2723*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
2724*8975f5c5SAndroid Build Coastguard Worker }
2725*8975f5c5SAndroid Build Coastguard Worker 
2726*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image, target 2D texture
TEST_P(ImageTest,SourceAHBTarget2D)2727*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2D)
2728*8975f5c5SAndroid Build Coastguard Worker {
2729*8975f5c5SAndroid Build Coastguard Worker     SourceAHBTarget2D_helper(kDefaultAttribs);
2730*8975f5c5SAndroid Build Coastguard Worker }
2731*8975f5c5SAndroid Build Coastguard Worker 
2732*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image with colorspace, target 2D texture
TEST_P(ImageTest,SourceAHBTarget2D_Colorspace)2733*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2D_Colorspace)
2734*8975f5c5SAndroid Build Coastguard Worker {
2735*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
2736*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
2737*8975f5c5SAndroid Build Coastguard Worker     SourceAHBTarget2D_helper(kColorspaceAttribs);
2738*8975f5c5SAndroid Build Coastguard Worker }
2739*8975f5c5SAndroid Build Coastguard Worker 
SourceAHBTarget2D_helper(const EGLint * attribs)2740*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceAHBTarget2D_helper(const EGLint *attribs)
2741*8975f5c5SAndroid Build Coastguard Worker {
2742*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2743*8975f5c5SAndroid Build Coastguard Worker 
2744*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2745*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
2746*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
2747*8975f5c5SAndroid Build Coastguard Worker 
2748*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
2749*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
2750*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
2751*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
2752*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, attribs, {{kSrgbColor, 4}}, &source,
2753*8975f5c5SAndroid Build Coastguard Worker                                               &image);
2754*8975f5c5SAndroid Build Coastguard Worker 
2755*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
2756*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2757*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
2758*8975f5c5SAndroid Build Coastguard Worker 
2759*8975f5c5SAndroid Build Coastguard Worker     // Use texture target bound to egl image as source and render to framebuffer
2760*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
2761*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, getExpected2DColorForAttribList(attribs));
2762*8975f5c5SAndroid Build Coastguard Worker 
2763*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2764*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
2765*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
2766*8975f5c5SAndroid Build Coastguard Worker }
2767*8975f5c5SAndroid Build Coastguard Worker 
2768*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL images, target 2D external texture, cycling through YUV sources.
TEST_P(ImageTest,SourceAHBTarget2DExternalCycleThroughYuvSourcesNoData)2769*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2DExternalCycleThroughYuvSourcesNoData)
2770*8975f5c5SAndroid Build Coastguard Worker {
2771*8975f5c5SAndroid Build Coastguard Worker     // http://issuetracker.google.com/175021871
2772*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsPixel2() || IsPixel2XL());
2773*8975f5c5SAndroid Build Coastguard Worker 
2774*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2775*8975f5c5SAndroid Build Coastguard Worker 
2776*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2777*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
2778*8975f5c5SAndroid Build Coastguard Worker 
2779*8975f5c5SAndroid Build Coastguard Worker     // Create YCbCr source and image but without initial data
2780*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ycbcrSource;
2781*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ycbcrImage;
2782*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420,
2783*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &ycbcrSource,
2784*8975f5c5SAndroid Build Coastguard Worker                                               &ycbcrImage);
2785*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(ycbcrSource, nullptr);
2786*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(ycbcrImage, EGL_NO_IMAGE_KHR);
2787*8975f5c5SAndroid Build Coastguard Worker 
2788*8975f5c5SAndroid Build Coastguard Worker     // Create YCrCb source and image but without initial data
2789*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ycrcbSource;
2790*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ycrcbImage;
2791*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cr8Cb8_420_SP,
2792*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &ycrcbSource,
2793*8975f5c5SAndroid Build Coastguard Worker                                               &ycrcbImage);
2794*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(ycrcbSource, nullptr);
2795*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(ycrcbImage, EGL_NO_IMAGE_KHR);
2796*8975f5c5SAndroid Build Coastguard Worker 
2797*8975f5c5SAndroid Build Coastguard Worker     // Create YV12 source and image but without initial data
2798*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *yv12Source;
2799*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR yv12Image;
2800*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_YV12,
2801*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &yv12Source,
2802*8975f5c5SAndroid Build Coastguard Worker                                               &yv12Image);
2803*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(yv12Source, nullptr);
2804*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(yv12Image, EGL_NO_IMAGE_KHR);
2805*8975f5c5SAndroid Build Coastguard Worker 
2806*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
2807*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2808*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, target);
2809*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
2810*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2811*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2812*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2813*8975f5c5SAndroid Build Coastguard Worker 
2814*8975f5c5SAndroid Build Coastguard Worker     // Bind YCbCr image
2815*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, ycbcrImage);
2816*8975f5c5SAndroid Build Coastguard Worker     // Draw while sampling should result in no EGL/GL errors
2817*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureExternalProgram);
2818*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureExternalUniformLocation, 0);
2819*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
2820*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2821*8975f5c5SAndroid Build Coastguard Worker 
2822*8975f5c5SAndroid Build Coastguard Worker     // Bind YCrCb image
2823*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, ycrcbImage);
2824*8975f5c5SAndroid Build Coastguard Worker     // Draw while sampling should result in no EGL/GL errors
2825*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureExternalProgram);
2826*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureExternalUniformLocation, 0);
2827*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
2828*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2829*8975f5c5SAndroid Build Coastguard Worker 
2830*8975f5c5SAndroid Build Coastguard Worker     // Bind YV12 image
2831*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, yv12Image);
2832*8975f5c5SAndroid Build Coastguard Worker     // Draw while sampling should result in no EGL/GL errors
2833*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureExternalProgram);
2834*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureExternalUniformLocation, 0);
2835*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
2836*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2837*8975f5c5SAndroid Build Coastguard Worker 
2838*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2839*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ycbcrImage);
2840*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ycbcrSource);
2841*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ycrcbImage);
2842*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ycrcbSource);
2843*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), yv12Image);
2844*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(yv12Source);
2845*8975f5c5SAndroid Build Coastguard Worker }
2846*8975f5c5SAndroid Build Coastguard Worker 
2847*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL images, target 2D external texture, cycling through RGB and YUV sources.
TEST_P(ImageTest,SourceAHBTarget2DExternalCycleThroughRgbAndYuvSources)2848*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2DExternalCycleThroughRgbAndYuvSources)
2849*8975f5c5SAndroid Build Coastguard Worker {
2850*8975f5c5SAndroid Build Coastguard Worker     // http://issuetracker.google.com/175021871
2851*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsPixel2() || IsPixel2XL());
2852*8975f5c5SAndroid Build Coastguard Worker 
2853*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2854*8975f5c5SAndroid Build Coastguard Worker 
2855*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2856*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
2857*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
2858*8975f5c5SAndroid Build Coastguard Worker 
2859*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
2860*8975f5c5SAndroid Build Coastguard Worker         1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM, kDefaultAHBUsage));
2861*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
2862*8975f5c5SAndroid Build Coastguard Worker         2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420, kDefaultAHBUsage));
2863*8975f5c5SAndroid Build Coastguard Worker 
2864*8975f5c5SAndroid Build Coastguard Worker     // Create RGB Image
2865*8975f5c5SAndroid Build Coastguard Worker     GLubyte rgbColor[4] = {0, 0, 255, 255};
2866*8975f5c5SAndroid Build Coastguard Worker 
2867*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *rgbSource;
2868*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR rgbImage;
2869*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
2870*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{rgbColor, 4}},
2871*8975f5c5SAndroid Build Coastguard Worker                                               &rgbSource, &rgbImage);
2872*8975f5c5SAndroid Build Coastguard Worker 
2873*8975f5c5SAndroid Build Coastguard Worker     // Create YUV Image
2874*8975f5c5SAndroid Build Coastguard Worker     // 3 planes of data
2875*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataY[4]  = {40, 40, 40, 40};
2876*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCb[1] = {
2877*8975f5c5SAndroid Build Coastguard Worker         240,
2878*8975f5c5SAndroid Build Coastguard Worker     };
2879*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCr[1] = {
2880*8975f5c5SAndroid Build Coastguard Worker         109,
2881*8975f5c5SAndroid Build Coastguard Worker     };
2882*8975f5c5SAndroid Build Coastguard Worker 
2883*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedRgbColor[4] = {0, 0, 255, 255};
2884*8975f5c5SAndroid Build Coastguard Worker 
2885*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *yuvSource;
2886*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR yuvImage;
2887*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(
2888*8975f5c5SAndroid Build Coastguard Worker         2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420, kDefaultAHBUsage, kDefaultAttribs,
2889*8975f5c5SAndroid Build Coastguard Worker         {{dataY, 1}, {dataCb, 1}, {dataCr, 1}}, &yuvSource, &yuvImage);
2890*8975f5c5SAndroid Build Coastguard Worker 
2891*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
2892*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
2893*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, target);
2894*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
2895*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2896*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2897*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2898*8975f5c5SAndroid Build Coastguard Worker 
2899*8975f5c5SAndroid Build Coastguard Worker     // Bind YUV image
2900*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, yuvImage);
2901*8975f5c5SAndroid Build Coastguard Worker     // Expect render target to have the same color as expectedRgbColor
2902*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(target, expectedRgbColor);
2903*8975f5c5SAndroid Build Coastguard Worker 
2904*8975f5c5SAndroid Build Coastguard Worker     // Bind RGB image
2905*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, rgbImage);
2906*8975f5c5SAndroid Build Coastguard Worker     // Expect render target to have the same color as rgbColor
2907*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(target, rgbColor);
2908*8975f5c5SAndroid Build Coastguard Worker 
2909*8975f5c5SAndroid Build Coastguard Worker     // Bind YUV image
2910*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, yuvImage);
2911*8975f5c5SAndroid Build Coastguard Worker     // Expect render target to have the same color as expectedRgbColor
2912*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(target, expectedRgbColor);
2913*8975f5c5SAndroid Build Coastguard Worker 
2914*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2915*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), yuvImage);
2916*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(yuvSource);
2917*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), rgbImage);
2918*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(rgbSource);
2919*8975f5c5SAndroid Build Coastguard Worker }
2920*8975f5c5SAndroid Build Coastguard Worker 
2921*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL images, target 2D external textures, cycling through RGB and YUV targets.
TEST_P(ImageTest,SourceAHBTarget2DExternalCycleThroughRgbAndYuvTargets)2922*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2DExternalCycleThroughRgbAndYuvTargets)
2923*8975f5c5SAndroid Build Coastguard Worker {
2924*8975f5c5SAndroid Build Coastguard Worker     // http://issuetracker.google.com/175021871
2925*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsPixel2() || IsPixel2XL());
2926*8975f5c5SAndroid Build Coastguard Worker 
2927*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
2928*8975f5c5SAndroid Build Coastguard Worker 
2929*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
2930*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
2931*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
2932*8975f5c5SAndroid Build Coastguard Worker 
2933*8975f5c5SAndroid Build Coastguard Worker     // Create RGBA Image
2934*8975f5c5SAndroid Build Coastguard Worker     GLubyte rgbaColor[4] = {0, 0, 255, 255};
2935*8975f5c5SAndroid Build Coastguard Worker 
2936*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *rgbaSource;
2937*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR rgbaImage;
2938*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
2939*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{rgbaColor, 4}},
2940*8975f5c5SAndroid Build Coastguard Worker                                               &rgbaSource, &rgbaImage);
2941*8975f5c5SAndroid Build Coastguard Worker 
2942*8975f5c5SAndroid Build Coastguard Worker     // Create YUV Image
2943*8975f5c5SAndroid Build Coastguard Worker     // 3 planes of data
2944*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataY[4]  = {40, 40, 40, 40};
2945*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCb[1] = {
2946*8975f5c5SAndroid Build Coastguard Worker         240,
2947*8975f5c5SAndroid Build Coastguard Worker     };
2948*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCr[1] = {
2949*8975f5c5SAndroid Build Coastguard Worker         109,
2950*8975f5c5SAndroid Build Coastguard Worker     };
2951*8975f5c5SAndroid Build Coastguard Worker 
2952*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedRgbColor[4] = {0, 0, 255, 255};
2953*8975f5c5SAndroid Build Coastguard Worker 
2954*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *yuvSource;
2955*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR yuvImage;
2956*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(
2957*8975f5c5SAndroid Build Coastguard Worker         2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420, kDefaultAHBUsage, kDefaultAttribs,
2958*8975f5c5SAndroid Build Coastguard Worker         {{dataY, 1}, {dataCb, 1}, {dataCr, 1}}, &yuvSource, &yuvImage);
2959*8975f5c5SAndroid Build Coastguard Worker 
2960*8975f5c5SAndroid Build Coastguard Worker     // Create texture target siblings to bind the egl images
2961*8975f5c5SAndroid Build Coastguard Worker     // Create YUV target and bind the image
2962*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTarget;
2963*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, yuvTarget);
2964*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
2965*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2966*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2967*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2968*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, yuvImage);
2969*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2970*8975f5c5SAndroid Build Coastguard Worker 
2971*8975f5c5SAndroid Build Coastguard Worker     // Create RGBA target and bind the image
2972*8975f5c5SAndroid Build Coastguard Worker     GLTexture rgbaTarget;
2973*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, rgbaTarget);
2974*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
2975*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2976*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2977*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2978*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, rgbaImage);
2979*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
2980*8975f5c5SAndroid Build Coastguard Worker 
2981*8975f5c5SAndroid Build Coastguard Worker     // Cycle through targets
2982*8975f5c5SAndroid Build Coastguard Worker     // YUV target
2983*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, yuvTarget);
2984*8975f5c5SAndroid Build Coastguard Worker     // Expect render target to have the same color as expectedRgbColor
2985*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(yuvTarget, expectedRgbColor);
2986*8975f5c5SAndroid Build Coastguard Worker 
2987*8975f5c5SAndroid Build Coastguard Worker     // RGBA target
2988*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, rgbaTarget);
2989*8975f5c5SAndroid Build Coastguard Worker     // Expect render target to have the same color as rgbColor
2990*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(rgbaTarget, rgbaColor);
2991*8975f5c5SAndroid Build Coastguard Worker 
2992*8975f5c5SAndroid Build Coastguard Worker     // YUV target
2993*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, yuvTarget);
2994*8975f5c5SAndroid Build Coastguard Worker     // Expect render target to have the same color as expectedRgbColor
2995*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(yuvTarget, expectedRgbColor);
2996*8975f5c5SAndroid Build Coastguard Worker 
2997*8975f5c5SAndroid Build Coastguard Worker     // Clean up
2998*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), yuvImage);
2999*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(yuvSource);
3000*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), rgbaImage);
3001*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(rgbaSource);
3002*8975f5c5SAndroid Build Coastguard Worker }
3003*8975f5c5SAndroid Build Coastguard Worker 
3004*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL images, target 2D external textures, cycling through YUV targets.
TEST_P(ImageTest,SourceAHBTarget2DExternalCycleThroughYuvTargetsNoData)3005*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2DExternalCycleThroughYuvTargetsNoData)
3006*8975f5c5SAndroid Build Coastguard Worker {
3007*8975f5c5SAndroid Build Coastguard Worker     // http://issuetracker.google.com/175021871
3008*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsPixel2() || IsPixel2XL());
3009*8975f5c5SAndroid Build Coastguard Worker 
3010*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3011*8975f5c5SAndroid Build Coastguard Worker 
3012*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3013*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3014*8975f5c5SAndroid Build Coastguard Worker 
3015*8975f5c5SAndroid Build Coastguard Worker     // Create YCbCr source and image but without initial data
3016*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ycbcrSource;
3017*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ycbcrImage;
3018*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420,
3019*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &ycbcrSource,
3020*8975f5c5SAndroid Build Coastguard Worker                                               &ycbcrImage);
3021*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(ycbcrSource, nullptr);
3022*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(ycbcrImage, EGL_NO_IMAGE_KHR);
3023*8975f5c5SAndroid Build Coastguard Worker 
3024*8975f5c5SAndroid Build Coastguard Worker     // Create YV12 source and image but without initial data
3025*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *yv12Source;
3026*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR yv12Image;
3027*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_YV12,
3028*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &yv12Source,
3029*8975f5c5SAndroid Build Coastguard Worker                                               &yv12Image);
3030*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(yv12Source, nullptr);
3031*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(yv12Image, EGL_NO_IMAGE_KHR);
3032*8975f5c5SAndroid Build Coastguard Worker 
3033*8975f5c5SAndroid Build Coastguard Worker     // Create texture target siblings to bind the egl images
3034*8975f5c5SAndroid Build Coastguard Worker     // Create YCbCr target and bind the image
3035*8975f5c5SAndroid Build Coastguard Worker     GLTexture ycbcrTarget;
3036*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, ycbcrTarget);
3037*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
3038*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3039*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3040*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3041*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, ycbcrImage);
3042*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3043*8975f5c5SAndroid Build Coastguard Worker 
3044*8975f5c5SAndroid Build Coastguard Worker     // Create YV12 target and bind the image
3045*8975f5c5SAndroid Build Coastguard Worker     GLTexture yv12Target;
3046*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, yv12Target);
3047*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
3048*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3049*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3050*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3051*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, yv12Image);
3052*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3053*8975f5c5SAndroid Build Coastguard Worker 
3054*8975f5c5SAndroid Build Coastguard Worker     // Cycle through targets
3055*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureExternalProgram);
3056*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureExternalUniformLocation, 0);
3057*8975f5c5SAndroid Build Coastguard Worker 
3058*8975f5c5SAndroid Build Coastguard Worker     // Bind YCbCr image
3059*8975f5c5SAndroid Build Coastguard Worker     // YCbCr target
3060*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, ycbcrTarget);
3061*8975f5c5SAndroid Build Coastguard Worker     // Draw while sampling should result in no EGL/GL errors
3062*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
3063*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3064*8975f5c5SAndroid Build Coastguard Worker 
3065*8975f5c5SAndroid Build Coastguard Worker     // YV12 target
3066*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, yv12Target);
3067*8975f5c5SAndroid Build Coastguard Worker     // Draw while sampling should result in no EGL/GL errors
3068*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
3069*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3070*8975f5c5SAndroid Build Coastguard Worker 
3071*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3072*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ycbcrImage);
3073*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ycbcrSource);
3074*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), yv12Image);
3075*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(yv12Source);
3076*8975f5c5SAndroid Build Coastguard Worker }
3077*8975f5c5SAndroid Build Coastguard Worker 
3078*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image, target 2D texture retaining initial data.
TEST_P(ImageTest,SourceAHBTarget2DRetainInitialData)3079*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2DRetainInitialData)
3080*8975f5c5SAndroid Build Coastguard Worker {
3081*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3082*8975f5c5SAndroid Build Coastguard Worker 
3083*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3084*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3085*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3086*8975f5c5SAndroid Build Coastguard Worker 
3087*8975f5c5SAndroid Build Coastguard Worker     GLubyte data[4] = {0, 255, 0, 255};
3088*8975f5c5SAndroid Build Coastguard Worker 
3089*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
3090*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
3091*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
3092*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
3093*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{data, 4}},
3094*8975f5c5SAndroid Build Coastguard Worker                                               &source, &image);
3095*8975f5c5SAndroid Build Coastguard Worker 
3096*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3097*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3098*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
3099*8975f5c5SAndroid Build Coastguard Worker 
3100*8975f5c5SAndroid Build Coastguard Worker     // Create a framebuffer, and blend into the texture.
3101*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3102*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3103*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, target, 0);
3104*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3105*8975f5c5SAndroid Build Coastguard Worker 
3106*8975f5c5SAndroid Build Coastguard Worker     // Blend into the framebuffer.
3107*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
3108*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
3109*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
3110*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.0f);
3111*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3112*8975f5c5SAndroid Build Coastguard Worker 
3113*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
3114*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
3115*8975f5c5SAndroid Build Coastguard Worker 
3116*8975f5c5SAndroid Build Coastguard Worker     // Use texture target bound to egl image as source and render to framebuffer
3117*8975f5c5SAndroid Build Coastguard Worker     // Verify that data in framebuffer matches that in the egl image
3118*8975f5c5SAndroid Build Coastguard Worker     GLubyte expect[4] = {255, 255, 0, 255};
3119*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, expect);
3120*8975f5c5SAndroid Build Coastguard Worker 
3121*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3122*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3123*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
3124*8975f5c5SAndroid Build Coastguard Worker }
3125*8975f5c5SAndroid Build Coastguard Worker 
3126*8975f5c5SAndroid Build Coastguard Worker // Test interaction between AHBs and GL_EXT_multisampled_render_to_texture
TEST_P(ImageTest,SourceAHBTarget2DMSRTTInteraction)3127*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2DMSRTTInteraction)
3128*8975f5c5SAndroid Build Coastguard Worker {
3129*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3130*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3131*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3132*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture"));
3133*8975f5c5SAndroid Build Coastguard Worker 
3134*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
3135*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
3136*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
3137*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
3138*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &source,
3139*8975f5c5SAndroid Build Coastguard Worker                                               &image);
3140*8975f5c5SAndroid Build Coastguard Worker 
3141*8975f5c5SAndroid Build Coastguard Worker     // Create the target
3142*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3143*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
3144*8975f5c5SAndroid Build Coastguard Worker 
3145*8975f5c5SAndroid Build Coastguard Worker     // Bind target texture to mulisampled framebuffer
3146*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fboMS;
3147*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
3148*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
3149*8975f5c5SAndroid Build Coastguard Worker                                          target, 0, 4);
3150*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3151*8975f5c5SAndroid Build Coastguard Worker 
3152*8975f5c5SAndroid Build Coastguard Worker     // Clear framebuffer
3153*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
3154*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3155*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3156*8975f5c5SAndroid Build Coastguard Worker 
3157*8975f5c5SAndroid Build Coastguard Worker     // Check clear result
3158*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
3159*8975f5c5SAndroid Build Coastguard Worker 
3160*8975f5c5SAndroid Build Coastguard Worker     // Check the AHB is updated
3161*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(source, {{GLColor::blue.data(), 4}});
3162*8975f5c5SAndroid Build Coastguard Worker 
3163*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3164*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3165*8975f5c5SAndroid Build Coastguard Worker }
3166*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image, target 2D array texture
TEST_P(ImageTest,SourceAHBTarget2DArray)3167*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2DArray)
3168*8975f5c5SAndroid Build Coastguard Worker {
3169*8975f5c5SAndroid Build Coastguard Worker     SourceAHBTarget2DArray_helper(kDefaultAttribs);
3170*8975f5c5SAndroid Build Coastguard Worker }
3171*8975f5c5SAndroid Build Coastguard Worker 
3172*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image with colorspace, target 2D array texture
TEST_P(ImageTest,SourceAHBTarget2DArray_Colorspace)3173*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2DArray_Colorspace)
3174*8975f5c5SAndroid Build Coastguard Worker {
3175*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
3176*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
3177*8975f5c5SAndroid Build Coastguard Worker     SourceAHBTarget2DArray_helper(kColorspaceAttribs);
3178*8975f5c5SAndroid Build Coastguard Worker }
3179*8975f5c5SAndroid Build Coastguard Worker 
SourceAHBTarget2DArray_helper(const EGLint * attribs)3180*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceAHBTarget2DArray_helper(const EGLint *attribs)
3181*8975f5c5SAndroid Build Coastguard Worker {
3182*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3183*8975f5c5SAndroid Build Coastguard Worker 
3184*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
3185*8975f5c5SAndroid Build Coastguard Worker                        !hasEglImageArrayExt());
3186*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3187*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3188*8975f5c5SAndroid Build Coastguard Worker 
3189*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
3190*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
3191*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
3192*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
3193*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, attribs, {{kSrgbColor, 4}}, &source,
3194*8975f5c5SAndroid Build Coastguard Worker                                               &image);
3195*8975f5c5SAndroid Build Coastguard Worker 
3196*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3197*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3198*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2DArray(image, target);
3199*8975f5c5SAndroid Build Coastguard Worker 
3200*8975f5c5SAndroid Build Coastguard Worker     // Use texture target bound to egl image as source and render to framebuffer
3201*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
3202*8975f5c5SAndroid Build Coastguard Worker     verifyResults2DArray(target, getExpected2DColorForAttribList(attribs));
3203*8975f5c5SAndroid Build Coastguard Worker 
3204*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3205*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3206*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
3207*8975f5c5SAndroid Build Coastguard Worker }
3208*8975f5c5SAndroid Build Coastguard Worker 
3209*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image, target external texture
TEST_P(ImageTest,SourceAHBTargetExternal)3210*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTargetExternal)
3211*8975f5c5SAndroid Build Coastguard Worker {
3212*8975f5c5SAndroid Build Coastguard Worker     SourceAHBTargetExternal_helper(kDefaultAttribs);
3213*8975f5c5SAndroid Build Coastguard Worker }
3214*8975f5c5SAndroid Build Coastguard Worker 
3215*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image with colorspace, target external texture
TEST_P(ImageTest,SourceAHBTargetExternal_Colorspace)3216*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTargetExternal_Colorspace)
3217*8975f5c5SAndroid Build Coastguard Worker {
3218*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
3219*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
3220*8975f5c5SAndroid Build Coastguard Worker     SourceAHBTargetExternal_helper(kColorspaceAttribs);
3221*8975f5c5SAndroid Build Coastguard Worker }
3222*8975f5c5SAndroid Build Coastguard Worker 
SourceAHBTargetExternal_helper(const EGLint * attribs)3223*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceAHBTargetExternal_helper(const EGLint *attribs)
3224*8975f5c5SAndroid Build Coastguard Worker {
3225*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3226*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() || !hasExternalExt());
3227*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3228*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3229*8975f5c5SAndroid Build Coastguard Worker 
3230*8975f5c5SAndroid Build Coastguard Worker     // Ozone only supports external target for images created with EGL_EXT_image_dma_buf_import
3231*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
3232*8975f5c5SAndroid Build Coastguard Worker 
3233*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
3234*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
3235*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
3236*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
3237*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, attribs, {{kSrgbColor, 4}}, &source,
3238*8975f5c5SAndroid Build Coastguard Worker                                               &image);
3239*8975f5c5SAndroid Build Coastguard Worker 
3240*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3241*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3242*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
3243*8975f5c5SAndroid Build Coastguard Worker 
3244*8975f5c5SAndroid Build Coastguard Worker     // Use texture target bound to egl image as source and render to framebuffer
3245*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
3246*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(target, getExpected2DColorForAttribList(attribs));
3247*8975f5c5SAndroid Build Coastguard Worker 
3248*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3249*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3250*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
3251*8975f5c5SAndroid Build Coastguard Worker }
3252*8975f5c5SAndroid Build Coastguard Worker 
3253*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image, target external ESSL3 texture
TEST_P(ImageTestES3,SourceAHBTargetExternalESSL3)3254*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceAHBTargetExternalESSL3)
3255*8975f5c5SAndroid Build Coastguard Worker {
3256*8975f5c5SAndroid Build Coastguard Worker     SourceAHBTargetExternalESSL3_helper(kDefaultAttribs);
3257*8975f5c5SAndroid Build Coastguard Worker }
3258*8975f5c5SAndroid Build Coastguard Worker 
3259*8975f5c5SAndroid Build Coastguard Worker // Test sampling from a YUV texture using GL_ANGLE_yuv_internal_format as external texture and then
3260*8975f5c5SAndroid Build Coastguard Worker // switching to raw YUV sampling using EXT_yuv_target
TEST_P(ImageTestES3,SourceYUVTextureTargetExternalRGBSampleYUVSample)3261*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceYUVTextureTargetExternalRGBSampleYUVSample)
3262*8975f5c5SAndroid Build Coastguard Worker {
3263*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
3264*8975f5c5SAndroid Build Coastguard Worker                        !hasYUVInternalFormatExt() || !hasYUVTargetExt());
3265*8975f5c5SAndroid Build Coastguard Worker 
3266*8975f5c5SAndroid Build Coastguard Worker     // Create source YUV texture
3267*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTexture;
3268*8975f5c5SAndroid Build Coastguard Worker     GLubyte yuvColor[6]         = {7, 51, 197, 231, 128, 192};
3269*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedRgbColor[4] = {255, 159, 211, 255};
3270*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kWidth     = 2;
3271*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kHeight    = 2;
3272*8975f5c5SAndroid Build Coastguard Worker 
3273*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, yuvTexture);
3274*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, kWidth, kHeight);
3275*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3276*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
3277*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, yuvColor);
3278*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3279*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
3280*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3281*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3282*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3283*8975f5c5SAndroid Build Coastguard Worker 
3284*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
3285*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3286*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image =
3287*8975f5c5SAndroid Build Coastguard Worker         eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
3288*8975f5c5SAndroid Build Coastguard Worker                           reinterpretHelper<EGLClientBuffer>(yuvTexture), kDefaultAttribs);
3289*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
3290*8975f5c5SAndroid Build Coastguard Worker 
3291*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3292*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3293*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
3294*8975f5c5SAndroid Build Coastguard Worker 
3295*8975f5c5SAndroid Build Coastguard Worker     // Draw quad with program that samples YUV data with implicit RGB conversion
3296*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureExternalProgram);
3297*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureExternalUniformLocation, 0);
3298*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
3299*8975f5c5SAndroid Build Coastguard Worker     // Expect that the rendered quad's color is converted to RGB
3300*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, expectedRgbColor[0], expectedRgbColor[1], expectedRgbColor[2],
3301*8975f5c5SAndroid Build Coastguard Worker                       expectedRgbColor[3], 1);
3302*8975f5c5SAndroid Build Coastguard Worker 
3303*8975f5c5SAndroid Build Coastguard Worker     // Draw quad with program that samples raw YUV data
3304*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureYUVProgram);
3305*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureYUVUniformLocation, 0);
3306*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureYUVProgram, "position", 0.5f);
3307*8975f5c5SAndroid Build Coastguard Worker     // Expect that the rendered quad's color matches the raw YUV data
3308*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, yuvColor[2], yuvColor[4], yuvColor[5], 255, 1);
3309*8975f5c5SAndroid Build Coastguard Worker 
3310*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3311*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3312*8975f5c5SAndroid Build Coastguard Worker }
3313*8975f5c5SAndroid Build Coastguard Worker 
3314*8975f5c5SAndroid Build Coastguard Worker // Similar to SourceYUVTextureTargetExternalRGBSampleYUVSample, but added swizzle after
3315*8975f5c5SAndroid Build Coastguard Worker // __samplerExternal2DY2YEXT from texture.
TEST_P(ImageTestES3,SourceYUVTextureTargetExternalRGBSampleYUVSampleWithSwizzle)3316*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceYUVTextureTargetExternalRGBSampleYUVSampleWithSwizzle)
3317*8975f5c5SAndroid Build Coastguard Worker {
3318*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
3319*8975f5c5SAndroid Build Coastguard Worker                        !hasYUVInternalFormatExt() || !hasYUVTargetExt());
3320*8975f5c5SAndroid Build Coastguard Worker 
3321*8975f5c5SAndroid Build Coastguard Worker     // Create source YUV texture
3322*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTexture;
3323*8975f5c5SAndroid Build Coastguard Worker     GLubyte yuvColor[6]      = {7, 51, 197, 231, 128, 192};
3324*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kWidth  = 2;
3325*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kHeight = 2;
3326*8975f5c5SAndroid Build Coastguard Worker 
3327*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, yuvTexture);
3328*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, kWidth, kHeight);
3329*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3330*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
3331*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, yuvColor);
3332*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3333*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
3334*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3335*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3336*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3337*8975f5c5SAndroid Build Coastguard Worker 
3338*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
3339*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3340*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image =
3341*8975f5c5SAndroid Build Coastguard Worker         eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
3342*8975f5c5SAndroid Build Coastguard Worker                           reinterpretHelper<EGLClientBuffer>(yuvTexture), kDefaultAttribs);
3343*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
3344*8975f5c5SAndroid Build Coastguard Worker 
3345*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3346*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3347*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
3348*8975f5c5SAndroid Build Coastguard Worker 
3349*8975f5c5SAndroid Build Coastguard Worker     // Draw quad with program that samples raw YUV data and then swizzle
3350*8975f5c5SAndroid Build Coastguard Worker     const char *fragmentShaderSource = R"(#version 300 es
3351*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_YUV_target : require
3352*8975f5c5SAndroid Build Coastguard Worker precision highp float;
3353*8975f5c5SAndroid Build Coastguard Worker uniform __samplerExternal2DY2YEXT tex;
3354*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
3355*8975f5c5SAndroid Build Coastguard Worker out vec4 color;
3356*8975f5c5SAndroid Build Coastguard Worker 
3357*8975f5c5SAndroid Build Coastguard Worker void main()
3358*8975f5c5SAndroid Build Coastguard Worker {
3359*8975f5c5SAndroid Build Coastguard Worker     color = vec4(texture(tex, texcoord).zyx, 1.0);
3360*8975f5c5SAndroid Build Coastguard Worker })";
3361*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(textureYUVProgram, getVSESSL3(), fragmentShaderSource);
3362*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, textureYUVProgram) << "shader compilation failed.";
3363*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(textureYUVProgram);
3364*8975f5c5SAndroid Build Coastguard Worker     GLint uniformLocation = glGetUniformLocation(textureYUVProgram, "tex");
3365*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, uniformLocation);
3366*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(uniformLocation, 0);
3367*8975f5c5SAndroid Build Coastguard Worker     drawQuad(textureYUVProgram, "position", 0.5f);
3368*8975f5c5SAndroid Build Coastguard Worker     // Expect that the rendered quad's color matches the raw YUV data after component swizzle
3369*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, yuvColor[5], yuvColor[4], yuvColor[2], 255, 1);
3370*8975f5c5SAndroid Build Coastguard Worker 
3371*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3372*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3373*8975f5c5SAndroid Build Coastguard Worker }
3374*8975f5c5SAndroid Build Coastguard Worker 
3375*8975f5c5SAndroid Build Coastguard Worker // Test interaction between GL_ANGLE_yuv_internal_format and EXT_yuv_target when a program has
3376*8975f5c5SAndroid Build Coastguard Worker // both __samplerExternal2DY2YEXT and samplerExternalOES samplers.
TEST_P(ImageTestES3,ProgramWithBothExternalY2YAndExternalOESSampler)3377*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, ProgramWithBothExternalY2YAndExternalOESSampler)
3378*8975f5c5SAndroid Build Coastguard Worker {
3379*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
3380*8975f5c5SAndroid Build Coastguard Worker                        !hasYUVInternalFormatExt() || !hasYUVTargetExt());
3381*8975f5c5SAndroid Build Coastguard Worker 
3382*8975f5c5SAndroid Build Coastguard Worker     GLubyte yuvColor[6]         = {40, 40, 40, 40, 240, 109};
3383*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedRgbColor[4] = {0, 0, 255, 255};
3384*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kWidth     = 2;
3385*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kHeight    = 2;
3386*8975f5c5SAndroid Build Coastguard Worker 
3387*8975f5c5SAndroid Build Coastguard Worker     // Create 2 plane YUV texture source
3388*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTexture0;
3389*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, yuvTexture0);
3390*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, kWidth, kHeight);
3391*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3392*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
3393*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, yuvColor);
3394*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3395*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
3396*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3397*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3398*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3399*8975f5c5SAndroid Build Coastguard Worker 
3400*8975f5c5SAndroid Build Coastguard Worker     // Create 2 plane YUV texture source
3401*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTexture1;
3402*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, yuvTexture1);
3403*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE, kWidth, kHeight);
3404*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3405*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_G8_B8R8_2PLANE_420_UNORM_ANGLE,
3406*8975f5c5SAndroid Build Coastguard Worker                     GL_UNSIGNED_BYTE, yuvColor);
3407*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3408*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
3409*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3410*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3411*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3412*8975f5c5SAndroid Build Coastguard Worker 
3413*8975f5c5SAndroid Build Coastguard Worker     // Create the Images
3414*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3415*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image0 =
3416*8975f5c5SAndroid Build Coastguard Worker         eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
3417*8975f5c5SAndroid Build Coastguard Worker                           reinterpretHelper<EGLClientBuffer>(yuvTexture0), kDefaultAttribs);
3418*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
3419*8975f5c5SAndroid Build Coastguard Worker 
3420*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image1 =
3421*8975f5c5SAndroid Build Coastguard Worker         eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
3422*8975f5c5SAndroid Build Coastguard Worker                           reinterpretHelper<EGLClientBuffer>(yuvTexture1), kDefaultAttribs);
3423*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
3424*8975f5c5SAndroid Build Coastguard Worker 
3425*8975f5c5SAndroid Build Coastguard Worker     // Create texture targets for EGLImages
3426*8975f5c5SAndroid Build Coastguard Worker     GLTexture target0;
3427*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image0, target0);
3428*8975f5c5SAndroid Build Coastguard Worker 
3429*8975f5c5SAndroid Build Coastguard Worker     GLTexture target1;
3430*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image1, target1);
3431*8975f5c5SAndroid Build Coastguard Worker 
3432*8975f5c5SAndroid Build Coastguard Worker     // Create program with 2 samplers
3433*8975f5c5SAndroid Build Coastguard Worker     const char *vertexShaderSource   = R"(#version 300 es
3434*8975f5c5SAndroid Build Coastguard Worker out vec2 texcoord;
3435*8975f5c5SAndroid Build Coastguard Worker in vec4 position;
3436*8975f5c5SAndroid Build Coastguard Worker void main()
3437*8975f5c5SAndroid Build Coastguard Worker {
3438*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position.xy, 0.0, 1.0);
3439*8975f5c5SAndroid Build Coastguard Worker     texcoord = (position.xy * 0.5) + 0.5;
3440*8975f5c5SAndroid Build Coastguard Worker })";
3441*8975f5c5SAndroid Build Coastguard Worker     const char *fragmentShaderSource = R"(#version 300 es
3442*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_YUV_target : require
3443*8975f5c5SAndroid Build Coastguard Worker #extension GL_OES_EGL_image_external_essl3 : require
3444*8975f5c5SAndroid Build Coastguard Worker precision highp float;
3445*8975f5c5SAndroid Build Coastguard Worker uniform __samplerExternal2DY2YEXT tex0;
3446*8975f5c5SAndroid Build Coastguard Worker uniform samplerExternalOES tex1;
3447*8975f5c5SAndroid Build Coastguard Worker uniform uint samplerSelector;
3448*8975f5c5SAndroid Build Coastguard Worker in vec2 texcoord;
3449*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
3450*8975f5c5SAndroid Build Coastguard Worker 
3451*8975f5c5SAndroid Build Coastguard Worker void main()
3452*8975f5c5SAndroid Build Coastguard Worker {
3453*8975f5c5SAndroid Build Coastguard Worker     vec4 color0 = texture(tex0, texcoord);
3454*8975f5c5SAndroid Build Coastguard Worker     vec4 color1 = texture(tex1, texcoord);
3455*8975f5c5SAndroid Build Coastguard Worker     if (samplerSelector == 0u)
3456*8975f5c5SAndroid Build Coastguard Worker     {
3457*8975f5c5SAndroid Build Coastguard Worker         fragColor = color0;
3458*8975f5c5SAndroid Build Coastguard Worker     }
3459*8975f5c5SAndroid Build Coastguard Worker     else if (samplerSelector == 1u)
3460*8975f5c5SAndroid Build Coastguard Worker     {
3461*8975f5c5SAndroid Build Coastguard Worker         fragColor = color1;
3462*8975f5c5SAndroid Build Coastguard Worker     }
3463*8975f5c5SAndroid Build Coastguard Worker     else
3464*8975f5c5SAndroid Build Coastguard Worker     {
3465*8975f5c5SAndroid Build Coastguard Worker         fragColor = vec4(1.0);
3466*8975f5c5SAndroid Build Coastguard Worker     }
3467*8975f5c5SAndroid Build Coastguard Worker })";
3468*8975f5c5SAndroid Build Coastguard Worker 
3469*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(twoSamplersProgram, vertexShaderSource, fragmentShaderSource);
3470*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(twoSamplersProgram);
3471*8975f5c5SAndroid Build Coastguard Worker     GLint tex0Location = glGetUniformLocation(twoSamplersProgram, "tex0");
3472*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, tex0Location);
3473*8975f5c5SAndroid Build Coastguard Worker     GLint tex1Location = glGetUniformLocation(twoSamplersProgram, "tex1");
3474*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, tex1Location);
3475*8975f5c5SAndroid Build Coastguard Worker     GLint samplerSelectorLocation = glGetUniformLocation(twoSamplersProgram, "samplerSelector");
3476*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, samplerSelectorLocation);
3477*8975f5c5SAndroid Build Coastguard Worker 
3478*8975f5c5SAndroid Build Coastguard Worker     // Bind texture target to GL_TEXTURE_EXTERNAL_OES
3479*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
3480*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, target0);
3481*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3482*8975f5c5SAndroid Build Coastguard Worker 
3483*8975f5c5SAndroid Build Coastguard Worker     // Bind texture target to GL_TEXTURE_EXTERNAL_OES
3484*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
3485*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, target1);
3486*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3487*8975f5c5SAndroid Build Coastguard Worker 
3488*8975f5c5SAndroid Build Coastguard Worker     // Set sampler uniform values
3489*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex0Location, 0);
3490*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(tex1Location, 1);
3491*8975f5c5SAndroid Build Coastguard Worker 
3492*8975f5c5SAndroid Build Coastguard Worker     // Set sampler selector uniform value and draw
3493*8975f5c5SAndroid Build Coastguard Worker     glUniform1ui(samplerSelectorLocation, 0);
3494*8975f5c5SAndroid Build Coastguard Worker     drawQuad(twoSamplersProgram, "position", 0.5f);
3495*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3496*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, yuvColor[3], yuvColor[4], yuvColor[5], 255, 1);
3497*8975f5c5SAndroid Build Coastguard Worker 
3498*8975f5c5SAndroid Build Coastguard Worker     // Switch sampler selector uniform value and draw
3499*8975f5c5SAndroid Build Coastguard Worker     glUniform1ui(samplerSelectorLocation, 1);
3500*8975f5c5SAndroid Build Coastguard Worker     drawQuad(twoSamplersProgram, "position", 0.5f);
3501*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3502*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, expectedRgbColor[0], expectedRgbColor[1], expectedRgbColor[2],
3503*8975f5c5SAndroid Build Coastguard Worker                       expectedRgbColor[3], 1);
3504*8975f5c5SAndroid Build Coastguard Worker 
3505*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3506*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image0);
3507*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image1);
3508*8975f5c5SAndroid Build Coastguard Worker }
3509*8975f5c5SAndroid Build Coastguard Worker 
3510*8975f5c5SAndroid Build Coastguard Worker // Test sampling from a YUV AHB with a regular external sampler and pre-initialized data
TEST_P(ImageTest,SourceYUVAHBTargetExternalRGBSampleInitData)3511*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceYUVAHBTargetExternalRGBSampleInitData)
3512*8975f5c5SAndroid Build Coastguard Worker {
3513*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3514*8975f5c5SAndroid Build Coastguard Worker 
3515*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3516*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3517*8975f5c5SAndroid Build Coastguard Worker     // http://issuetracker.google.com/175021871
3518*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsPixel2() || IsPixel2XL());
3519*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3520*8975f5c5SAndroid Build Coastguard Worker 
3521*8975f5c5SAndroid Build Coastguard Worker     // 3 planes of data
3522*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataY[4]  = {7, 51, 197, 231};
3523*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCb[1] = {
3524*8975f5c5SAndroid Build Coastguard Worker         128,
3525*8975f5c5SAndroid Build Coastguard Worker     };
3526*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCr[1] = {
3527*8975f5c5SAndroid Build Coastguard Worker         192,
3528*8975f5c5SAndroid Build Coastguard Worker     };
3529*8975f5c5SAndroid Build Coastguard Worker 
3530*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
3531*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
3532*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
3533*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(
3534*8975f5c5SAndroid Build Coastguard Worker         2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420, kDefaultAHBUsage, kDefaultAttribs,
3535*8975f5c5SAndroid Build Coastguard Worker         {{dataY, 1}, {dataCb, 1}, {dataCr, 1}}, &source, &image);
3536*8975f5c5SAndroid Build Coastguard Worker 
3537*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3538*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3539*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
3540*8975f5c5SAndroid Build Coastguard Worker 
3541*8975f5c5SAndroid Build Coastguard Worker     GLubyte pixelColor[4] = {255, 159, 211, 255};
3542*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(target, pixelColor);
3543*8975f5c5SAndroid Build Coastguard Worker 
3544*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3545*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3546*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
3547*8975f5c5SAndroid Build Coastguard Worker }
3548*8975f5c5SAndroid Build Coastguard Worker 
3549*8975f5c5SAndroid Build Coastguard Worker // Test sampling from a YUV AHB with a regular external sampler without data. This gives coverage of
3550*8975f5c5SAndroid Build Coastguard Worker // sampling even if we can't verify the results.
TEST_P(ImageTest,SourceYUVAHBTargetExternalRGBSampleNoData)3551*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceYUVAHBTargetExternalRGBSampleNoData)
3552*8975f5c5SAndroid Build Coastguard Worker {
3553*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3554*8975f5c5SAndroid Build Coastguard Worker 
3555*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3556*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3557*8975f5c5SAndroid Build Coastguard Worker 
3558*8975f5c5SAndroid Build Coastguard Worker     // Create the Image without data so we don't need ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
3559*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
3560*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
3561*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420,
3562*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &source,
3563*8975f5c5SAndroid Build Coastguard Worker                                               &image);
3564*8975f5c5SAndroid Build Coastguard Worker 
3565*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3566*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3567*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
3568*8975f5c5SAndroid Build Coastguard Worker 
3569*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureExternalProgram);
3570*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, target);
3571*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureExternalUniformLocation, 0);
3572*8975f5c5SAndroid Build Coastguard Worker 
3573*8975f5c5SAndroid Build Coastguard Worker     // Sample from the YUV texture with a nearest sampler
3574*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3575*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3576*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
3577*8975f5c5SAndroid Build Coastguard Worker 
3578*8975f5c5SAndroid Build Coastguard Worker     // Sample from the YUV texture with a linear sampler
3579*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
3580*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3581*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
3582*8975f5c5SAndroid Build Coastguard Worker 
3583*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3584*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3585*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
3586*8975f5c5SAndroid Build Coastguard Worker }
3587*8975f5c5SAndroid Build Coastguard Worker 
3588*8975f5c5SAndroid Build Coastguard Worker // Test sampling from a YUV AHB using EXT_yuv_target
TEST_P(ImageTestES3,SourceYUVAHBTargetExternalYUVSample)3589*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceYUVAHBTargetExternalYUVSample)
3590*8975f5c5SAndroid Build Coastguard Worker {
3591*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3592*8975f5c5SAndroid Build Coastguard Worker 
3593*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() || !hasYUVTargetExt());
3594*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3595*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3596*8975f5c5SAndroid Build Coastguard Worker 
3597*8975f5c5SAndroid Build Coastguard Worker     // 3 planes of data
3598*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataY[4]  = {7, 51, 197, 231};
3599*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCb[1] = {
3600*8975f5c5SAndroid Build Coastguard Worker         128,
3601*8975f5c5SAndroid Build Coastguard Worker     };
3602*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCr[1] = {
3603*8975f5c5SAndroid Build Coastguard Worker         192,
3604*8975f5c5SAndroid Build Coastguard Worker     };
3605*8975f5c5SAndroid Build Coastguard Worker 
3606*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
3607*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
3608*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
3609*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(
3610*8975f5c5SAndroid Build Coastguard Worker         2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420, kDefaultAHBUsage, kDefaultAttribs,
3611*8975f5c5SAndroid Build Coastguard Worker         {{dataY, 1}, {dataCb, 1}, {dataCr, 1}}, &source, &image);
3612*8975f5c5SAndroid Build Coastguard Worker 
3613*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3614*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3615*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
3616*8975f5c5SAndroid Build Coastguard Worker 
3617*8975f5c5SAndroid Build Coastguard Worker     GLubyte pixelColor[4] = {197, 128, 192, 255};
3618*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternalYUV(target, pixelColor);
3619*8975f5c5SAndroid Build Coastguard Worker 
3620*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3621*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3622*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
3623*8975f5c5SAndroid Build Coastguard Worker }
3624*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTestES3,SourceYUVAHBTargetExternalYUVSampleLinearFiltering)3625*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceYUVAHBTargetExternalYUVSampleLinearFiltering)
3626*8975f5c5SAndroid Build Coastguard Worker {
3627*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3628*8975f5c5SAndroid Build Coastguard Worker 
3629*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3630*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3631*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3632*8975f5c5SAndroid Build Coastguard Worker 
3633*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
3634*8975f5c5SAndroid Build Coastguard Worker         2, 4, 1, AHARDWAREBUFFER_FORMAT_YV12, kDefaultAHBYUVUsage));
3635*8975f5c5SAndroid Build Coastguard Worker 
3636*8975f5c5SAndroid Build Coastguard Worker     // [  Red,   Red]
3637*8975f5c5SAndroid Build Coastguard Worker     // [  Red,   Red]
3638*8975f5c5SAndroid Build Coastguard Worker     // [Black, Black]
3639*8975f5c5SAndroid Build Coastguard Worker     // [Black, Black]
3640*8975f5c5SAndroid Build Coastguard Worker 
3641*8975f5c5SAndroid Build Coastguard Worker     // clang-format off
3642*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataY[]  = {
3643*8975f5c5SAndroid Build Coastguard Worker         81, 81,
3644*8975f5c5SAndroid Build Coastguard Worker         81, 81,
3645*8975f5c5SAndroid Build Coastguard Worker         16, 16,
3646*8975f5c5SAndroid Build Coastguard Worker         16, 16,
3647*8975f5c5SAndroid Build Coastguard Worker     };
3648*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCb[] = {
3649*8975f5c5SAndroid Build Coastguard Worker         90,
3650*8975f5c5SAndroid Build Coastguard Worker         128,
3651*8975f5c5SAndroid Build Coastguard Worker     };
3652*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCr[] = {
3653*8975f5c5SAndroid Build Coastguard Worker         240,
3654*8975f5c5SAndroid Build Coastguard Worker         128,
3655*8975f5c5SAndroid Build Coastguard Worker     };
3656*8975f5c5SAndroid Build Coastguard Worker     // clang-format on
3657*8975f5c5SAndroid Build Coastguard Worker 
3658*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
3659*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahbSource;
3660*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
3661*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(
3662*8975f5c5SAndroid Build Coastguard Worker         2, 4, 1, AHARDWAREBUFFER_FORMAT_YV12, kDefaultAHBYUVUsage, kDefaultAttribs,
3663*8975f5c5SAndroid Build Coastguard Worker         {{dataY, 1}, {dataCb, 1}, {dataCr, 1}}, &ahbSource, &ahbImage);
3664*8975f5c5SAndroid Build Coastguard Worker 
3665*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3666*8975f5c5SAndroid Build Coastguard Worker 
3667*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3668*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
3669*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(ahbImage, ahbTexture);
3670*8975f5c5SAndroid Build Coastguard Worker 
3671*8975f5c5SAndroid Build Coastguard Worker     // Configure linear filtering
3672*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, ahbTexture);
3673*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
3674*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3675*8975f5c5SAndroid Build Coastguard Worker 
3676*8975f5c5SAndroid Build Coastguard Worker     // Draw fullscreen sampling from ahbTexture.
3677*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureExternalProgram);
3678*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, ahbTexture);
3679*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureExternalUniformLocation, 0);
3680*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
3681*8975f5c5SAndroid Build Coastguard Worker 
3682*8975f5c5SAndroid Build Coastguard Worker     // Framebuffer needs to be bigger than the AHB so there is an area in between that will result
3683*8975f5c5SAndroid Build Coastguard Worker     // in half-red.
3684*8975f5c5SAndroid Build Coastguard Worker     const int windowHeight = getWindowHeight();
3685*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GE(windowHeight, 8);
3686*8975f5c5SAndroid Build Coastguard Worker 
3687*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor::black, 1);
3688*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, windowHeight - 1, GLColor::red, 1);
3689*8975f5c5SAndroid Build Coastguard Worker 
3690*8975f5c5SAndroid Build Coastguard Worker     // Approximately half-red:
3691*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, windowHeight / 2, GLColor(127, 0, 0, 255), 15.0);
3692*8975f5c5SAndroid Build Coastguard Worker 
3693*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3694*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
3695*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahbSource);
3696*8975f5c5SAndroid Build Coastguard Worker }
3697*8975f5c5SAndroid Build Coastguard Worker 
3698*8975f5c5SAndroid Build Coastguard Worker // Test rendering to a YUV AHB using EXT_yuv_target
TEST_P(ImageTestES3,RenderToYUVAHB)3699*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RenderToYUVAHB)
3700*8975f5c5SAndroid Build Coastguard Worker {
3701*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3702*8975f5c5SAndroid Build Coastguard Worker 
3703*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() || !hasYUVTargetExt());
3704*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3705*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3706*8975f5c5SAndroid Build Coastguard Worker 
3707*8975f5c5SAndroid Build Coastguard Worker     // 3 planes of data, initialize to all zeroes
3708*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataY[4]  = {0, 0, 0, 0};
3709*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCb[1] = {
3710*8975f5c5SAndroid Build Coastguard Worker         0,
3711*8975f5c5SAndroid Build Coastguard Worker     };
3712*8975f5c5SAndroid Build Coastguard Worker     GLubyte dataCr[1] = {
3713*8975f5c5SAndroid Build Coastguard Worker         0,
3714*8975f5c5SAndroid Build Coastguard Worker     };
3715*8975f5c5SAndroid Build Coastguard Worker 
3716*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
3717*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
3718*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
3719*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(
3720*8975f5c5SAndroid Build Coastguard Worker         2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420, kDefaultAHBUsage, kDefaultAttribs,
3721*8975f5c5SAndroid Build Coastguard Worker         {{dataY, 1}, {dataCb, 1}, {dataCr, 1}}, &source, &image);
3722*8975f5c5SAndroid Build Coastguard Worker 
3723*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3724*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3725*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
3726*8975f5c5SAndroid Build Coastguard Worker 
3727*8975f5c5SAndroid Build Coastguard Worker     // Set up a framebuffer to render into the AHB
3728*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3729*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3730*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, target,
3731*8975f5c5SAndroid Build Coastguard Worker                            0);
3732*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3733*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3734*8975f5c5SAndroid Build Coastguard Worker 
3735*8975f5c5SAndroid Build Coastguard Worker     GLubyte drawColor[4] = {197, 128, 192, 255};
3736*8975f5c5SAndroid Build Coastguard Worker 
3737*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mRenderYUVProgram);
3738*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(mRenderYUVUniformLocation, drawColor[0] / 255.0f, drawColor[1] / 255.0f,
3739*8975f5c5SAndroid Build Coastguard Worker                 drawColor[2] / 255.0f, drawColor[3] / 255.0f);
3740*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mRenderYUVProgram, "position", 0.0f);
3741*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3742*8975f5c5SAndroid Build Coastguard Worker 
3743*8975f5c5SAndroid Build Coastguard Worker     // ReadPixels returns the RGB converted color
3744*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 159, 212, 255), 1.0);
3745*8975f5c5SAndroid Build Coastguard Worker 
3746*8975f5c5SAndroid Build Coastguard Worker     // Finish before reading back AHB data
3747*8975f5c5SAndroid Build Coastguard Worker     glFinish();
3748*8975f5c5SAndroid Build Coastguard Worker 
3749*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedDataY[4]  = {drawColor[0], drawColor[0], drawColor[0], drawColor[0]};
3750*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedDataCb[1] = {
3751*8975f5c5SAndroid Build Coastguard Worker         drawColor[1],
3752*8975f5c5SAndroid Build Coastguard Worker     };
3753*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedDataCr[1] = {
3754*8975f5c5SAndroid Build Coastguard Worker         drawColor[2],
3755*8975f5c5SAndroid Build Coastguard Worker     };
3756*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(source, {{expectedDataY, 1}, {expectedDataCb, 1}, {expectedDataCr, 1}});
3757*8975f5c5SAndroid Build Coastguard Worker 
3758*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3759*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3760*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
3761*8975f5c5SAndroid Build Coastguard Worker }
3762*8975f5c5SAndroid Build Coastguard Worker 
3763*8975f5c5SAndroid Build Coastguard Worker // Test clearing to a YUV AHB using EXT_yuv_target
TEST_P(ImageTestES3,ClearYUVAHB)3764*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, ClearYUVAHB)
3765*8975f5c5SAndroid Build Coastguard Worker {
3766*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3767*8975f5c5SAndroid Build Coastguard Worker 
3768*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() || !hasYUVTargetExt());
3769*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3770*8975f5c5SAndroid Build Coastguard Worker 
3771*8975f5c5SAndroid Build Coastguard Worker     // Create the Image without data so we don't need ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
3772*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
3773*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
3774*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420,
3775*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &source,
3776*8975f5c5SAndroid Build Coastguard Worker                                               &image);
3777*8975f5c5SAndroid Build Coastguard Worker 
3778*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
3779*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
3780*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
3781*8975f5c5SAndroid Build Coastguard Worker 
3782*8975f5c5SAndroid Build Coastguard Worker     // Set up a framebuffer to render into the AHB
3783*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
3784*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3785*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, target,
3786*8975f5c5SAndroid Build Coastguard Worker                            0);
3787*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3788*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3789*8975f5c5SAndroid Build Coastguard Worker 
3790*8975f5c5SAndroid Build Coastguard Worker     // Clearing a YUV framebuffer reinterprets the rgba clear color as YUV values and writes them
3791*8975f5c5SAndroid Build Coastguard Worker     // directly to the buffer
3792*8975f5c5SAndroid Build Coastguard Worker     GLubyte clearColor[4] = {197, 128, 192, 255};
3793*8975f5c5SAndroid Build Coastguard Worker     glClearColor(clearColor[0] / 255.0f, clearColor[1] / 255.0f, clearColor[2] / 255.0f,
3794*8975f5c5SAndroid Build Coastguard Worker                  clearColor[3] / 255.0f);
3795*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
3796*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
3797*8975f5c5SAndroid Build Coastguard Worker 
3798*8975f5c5SAndroid Build Coastguard Worker     // ReadPixels returns the RGB converted color
3799*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 159, 212, 255), 1.0);
3800*8975f5c5SAndroid Build Coastguard Worker 
3801*8975f5c5SAndroid Build Coastguard Worker     // Clean up
3802*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
3803*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
3804*8975f5c5SAndroid Build Coastguard Worker }
3805*8975f5c5SAndroid Build Coastguard Worker 
3806*8975f5c5SAndroid Build Coastguard Worker // Test glClear on FBO with AHB attachment is applied to the AHB image before we read back
TEST_P(ImageTestES3,AHBClearAppliedBeforeReadBack)3807*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBClearAppliedBeforeReadBack)
3808*8975f5c5SAndroid Build Coastguard Worker {
3809*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3810*8975f5c5SAndroid Build Coastguard Worker 
3811*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3812*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3813*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3814*8975f5c5SAndroid Build Coastguard Worker 
3815*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed[]   = {255, 0, 0, 255};
3816*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
3817*8975f5c5SAndroid Build Coastguard Worker 
3818*8975f5c5SAndroid Build Coastguard Worker     // Create one image backed by the AHB.
3819*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
3820*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
3821*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
3822*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{kBlack, 4}},
3823*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
3824*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
3825*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
3826*8975f5c5SAndroid Build Coastguard Worker 
3827*8975f5c5SAndroid Build Coastguard Worker     // Create one framebuffer backed by the AHB.
3828*8975f5c5SAndroid Build Coastguard Worker     {
3829*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer ahbFbo;
3830*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, ahbFbo);
3831*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
3832*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3833*8975f5c5SAndroid Build Coastguard Worker 
3834*8975f5c5SAndroid Build Coastguard Worker         // Clear to red
3835*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1, 0, 0, 1);
3836*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
3837*8975f5c5SAndroid Build Coastguard Worker         glFinish();
3838*8975f5c5SAndroid Build Coastguard Worker     }
3839*8975f5c5SAndroid Build Coastguard Worker 
3840*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed, 4}});
3841*8975f5c5SAndroid Build Coastguard Worker 
3842*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
3843*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
3844*8975f5c5SAndroid Build Coastguard Worker }
3845*8975f5c5SAndroid Build Coastguard Worker 
3846*8975f5c5SAndroid Build Coastguard Worker // Similar to AHBClearAppliedBeforeReadBack, but clear is applied twice.
TEST_P(ImageTestES3,AHBTwiceClearAppliedBeforeReadBack)3847*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBTwiceClearAppliedBeforeReadBack)
3848*8975f5c5SAndroid Build Coastguard Worker {
3849*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3850*8975f5c5SAndroid Build Coastguard Worker 
3851*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3852*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3853*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3854*8975f5c5SAndroid Build Coastguard Worker 
3855*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed[]   = {255, 0, 0, 255};
3856*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
3857*8975f5c5SAndroid Build Coastguard Worker 
3858*8975f5c5SAndroid Build Coastguard Worker     // Create one image backed by the AHB.
3859*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
3860*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
3861*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
3862*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{kBlack, 4}},
3863*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
3864*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
3865*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
3866*8975f5c5SAndroid Build Coastguard Worker 
3867*8975f5c5SAndroid Build Coastguard Worker     // Create one framebuffer backed by the AHB.
3868*8975f5c5SAndroid Build Coastguard Worker     {
3869*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer ahbFbo;
3870*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, ahbFbo);
3871*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
3872*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3873*8975f5c5SAndroid Build Coastguard Worker 
3874*8975f5c5SAndroid Build Coastguard Worker         // Clear to green, then to red
3875*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0, 1, 0, 1);
3876*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
3877*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1, 0, 0, 1);
3878*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
3879*8975f5c5SAndroid Build Coastguard Worker         glFinish();
3880*8975f5c5SAndroid Build Coastguard Worker     }
3881*8975f5c5SAndroid Build Coastguard Worker 
3882*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed, 4}});
3883*8975f5c5SAndroid Build Coastguard Worker 
3884*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
3885*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
3886*8975f5c5SAndroid Build Coastguard Worker }
3887*8975f5c5SAndroid Build Coastguard Worker 
3888*8975f5c5SAndroid Build Coastguard Worker // Test that glClear on FBO with AHB attachment is applied to the AHB image before detaching the AHB
3889*8975f5c5SAndroid Build Coastguard Worker // image from FBO
TEST_P(ImageTestES3,AHBClearAndDetachBeforeReadback)3890*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBClearAndDetachBeforeReadback)
3891*8975f5c5SAndroid Build Coastguard Worker {
3892*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3893*8975f5c5SAndroid Build Coastguard Worker 
3894*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3895*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3896*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3897*8975f5c5SAndroid Build Coastguard Worker 
3898*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed[]   = {255, 0, 0, 255};
3899*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
3900*8975f5c5SAndroid Build Coastguard Worker 
3901*8975f5c5SAndroid Build Coastguard Worker     // Create one image backed by the AHB.
3902*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
3903*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
3904*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
3905*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{kBlack, 4}},
3906*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
3907*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
3908*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
3909*8975f5c5SAndroid Build Coastguard Worker 
3910*8975f5c5SAndroid Build Coastguard Worker     // Create one framebuffer backed by the AHB.
3911*8975f5c5SAndroid Build Coastguard Worker     {
3912*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer ahbFbo;
3913*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, ahbFbo);
3914*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
3915*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3916*8975f5c5SAndroid Build Coastguard Worker 
3917*8975f5c5SAndroid Build Coastguard Worker         // Clear to red
3918*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1, 0, 0, 1);
3919*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
3920*8975f5c5SAndroid Build Coastguard Worker 
3921*8975f5c5SAndroid Build Coastguard Worker         // Detach the AHB image from the FBO color attachment
3922*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
3923*8975f5c5SAndroid Build Coastguard Worker         glFinish();
3924*8975f5c5SAndroid Build Coastguard Worker     }
3925*8975f5c5SAndroid Build Coastguard Worker 
3926*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed, 4}});
3927*8975f5c5SAndroid Build Coastguard Worker 
3928*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
3929*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
3930*8975f5c5SAndroid Build Coastguard Worker }
3931*8975f5c5SAndroid Build Coastguard Worker 
3932*8975f5c5SAndroid Build Coastguard Worker // Test that glClear on FBO with AHB color attachment is applied to the AHB image before implicity
3933*8975f5c5SAndroid Build Coastguard Worker // unbinding the AHB image from FBO
TEST_P(ImageTestES3,AHBClearAndAttachAnotherTextureBeforeReadback)3934*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBClearAndAttachAnotherTextureBeforeReadback)
3935*8975f5c5SAndroid Build Coastguard Worker {
3936*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3937*8975f5c5SAndroid Build Coastguard Worker 
3938*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3939*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3940*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3941*8975f5c5SAndroid Build Coastguard Worker 
3942*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed[]   = {255, 0, 0, 255};
3943*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
3944*8975f5c5SAndroid Build Coastguard Worker 
3945*8975f5c5SAndroid Build Coastguard Worker     // Create one image backed by the AHB.
3946*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
3947*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
3948*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
3949*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{kBlack, 4}},
3950*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
3951*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
3952*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
3953*8975f5c5SAndroid Build Coastguard Worker 
3954*8975f5c5SAndroid Build Coastguard Worker     // Create one framebuffer backed by the AHB.
3955*8975f5c5SAndroid Build Coastguard Worker     {
3956*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer ahbFbo;
3957*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, ahbFbo);
3958*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
3959*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3960*8975f5c5SAndroid Build Coastguard Worker 
3961*8975f5c5SAndroid Build Coastguard Worker         // Clear to red
3962*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1, 0, 0, 1);
3963*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
3964*8975f5c5SAndroid Build Coastguard Worker 
3965*8975f5c5SAndroid Build Coastguard Worker         // Attach a random texture to the same FBO color attachment slot that AHB image was attached
3966*8975f5c5SAndroid Build Coastguard Worker         // to, this should implicity detach the AHB image from the FBO.
3967*8975f5c5SAndroid Build Coastguard Worker         GLTexture newTexture;
3968*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, newTexture);
3969*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
3970*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, newTexture, 0);
3971*8975f5c5SAndroid Build Coastguard Worker         glFinish();
3972*8975f5c5SAndroid Build Coastguard Worker     }
3973*8975f5c5SAndroid Build Coastguard Worker 
3974*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed, 4}});
3975*8975f5c5SAndroid Build Coastguard Worker 
3976*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
3977*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
3978*8975f5c5SAndroid Build Coastguard Worker }
3979*8975f5c5SAndroid Build Coastguard Worker 
3980*8975f5c5SAndroid Build Coastguard Worker // Test glClear to FBO with AHB color attachment is applied to the AHB image before we switch back
3981*8975f5c5SAndroid Build Coastguard Worker // to the default FBO
TEST_P(ImageTestES3,AHBClearAndSwitchToDefaultFBOBeforeReadBack)3982*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBClearAndSwitchToDefaultFBOBeforeReadBack)
3983*8975f5c5SAndroid Build Coastguard Worker {
3984*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
3985*8975f5c5SAndroid Build Coastguard Worker 
3986*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
3987*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
3988*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
3989*8975f5c5SAndroid Build Coastguard Worker 
3990*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed[]   = {255, 0, 0, 255};
3991*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
3992*8975f5c5SAndroid Build Coastguard Worker 
3993*8975f5c5SAndroid Build Coastguard Worker     // Create one image backed by the AHB.
3994*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
3995*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
3996*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
3997*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{kBlack, 4}},
3998*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
3999*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4000*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4001*8975f5c5SAndroid Build Coastguard Worker 
4002*8975f5c5SAndroid Build Coastguard Worker     // Create one framebuffer backed by the AHB.
4003*8975f5c5SAndroid Build Coastguard Worker     {
4004*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer ahbFbo;
4005*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, ahbFbo);
4006*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4007*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4008*8975f5c5SAndroid Build Coastguard Worker 
4009*8975f5c5SAndroid Build Coastguard Worker         // Clear to red
4010*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1, 0, 0, 1);
4011*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
4012*8975f5c5SAndroid Build Coastguard Worker 
4013*8975f5c5SAndroid Build Coastguard Worker         // Switch to default FBO
4014*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
4015*8975f5c5SAndroid Build Coastguard Worker         glFinish();
4016*8975f5c5SAndroid Build Coastguard Worker     }
4017*8975f5c5SAndroid Build Coastguard Worker 
4018*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed, 4}});
4019*8975f5c5SAndroid Build Coastguard Worker 
4020*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4021*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4022*8975f5c5SAndroid Build Coastguard Worker }
4023*8975f5c5SAndroid Build Coastguard Worker 
4024*8975f5c5SAndroid Build Coastguard Worker // Test glClear on FBO with AHB color attachment is applied to the AHB image with glClientWaitSync
TEST_P(ImageTestES3,AHBClearWithGLClientWaitSyncBeforeReadBack)4025*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBClearWithGLClientWaitSyncBeforeReadBack)
4026*8975f5c5SAndroid Build Coastguard Worker {
4027*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4028*8975f5c5SAndroid Build Coastguard Worker 
4029*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4030*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4031*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4032*8975f5c5SAndroid Build Coastguard Worker 
4033*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed[]   = {255, 0, 0, 255};
4034*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
4035*8975f5c5SAndroid Build Coastguard Worker 
4036*8975f5c5SAndroid Build Coastguard Worker     // Create one image backed by the AHB.
4037*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4038*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4039*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
4040*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{kBlack, 4}},
4041*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
4042*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4043*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4044*8975f5c5SAndroid Build Coastguard Worker 
4045*8975f5c5SAndroid Build Coastguard Worker     // Create one framebuffer backed by the AHB.
4046*8975f5c5SAndroid Build Coastguard Worker     {
4047*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer ahbFbo;
4048*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, ahbFbo);
4049*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4050*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4051*8975f5c5SAndroid Build Coastguard Worker 
4052*8975f5c5SAndroid Build Coastguard Worker         // Clear to red
4053*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1, 0, 0, 1);
4054*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
4055*8975f5c5SAndroid Build Coastguard Worker 
4056*8975f5c5SAndroid Build Coastguard Worker         // Create a GLSync object and immediately wait on it
4057*8975f5c5SAndroid Build Coastguard Worker         GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
4058*8975f5c5SAndroid Build Coastguard Worker         glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED);
4059*8975f5c5SAndroid Build Coastguard Worker     }
4060*8975f5c5SAndroid Build Coastguard Worker 
4061*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed, 4}});
4062*8975f5c5SAndroid Build Coastguard Worker 
4063*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4064*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4065*8975f5c5SAndroid Build Coastguard Worker }
4066*8975f5c5SAndroid Build Coastguard Worker 
4067*8975f5c5SAndroid Build Coastguard Worker // Test glDraw + glFlush on FBO with AHB attachment are applied to the AHB image before we read back
TEST_P(ImageTestES3,AHBDrawFlushAppliedBeforeReadBack)4068*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBDrawFlushAppliedBeforeReadBack)
4069*8975f5c5SAndroid Build Coastguard Worker {
4070*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4071*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4072*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4073*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport() || !kHasAHBFrontBufferUsageSupport);
4074*8975f5c5SAndroid Build Coastguard Worker 
4075*8975f5c5SAndroid Build Coastguard Worker     // Create a GLTexture backed by the AHB.
4076*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4077*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4078*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
4079*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed[]   = {255, 0, 0, 255};
4080*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
4081*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage | kAHBUsageFrontBuffer,
4082*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAttribs, {{kBlack, 4}}, &ahb, &ahbImage);
4083*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4084*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4085*8975f5c5SAndroid Build Coastguard Worker 
4086*8975f5c5SAndroid Build Coastguard Worker     // Create one framebuffer backed by the AHB-based GLTexture
4087*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer ahbFbo;
4088*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, ahbFbo);
4089*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4090*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4091*8975f5c5SAndroid Build Coastguard Worker 
4092*8975f5c5SAndroid Build Coastguard Worker     // Draw to the FBO and call glFlush()
4093*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
4094*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
4095*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
4096*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
4097*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
4098*8975f5c5SAndroid Build Coastguard Worker 
4099*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, kRed[0] / 255.0f, kRed[1] / 255.0f, kRed[2] / 255.0f,
4100*8975f5c5SAndroid Build Coastguard Worker                 kRed[3] / 255.0f);
4101*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
4102*8975f5c5SAndroid Build Coastguard Worker     glFlush();
4103*8975f5c5SAndroid Build Coastguard Worker     // unlike glFinish(), glFlush() does not wait for commands execution to complete.
4104*8975f5c5SAndroid Build Coastguard Worker     // sleep for 1 second before reading back from AHB.
4105*8975f5c5SAndroid Build Coastguard Worker     angle::Sleep(1000);
4106*8975f5c5SAndroid Build Coastguard Worker 
4107*8975f5c5SAndroid Build Coastguard Worker     // Verify the result
4108*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed, 4}});
4109*8975f5c5SAndroid Build Coastguard Worker 
4110*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4111*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4112*8975f5c5SAndroid Build Coastguard Worker }
4113*8975f5c5SAndroid Build Coastguard Worker 
4114*8975f5c5SAndroid Build Coastguard Worker // Test that glDraw + glFlush on FBO with AHB attachment are applied to the AHB
4115*8975f5c5SAndroid Build Coastguard Worker // image before detaching the AHB image from FBO
TEST_P(ImageTestES3,AHBDrawFlushAndDetachBeforeReadBack)4116*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBDrawFlushAndDetachBeforeReadBack)
4117*8975f5c5SAndroid Build Coastguard Worker {
4118*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4119*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4120*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4121*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport() || !kHasAHBFrontBufferUsageSupport);
4122*8975f5c5SAndroid Build Coastguard Worker 
4123*8975f5c5SAndroid Build Coastguard Worker     // Create a GLTexture backed by the AHB.
4124*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4125*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4126*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
4127*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed[]   = {255, 0, 0, 255};
4128*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
4129*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage | kAHBUsageFrontBuffer,
4130*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAttribs, {{kBlack, 4}}, &ahb, &ahbImage);
4131*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4132*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4133*8975f5c5SAndroid Build Coastguard Worker 
4134*8975f5c5SAndroid Build Coastguard Worker     // Create one framebuffer backed by the AHB-based GLTexture
4135*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer ahbFbo;
4136*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, ahbFbo);
4137*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4138*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4139*8975f5c5SAndroid Build Coastguard Worker 
4140*8975f5c5SAndroid Build Coastguard Worker     // Draw to the FBO and call glFlush()
4141*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
4142*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
4143*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
4144*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
4145*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
4146*8975f5c5SAndroid Build Coastguard Worker 
4147*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, kRed[0] / 255.0f, kRed[1] / 255.0f, kRed[2] / 255.0f,
4148*8975f5c5SAndroid Build Coastguard Worker                 kRed[3] / 255.0f);
4149*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
4150*8975f5c5SAndroid Build Coastguard Worker 
4151*8975f5c5SAndroid Build Coastguard Worker     glFlush();
4152*8975f5c5SAndroid Build Coastguard Worker     // unlike glFinish(), glFlush() does not wait for commands execution to complete.
4153*8975f5c5SAndroid Build Coastguard Worker     // sleep for 1 second before reading back from AHB.
4154*8975f5c5SAndroid Build Coastguard Worker     angle::Sleep(1000);
4155*8975f5c5SAndroid Build Coastguard Worker 
4156*8975f5c5SAndroid Build Coastguard Worker     // Detach the AHB image from the FBO color attachment
4157*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
4158*8975f5c5SAndroid Build Coastguard Worker 
4159*8975f5c5SAndroid Build Coastguard Worker     // Verify the result
4160*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed, 4}});
4161*8975f5c5SAndroid Build Coastguard Worker 
4162*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4163*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4164*8975f5c5SAndroid Build Coastguard Worker }
4165*8975f5c5SAndroid Build Coastguard Worker 
4166*8975f5c5SAndroid Build Coastguard Worker // Test that glDraw + glFlush on FBO with AHB attachment are applied to the AHB
4167*8975f5c5SAndroid Build Coastguard Worker // image before implicitly unbinding the AHB image from FBO
TEST_P(ImageTestES3,AHBDrawFlushAndAttachAnotherTextureBeforeReadBack)4168*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBDrawFlushAndAttachAnotherTextureBeforeReadBack)
4169*8975f5c5SAndroid Build Coastguard Worker {
4170*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4171*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4172*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4173*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport() || !kHasAHBFrontBufferUsageSupport);
4174*8975f5c5SAndroid Build Coastguard Worker 
4175*8975f5c5SAndroid Build Coastguard Worker     // Create a GLTexture backed by the AHB.
4176*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4177*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4178*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
4179*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed[]   = {255, 0, 0, 255};
4180*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
4181*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage | kAHBUsageFrontBuffer,
4182*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAttribs, {{kBlack, 4}}, &ahb, &ahbImage);
4183*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4184*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4185*8975f5c5SAndroid Build Coastguard Worker 
4186*8975f5c5SAndroid Build Coastguard Worker     // Create one framebuffer backed by the AHB-based GLTexture
4187*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer ahbFbo;
4188*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, ahbFbo);
4189*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4190*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4191*8975f5c5SAndroid Build Coastguard Worker 
4192*8975f5c5SAndroid Build Coastguard Worker     // Draw to the FBO and call glFlush()
4193*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
4194*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
4195*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
4196*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
4197*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
4198*8975f5c5SAndroid Build Coastguard Worker 
4199*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, kRed[0] / 255.0f, kRed[1] / 255.0f, kRed[2] / 255.0f,
4200*8975f5c5SAndroid Build Coastguard Worker                 kRed[3] / 255.0f);
4201*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
4202*8975f5c5SAndroid Build Coastguard Worker 
4203*8975f5c5SAndroid Build Coastguard Worker     glFlush();
4204*8975f5c5SAndroid Build Coastguard Worker     // unlike glFinish(), glFlush() does not wait for commands execution to complete.
4205*8975f5c5SAndroid Build Coastguard Worker     // sleep for 1 second before reading back from AHB.
4206*8975f5c5SAndroid Build Coastguard Worker     angle::Sleep(1000);
4207*8975f5c5SAndroid Build Coastguard Worker 
4208*8975f5c5SAndroid Build Coastguard Worker     // Attach a random texture to the same FBO color attachment slot that AHB image was attached
4209*8975f5c5SAndroid Build Coastguard Worker     // to, this should implicity detach the AHB image from the FBO.
4210*8975f5c5SAndroid Build Coastguard Worker     GLTexture newTexture;
4211*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, newTexture);
4212*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
4213*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, newTexture, 0);
4214*8975f5c5SAndroid Build Coastguard Worker 
4215*8975f5c5SAndroid Build Coastguard Worker     // Verify the result
4216*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed, 4}});
4217*8975f5c5SAndroid Build Coastguard Worker 
4218*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4219*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4220*8975f5c5SAndroid Build Coastguard Worker }
4221*8975f5c5SAndroid Build Coastguard Worker 
4222*8975f5c5SAndroid Build Coastguard Worker // Test that glDraw + glFlush on FBO with AHB attachment are applied to the AHB
4223*8975f5c5SAndroid Build Coastguard Worker // image before switching to the default FBO
TEST_P(ImageTestES3,AHBDrawFlushAndSwitchToDefaultFBOBeforeReadBack)4224*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBDrawFlushAndSwitchToDefaultFBOBeforeReadBack)
4225*8975f5c5SAndroid Build Coastguard Worker {
4226*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4227*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4228*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4229*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport() || !kHasAHBFrontBufferUsageSupport);
4230*8975f5c5SAndroid Build Coastguard Worker 
4231*8975f5c5SAndroid Build Coastguard Worker     // Create a GLTexture backed by the AHB.
4232*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4233*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4234*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
4235*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed[]   = {255, 0, 0, 255};
4236*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
4237*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage | kAHBUsageFrontBuffer,
4238*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAttribs, {{kBlack, 4}}, &ahb, &ahbImage);
4239*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4240*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4241*8975f5c5SAndroid Build Coastguard Worker 
4242*8975f5c5SAndroid Build Coastguard Worker     // Create one framebuffer backed by the AHB-based GLTexture
4243*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer ahbFbo;
4244*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, ahbFbo);
4245*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4246*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4247*8975f5c5SAndroid Build Coastguard Worker 
4248*8975f5c5SAndroid Build Coastguard Worker     // Draw to the FBO and call glFlush()
4249*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
4250*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
4251*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
4252*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
4253*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
4254*8975f5c5SAndroid Build Coastguard Worker 
4255*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, kRed[0] / 255.0f, kRed[1] / 255.0f, kRed[2] / 255.0f,
4256*8975f5c5SAndroid Build Coastguard Worker                 kRed[3] / 255.0f);
4257*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
4258*8975f5c5SAndroid Build Coastguard Worker 
4259*8975f5c5SAndroid Build Coastguard Worker     glFlush();
4260*8975f5c5SAndroid Build Coastguard Worker     // unlike glFinish(), glFlush() does not wait for commands execution to complete.
4261*8975f5c5SAndroid Build Coastguard Worker     // sleep for 1 second before reading back from AHB.
4262*8975f5c5SAndroid Build Coastguard Worker     angle::Sleep(1000);
4263*8975f5c5SAndroid Build Coastguard Worker 
4264*8975f5c5SAndroid Build Coastguard Worker     // Switch to default FBO
4265*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
4266*8975f5c5SAndroid Build Coastguard Worker 
4267*8975f5c5SAndroid Build Coastguard Worker     // Verify the result
4268*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed, 4}});
4269*8975f5c5SAndroid Build Coastguard Worker 
4270*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4271*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4272*8975f5c5SAndroid Build Coastguard Worker }
4273*8975f5c5SAndroid Build Coastguard Worker 
4274*8975f5c5SAndroid Build Coastguard Worker // Test that texture swizzle parameters work with EGL image-backed textures
TEST_P(ImageTestES3,AHBTextureSwizzleParameters)4275*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBTextureSwizzleParameters)
4276*8975f5c5SAndroid Build Coastguard Worker {
4277*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4278*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4279*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4280*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4281*8975f5c5SAndroid Build Coastguard Worker 
4282*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4283*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4284*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4285*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4286*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs,
4287*8975f5c5SAndroid Build Coastguard Worker                                               {{kLinearColor, 4}}, &ahb, &ahbImage);
4288*8975f5c5SAndroid Build Coastguard Worker 
4289*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4290*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4291*8975f5c5SAndroid Build Coastguard Worker 
4292*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, ahbTexture);
4293*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_GREEN);
4294*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_BLUE);
4295*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
4296*8975f5c5SAndroid Build Coastguard Worker 
4297*8975f5c5SAndroid Build Coastguard Worker     GLubyte expectedColor[] = {kLinearColor[1], kLinearColor[2], kLinearColor[0], kLinearColor[3]};
4298*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, expectedColor);
4299*8975f5c5SAndroid Build Coastguard Worker 
4300*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4301*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4302*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4303*8975f5c5SAndroid Build Coastguard Worker }
4304*8975f5c5SAndroid Build Coastguard Worker 
4305*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB.  Regression test for a bug in the
4306*8975f5c5SAndroid Build Coastguard Worker // Vulkan backend where the image was cleared due to format emulation.
TEST_P(ImageTestES3,RGBXAHBImportPreservesData)4307*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBImportPreservesData)
4308*8975f5c5SAndroid Build Coastguard Worker {
4309*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4310*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4311*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4312*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4313*8975f5c5SAndroid Build Coastguard Worker 
4314*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4315*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4316*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4317*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4318*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs,
4319*8975f5c5SAndroid Build Coastguard Worker                                               {{kLinearColor, 4}}, &ahb, &ahbImage);
4320*8975f5c5SAndroid Build Coastguard Worker 
4321*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4322*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4323*8975f5c5SAndroid Build Coastguard Worker 
4324*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kLinearColor);
4325*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kLinearColor, 4}});
4326*8975f5c5SAndroid Build Coastguard Worker 
4327*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4328*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4329*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4330*8975f5c5SAndroid Build Coastguard Worker }
4331*8975f5c5SAndroid Build Coastguard Worker 
4332*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB created with sRGB color space.
TEST_P(ImageTestES3,RGBXAHBImportPreservesData_Colorspace)4333*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBImportPreservesData_Colorspace)
4334*8975f5c5SAndroid Build Coastguard Worker {
4335*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4336*8975f5c5SAndroid Build Coastguard Worker 
4337*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4338*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4339*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4340*8975f5c5SAndroid Build Coastguard Worker 
4341*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed50SRGB[]   = {188, 0, 0, 255};
4342*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed50Linear[] = {128, 0, 0, 255};
4343*8975f5c5SAndroid Build Coastguard Worker 
4344*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4345*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4346*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4347*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4348*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kColorspaceAttribs,
4349*8975f5c5SAndroid Build Coastguard Worker                                               {{kRed50SRGB, 4}}, &ahb, &ahbImage);
4350*8975f5c5SAndroid Build Coastguard Worker 
4351*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4352*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4353*8975f5c5SAndroid Build Coastguard Worker 
4354*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kRed50Linear);
4355*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed50SRGB, 4}});
4356*8975f5c5SAndroid Build Coastguard Worker 
4357*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4358*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4359*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4360*8975f5c5SAndroid Build Coastguard Worker }
4361*8975f5c5SAndroid Build Coastguard Worker 
4362*8975f5c5SAndroid Build Coastguard Worker // Tests that RGBX can be successfully loaded with 3-channel data and read back as 4-channel data.
TEST_P(ImageTestES3,RGBXAHBUploadDownload)4363*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBUploadDownload)
4364*8975f5c5SAndroid Build Coastguard Worker {
4365*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4366*8975f5c5SAndroid Build Coastguard Worker 
4367*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4368*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4369*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport() || !hasRGBXInternalFormatExt());
4370*8975f5c5SAndroid Build Coastguard Worker 
4371*8975f5c5SAndroid Build Coastguard Worker     const size_t kWidth  = 32;
4372*8975f5c5SAndroid Build Coastguard Worker     const size_t kHeight = 32;
4373*8975f5c5SAndroid Build Coastguard Worker 
4374*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 255};
4375*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kCyan[]  = {0, 255, 255};
4376*8975f5c5SAndroid Build Coastguard Worker 
4377*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixelsRGBABlack;
4378*8975f5c5SAndroid Build Coastguard Worker     for (size_t h = 0; h < kHeight; h++)
4379*8975f5c5SAndroid Build Coastguard Worker     {
4380*8975f5c5SAndroid Build Coastguard Worker         for (size_t w = 0; w < kWidth; w++)
4381*8975f5c5SAndroid Build Coastguard Worker         {
4382*8975f5c5SAndroid Build Coastguard Worker             pixelsRGBABlack.push_back(kBlack[0]);
4383*8975f5c5SAndroid Build Coastguard Worker             pixelsRGBABlack.push_back(kBlack[1]);
4384*8975f5c5SAndroid Build Coastguard Worker             pixelsRGBABlack.push_back(kBlack[2]);
4385*8975f5c5SAndroid Build Coastguard Worker             pixelsRGBABlack.push_back(kBlack[3]);
4386*8975f5c5SAndroid Build Coastguard Worker         }
4387*8975f5c5SAndroid Build Coastguard Worker     }
4388*8975f5c5SAndroid Build Coastguard Worker 
4389*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixelsRGBCyan;
4390*8975f5c5SAndroid Build Coastguard Worker     for (size_t h = 0; h < kHeight; h++)
4391*8975f5c5SAndroid Build Coastguard Worker     {
4392*8975f5c5SAndroid Build Coastguard Worker         for (size_t w = 0; w < kWidth; w++)
4393*8975f5c5SAndroid Build Coastguard Worker         {
4394*8975f5c5SAndroid Build Coastguard Worker             pixelsRGBCyan.push_back(kCyan[0]);
4395*8975f5c5SAndroid Build Coastguard Worker             pixelsRGBCyan.push_back(kCyan[1]);
4396*8975f5c5SAndroid Build Coastguard Worker             pixelsRGBCyan.push_back(kCyan[2]);
4397*8975f5c5SAndroid Build Coastguard Worker         }
4398*8975f5c5SAndroid Build Coastguard Worker     }
4399*8975f5c5SAndroid Build Coastguard Worker 
4400*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4401*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4402*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4403*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(
4404*8975f5c5SAndroid Build Coastguard Worker         kWidth, kHeight, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM, kDefaultAHBUsage,
4405*8975f5c5SAndroid Build Coastguard Worker         kDefaultAttribs, {{pixelsRGBABlack.data(), 4}}, &ahb, &ahbImage);
4406*8975f5c5SAndroid Build Coastguard Worker 
4407*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4408*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4409*8975f5c5SAndroid Build Coastguard Worker 
4410*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kBlack);
4411*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{pixelsRGBABlack.data(), 4}});
4412*8975f5c5SAndroid Build Coastguard Worker 
4413*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, ahbTexture);
4414*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE,
4415*8975f5c5SAndroid Build Coastguard Worker                     pixelsRGBCyan.data());
4416*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4417*8975f5c5SAndroid Build Coastguard Worker 
4418*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer ahbFramebuffer;
4419*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, ahbFramebuffer);
4420*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4421*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4422*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4423*8975f5c5SAndroid Build Coastguard Worker 
4424*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> readback;
4425*8975f5c5SAndroid Build Coastguard Worker     readback.resize(kWidth * kHeight * 4);
4426*8975f5c5SAndroid Build Coastguard Worker     glReadPixels(0, 0, kWidth, kHeight, GL_RGBX8_ANGLE, GL_UNSIGNED_BYTE, readback.data());
4427*8975f5c5SAndroid Build Coastguard Worker 
4428*8975f5c5SAndroid Build Coastguard Worker     for (size_t y = 0; y < kHeight; y++)
4429*8975f5c5SAndroid Build Coastguard Worker     {
4430*8975f5c5SAndroid Build Coastguard Worker         const GLubyte *actualRowData = readback.data() + (y * kWidth * 4);
4431*8975f5c5SAndroid Build Coastguard Worker         for (size_t x = 0; x < kWidth; x++)
4432*8975f5c5SAndroid Build Coastguard Worker         {
4433*8975f5c5SAndroid Build Coastguard Worker             const GLubyte *actualPixelData = actualRowData + (x * 4);
4434*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(actualPixelData[0], kCyan[0]) << "at (" << x << ", " << y << ")";
4435*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(actualPixelData[1], kCyan[1]) << "at (" << x << ", " << y << ")";
4436*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(actualPixelData[2], kCyan[2]) << "at (" << x << ", " << y << ")";
4437*8975f5c5SAndroid Build Coastguard Worker         }
4438*8975f5c5SAndroid Build Coastguard Worker     }
4439*8975f5c5SAndroid Build Coastguard Worker 
4440*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4441*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4442*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4443*8975f5c5SAndroid Build Coastguard Worker }
4444*8975f5c5SAndroid Build Coastguard Worker 
4445*8975f5c5SAndroid Build Coastguard Worker // Test that RGBA data are preserved when importing from AHB and glTexSubImage is able to update
4446*8975f5c5SAndroid Build Coastguard Worker // data.
TEST_P(ImageTestES3,RGBAAHBUploadData)4447*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBAAHBUploadData)
4448*8975f5c5SAndroid Build Coastguard Worker {
4449*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4450*8975f5c5SAndroid Build Coastguard Worker 
4451*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4452*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4453*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4454*8975f5c5SAndroid Build Coastguard Worker 
4455*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kGarbage[]     = {123, 123, 123, 123};
4456*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed50Linear[] = {128, 0, 0, 127};
4457*8975f5c5SAndroid Build Coastguard Worker 
4458*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4459*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4460*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4461*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
4462*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{kGarbage, 4}},
4463*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
4464*8975f5c5SAndroid Build Coastguard Worker 
4465*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4466*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4467*8975f5c5SAndroid Build Coastguard Worker 
4468*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, ahbTexture);
4469*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kRed50Linear);
4470*8975f5c5SAndroid Build Coastguard Worker     glFinish();
4471*8975f5c5SAndroid Build Coastguard Worker 
4472*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kRed50Linear);
4473*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed50Linear, 4}});
4474*8975f5c5SAndroid Build Coastguard Worker 
4475*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4476*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4477*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4478*8975f5c5SAndroid Build Coastguard Worker }
4479*8975f5c5SAndroid Build Coastguard Worker 
4480*8975f5c5SAndroid Build Coastguard Worker // Test that RGBA data are preserved when importing from AHB with sRGB color space and glTexSubImage
4481*8975f5c5SAndroid Build Coastguard Worker // is able to update data.
TEST_P(ImageTestES3,RGBAAHBUploadDataColorspace)4482*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBAAHBUploadDataColorspace)
4483*8975f5c5SAndroid Build Coastguard Worker {
4484*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4485*8975f5c5SAndroid Build Coastguard Worker 
4486*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4487*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4488*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4489*8975f5c5SAndroid Build Coastguard Worker 
4490*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kGarbage[]     = {123, 123, 123, 123};
4491*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed50SRGB[]   = {188, 0, 0, 128};
4492*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed50Linear[] = {128, 0, 0, 127};
4493*8975f5c5SAndroid Build Coastguard Worker 
4494*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4495*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4496*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4497*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
4498*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kColorspaceAttribs, {{kGarbage, 4}},
4499*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
4500*8975f5c5SAndroid Build Coastguard Worker 
4501*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4502*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4503*8975f5c5SAndroid Build Coastguard Worker 
4504*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, ahbTexture);
4505*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kRed50SRGB);
4506*8975f5c5SAndroid Build Coastguard Worker     glFinish();
4507*8975f5c5SAndroid Build Coastguard Worker 
4508*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kRed50Linear);
4509*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed50SRGB, 4}});
4510*8975f5c5SAndroid Build Coastguard Worker 
4511*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4512*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4513*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4514*8975f5c5SAndroid Build Coastguard Worker }
4515*8975f5c5SAndroid Build Coastguard Worker 
4516*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB and glTexSubImage is able to update
4517*8975f5c5SAndroid Build Coastguard Worker // data.
TEST_P(ImageTestES3,RGBXAHBUploadData)4518*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBUploadData)
4519*8975f5c5SAndroid Build Coastguard Worker {
4520*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4521*8975f5c5SAndroid Build Coastguard Worker 
4522*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4523*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4524*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4525*8975f5c5SAndroid Build Coastguard Worker 
4526*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kGarbage[]     = {123, 123, 123, 123};
4527*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed50Linear[] = {128, 0, 0, 255};
4528*8975f5c5SAndroid Build Coastguard Worker 
4529*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4530*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4531*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4532*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4533*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{kGarbage, 4}},
4534*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
4535*8975f5c5SAndroid Build Coastguard Worker 
4536*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4537*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4538*8975f5c5SAndroid Build Coastguard Worker 
4539*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, ahbTexture);
4540*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, kRed50Linear);
4541*8975f5c5SAndroid Build Coastguard Worker     glFinish();
4542*8975f5c5SAndroid Build Coastguard Worker 
4543*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kRed50Linear);
4544*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed50Linear, 4}});
4545*8975f5c5SAndroid Build Coastguard Worker 
4546*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4547*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4548*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4549*8975f5c5SAndroid Build Coastguard Worker }
4550*8975f5c5SAndroid Build Coastguard Worker 
4551*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB created with sRGB color space and
4552*8975f5c5SAndroid Build Coastguard Worker // glTexSubImage is able to update data.
TEST_P(ImageTestES3,RGBXAHBUploadDataColorspace)4553*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBUploadDataColorspace)
4554*8975f5c5SAndroid Build Coastguard Worker {
4555*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4556*8975f5c5SAndroid Build Coastguard Worker 
4557*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4558*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4559*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4560*8975f5c5SAndroid Build Coastguard Worker 
4561*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kGarbage[]     = {123, 123, 123, 123};
4562*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed50SRGB[]   = {188, 0, 0, 255};
4563*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed50Linear[] = {128, 0, 0, 255};
4564*8975f5c5SAndroid Build Coastguard Worker 
4565*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4566*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4567*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4568*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4569*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kColorspaceAttribs,
4570*8975f5c5SAndroid Build Coastguard Worker                                               {{kGarbage, sizeof(kGarbage)}}, &ahb, &ahbImage);
4571*8975f5c5SAndroid Build Coastguard Worker 
4572*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4573*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4574*8975f5c5SAndroid Build Coastguard Worker 
4575*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, ahbTexture);
4576*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, kRed50SRGB);
4577*8975f5c5SAndroid Build Coastguard Worker     glFinish();
4578*8975f5c5SAndroid Build Coastguard Worker 
4579*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kRed50Linear);
4580*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed50SRGB, sizeof(kRed50SRGB)}});
4581*8975f5c5SAndroid Build Coastguard Worker 
4582*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4583*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4584*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4585*8975f5c5SAndroid Build Coastguard Worker }
4586*8975f5c5SAndroid Build Coastguard Worker 
4587*8975f5c5SAndroid Build Coastguard Worker // Test that RGB data are preserved when importing from AHB created with sRGB color space and
4588*8975f5c5SAndroid Build Coastguard Worker // glTexSubImage is able to update data.
TEST_P(ImageTestES3,RGBAHBUploadDataColorspace)4589*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBAHBUploadDataColorspace)
4590*8975f5c5SAndroid Build Coastguard Worker {
4591*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4592*8975f5c5SAndroid Build Coastguard Worker 
4593*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4594*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4595*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4596*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
4597*8975f5c5SAndroid Build Coastguard Worker         1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM, kDefaultAHBUsage));
4598*8975f5c5SAndroid Build Coastguard Worker 
4599*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kGarbage[]     = {123, 123, 123};
4600*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed50SRGB[]   = {188, 0, 0};
4601*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kRed50Linear[] = {128, 0, 0, 255};
4602*8975f5c5SAndroid Build Coastguard Worker 
4603*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4604*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4605*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4606*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM,
4607*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kColorspaceAttribs,
4608*8975f5c5SAndroid Build Coastguard Worker                                               {{kGarbage, sizeof(kGarbage)}}, &ahb, &ahbImage);
4609*8975f5c5SAndroid Build Coastguard Worker 
4610*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4611*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4612*8975f5c5SAndroid Build Coastguard Worker 
4613*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, ahbTexture);
4614*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, kRed50SRGB);
4615*8975f5c5SAndroid Build Coastguard Worker     glFinish();
4616*8975f5c5SAndroid Build Coastguard Worker 
4617*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kRed50Linear);
4618*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kRed50SRGB, sizeof(kRed50SRGB)}});
4619*8975f5c5SAndroid Build Coastguard Worker 
4620*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4621*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4622*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4623*8975f5c5SAndroid Build Coastguard Worker }
4624*8975f5c5SAndroid Build Coastguard Worker 
4625*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB.  Tests interaction of emulated channel
4626*8975f5c5SAndroid Build Coastguard Worker // being cleared with no GPU_FRAMEBUFFER usage specified.
TEST_P(ImageTestES3,RGBXAHBImportNoFramebufferUsage)4627*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBImportNoFramebufferUsage)
4628*8975f5c5SAndroid Build Coastguard Worker {
4629*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4630*8975f5c5SAndroid Build Coastguard Worker 
4631*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4632*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4633*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4634*8975f5c5SAndroid Build Coastguard Worker 
4635*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4636*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4637*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4638*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4639*8975f5c5SAndroid Build Coastguard Worker                                               kAHBUsageGPUSampledImage, kDefaultAttribs,
4640*8975f5c5SAndroid Build Coastguard Worker                                               {{kLinearColor, 4}}, &ahb, &ahbImage);
4641*8975f5c5SAndroid Build Coastguard Worker 
4642*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4643*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4644*8975f5c5SAndroid Build Coastguard Worker 
4645*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kLinearColor);
4646*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kLinearColor, 4}});
4647*8975f5c5SAndroid Build Coastguard Worker 
4648*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4649*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4650*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4651*8975f5c5SAndroid Build Coastguard Worker }
4652*8975f5c5SAndroid Build Coastguard Worker 
4653*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB.  Tests interaction of emulated channel
4654*8975f5c5SAndroid Build Coastguard Worker // being cleared with multiple layers.
TEST_P(ImageTestES3,RGBXAHBImportMultipleLayers)4655*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBImportMultipleLayers)
4656*8975f5c5SAndroid Build Coastguard Worker {
4657*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4658*8975f5c5SAndroid Build Coastguard Worker 
4659*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4660*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4661*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4662*8975f5c5SAndroid Build Coastguard Worker 
4663*8975f5c5SAndroid Build Coastguard Worker     // Limit the test to singke layer for now. writeAHBData is assuming alignment between layers
4664*8975f5c5SAndroid Build Coastguard Worker     // being 4096 which may not true on some GPUs. There is no API to retrieve such alignment from
4665*8975f5c5SAndroid Build Coastguard Worker     // driver. For now just limit to single layer so that we can still test single layer behavior
4666*8975f5c5SAndroid Build Coastguard Worker     // here.
4667*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kLayerCount = 1;
4668*8975f5c5SAndroid Build Coastguard Worker 
4669*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
4670*8975f5c5SAndroid Build Coastguard Worker         1, 1, kLayerCount, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM, kDefaultAHBUsage));
4671*8975f5c5SAndroid Build Coastguard Worker 
4672*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kInitColor[] = {132, 55, 219, 12, 77, 23, 190, 101, 231, 44, 143, 99};
4673*8975f5c5SAndroid Build Coastguard Worker 
4674*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4675*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4676*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4677*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(
4678*8975f5c5SAndroid Build Coastguard Worker         1, 1, kLayerCount, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM, kDefaultAHBUsage, kDefaultAttribs,
4679*8975f5c5SAndroid Build Coastguard Worker         {{kInitColor, 4}}, &ahb, &ahbImage);
4680*8975f5c5SAndroid Build Coastguard Worker 
4681*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4682*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2DArray(ahbImage, ahbTexture);
4683*8975f5c5SAndroid Build Coastguard Worker 
4684*8975f5c5SAndroid Build Coastguard Worker     // RGBX doesn't have alpha, so readback should return 255.
4685*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kExpectedColor[] = {
4686*8975f5c5SAndroid Build Coastguard Worker         kInitColor[0], kInitColor[1], kInitColor[2], 255,           kInitColor[4],  kInitColor[5],
4687*8975f5c5SAndroid Build Coastguard Worker         kInitColor[6], 255,           kInitColor[8], kInitColor[9], kInitColor[10], 255,
4688*8975f5c5SAndroid Build Coastguard Worker     };
4689*8975f5c5SAndroid Build Coastguard Worker     for (uint32_t layerIndex = 0; layerIndex < kLayerCount; ++layerIndex)
4690*8975f5c5SAndroid Build Coastguard Worker     {
4691*8975f5c5SAndroid Build Coastguard Worker         verifyResults2DArray(ahbTexture, kExpectedColor + 4 * layerIndex, layerIndex);
4692*8975f5c5SAndroid Build Coastguard Worker     }
4693*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kExpectedColor, 4}});
4694*8975f5c5SAndroid Build Coastguard Worker 
4695*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4696*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4697*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4698*8975f5c5SAndroid Build Coastguard Worker }
4699*8975f5c5SAndroid Build Coastguard Worker 
4700*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB.  Tests interaction of emulated channel
4701*8975f5c5SAndroid Build Coastguard Worker // being cleared with glReadPixels.
TEST_P(ImageTestES3,RGBXAHBImportThenReadPixels)4702*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBImportThenReadPixels)
4703*8975f5c5SAndroid Build Coastguard Worker {
4704*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4705*8975f5c5SAndroid Build Coastguard Worker 
4706*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4707*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4708*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4709*8975f5c5SAndroid Build Coastguard Worker 
4710*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4711*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4712*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4713*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4714*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs,
4715*8975f5c5SAndroid Build Coastguard Worker                                               {{kLinearColor, 4}}, &ahb, &ahbImage);
4716*8975f5c5SAndroid Build Coastguard Worker 
4717*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4718*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4719*8975f5c5SAndroid Build Coastguard Worker 
4720*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4721*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4722*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4723*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4724*8975f5c5SAndroid Build Coastguard Worker 
4725*8975f5c5SAndroid Build Coastguard Worker     // RGBX doesn't have alpha, so readback should return 255.  kLinearColor[3] is already 255.
4726*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_NEAR(0, 0, kLinearColor[0], kLinearColor[1], kLinearColor[2], kLinearColor[3], 1);
4727*8975f5c5SAndroid Build Coastguard Worker 
4728*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
4729*8975f5c5SAndroid Build Coastguard Worker 
4730*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kLinearColor);
4731*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kLinearColor, 4}});
4732*8975f5c5SAndroid Build Coastguard Worker 
4733*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4734*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4735*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4736*8975f5c5SAndroid Build Coastguard Worker }
4737*8975f5c5SAndroid Build Coastguard Worker 
4738*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB.  Tests interaction of emulated channel
4739*8975f5c5SAndroid Build Coastguard Worker // being cleared with a following clear.
TEST_P(ImageTestES3,RGBXAHBImportThenClear)4740*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBImportThenClear)
4741*8975f5c5SAndroid Build Coastguard Worker {
4742*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4743*8975f5c5SAndroid Build Coastguard Worker 
4744*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4745*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4746*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4747*8975f5c5SAndroid Build Coastguard Worker 
4748*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4749*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4750*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4751*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4752*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs,
4753*8975f5c5SAndroid Build Coastguard Worker                                               {{kLinearColor, 4}}, &ahb, &ahbImage);
4754*8975f5c5SAndroid Build Coastguard Worker 
4755*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4756*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4757*8975f5c5SAndroid Build Coastguard Worker 
4758*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4759*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4760*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4761*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4762*8975f5c5SAndroid Build Coastguard Worker 
4763*8975f5c5SAndroid Build Coastguard Worker     // Clear
4764*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kClearColor[] = {63, 127, 191, 55};
4765*8975f5c5SAndroid Build Coastguard Worker     glClearColor(kClearColor[0] / 255.0f, kClearColor[1] / 255.0f, kClearColor[2] / 255.0f,
4766*8975f5c5SAndroid Build Coastguard Worker                  kClearColor[3] / 255.0f);
4767*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4768*8975f5c5SAndroid Build Coastguard Worker 
4769*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
4770*8975f5c5SAndroid Build Coastguard Worker 
4771*8975f5c5SAndroid Build Coastguard Worker     // RGBX doesn't have alpha, so readback should return 255.
4772*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kExpectedColor[] = {kClearColor[0], kClearColor[1], kClearColor[2], 255};
4773*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kExpectedColor);
4774*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kExpectedColor, 4}});
4775*8975f5c5SAndroid Build Coastguard Worker 
4776*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4777*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4778*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4779*8975f5c5SAndroid Build Coastguard Worker }
4780*8975f5c5SAndroid Build Coastguard Worker 
4781*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB.  Tests interaction of emulated channel
4782*8975f5c5SAndroid Build Coastguard Worker // being cleared with a following clear and a draw call.
TEST_P(ImageTestES3,RGBXAHBImportThenClearThenDraw)4783*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBImportThenClearThenDraw)
4784*8975f5c5SAndroid Build Coastguard Worker {
4785*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4786*8975f5c5SAndroid Build Coastguard Worker 
4787*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4788*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4789*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4790*8975f5c5SAndroid Build Coastguard Worker 
4791*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4792*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4793*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4794*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4795*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs,
4796*8975f5c5SAndroid Build Coastguard Worker                                               {{kLinearColor, 4}}, &ahb, &ahbImage);
4797*8975f5c5SAndroid Build Coastguard Worker 
4798*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4799*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4800*8975f5c5SAndroid Build Coastguard Worker 
4801*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4802*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4803*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4804*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4805*8975f5c5SAndroid Build Coastguard Worker 
4806*8975f5c5SAndroid Build Coastguard Worker     // Clear
4807*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kClearColor[] = {63, 127, 191, 55};
4808*8975f5c5SAndroid Build Coastguard Worker     glClearColor(kClearColor[0] / 255.0f, kClearColor[1] / 255.0f, kClearColor[2] / 255.0f,
4809*8975f5c5SAndroid Build Coastguard Worker                  kClearColor[3] / 255.0f);
4810*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4811*8975f5c5SAndroid Build Coastguard Worker 
4812*8975f5c5SAndroid Build Coastguard Worker     // Draw with blend
4813*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
4814*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
4815*8975f5c5SAndroid Build Coastguard Worker 
4816*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
4817*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(drawColor);
4818*8975f5c5SAndroid Build Coastguard Worker     GLint colorUniformLocation =
4819*8975f5c5SAndroid Build Coastguard Worker         glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform());
4820*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(colorUniformLocation, -1);
4821*8975f5c5SAndroid Build Coastguard Worker 
4822*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(colorUniformLocation, 0.25f, 0.25f, 0.25f, 0.25f);
4823*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawColor, essl1_shaders::PositionAttrib(), 0.5f);
4824*8975f5c5SAndroid Build Coastguard Worker 
4825*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
4826*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
4827*8975f5c5SAndroid Build Coastguard Worker 
4828*8975f5c5SAndroid Build Coastguard Worker     // RGBX doesn't have alpha, so readback should return 255.
4829*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kExpectedColor[] = {static_cast<GLubyte>(kClearColor[0] + 64),
4830*8975f5c5SAndroid Build Coastguard Worker                                       static_cast<GLubyte>(kClearColor[1] + 64),
4831*8975f5c5SAndroid Build Coastguard Worker                                       static_cast<GLubyte>(kClearColor[2] + 64), 255};
4832*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kExpectedColor);
4833*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kExpectedColor, 4}});
4834*8975f5c5SAndroid Build Coastguard Worker 
4835*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4836*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4837*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4838*8975f5c5SAndroid Build Coastguard Worker }
4839*8975f5c5SAndroid Build Coastguard Worker 
4840*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB.  Tests interaction of emulated channel
4841*8975f5c5SAndroid Build Coastguard Worker // being cleared with a following data upload.
TEST_P(ImageTestES3,RGBXAHBImportThenUpload)4842*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBImportThenUpload)
4843*8975f5c5SAndroid Build Coastguard Worker {
4844*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4845*8975f5c5SAndroid Build Coastguard Worker 
4846*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4847*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4848*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4849*8975f5c5SAndroid Build Coastguard Worker 
4850*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kInitColor[] = {132, 55, 219, 12, 132, 55, 219, 12};
4851*8975f5c5SAndroid Build Coastguard Worker 
4852*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4853*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4854*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4855*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4856*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{kInitColor, 4}},
4857*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
4858*8975f5c5SAndroid Build Coastguard Worker 
4859*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4860*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4861*8975f5c5SAndroid Build Coastguard Worker 
4862*8975f5c5SAndroid Build Coastguard Worker     // Upload data
4863*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kUploadColor[] = {63, 127, 191, 55};
4864*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, kUploadColor);
4865*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4866*8975f5c5SAndroid Build Coastguard Worker 
4867*8975f5c5SAndroid Build Coastguard Worker     // RGBX doesn't have alpha, so readback should return 255.
4868*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kExpectedColorRight[] = {kUploadColor[0], kUploadColor[1], kUploadColor[2], 255};
4869*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kExpectedColorLeft[]  = {kInitColor[0], kInitColor[1], kInitColor[2], 255};
4870*8975f5c5SAndroid Build Coastguard Worker     verifyResults2DLeftAndRight(ahbTexture, kExpectedColorLeft, kExpectedColorRight);
4871*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kExpectedColorLeft, 4}}, AHBVerifyRegion::LeftHalf);
4872*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kExpectedColorRight, 4}}, AHBVerifyRegion::RightHalf);
4873*8975f5c5SAndroid Build Coastguard Worker 
4874*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4875*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4876*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4877*8975f5c5SAndroid Build Coastguard Worker }
4878*8975f5c5SAndroid Build Coastguard Worker 
4879*8975f5c5SAndroid Build Coastguard Worker // Tests interaction of emulated channel being cleared with a following data upload and immediately
4880*8975f5c5SAndroid Build Coastguard Worker // ends to check that the image updates are processed and flushed without errors. It is similar to
4881*8975f5c5SAndroid Build Coastguard Worker // RGBXAHBImportThenUpload, but there is no pixel reading or destroying the image to avoid extra
4882*8975f5c5SAndroid Build Coastguard Worker // staged update flushes.
TEST_P(ImageTestES3,IncompleteRGBXAHBImportThenUploadThenEnd)4883*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, IncompleteRGBXAHBImportThenUploadThenEnd)
4884*8975f5c5SAndroid Build Coastguard Worker {
4885*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4886*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4887*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4888*8975f5c5SAndroid Build Coastguard Worker 
4889*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kInitColor[] = {132, 55, 219, 12, 132, 55, 219, 12};
4890*8975f5c5SAndroid Build Coastguard Worker 
4891*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4892*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4893*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4894*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4895*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{kInitColor, 4}},
4896*8975f5c5SAndroid Build Coastguard Worker                                               &ahb, &ahbImage);
4897*8975f5c5SAndroid Build Coastguard Worker 
4898*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4899*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4900*8975f5c5SAndroid Build Coastguard Worker 
4901*8975f5c5SAndroid Build Coastguard Worker     // Upload data
4902*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kUploadColor[] = {63, 127, 191, 55};
4903*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, kUploadColor);
4904*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4905*8975f5c5SAndroid Build Coastguard Worker 
4906*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4907*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4908*8975f5c5SAndroid Build Coastguard Worker     // This test relies on internal assertions to catch the issue regarding unflushed updates after
4909*8975f5c5SAndroid Build Coastguard Worker     // clearing emulated channels.
4910*8975f5c5SAndroid Build Coastguard Worker }
4911*8975f5c5SAndroid Build Coastguard Worker 
4912*8975f5c5SAndroid Build Coastguard Worker // Test that RGBX data are preserved when importing from AHB.  Tests interaction of emulated channel
4913*8975f5c5SAndroid Build Coastguard Worker // being cleared with occlusion queries.
TEST_P(ImageTestES3,RGBXAHBImportOcclusionQueryNotCounted)4914*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, RGBXAHBImportOcclusionQueryNotCounted)
4915*8975f5c5SAndroid Build Coastguard Worker {
4916*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
4917*8975f5c5SAndroid Build Coastguard Worker 
4918*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4919*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4920*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4921*8975f5c5SAndroid Build Coastguard Worker 
4922*8975f5c5SAndroid Build Coastguard Worker     GLQueryEXT query;
4923*8975f5c5SAndroid Build Coastguard Worker     glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
4924*8975f5c5SAndroid Build Coastguard Worker 
4925*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
4926*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *ahb;
4927*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR ahbImage;
4928*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
4929*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs,
4930*8975f5c5SAndroid Build Coastguard Worker                                               {{kLinearColor, 4}}, &ahb, &ahbImage);
4931*8975f5c5SAndroid Build Coastguard Worker 
4932*8975f5c5SAndroid Build Coastguard Worker     GLTexture ahbTexture;
4933*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(ahbImage, ahbTexture);
4934*8975f5c5SAndroid Build Coastguard Worker 
4935*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
4936*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
4937*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ahbTexture, 0);
4938*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
4939*8975f5c5SAndroid Build Coastguard Worker 
4940*8975f5c5SAndroid Build Coastguard Worker     // Perform a masked clear.  Both the emulated clear and the masked clear should be performed,
4941*8975f5c5SAndroid Build Coastguard Worker     // neither of which should contribute to the occlusion query.
4942*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kClearColor[] = {63, 127, 191, 55};
4943*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
4944*8975f5c5SAndroid Build Coastguard Worker     glClearColor(kClearColor[0] / 255.0f, kClearColor[1] / 255.0f, kClearColor[2] / 255.0f,
4945*8975f5c5SAndroid Build Coastguard Worker                  kClearColor[3] / 255.0f);
4946*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
4947*8975f5c5SAndroid Build Coastguard Worker     glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
4948*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
4949*8975f5c5SAndroid Build Coastguard Worker 
4950*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
4951*8975f5c5SAndroid Build Coastguard Worker     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
4952*8975f5c5SAndroid Build Coastguard Worker 
4953*8975f5c5SAndroid Build Coastguard Worker     // RGBX doesn't have alpha, so readback should return 255.
4954*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kExpectedColor[] = {kClearColor[0], kLinearColor[1], kClearColor[2], 255};
4955*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(ahbTexture, kExpectedColor);
4956*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(ahb, {{kExpectedColor, 4}});
4957*8975f5c5SAndroid Build Coastguard Worker 
4958*8975f5c5SAndroid Build Coastguard Worker     GLuint result = GL_TRUE;
4959*8975f5c5SAndroid Build Coastguard Worker     glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result);
4960*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
4961*8975f5c5SAndroid Build Coastguard Worker 
4962*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FALSE(result);
4963*8975f5c5SAndroid Build Coastguard Worker 
4964*8975f5c5SAndroid Build Coastguard Worker     // Clean up
4965*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), ahbImage);
4966*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(ahb);
4967*8975f5c5SAndroid Build Coastguard Worker }
4968*8975f5c5SAndroid Build Coastguard Worker 
4969*8975f5c5SAndroid Build Coastguard Worker // Test repeatedly importing and releasing AHBs into textures to replicate behavior where
4970*8975f5c5SAndroid Build Coastguard Worker // SurfaceFlinger optimistically imports AHBs but never actually ends up using them. Regression
4971*8975f5c5SAndroid Build Coastguard Worker // test to check that AHB releases are not left pending and kept alive to avoid running out of
4972*8975f5c5SAndroid Build Coastguard Worker // memory.
TEST_P(ImageTestES3,AHBImportReleaseStress)4973*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, AHBImportReleaseStress)
4974*8975f5c5SAndroid Build Coastguard Worker {
4975*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
4976*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
4977*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
4978*8975f5c5SAndroid Build Coastguard Worker 
4979*8975f5c5SAndroid Build Coastguard Worker     // Counters only available on Vulkan.
4980*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan());
4981*8975f5c5SAndroid Build Coastguard Worker 
4982*8975f5c5SAndroid Build Coastguard Worker     const GLubyte kBlack[] = {0, 0, 0, 0};
4983*8975f5c5SAndroid Build Coastguard Worker 
4984*8975f5c5SAndroid Build Coastguard Worker     glFinish();
4985*8975f5c5SAndroid Build Coastguard Worker 
4986*8975f5c5SAndroid Build Coastguard Worker     GLPerfMonitor monitor;
4987*8975f5c5SAndroid Build Coastguard Worker     glBeginPerfMonitorAMD(monitor);
4988*8975f5c5SAndroid Build Coastguard Worker 
4989*8975f5c5SAndroid Build Coastguard Worker     const uint64_t initialPendingSubmissionGarbageObjects =
4990*8975f5c5SAndroid Build Coastguard Worker         getPerfCounters().pendingSubmissionGarbageObjects;
4991*8975f5c5SAndroid Build Coastguard Worker 
4992*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 20; i++)
4993*8975f5c5SAndroid Build Coastguard Worker     {
4994*8975f5c5SAndroid Build Coastguard Worker         AHardwareBuffer *ahb;
4995*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR ahbImage;
4996*8975f5c5SAndroid Build Coastguard Worker         createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
4997*8975f5c5SAndroid Build Coastguard Worker                                                   kDefaultAHBUsage, kDefaultAttribs, {{kBlack, 4}},
4998*8975f5c5SAndroid Build Coastguard Worker                                                   &ahb, &ahbImage);
4999*8975f5c5SAndroid Build Coastguard Worker 
5000*8975f5c5SAndroid Build Coastguard Worker         {
5001*8975f5c5SAndroid Build Coastguard Worker             GLTexture ahbTexture;
5002*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, ahbTexture);
5003*8975f5c5SAndroid Build Coastguard Worker             glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, ahbImage);
5004*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5005*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5006*8975f5c5SAndroid Build Coastguard Worker             ASSERT_GL_NO_ERROR();
5007*8975f5c5SAndroid Build Coastguard Worker 
5008*8975f5c5SAndroid Build Coastguard Worker             // Intentionally not doing anything which may explicitly flush operations on the AHB.
5009*8975f5c5SAndroid Build Coastguard Worker         }
5010*8975f5c5SAndroid Build Coastguard Worker 
5011*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(getEGLWindow()->getDisplay(), ahbImage);
5012*8975f5c5SAndroid Build Coastguard Worker         destroyAndroidHardwareBuffer(ahb);
5013*8975f5c5SAndroid Build Coastguard Worker     }
5014*8975f5c5SAndroid Build Coastguard Worker 
5015*8975f5c5SAndroid Build Coastguard Worker     glEndPerfMonitorAMD(monitor);
5016*8975f5c5SAndroid Build Coastguard Worker 
5017*8975f5c5SAndroid Build Coastguard Worker     EXPECT_LE(getPerfCounters().pendingSubmissionGarbageObjects,
5018*8975f5c5SAndroid Build Coastguard Worker               initialPendingSubmissionGarbageObjects + 10);
5019*8975f5c5SAndroid Build Coastguard Worker }
5020*8975f5c5SAndroid Build Coastguard Worker 
5021*8975f5c5SAndroid Build Coastguard Worker // Test validatin of using EXT_yuv_target
TEST_P(ImageTestES3,YUVValidation)5022*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, YUVValidation)
5023*8975f5c5SAndroid Build Coastguard Worker {
5024*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5025*8975f5c5SAndroid Build Coastguard Worker 
5026*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() || !hasYUVTargetExt());
5027*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
5028*8975f5c5SAndroid Build Coastguard Worker 
5029*8975f5c5SAndroid Build Coastguard Worker     // Create the Image without data so we don't need ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
5030*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *yuvSource;
5031*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR yuvImage;
5032*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420,
5033*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &yuvSource,
5034*8975f5c5SAndroid Build Coastguard Worker                                               &yuvImage);
5035*8975f5c5SAndroid Build Coastguard Worker 
5036*8975f5c5SAndroid Build Coastguard Worker     GLTexture yuvTexture;
5037*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(yuvImage, yuvTexture);
5038*8975f5c5SAndroid Build Coastguard Worker 
5039*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer yuvFbo;
5040*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, yuvFbo);
5041*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES,
5042*8975f5c5SAndroid Build Coastguard Worker                            yuvTexture, 0);
5043*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5044*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5045*8975f5c5SAndroid Build Coastguard Worker 
5046*8975f5c5SAndroid Build Coastguard Worker     // Create an rgba image
5047*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *rgbaSource;
5048*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR rgbaImage;
5049*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5050*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &rgbaSource,
5051*8975f5c5SAndroid Build Coastguard Worker                                               &rgbaImage);
5052*8975f5c5SAndroid Build Coastguard Worker 
5053*8975f5c5SAndroid Build Coastguard Worker     GLTexture rgbaExternalTexture;
5054*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(rgbaImage, rgbaExternalTexture);
5055*8975f5c5SAndroid Build Coastguard Worker 
5056*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer rgbaExternalFbo;
5057*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, rgbaExternalFbo);
5058*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES,
5059*8975f5c5SAndroid Build Coastguard Worker                            rgbaExternalTexture, 0);
5060*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5061*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5062*8975f5c5SAndroid Build Coastguard Worker 
5063*8975f5c5SAndroid Build Coastguard Worker     // Create a 2d rgb texture/framebuffer
5064*8975f5c5SAndroid Build Coastguard Worker     GLTexture rgb2DTexture;
5065*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, rgb2DTexture);
5066*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
5067*8975f5c5SAndroid Build Coastguard Worker 
5068*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer rgb2DFbo;
5069*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, rgb2DFbo);
5070*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rgb2DTexture, 0);
5071*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5072*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
5073*8975f5c5SAndroid Build Coastguard Worker 
5074*8975f5c5SAndroid Build Coastguard Worker     // It's an error to sample from a non-yuv external texture with a yuv sampler
5075*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
5076*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureYUVProgram);
5077*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, rgbaExternalTexture);
5078*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureYUVUniformLocation, 0);
5079*8975f5c5SAndroid Build Coastguard Worker 
5080*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureYUVProgram, "position", 0.5f);
5081*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5082*8975f5c5SAndroid Build Coastguard Worker 
5083*8975f5c5SAndroid Build Coastguard Worker     // It's an error to render into a YUV framebuffer without a YUV writing program
5084*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, yuvFbo);
5085*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureExternalESSL3Program);
5086*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, rgbaExternalTexture);
5087*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureExternalESSL3UniformLocation, 0);
5088*8975f5c5SAndroid Build Coastguard Worker 
5089*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalESSL3Program, "position", 0.5f);
5090*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5091*8975f5c5SAndroid Build Coastguard Worker 
5092*8975f5c5SAndroid Build Coastguard Worker     // It's an error to render to a RGBA framebuffer with a YUV writing program
5093*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, rgb2DFbo);
5094*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mRenderYUVProgram);
5095*8975f5c5SAndroid Build Coastguard Worker 
5096*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mRenderYUVProgram, "position", 0.5f);
5097*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5098*8975f5c5SAndroid Build Coastguard Worker 
5099*8975f5c5SAndroid Build Coastguard Worker     // It's an error to set disable r, g, or b color writes when rendering to a yuv framebuffer
5100*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, yuvFbo);
5101*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mRenderYUVProgram);
5102*8975f5c5SAndroid Build Coastguard Worker 
5103*8975f5c5SAndroid Build Coastguard Worker     glColorMask(false, true, true, true);
5104*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mRenderYUVProgram, "position", 0.5f);
5105*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5106*8975f5c5SAndroid Build Coastguard Worker 
5107*8975f5c5SAndroid Build Coastguard Worker     glColorMask(true, false, true, true);
5108*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mRenderYUVProgram, "position", 0.5f);
5109*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5110*8975f5c5SAndroid Build Coastguard Worker 
5111*8975f5c5SAndroid Build Coastguard Worker     glColorMask(true, true, false, true);
5112*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mRenderYUVProgram, "position", 0.5f);
5113*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5114*8975f5c5SAndroid Build Coastguard Worker 
5115*8975f5c5SAndroid Build Coastguard Worker     // It's an error to enable blending when rendering to a yuv framebuffer
5116*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, yuvFbo);
5117*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mRenderYUVProgram);
5118*8975f5c5SAndroid Build Coastguard Worker 
5119*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_BLEND);
5120*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mRenderYUVProgram, "position", 0.5f);
5121*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5122*8975f5c5SAndroid Build Coastguard Worker 
5123*8975f5c5SAndroid Build Coastguard Worker     // It's an error to blit to/from a yuv framebuffer
5124*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, yuvFbo);
5125*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, rgb2DFbo);
5126*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
5127*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5128*8975f5c5SAndroid Build Coastguard Worker 
5129*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, rgb2DFbo);
5130*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, yuvFbo);
5131*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
5132*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5133*8975f5c5SAndroid Build Coastguard Worker 
5134*8975f5c5SAndroid Build Coastguard Worker     // It's an error to glCopyTexImage/glCopyTexSubImage from a YUV framebuffer
5135*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, yuvFbo);
5136*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, rgb2DTexture);
5137*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, 1, 0);
5138*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5139*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
5140*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
5141*8975f5c5SAndroid Build Coastguard Worker 
5142*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5143*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), yuvImage);
5144*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(yuvSource);
5145*8975f5c5SAndroid Build Coastguard Worker 
5146*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), rgbaImage);
5147*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(rgbaSource);
5148*8975f5c5SAndroid Build Coastguard Worker }
5149*8975f5c5SAndroid Build Coastguard Worker 
5150*8975f5c5SAndroid Build Coastguard Worker // Testing source AHB EGL image with colorspace, target external ESSL3 texture
TEST_P(ImageTestES3,SourceAHBTargetExternalESSL3_Colorspace)5151*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceAHBTargetExternalESSL3_Colorspace)
5152*8975f5c5SAndroid Build Coastguard Worker {
5153*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
5154*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5155*8975f5c5SAndroid Build Coastguard Worker     SourceAHBTargetExternalESSL3_helper(kColorspaceAttribs);
5156*8975f5c5SAndroid Build Coastguard Worker }
5157*8975f5c5SAndroid Build Coastguard Worker 
SourceAHBTargetExternalESSL3_helper(const EGLint * attribs)5158*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceAHBTargetExternalESSL3_helper(const EGLint *attribs)
5159*8975f5c5SAndroid Build Coastguard Worker {
5160*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5161*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
5162*8975f5c5SAndroid Build Coastguard Worker                        !hasExternalESSL3Ext());
5163*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
5164*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
5165*8975f5c5SAndroid Build Coastguard Worker 
5166*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
5167*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
5168*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5169*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5170*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, attribs, {{kSrgbColor, 4}}, &source,
5171*8975f5c5SAndroid Build Coastguard Worker                                               &image);
5172*8975f5c5SAndroid Build Coastguard Worker 
5173*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
5174*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
5175*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
5176*8975f5c5SAndroid Build Coastguard Worker 
5177*8975f5c5SAndroid Build Coastguard Worker     // Use texture target bound to egl image as source and render to framebuffer
5178*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
5179*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternalESSL3(target, getExpected2DColorForAttribList(attribs));
5180*8975f5c5SAndroid Build Coastguard Worker 
5181*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5182*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5183*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
5184*8975f5c5SAndroid Build Coastguard Worker }
5185*8975f5c5SAndroid Build Coastguard Worker 
5186*8975f5c5SAndroid Build Coastguard Worker // Testing source multi-layered AHB EGL image, target 2D array texture
TEST_P(ImageTestES3,SourceAHBArrayTarget2DArray)5187*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceAHBArrayTarget2DArray)
5188*8975f5c5SAndroid Build Coastguard Worker {
5189*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5190*8975f5c5SAndroid Build Coastguard Worker 
5191*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
5192*8975f5c5SAndroid Build Coastguard Worker                        !hasEglImageArrayExt());
5193*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
5194*8975f5c5SAndroid Build Coastguard Worker 
5195*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kDepth = 2;
5196*8975f5c5SAndroid Build Coastguard Worker 
5197*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
5198*8975f5c5SAndroid Build Coastguard Worker         1, 1, kDepth, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM, kDefaultAHBUsage));
5199*8975f5c5SAndroid Build Coastguard Worker 
5200*8975f5c5SAndroid Build Coastguard Worker     // Create the Image without data so we don't need ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
5201*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
5202*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5203*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, kDepth, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5204*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {}, &source,
5205*8975f5c5SAndroid Build Coastguard Worker                                               &image);
5206*8975f5c5SAndroid Build Coastguard Worker 
5207*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
5208*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
5209*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2DArray(image, target);
5210*8975f5c5SAndroid Build Coastguard Worker 
5211*8975f5c5SAndroid Build Coastguard Worker     // Upload texture data
5212*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 1, 1, kDepth, GL_RGBA, GL_UNSIGNED_BYTE,
5213*8975f5c5SAndroid Build Coastguard Worker                     kLinearColor3D);
5214*8975f5c5SAndroid Build Coastguard Worker 
5215*8975f5c5SAndroid Build Coastguard Worker     // Use texture target bound to egl image as source and render to framebuffer
5216*8975f5c5SAndroid Build Coastguard Worker     for (size_t layer = 0; layer < kDepth; layer++)
5217*8975f5c5SAndroid Build Coastguard Worker     {
5218*8975f5c5SAndroid Build Coastguard Worker         // Expect that the target texture has the same color as the source texture
5219*8975f5c5SAndroid Build Coastguard Worker         verifyResults2DArray(target, &kLinearColor3D[layer * 4], layer);
5220*8975f5c5SAndroid Build Coastguard Worker     }
5221*8975f5c5SAndroid Build Coastguard Worker 
5222*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5223*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5224*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
5225*8975f5c5SAndroid Build Coastguard Worker }
5226*8975f5c5SAndroid Build Coastguard Worker 
5227*8975f5c5SAndroid Build Coastguard Worker // Testing source cubemap AHB EGL image, target cubemap texture
TEST_P(ImageTestES3,SourceAHBCubeTargetCube)5228*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceAHBCubeTargetCube)
5229*8975f5c5SAndroid Build Coastguard Worker {
5230*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5231*8975f5c5SAndroid Build Coastguard Worker 
5232*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasEglImageStorageExt());
5233*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
5234*8975f5c5SAndroid Build Coastguard Worker 
5235*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
5236*8975f5c5SAndroid Build Coastguard Worker         1, 1, kCubeFaceCount, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5237*8975f5c5SAndroid Build Coastguard Worker         kDefaultAHBUsage | kAHBUsageGPUCubeMap));
5238*8975f5c5SAndroid Build Coastguard Worker 
5239*8975f5c5SAndroid Build Coastguard Worker     // Create the Image without data so we don't need ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
5240*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
5241*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5242*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(
5243*8975f5c5SAndroid Build Coastguard Worker         1, 1, kCubeFaceCount, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5244*8975f5c5SAndroid Build Coastguard Worker         kDefaultAHBUsage | kAHBUsageGPUCubeMap, kDefaultAttribs, {}, &source, &image);
5245*8975f5c5SAndroid Build Coastguard Worker 
5246*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
5247*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
5248*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureStorage(image, GL_TEXTURE_CUBE_MAP, target, nullptr);
5249*8975f5c5SAndroid Build Coastguard Worker 
5250*8975f5c5SAndroid Build Coastguard Worker     // Upload texture data
5251*8975f5c5SAndroid Build Coastguard Worker     for (size_t faceIdx = 0; faceIdx < kCubeFaceCount; faceIdx++)
5252*8975f5c5SAndroid Build Coastguard Worker     {
5253*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIdx, 0, 0, 0, 1, 1, GL_RGBA,
5254*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_BYTE, &kLinearColorCube[faceIdx * 4]);
5255*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
5256*8975f5c5SAndroid Build Coastguard Worker     }
5257*8975f5c5SAndroid Build Coastguard Worker 
5258*8975f5c5SAndroid Build Coastguard Worker     // Use texture target bound to egl image as source and render to framebuffer
5259*8975f5c5SAndroid Build Coastguard Worker     for (size_t faceIdx = 0; faceIdx < kCubeFaceCount; faceIdx++)
5260*8975f5c5SAndroid Build Coastguard Worker     {
5261*8975f5c5SAndroid Build Coastguard Worker         // Expect that the target texture has the same color as the source texture
5262*8975f5c5SAndroid Build Coastguard Worker         verifyResultsCube(target, &kLinearColorCube[faceIdx * 4], faceIdx);
5263*8975f5c5SAndroid Build Coastguard Worker     }
5264*8975f5c5SAndroid Build Coastguard Worker 
5265*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5266*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5267*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
5268*8975f5c5SAndroid Build Coastguard Worker }
5269*8975f5c5SAndroid Build Coastguard Worker 
5270*8975f5c5SAndroid Build Coastguard Worker // Testing source cubemap array AHB EGL image, target cubemap array texture
TEST_P(ImageTestES31,SourceAHBCubeArrayTargetCubeArray)5271*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES31, SourceAHBCubeArrayTargetCubeArray)
5272*8975f5c5SAndroid Build Coastguard Worker {
5273*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5274*8975f5c5SAndroid Build Coastguard Worker 
5275*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!(getClientMajorVersion() >= 3 && getClientMinorVersion() >= 1));
5276*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasEglImageStorageExt() ||
5277*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_EXT_texture_cube_map_array"));
5278*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
5279*8975f5c5SAndroid Build Coastguard Worker 
5280*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kDepth = kCubeFaceCount * 2;
5281*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
5282*8975f5c5SAndroid Build Coastguard Worker         1, 1, kDepth, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5283*8975f5c5SAndroid Build Coastguard Worker         kDefaultAHBUsage | kAHBUsageGPUCubeMap));
5284*8975f5c5SAndroid Build Coastguard Worker 
5285*8975f5c5SAndroid Build Coastguard Worker     // Create the Image without data so we don't need ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
5286*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
5287*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5288*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, kDepth, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5289*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage | kAHBUsageGPUCubeMap,
5290*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAttribs, {}, &source, &image);
5291*8975f5c5SAndroid Build Coastguard Worker 
5292*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
5293*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
5294*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureStorage(image, GL_TEXTURE_CUBE_MAP_ARRAY, target, nullptr);
5295*8975f5c5SAndroid Build Coastguard Worker 
5296*8975f5c5SAndroid Build Coastguard Worker     // Upload texture data
5297*8975f5c5SAndroid Build Coastguard Worker     for (size_t faceIdx = 0; faceIdx < kCubeFaceCount; faceIdx++)
5298*8975f5c5SAndroid Build Coastguard Worker     {
5299*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, faceIdx, 1, 1, 1, GL_RGBA,
5300*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_BYTE, &kLinearColorCube[faceIdx * 4]);
5301*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 11 - faceIdx, 1, 1, 1, GL_RGBA,
5302*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_BYTE, &kLinearColorCube[faceIdx * 4]);
5303*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
5304*8975f5c5SAndroid Build Coastguard Worker     }
5305*8975f5c5SAndroid Build Coastguard Worker 
5306*8975f5c5SAndroid Build Coastguard Worker     // Use texture target bound to egl image as source and render to framebuffer
5307*8975f5c5SAndroid Build Coastguard Worker     for (size_t faceIdx = 0; faceIdx < kCubeFaceCount; faceIdx++)
5308*8975f5c5SAndroid Build Coastguard Worker     {
5309*8975f5c5SAndroid Build Coastguard Worker         // Expect that the target texture has the same color as the source texture
5310*8975f5c5SAndroid Build Coastguard Worker         verifyResultsCubeArray(target, &kLinearColorCube[faceIdx * 4], faceIdx, 0);
5311*8975f5c5SAndroid Build Coastguard Worker         verifyResultsCubeArray(target, &kLinearColorCube[(5 - faceIdx) * 4], faceIdx, 1);
5312*8975f5c5SAndroid Build Coastguard Worker     }
5313*8975f5c5SAndroid Build Coastguard Worker 
5314*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5315*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5316*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
5317*8975f5c5SAndroid Build Coastguard Worker }
5318*8975f5c5SAndroid Build Coastguard Worker 
5319*8975f5c5SAndroid Build Coastguard Worker // Testing source 2D AHB with mipmap EGL image, target 2D texture with mipmap
TEST_P(ImageTestES3,SourceAHBMipTarget2DMip)5320*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceAHBMipTarget2DMip)
5321*8975f5c5SAndroid Build Coastguard Worker {
5322*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5323*8975f5c5SAndroid Build Coastguard Worker 
5324*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasEglImageStorageExt());
5325*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
5326*8975f5c5SAndroid Build Coastguard Worker 
5327*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
5328*8975f5c5SAndroid Build Coastguard Worker         2, 2, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5329*8975f5c5SAndroid Build Coastguard Worker         kDefaultAHBUsage | kAHBUsageGPUMipMapComplete));
5330*8975f5c5SAndroid Build Coastguard Worker 
5331*8975f5c5SAndroid Build Coastguard Worker     // Create the Image without data so we don't need ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
5332*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
5333*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5334*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5335*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage | kAHBUsageGPUMipMapComplete,
5336*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAttribs, {}, &source, &image);
5337*8975f5c5SAndroid Build Coastguard Worker 
5338*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
5339*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
5340*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureStorage(image, GL_TEXTURE_2D, target, nullptr);
5341*8975f5c5SAndroid Build Coastguard Worker 
5342*8975f5c5SAndroid Build Coastguard Worker     // Upload texture data
5343*8975f5c5SAndroid Build Coastguard Worker     // Set Mip level 0 to one color
5344*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kRedData(4, GLColor::red);
5345*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, kRedData.data());
5346*8975f5c5SAndroid Build Coastguard Worker 
5347*8975f5c5SAndroid Build Coastguard Worker     // Set Mip level 1 to a different color
5348*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kGreenData(1, GLColor::green);
5349*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kGreenData.data());
5350*8975f5c5SAndroid Build Coastguard Worker 
5351*8975f5c5SAndroid Build Coastguard Worker     // Use texture target bound to egl image as source and render to framebuffer
5352*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the same color as the corresponding mip level in the
5353*8975f5c5SAndroid Build Coastguard Worker     // source texture
5354*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
5355*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
5356*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, GLColor::red.data());
5357*8975f5c5SAndroid Build Coastguard Worker 
5358*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5359*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
5360*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, GLColor::green.data());
5361*8975f5c5SAndroid Build Coastguard Worker 
5362*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5363*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5364*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
5365*8975f5c5SAndroid Build Coastguard Worker }
5366*8975f5c5SAndroid Build Coastguard Worker 
5367*8975f5c5SAndroid Build Coastguard Worker // Test glGenerateMipmap and GL_EXT_EGL_image_storage interaction
TEST_P(ImageTestES3,SourceAHBMipTarget2DMipGenerateMipmap)5368*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceAHBMipTarget2DMipGenerateMipmap)
5369*8975f5c5SAndroid Build Coastguard Worker {
5370*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5371*8975f5c5SAndroid Build Coastguard Worker 
5372*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasEglImageStorageExt());
5373*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
5374*8975f5c5SAndroid Build Coastguard Worker 
5375*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!isAndroidHardwareBufferConfigurationSupported(
5376*8975f5c5SAndroid Build Coastguard Worker         2, 2, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5377*8975f5c5SAndroid Build Coastguard Worker         kDefaultAHBUsage | kAHBUsageGPUMipMapComplete));
5378*8975f5c5SAndroid Build Coastguard Worker 
5379*8975f5c5SAndroid Build Coastguard Worker     // Create the Image without data so we don't need ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT
5380*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
5381*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5382*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(2, 2, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
5383*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage | kAHBUsageGPUMipMapComplete,
5384*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAttribs, {}, &source, &image);
5385*8975f5c5SAndroid Build Coastguard Worker 
5386*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
5387*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
5388*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureStorage(image, GL_TEXTURE_2D, target, nullptr);
5389*8975f5c5SAndroid Build Coastguard Worker 
5390*8975f5c5SAndroid Build Coastguard Worker     // Upload texture data
5391*8975f5c5SAndroid Build Coastguard Worker     // Set Mip level 0 to one color
5392*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kRedData(4, GLColor::red);
5393*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, kRedData.data());
5394*8975f5c5SAndroid Build Coastguard Worker 
5395*8975f5c5SAndroid Build Coastguard Worker     // Set Mip level 1 to a different color
5396*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLColor> kGreenData(1, GLColor::green);
5397*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kGreenData.data());
5398*8975f5c5SAndroid Build Coastguard Worker 
5399*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmap level 1
5400*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
5401*8975f5c5SAndroid Build Coastguard Worker 
5402*8975f5c5SAndroid Build Coastguard Worker     // Use mipmap level 1 of texture target bound to egl image as source and render to framebuffer
5403*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the same color as the mip level 0 in the source texture
5404*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
5405*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
5406*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, GLColor::red.data());
5407*8975f5c5SAndroid Build Coastguard Worker 
5408*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5409*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5410*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
5411*8975f5c5SAndroid Build Coastguard Worker }
5412*8975f5c5SAndroid Build Coastguard Worker 
5413*8975f5c5SAndroid Build Coastguard Worker // Create a depth format AHB backed EGL image and verify that the image's aspect is honored
TEST_P(ImageTest,SourceAHBTarget2DDepth)5414*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceAHBTarget2DDepth)
5415*8975f5c5SAndroid Build Coastguard Worker {
5416*8975f5c5SAndroid Build Coastguard Worker     // TODO - Support for depth formats in AHB is missing (http://anglebug.com/42263405)
5417*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(true);
5418*8975f5c5SAndroid Build Coastguard Worker 
5419*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5420*8975f5c5SAndroid Build Coastguard Worker 
5421*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
5422*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
5423*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
5424*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
5425*8975f5c5SAndroid Build Coastguard Worker 
5426*8975f5c5SAndroid Build Coastguard Worker     GLint level             = 0;
5427*8975f5c5SAndroid Build Coastguard Worker     GLsizei width           = 1;
5428*8975f5c5SAndroid Build Coastguard Worker     GLsizei height          = 1;
5429*8975f5c5SAndroid Build Coastguard Worker     GLsizei depth           = 1;
5430*8975f5c5SAndroid Build Coastguard Worker     GLint depthStencilValue = 0;
5431*8975f5c5SAndroid Build Coastguard Worker 
5432*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
5433*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
5434*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5435*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(
5436*8975f5c5SAndroid Build Coastguard Worker         width, height, depth, AHARDWAREBUFFER_FORMAT_D24_UNORM, kDefaultAHBUsage, kDefaultAttribs,
5437*8975f5c5SAndroid Build Coastguard Worker         {{reinterpret_cast<GLubyte *>(&depthStencilValue), 3}}, &source, &image);
5438*8975f5c5SAndroid Build Coastguard Worker 
5439*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image
5440*8975f5c5SAndroid Build Coastguard Worker     GLTexture depthTextureTarget;
5441*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, depthTextureTarget);
5442*8975f5c5SAndroid Build Coastguard Worker 
5443*8975f5c5SAndroid Build Coastguard Worker     // Create a color texture and fill it with red
5444*8975f5c5SAndroid Build Coastguard Worker     GLTexture colorTexture;
5445*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, colorTexture);
5446*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
5447*8975f5c5SAndroid Build Coastguard Worker                  GLColor::red.data());
5448*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5449*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5450*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
5451*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
5452*8975f5c5SAndroid Build Coastguard Worker 
5453*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
5454*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
5455*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
5456*8975f5c5SAndroid Build Coastguard Worker 
5457*8975f5c5SAndroid Build Coastguard Worker     // Attach the color and depth texture to the FBO
5458*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
5459*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
5460*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTextureTarget,
5461*8975f5c5SAndroid Build Coastguard Worker                            0);
5462*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
5463*8975f5c5SAndroid Build Coastguard Worker 
5464*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
5465*8975f5c5SAndroid Build Coastguard Worker 
5466*8975f5c5SAndroid Build Coastguard Worker     // Clear the color texture to red
5467*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
5468*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
5469*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
5470*8975f5c5SAndroid Build Coastguard Worker 
5471*8975f5c5SAndroid Build Coastguard Worker     // Enable Depth test but disable depth writes. The depth function is set to ">".
5472*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
5473*8975f5c5SAndroid Build Coastguard Worker     glDepthMask(GL_FALSE);
5474*8975f5c5SAndroid Build Coastguard Worker     glDepthFunc(GL_GREATER);
5475*8975f5c5SAndroid Build Coastguard Worker 
5476*8975f5c5SAndroid Build Coastguard Worker     // Fill any fragment of the color attachment with blue if it passes the depth test.
5477*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(colorFillProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
5478*8975f5c5SAndroid Build Coastguard Worker     drawQuad(colorFillProgram, essl1_shaders::PositionAttrib(), 1.0f, 1.0f);
5479*8975f5c5SAndroid Build Coastguard Worker 
5480*8975f5c5SAndroid Build Coastguard Worker     // Since 1.0f > 0.0f, all fragments of the color attachment should be blue.
5481*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(0, 0, 0, 0, 255, 255);
5482*8975f5c5SAndroid Build Coastguard Worker 
5483*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5484*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, 0);
5485*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5486*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
5487*8975f5c5SAndroid Build Coastguard Worker }
5488*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source2DTargetRenderbuffer)5489*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source2DTargetRenderbuffer)
5490*8975f5c5SAndroid Build Coastguard Worker {
5491*8975f5c5SAndroid Build Coastguard Worker     Source2DTargetRenderbuffer_helper(kDefaultAttribs);
5492*8975f5c5SAndroid Build Coastguard Worker }
5493*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source2DTargetRenderbuffer_Colorspace)5494*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source2DTargetRenderbuffer_Colorspace)
5495*8975f5c5SAndroid Build Coastguard Worker {
5496*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
5497*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5498*8975f5c5SAndroid Build Coastguard Worker     Source2DTargetRenderbuffer_helper(kColorspaceAttribs);
5499*8975f5c5SAndroid Build Coastguard Worker }
5500*8975f5c5SAndroid Build Coastguard Worker 
Source2DTargetRenderbuffer_helper(const EGLint * attribs)5501*8975f5c5SAndroid Build Coastguard Worker void ImageTest::Source2DTargetRenderbuffer_helper(const EGLint *attribs)
5502*8975f5c5SAndroid Build Coastguard Worker {
5503*8975f5c5SAndroid Build Coastguard Worker 
5504*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5505*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
5506*8975f5c5SAndroid Build Coastguard Worker 
5507*8975f5c5SAndroid Build Coastguard Worker     // Create sampling texture
5508*8975f5c5SAndroid Build Coastguard Worker     GLTexture sampleTexture;
5509*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, sampleTexture);
5510*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, kLinearColor);
5511*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
5512*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5513*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5514*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5515*8975f5c5SAndroid Build Coastguard Worker 
5516*8975f5c5SAndroid Build Coastguard Worker     // Create the attachment texture and image
5517*8975f5c5SAndroid Build Coastguard Worker     GLTexture attachmentTexture;
5518*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5519*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, attribs, nullptr,
5520*8975f5c5SAndroid Build Coastguard Worker                                   attachmentTexture, &image);
5521*8975f5c5SAndroid Build Coastguard Worker 
5522*8975f5c5SAndroid Build Coastguard Worker     // Create the renderbuffer
5523*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
5524*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetRenderbuffer(image, renderbuffer);
5525*8975f5c5SAndroid Build Coastguard Worker 
5526*8975f5c5SAndroid Build Coastguard Worker     // Verify that the render buffer has the expected color
5527*8975f5c5SAndroid Build Coastguard Worker     verifyResultsRenderbufferWithClearAndDraw(
5528*8975f5c5SAndroid Build Coastguard Worker         sampleTexture, renderbuffer, kLinearColor,
5529*8975f5c5SAndroid Build Coastguard Worker         getExpected2DColorForAttribList(attribs, EglImageUsage::Rendering));
5530*8975f5c5SAndroid Build Coastguard Worker 
5531*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5532*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5533*8975f5c5SAndroid Build Coastguard Worker }
5534*8975f5c5SAndroid Build Coastguard Worker 
5535*8975f5c5SAndroid Build Coastguard Worker // Testing source native client buffer EGL image, target external texture
5536*8975f5c5SAndroid Build Coastguard Worker // where source native client buffer is created using EGL_ANDROID_create_native_client_buffer API
TEST_P(ImageTest,SourceNativeClientBufferTargetExternal)5537*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceNativeClientBufferTargetExternal)
5538*8975f5c5SAndroid Build Coastguard Worker {
5539*8975f5c5SAndroid Build Coastguard Worker     SourceNativeClientBufferTargetExternal_helper(kDefaultAttribs);
5540*8975f5c5SAndroid Build Coastguard Worker }
5541*8975f5c5SAndroid Build Coastguard Worker 
5542*8975f5c5SAndroid Build Coastguard Worker // Testing source native client buffer EGL image with colorspace, target external texture
5543*8975f5c5SAndroid Build Coastguard Worker // where source native client buffer is created using EGL_ANDROID_create_native_client_buffer API
TEST_P(ImageTest,SourceNativeClientBufferTargetExternal_Colorspace)5544*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceNativeClientBufferTargetExternal_Colorspace)
5545*8975f5c5SAndroid Build Coastguard Worker {
5546*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
5547*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5548*8975f5c5SAndroid Build Coastguard Worker     SourceNativeClientBufferTargetExternal_helper(kColorspaceAttribs);
5549*8975f5c5SAndroid Build Coastguard Worker }
5550*8975f5c5SAndroid Build Coastguard Worker 
SourceNativeClientBufferTargetExternal_helper(const EGLint * attribs)5551*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceNativeClientBufferTargetExternal_helper(const EGLint *attribs)
5552*8975f5c5SAndroid Build Coastguard Worker {
5553*8975f5c5SAndroid Build Coastguard Worker 
5554*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5555*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
5556*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
5557*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
5558*8975f5c5SAndroid Build Coastguard Worker 
5559*8975f5c5SAndroid Build Coastguard Worker     // Create an Image backed by a native client buffer allocated using
5560*8975f5c5SAndroid Build Coastguard Worker     // EGL_ANDROID_create_native_client_buffer API
5561*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5562*8975f5c5SAndroid Build Coastguard Worker     createEGLImageANWBClientBufferSource(1, 1, 1, kNativeClientBufferAttribs_RGBA8_Texture, attribs,
5563*8975f5c5SAndroid Build Coastguard Worker                                          {{kSrgbColor, 4}}, &image);
5564*8975f5c5SAndroid Build Coastguard Worker 
5565*8975f5c5SAndroid Build Coastguard Worker     // Create the target
5566*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
5567*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
5568*8975f5c5SAndroid Build Coastguard Worker 
5569*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
5570*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(target, getExpected2DColorForAttribList(attribs));
5571*8975f5c5SAndroid Build Coastguard Worker 
5572*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5573*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5574*8975f5c5SAndroid Build Coastguard Worker }
5575*8975f5c5SAndroid Build Coastguard Worker 
5576*8975f5c5SAndroid Build Coastguard Worker // Testing source native client buffer EGL image, target Renderbuffer
5577*8975f5c5SAndroid Build Coastguard Worker // where source native client buffer is created using EGL_ANDROID_create_native_client_buffer API
TEST_P(ImageTest,SourceNativeClientBufferTargetRenderbuffer)5578*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceNativeClientBufferTargetRenderbuffer)
5579*8975f5c5SAndroid Build Coastguard Worker {
5580*8975f5c5SAndroid Build Coastguard Worker     SourceNativeClientBufferTargetRenderbuffer_helper(kDefaultAttribs);
5581*8975f5c5SAndroid Build Coastguard Worker }
5582*8975f5c5SAndroid Build Coastguard Worker 
5583*8975f5c5SAndroid Build Coastguard Worker // Testing source native client buffer EGL image with colorspace, target Renderbuffer
5584*8975f5c5SAndroid Build Coastguard Worker // where source native client buffer is created using EGL_ANDROID_create_native_client_buffer API
TEST_P(ImageTest,SourceNativeClientBufferTargetRenderbuffer_Colorspace)5585*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceNativeClientBufferTargetRenderbuffer_Colorspace)
5586*8975f5c5SAndroid Build Coastguard Worker {
5587*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
5588*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5589*8975f5c5SAndroid Build Coastguard Worker     SourceNativeClientBufferTargetRenderbuffer_helper(kColorspaceAttribs);
5590*8975f5c5SAndroid Build Coastguard Worker }
5591*8975f5c5SAndroid Build Coastguard Worker 
SourceNativeClientBufferTargetRenderbuffer_helper(const EGLint * attribs)5592*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceNativeClientBufferTargetRenderbuffer_helper(const EGLint *attribs)
5593*8975f5c5SAndroid Build Coastguard Worker {
5594*8975f5c5SAndroid Build Coastguard Worker 
5595*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5596*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
5597*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
5598*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
5599*8975f5c5SAndroid Build Coastguard Worker 
5600*8975f5c5SAndroid Build Coastguard Worker     // Create an Image backed by a native client buffer allocated using
5601*8975f5c5SAndroid Build Coastguard Worker     // EGL_ANDROID_create_native_client_buffer API
5602*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image = EGL_NO_IMAGE_KHR;
5603*8975f5c5SAndroid Build Coastguard Worker     createEGLImageANWBClientBufferSource(1, 1, 1, kNativeClientBufferAttribs_RGBA8_Renderbuffer,
5604*8975f5c5SAndroid Build Coastguard Worker                                          attribs, {{kSrgbColor, 4}}, &image);
5605*8975f5c5SAndroid Build Coastguard Worker     // We are locking AHB to initialize AHB with data. The lock is allowed to fail, and may fail if
5606*8975f5c5SAndroid Build Coastguard Worker     // driver decided to allocate with framebuffer compression enabled.
5607*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(image == EGL_NO_IMAGE_KHR);
5608*8975f5c5SAndroid Build Coastguard Worker 
5609*8975f5c5SAndroid Build Coastguard Worker     // Create the target
5610*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer target;
5611*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetRenderbuffer(image, target);
5612*8975f5c5SAndroid Build Coastguard Worker 
5613*8975f5c5SAndroid Build Coastguard Worker     // Create a framebuffer with renderbuffer attachment and clear it
5614*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
5615*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5616*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, target);
5617*8975f5c5SAndroid Build Coastguard Worker     glClearColor(kLinearColor[0] / 255.0f, kLinearColor[1] / 255.0f, kLinearColor[2] / 255.0f,
5618*8975f5c5SAndroid Build Coastguard Worker                  kLinearColor[3] / 255.0f);
5619*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
5620*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
5621*8975f5c5SAndroid Build Coastguard Worker 
5622*8975f5c5SAndroid Build Coastguard Worker     // Verify that the render buffer has the expected color
5623*8975f5c5SAndroid Build Coastguard Worker     verifyResultsRenderbuffer(target,
5624*8975f5c5SAndroid Build Coastguard Worker                               getExpected2DColorForAttribList(attribs, EglImageUsage::Rendering));
5625*8975f5c5SAndroid Build Coastguard Worker 
5626*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5627*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5628*8975f5c5SAndroid Build Coastguard Worker }
5629*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source2DTargetExternal)5630*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source2DTargetExternal)
5631*8975f5c5SAndroid Build Coastguard Worker {
5632*8975f5c5SAndroid Build Coastguard Worker     Source2DTargetExternal_helper(kDefaultAttribs);
5633*8975f5c5SAndroid Build Coastguard Worker }
5634*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source2DTargetExternal_Colorspace)5635*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source2DTargetExternal_Colorspace)
5636*8975f5c5SAndroid Build Coastguard Worker {
5637*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
5638*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5639*8975f5c5SAndroid Build Coastguard Worker     Source2DTargetExternal_helper(kColorspaceAttribs);
5640*8975f5c5SAndroid Build Coastguard Worker }
5641*8975f5c5SAndroid Build Coastguard Worker 
Source2DTargetExternal_helper(const EGLint * attribs)5642*8975f5c5SAndroid Build Coastguard Worker void ImageTest::Source2DTargetExternal_helper(const EGLint *attribs)
5643*8975f5c5SAndroid Build Coastguard Worker {
5644*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5645*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() || !hasExternalExt());
5646*8975f5c5SAndroid Build Coastguard Worker 
5647*8975f5c5SAndroid Build Coastguard Worker     // Ozone only supports external target for images created with EGL_EXT_image_dma_buf_import
5648*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
5649*8975f5c5SAndroid Build Coastguard Worker 
5650*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
5651*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
5652*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5653*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, attribs, kSrgbColor, source,
5654*8975f5c5SAndroid Build Coastguard Worker                                   &image);
5655*8975f5c5SAndroid Build Coastguard Worker 
5656*8975f5c5SAndroid Build Coastguard Worker     // Create the target
5657*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
5658*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
5659*8975f5c5SAndroid Build Coastguard Worker 
5660*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
5661*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(target, getExpected2DColorForAttribList(attribs));
5662*8975f5c5SAndroid Build Coastguard Worker 
5663*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5664*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5665*8975f5c5SAndroid Build Coastguard Worker }
5666*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTestES3,Source2DTargetExternalESSL3)5667*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, Source2DTargetExternalESSL3)
5668*8975f5c5SAndroid Build Coastguard Worker {
5669*8975f5c5SAndroid Build Coastguard Worker     Source2DTargetExternalESSL3_helper(kDefaultAttribs);
5670*8975f5c5SAndroid Build Coastguard Worker }
5671*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTestES3,Source2DTargetExternalESSL3_Colorspace)5672*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, Source2DTargetExternalESSL3_Colorspace)
5673*8975f5c5SAndroid Build Coastguard Worker {
5674*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
5675*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5676*8975f5c5SAndroid Build Coastguard Worker     Source2DTargetExternalESSL3_helper(kColorspaceAttribs);
5677*8975f5c5SAndroid Build Coastguard Worker }
5678*8975f5c5SAndroid Build Coastguard Worker 
Source2DTargetExternalESSL3_helper(const EGLint * attribs)5679*8975f5c5SAndroid Build Coastguard Worker void ImageTest::Source2DTargetExternalESSL3_helper(const EGLint *attribs)
5680*8975f5c5SAndroid Build Coastguard Worker {
5681*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5682*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
5683*8975f5c5SAndroid Build Coastguard Worker                        !hasExternalESSL3Ext());
5684*8975f5c5SAndroid Build Coastguard Worker 
5685*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
5686*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
5687*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
5688*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, attribs, kSrgbColor, source,
5689*8975f5c5SAndroid Build Coastguard Worker                                   &image);
5690*8975f5c5SAndroid Build Coastguard Worker 
5691*8975f5c5SAndroid Build Coastguard Worker     // Create the target
5692*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
5693*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
5694*8975f5c5SAndroid Build Coastguard Worker 
5695*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
5696*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternalESSL3(target, getExpected2DColorForAttribList(attribs));
5697*8975f5c5SAndroid Build Coastguard Worker 
5698*8975f5c5SAndroid Build Coastguard Worker     // Clean up
5699*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
5700*8975f5c5SAndroid Build Coastguard Worker }
5701*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,SourceCubeTarget2D)5702*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceCubeTarget2D)
5703*8975f5c5SAndroid Build Coastguard Worker {
5704*8975f5c5SAndroid Build Coastguard Worker     SourceCubeTarget2D_helper(kDefaultAttribs);
5705*8975f5c5SAndroid Build Coastguard Worker }
5706*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,SourceCubeTarget2D_Colorspace)5707*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceCubeTarget2D_Colorspace)
5708*8975f5c5SAndroid Build Coastguard Worker {
5709*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
5710*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5711*8975f5c5SAndroid Build Coastguard Worker     SourceCubeTarget2D_helper(kColorspaceAttribs);
5712*8975f5c5SAndroid Build Coastguard Worker }
5713*8975f5c5SAndroid Build Coastguard Worker 
SourceCubeTarget2D_helper(const EGLint * attribs)5714*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceCubeTarget2D_helper(const EGLint *attribs)
5715*8975f5c5SAndroid Build Coastguard Worker {
5716*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5717*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !hasCubemapExt());
5718*8975f5c5SAndroid Build Coastguard Worker 
5719*8975f5c5SAndroid Build Coastguard Worker     for (EGLenum faceIdx = 0; faceIdx < 6; faceIdx++)
5720*8975f5c5SAndroid Build Coastguard Worker     {
5721*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
5722*8975f5c5SAndroid Build Coastguard Worker         GLTexture source;
5723*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image;
5724*8975f5c5SAndroid Build Coastguard Worker         createEGLImageCubemapTextureSource(
5725*8975f5c5SAndroid Build Coastguard Worker             1, 1, GL_RGBA, GL_UNSIGNED_BYTE, attribs, reinterpret_cast<uint8_t *>(kSrgbColorCube),
5726*8975f5c5SAndroid Build Coastguard Worker             sizeof(GLubyte) * 4, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR + faceIdx, source, &image);
5727*8975f5c5SAndroid Build Coastguard Worker 
5728*8975f5c5SAndroid Build Coastguard Worker         // Create the target
5729*8975f5c5SAndroid Build Coastguard Worker         GLTexture target;
5730*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetTexture2D(image, target);
5731*8975f5c5SAndroid Build Coastguard Worker 
5732*8975f5c5SAndroid Build Coastguard Worker         // Verify that the target texture has the expected color
5733*8975f5c5SAndroid Build Coastguard Worker         verifyResults2D(target, &getExpectedCubeColorForAttribList(attribs)[faceIdx * 4]);
5734*8975f5c5SAndroid Build Coastguard Worker 
5735*8975f5c5SAndroid Build Coastguard Worker         // Clean up
5736*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
5737*8975f5c5SAndroid Build Coastguard Worker     }
5738*8975f5c5SAndroid Build Coastguard Worker }
5739*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,SourceCubeTargetRenderbuffer)5740*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceCubeTargetRenderbuffer)
5741*8975f5c5SAndroid Build Coastguard Worker {
5742*8975f5c5SAndroid Build Coastguard Worker     SourceCubeTargetRenderbuffer_helper(kDefaultAttribs);
5743*8975f5c5SAndroid Build Coastguard Worker }
5744*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,SourceCubeTargetRenderbuffer_Colorspace)5745*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceCubeTargetRenderbuffer_Colorspace)
5746*8975f5c5SAndroid Build Coastguard Worker {
5747*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
5748*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5749*8975f5c5SAndroid Build Coastguard Worker     SourceCubeTargetRenderbuffer_helper(kColorspaceAttribs);
5750*8975f5c5SAndroid Build Coastguard Worker }
5751*8975f5c5SAndroid Build Coastguard Worker 
SourceCubeTargetRenderbuffer_helper(const EGLint * attribs)5752*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceCubeTargetRenderbuffer_helper(const EGLint *attribs)
5753*8975f5c5SAndroid Build Coastguard Worker {
5754*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5755*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !hasCubemapExt());
5756*8975f5c5SAndroid Build Coastguard Worker 
5757*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261821
5758*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan() && IsIntel() && IsFuchsia());
5759*8975f5c5SAndroid Build Coastguard Worker 
5760*8975f5c5SAndroid Build Coastguard Worker     for (EGLenum faceIdx = 0; faceIdx < 6; faceIdx++)
5761*8975f5c5SAndroid Build Coastguard Worker     {
5762*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
5763*8975f5c5SAndroid Build Coastguard Worker         GLTexture source;
5764*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image;
5765*8975f5c5SAndroid Build Coastguard Worker         createEGLImageCubemapTextureSource(
5766*8975f5c5SAndroid Build Coastguard Worker             1, 1, GL_RGBA, GL_UNSIGNED_BYTE, attribs, reinterpret_cast<uint8_t *>(kSrgbColorCube),
5767*8975f5c5SAndroid Build Coastguard Worker             sizeof(GLubyte) * 4, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR + faceIdx, source, &image);
5768*8975f5c5SAndroid Build Coastguard Worker 
5769*8975f5c5SAndroid Build Coastguard Worker         // Create the target
5770*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer target;
5771*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetRenderbuffer(image, target);
5772*8975f5c5SAndroid Build Coastguard Worker 
5773*8975f5c5SAndroid Build Coastguard Worker         // Create a framebuffer with renderbuffer attachment and clear it
5774*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer framebuffer;
5775*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5776*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, target);
5777*8975f5c5SAndroid Build Coastguard Worker         glClearColor(
5778*8975f5c5SAndroid Build Coastguard Worker             kLinearColorCube[faceIdx * 4 + 0] / 255.0f, kLinearColorCube[faceIdx * 4 + 1] / 255.0f,
5779*8975f5c5SAndroid Build Coastguard Worker             kLinearColorCube[faceIdx * 4 + 2] / 255.0f, kLinearColorCube[faceIdx * 4 + 3] / 255.0f);
5780*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
5781*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
5782*8975f5c5SAndroid Build Coastguard Worker 
5783*8975f5c5SAndroid Build Coastguard Worker         // Verify that the render buffer has the expected color
5784*8975f5c5SAndroid Build Coastguard Worker         verifyResultsRenderbuffer(target, &getExpectedCubeColorForAttribList(
5785*8975f5c5SAndroid Build Coastguard Worker                                               attribs, EglImageUsage::Rendering)[faceIdx * 4]);
5786*8975f5c5SAndroid Build Coastguard Worker 
5787*8975f5c5SAndroid Build Coastguard Worker         // Clean up
5788*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
5789*8975f5c5SAndroid Build Coastguard Worker     }
5790*8975f5c5SAndroid Build Coastguard Worker }
5791*8975f5c5SAndroid Build Coastguard Worker 
5792*8975f5c5SAndroid Build Coastguard Worker // Test cubemap -> external texture EGL images.
TEST_P(ImageTest,SourceCubeTargetExternal)5793*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceCubeTargetExternal)
5794*8975f5c5SAndroid Build Coastguard Worker {
5795*8975f5c5SAndroid Build Coastguard Worker     SourceCubeTargetExternal_helper(kDefaultAttribs);
5796*8975f5c5SAndroid Build Coastguard Worker }
5797*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,SourceCubeTargetExternal_Colorspace)5798*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceCubeTargetExternal_Colorspace)
5799*8975f5c5SAndroid Build Coastguard Worker {
5800*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
5801*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5802*8975f5c5SAndroid Build Coastguard Worker     SourceCubeTargetExternal_helper(kColorspaceAttribs);
5803*8975f5c5SAndroid Build Coastguard Worker }
5804*8975f5c5SAndroid Build Coastguard Worker 
SourceCubeTargetExternal_helper(const EGLint * attribs)5805*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceCubeTargetExternal_helper(const EGLint *attribs)
5806*8975f5c5SAndroid Build Coastguard Worker {
5807*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5808*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !hasCubemapExt() || !hasExternalExt());
5809*8975f5c5SAndroid Build Coastguard Worker 
5810*8975f5c5SAndroid Build Coastguard Worker     // Ozone only supports external target for images created with EGL_EXT_image_dma_buf_import
5811*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
5812*8975f5c5SAndroid Build Coastguard Worker 
5813*8975f5c5SAndroid Build Coastguard Worker     for (EGLenum faceIdx = 0; faceIdx < 6; faceIdx++)
5814*8975f5c5SAndroid Build Coastguard Worker     {
5815*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
5816*8975f5c5SAndroid Build Coastguard Worker         GLTexture source;
5817*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image;
5818*8975f5c5SAndroid Build Coastguard Worker         // Upload sRGB color so that it is converted to linear when sampling.
5819*8975f5c5SAndroid Build Coastguard Worker         createEGLImageCubemapTextureSource(
5820*8975f5c5SAndroid Build Coastguard Worker             1, 1, GL_RGBA, GL_UNSIGNED_BYTE, attribs, reinterpret_cast<uint8_t *>(kSrgbColorCube),
5821*8975f5c5SAndroid Build Coastguard Worker             sizeof(GLubyte) * 4, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR + faceIdx, source, &image);
5822*8975f5c5SAndroid Build Coastguard Worker 
5823*8975f5c5SAndroid Build Coastguard Worker         // Create the target
5824*8975f5c5SAndroid Build Coastguard Worker         GLTexture target;
5825*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetTextureExternal(image, target);
5826*8975f5c5SAndroid Build Coastguard Worker 
5827*8975f5c5SAndroid Build Coastguard Worker         // Verify that the target texture has the expected color
5828*8975f5c5SAndroid Build Coastguard Worker         verifyResultsExternal(target, &getExpectedCubeColorForAttribList(attribs)[faceIdx * 4]);
5829*8975f5c5SAndroid Build Coastguard Worker 
5830*8975f5c5SAndroid Build Coastguard Worker         // Clean up
5831*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
5832*8975f5c5SAndroid Build Coastguard Worker     }
5833*8975f5c5SAndroid Build Coastguard Worker }
5834*8975f5c5SAndroid Build Coastguard Worker 
5835*8975f5c5SAndroid Build Coastguard Worker // Test cubemap -> external texture EGL images using ESSL3 shaders.
TEST_P(ImageTestES3,SourceCubeTargetExternalESSL3)5836*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceCubeTargetExternalESSL3)
5837*8975f5c5SAndroid Build Coastguard Worker {
5838*8975f5c5SAndroid Build Coastguard Worker     SourceCubeTargetExternalESSL3_helper(kDefaultAttribs);
5839*8975f5c5SAndroid Build Coastguard Worker }
5840*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTestES3,SourceCubeTargetExternalESSL3_Colorspace)5841*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceCubeTargetExternalESSL3_Colorspace)
5842*8975f5c5SAndroid Build Coastguard Worker {
5843*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
5844*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5845*8975f5c5SAndroid Build Coastguard Worker     SourceCubeTargetExternalESSL3_helper(kColorspaceAttribs);
5846*8975f5c5SAndroid Build Coastguard Worker }
5847*8975f5c5SAndroid Build Coastguard Worker 
SourceCubeTargetExternalESSL3_helper(const EGLint * attribs)5848*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceCubeTargetExternalESSL3_helper(const EGLint *attribs)
5849*8975f5c5SAndroid Build Coastguard Worker {
5850*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5851*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasExternalESSL3Ext() || !hasBaseExt() || !hasCubemapExt());
5852*8975f5c5SAndroid Build Coastguard Worker 
5853*8975f5c5SAndroid Build Coastguard Worker     for (EGLenum faceIdx = 0; faceIdx < 6; faceIdx++)
5854*8975f5c5SAndroid Build Coastguard Worker     {
5855*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
5856*8975f5c5SAndroid Build Coastguard Worker         GLTexture source;
5857*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image;
5858*8975f5c5SAndroid Build Coastguard Worker         // Upload sRGB color so that it is converted to linear when sampling.
5859*8975f5c5SAndroid Build Coastguard Worker         createEGLImageCubemapTextureSource(
5860*8975f5c5SAndroid Build Coastguard Worker             1, 1, GL_RGBA, GL_UNSIGNED_BYTE, attribs, reinterpret_cast<uint8_t *>(kSrgbColorCube),
5861*8975f5c5SAndroid Build Coastguard Worker             sizeof(GLubyte) * 4, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR + faceIdx, source, &image);
5862*8975f5c5SAndroid Build Coastguard Worker 
5863*8975f5c5SAndroid Build Coastguard Worker         // Create the target
5864*8975f5c5SAndroid Build Coastguard Worker         GLTexture target;
5865*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetTextureExternal(image, target);
5866*8975f5c5SAndroid Build Coastguard Worker 
5867*8975f5c5SAndroid Build Coastguard Worker         // Verify that the target texture has the expected color
5868*8975f5c5SAndroid Build Coastguard Worker         verifyResultsExternalESSL3(target,
5869*8975f5c5SAndroid Build Coastguard Worker                                    &getExpectedCubeColorForAttribList(attribs)[faceIdx * 4]);
5870*8975f5c5SAndroid Build Coastguard Worker 
5871*8975f5c5SAndroid Build Coastguard Worker         // Clean up
5872*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
5873*8975f5c5SAndroid Build Coastguard Worker     }
5874*8975f5c5SAndroid Build Coastguard Worker }
5875*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source3DTargetTexture)5876*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source3DTargetTexture)
5877*8975f5c5SAndroid Build Coastguard Worker {
5878*8975f5c5SAndroid Build Coastguard Worker     Source3DTargetTexture_helper(default3DAttribs);
5879*8975f5c5SAndroid Build Coastguard Worker }
5880*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source3DTargetTexture_Colorspace)5881*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source3DTargetTexture_Colorspace)
5882*8975f5c5SAndroid Build Coastguard Worker {
5883*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
5884*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5885*8975f5c5SAndroid Build Coastguard Worker     Source3DTargetTexture_helper(colorspace3DAttribs);
5886*8975f5c5SAndroid Build Coastguard Worker }
5887*8975f5c5SAndroid Build Coastguard Worker 
Source3DTargetTexture_helper(EGLint * attribs)5888*8975f5c5SAndroid Build Coastguard Worker void ImageTest::Source3DTargetTexture_helper(EGLint *attribs)
5889*8975f5c5SAndroid Build Coastguard Worker {
5890*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5891*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has3DTextureExt());
5892*8975f5c5SAndroid Build Coastguard Worker 
5893*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_OES_texture_3D"));
5894*8975f5c5SAndroid Build Coastguard Worker 
5895*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t depth = 2;
5896*8975f5c5SAndroid Build Coastguard Worker 
5897*8975f5c5SAndroid Build Coastguard Worker     for (size_t layer = 0; layer < depth; layer++)
5898*8975f5c5SAndroid Build Coastguard Worker     {
5899*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
5900*8975f5c5SAndroid Build Coastguard Worker         GLTexture source;
5901*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image;
5902*8975f5c5SAndroid Build Coastguard Worker         // Upload sRGB color so that it is converted to linear when sampling.
5903*8975f5c5SAndroid Build Coastguard Worker         attribs[kTextureZOffsetAttributeIndex] = static_cast<EGLint>(layer);
5904*8975f5c5SAndroid Build Coastguard Worker         createEGLImage3DTextureSource(1, 1, depth, GL_RGBA, GL_UNSIGNED_BYTE, attribs, kSrgbColor3D,
5905*8975f5c5SAndroid Build Coastguard Worker                                       source, &image);
5906*8975f5c5SAndroid Build Coastguard Worker 
5907*8975f5c5SAndroid Build Coastguard Worker         // Create the target
5908*8975f5c5SAndroid Build Coastguard Worker         GLTexture target;
5909*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetTexture2D(image, target);
5910*8975f5c5SAndroid Build Coastguard Worker 
5911*8975f5c5SAndroid Build Coastguard Worker         // Verify that the target texture has the expected color
5912*8975f5c5SAndroid Build Coastguard Worker         verifyResults2D(target, &getExpected3DColorForAttribList(attribs)[layer * 4]);
5913*8975f5c5SAndroid Build Coastguard Worker 
5914*8975f5c5SAndroid Build Coastguard Worker         // Clean up
5915*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
5916*8975f5c5SAndroid Build Coastguard Worker     }
5917*8975f5c5SAndroid Build Coastguard Worker }
5918*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source3DTargetRenderbuffer)5919*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source3DTargetRenderbuffer)
5920*8975f5c5SAndroid Build Coastguard Worker {
5921*8975f5c5SAndroid Build Coastguard Worker     Source3DTargetRenderbuffer_helper(default3DAttribs);
5922*8975f5c5SAndroid Build Coastguard Worker }
5923*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source3DTargetRenderbuffer_Colorspace)5924*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source3DTargetRenderbuffer_Colorspace)
5925*8975f5c5SAndroid Build Coastguard Worker {
5926*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
5927*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5928*8975f5c5SAndroid Build Coastguard Worker     Source3DTargetRenderbuffer_helper(colorspace3DAttribs);
5929*8975f5c5SAndroid Build Coastguard Worker }
5930*8975f5c5SAndroid Build Coastguard Worker 
Source3DTargetRenderbuffer_helper(EGLint * attribs)5931*8975f5c5SAndroid Build Coastguard Worker void ImageTest::Source3DTargetRenderbuffer_helper(EGLint *attribs)
5932*8975f5c5SAndroid Build Coastguard Worker {
5933*8975f5c5SAndroid Build Coastguard Worker     // Qualcom drivers appear to always bind the 0 layer of the source 3D texture when the
5934*8975f5c5SAndroid Build Coastguard Worker     // target is a renderbuffer. They work correctly when the target is a 2D texture.
5935*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261453
5936*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
5937*8975f5c5SAndroid Build Coastguard Worker 
5938*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5939*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has3DTextureExt());
5940*8975f5c5SAndroid Build Coastguard Worker 
5941*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_OES_texture_3D"));
5942*8975f5c5SAndroid Build Coastguard Worker 
5943*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t depth = 2;
5944*8975f5c5SAndroid Build Coastguard Worker 
5945*8975f5c5SAndroid Build Coastguard Worker     for (size_t layer = 0; layer < depth; layer++)
5946*8975f5c5SAndroid Build Coastguard Worker     {
5947*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
5948*8975f5c5SAndroid Build Coastguard Worker         GLTexture source;
5949*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image;
5950*8975f5c5SAndroid Build Coastguard Worker 
5951*8975f5c5SAndroid Build Coastguard Worker         attribs[kTextureZOffsetAttributeIndex] = static_cast<EGLint>(layer);
5952*8975f5c5SAndroid Build Coastguard Worker         createEGLImage3DTextureSource(1, 1, depth, GL_RGBA, GL_UNSIGNED_BYTE, attribs, kSrgbColor3D,
5953*8975f5c5SAndroid Build Coastguard Worker                                       source, &image);
5954*8975f5c5SAndroid Build Coastguard Worker 
5955*8975f5c5SAndroid Build Coastguard Worker         // Create the target
5956*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer target;
5957*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetRenderbuffer(image, target);
5958*8975f5c5SAndroid Build Coastguard Worker 
5959*8975f5c5SAndroid Build Coastguard Worker         // Create a framebuffer with renderbuffer attachment and clear it
5960*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer framebuffer;
5961*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
5962*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, target);
5963*8975f5c5SAndroid Build Coastguard Worker         glClearColor(kLinearColor3D[layer * 4 + 0] / 255.0f, kLinearColor3D[layer * 4 + 1] / 255.0f,
5964*8975f5c5SAndroid Build Coastguard Worker                      kLinearColor3D[layer * 4 + 2] / 255.0f,
5965*8975f5c5SAndroid Build Coastguard Worker                      kLinearColor3D[layer * 4 + 3] / 255.0f);
5966*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
5967*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
5968*8975f5c5SAndroid Build Coastguard Worker 
5969*8975f5c5SAndroid Build Coastguard Worker         // Verify that the render buffer has the expected color
5970*8975f5c5SAndroid Build Coastguard Worker         verifyResultsRenderbuffer(
5971*8975f5c5SAndroid Build Coastguard Worker             target, &getExpected3DColorForAttribList(attribs, EglImageUsage::Rendering)[layer * 4]);
5972*8975f5c5SAndroid Build Coastguard Worker 
5973*8975f5c5SAndroid Build Coastguard Worker         // Clean up
5974*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
5975*8975f5c5SAndroid Build Coastguard Worker     }
5976*8975f5c5SAndroid Build Coastguard Worker }
5977*8975f5c5SAndroid Build Coastguard Worker 
5978*8975f5c5SAndroid Build Coastguard Worker // Test 3D -> external texture EGL images.
TEST_P(ImageTest,Source3DTargetExternal)5979*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source3DTargetExternal)
5980*8975f5c5SAndroid Build Coastguard Worker {
5981*8975f5c5SAndroid Build Coastguard Worker     Source3DTargetExternal_helper(default3DAttribs);
5982*8975f5c5SAndroid Build Coastguard Worker }
5983*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,Source3DTargetExternal_Colorspace)5984*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Source3DTargetExternal_Colorspace)
5985*8975f5c5SAndroid Build Coastguard Worker {
5986*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
5987*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
5988*8975f5c5SAndroid Build Coastguard Worker     Source3DTargetExternal_helper(colorspace3DAttribs);
5989*8975f5c5SAndroid Build Coastguard Worker }
5990*8975f5c5SAndroid Build Coastguard Worker 
Source3DTargetExternal_helper(EGLint * attribs)5991*8975f5c5SAndroid Build Coastguard Worker void ImageTest::Source3DTargetExternal_helper(EGLint *attribs)
5992*8975f5c5SAndroid Build Coastguard Worker {
5993*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
5994*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasExternalExt() || !hasBaseExt() || !has3DTextureExt());
5995*8975f5c5SAndroid Build Coastguard Worker 
5996*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_OES_texture_3D"));
5997*8975f5c5SAndroid Build Coastguard Worker 
5998*8975f5c5SAndroid Build Coastguard Worker     // Ozone only supports external target for images created with EGL_EXT_image_dma_buf_import
5999*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
6000*8975f5c5SAndroid Build Coastguard Worker 
6001*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t depth = 2;
6002*8975f5c5SAndroid Build Coastguard Worker 
6003*8975f5c5SAndroid Build Coastguard Worker     for (size_t layer = 0; layer < depth; layer++)
6004*8975f5c5SAndroid Build Coastguard Worker     {
6005*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
6006*8975f5c5SAndroid Build Coastguard Worker         GLTexture source;
6007*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image;
6008*8975f5c5SAndroid Build Coastguard Worker         // Upload sRGB color so that it is converted to linear when sampling.
6009*8975f5c5SAndroid Build Coastguard Worker         attribs[kTextureZOffsetAttributeIndex] = static_cast<EGLint>(layer);
6010*8975f5c5SAndroid Build Coastguard Worker         createEGLImage3DTextureSource(1, 1, depth, GL_RGBA, GL_UNSIGNED_BYTE, attribs, kSrgbColor3D,
6011*8975f5c5SAndroid Build Coastguard Worker                                       source, &image);
6012*8975f5c5SAndroid Build Coastguard Worker 
6013*8975f5c5SAndroid Build Coastguard Worker         // Create the target
6014*8975f5c5SAndroid Build Coastguard Worker         GLTexture target;
6015*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetTextureExternal(image, target);
6016*8975f5c5SAndroid Build Coastguard Worker 
6017*8975f5c5SAndroid Build Coastguard Worker         // Verify that the target texture has the expected color
6018*8975f5c5SAndroid Build Coastguard Worker         verifyResultsExternal(target, &getExpected3DColorForAttribList(attribs)[layer * 4]);
6019*8975f5c5SAndroid Build Coastguard Worker 
6020*8975f5c5SAndroid Build Coastguard Worker         // Clean up
6021*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
6022*8975f5c5SAndroid Build Coastguard Worker     }
6023*8975f5c5SAndroid Build Coastguard Worker }
6024*8975f5c5SAndroid Build Coastguard Worker 
6025*8975f5c5SAndroid Build Coastguard Worker // Test 3D -> external texture EGL images using ESSL3 shaders.
TEST_P(ImageTestES3,Source3DTargetExternalESSL3)6026*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, Source3DTargetExternalESSL3)
6027*8975f5c5SAndroid Build Coastguard Worker {
6028*8975f5c5SAndroid Build Coastguard Worker     Source3DTargetExternalESSL3_helper(default3DAttribs);
6029*8975f5c5SAndroid Build Coastguard Worker }
6030*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTestES3,Source3DTargetExternalESSL3_Colorspace)6031*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, Source3DTargetExternalESSL3_Colorspace)
6032*8975f5c5SAndroid Build Coastguard Worker {
6033*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
6034*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
6035*8975f5c5SAndroid Build Coastguard Worker     Source3DTargetExternalESSL3_helper(colorspace3DAttribs);
6036*8975f5c5SAndroid Build Coastguard Worker }
6037*8975f5c5SAndroid Build Coastguard Worker 
Source3DTargetExternalESSL3_helper(EGLint * attribs)6038*8975f5c5SAndroid Build Coastguard Worker void ImageTest::Source3DTargetExternalESSL3_helper(EGLint *attribs)
6039*8975f5c5SAndroid Build Coastguard Worker {
6040*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6041*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasExternalESSL3Ext() || !hasBaseExt() ||
6042*8975f5c5SAndroid Build Coastguard Worker                        !has3DTextureExt());
6043*8975f5c5SAndroid Build Coastguard Worker 
6044*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_OES_texture_3D"));
6045*8975f5c5SAndroid Build Coastguard Worker 
6046*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t depth = 2;
6047*8975f5c5SAndroid Build Coastguard Worker 
6048*8975f5c5SAndroid Build Coastguard Worker     for (size_t layer = 0; layer < depth; layer++)
6049*8975f5c5SAndroid Build Coastguard Worker     {
6050*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
6051*8975f5c5SAndroid Build Coastguard Worker         GLTexture source;
6052*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image;
6053*8975f5c5SAndroid Build Coastguard Worker         // Upload sRGB color so that it is converted to linear when sampling.
6054*8975f5c5SAndroid Build Coastguard Worker         attribs[kTextureZOffsetAttributeIndex] = static_cast<EGLint>(layer);
6055*8975f5c5SAndroid Build Coastguard Worker         createEGLImage3DTextureSource(1, 1, depth, GL_RGBA, GL_UNSIGNED_BYTE, attribs, kSrgbColor3D,
6056*8975f5c5SAndroid Build Coastguard Worker                                       source, &image);
6057*8975f5c5SAndroid Build Coastguard Worker 
6058*8975f5c5SAndroid Build Coastguard Worker         // Create the target
6059*8975f5c5SAndroid Build Coastguard Worker         GLTexture target;
6060*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetTextureExternal(image, target);
6061*8975f5c5SAndroid Build Coastguard Worker 
6062*8975f5c5SAndroid Build Coastguard Worker         // Verify that the target texture has the expected color
6063*8975f5c5SAndroid Build Coastguard Worker         verifyResultsExternalESSL3(target, &getExpected3DColorForAttribList(attribs)[layer * 4]);
6064*8975f5c5SAndroid Build Coastguard Worker 
6065*8975f5c5SAndroid Build Coastguard Worker         // Clean up
6066*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
6067*8975f5c5SAndroid Build Coastguard Worker     }
6068*8975f5c5SAndroid Build Coastguard Worker }
6069*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,SourceRenderbufferTargetTexture)6070*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceRenderbufferTargetTexture)
6071*8975f5c5SAndroid Build Coastguard Worker {
6072*8975f5c5SAndroid Build Coastguard Worker     SourceRenderbufferTargetTexture_helper(kDefaultAttribs);
6073*8975f5c5SAndroid Build Coastguard Worker }
6074*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,SourceRenderbufferTargetTexture_Colorspace)6075*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceRenderbufferTargetTexture_Colorspace)
6076*8975f5c5SAndroid Build Coastguard Worker {
6077*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
6078*8975f5c5SAndroid Build Coastguard Worker     SourceRenderbufferTargetTexture_helper(kColorspaceAttribs);
6079*8975f5c5SAndroid Build Coastguard Worker }
6080*8975f5c5SAndroid Build Coastguard Worker 
SourceRenderbufferTargetTexture_helper(const EGLint * attribs)6081*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceRenderbufferTargetTexture_helper(const EGLint *attribs)
6082*8975f5c5SAndroid Build Coastguard Worker {
6083*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6084*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !hasRenderbufferExt());
6085*8975f5c5SAndroid Build Coastguard Worker 
6086*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6087*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer source;
6088*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6089*8975f5c5SAndroid Build Coastguard Worker     createEGLImageRenderbufferSource(1, 1, GL_RGBA8_OES, attribs, source, &image);
6090*8975f5c5SAndroid Build Coastguard Worker 
6091*8975f5c5SAndroid Build Coastguard Worker     // Create a framebuffer with renderbuffer attachment and clear it
6092*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
6093*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
6094*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, source);
6095*8975f5c5SAndroid Build Coastguard Worker     glClearColor(kSrgbColor[0] / 255.0f, kSrgbColor[1] / 255.0f, kSrgbColor[2] / 255.0f,
6096*8975f5c5SAndroid Build Coastguard Worker                  kSrgbColor[3] / 255.0f);
6097*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6098*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6099*8975f5c5SAndroid Build Coastguard Worker 
6100*8975f5c5SAndroid Build Coastguard Worker     // Create the target
6101*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
6102*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
6103*8975f5c5SAndroid Build Coastguard Worker 
6104*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
6105*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, getExpected2DColorForAttribList(attribs));
6106*8975f5c5SAndroid Build Coastguard Worker 
6107*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6108*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6109*8975f5c5SAndroid Build Coastguard Worker }
6110*8975f5c5SAndroid Build Coastguard Worker 
6111*8975f5c5SAndroid Build Coastguard Worker // Test renderbuffer -> external texture EGL images.
TEST_P(ImageTest,SourceRenderbufferTargetTextureExternal)6112*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceRenderbufferTargetTextureExternal)
6113*8975f5c5SAndroid Build Coastguard Worker {
6114*8975f5c5SAndroid Build Coastguard Worker     SourceRenderbufferTargetTextureExternal_helper(kDefaultAttribs);
6115*8975f5c5SAndroid Build Coastguard Worker }
6116*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,SourceRenderbufferTargetTextureExternal_Colorspace)6117*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceRenderbufferTargetTextureExternal_Colorspace)
6118*8975f5c5SAndroid Build Coastguard Worker {
6119*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
6120*8975f5c5SAndroid Build Coastguard Worker     SourceRenderbufferTargetTextureExternal_helper(kColorspaceAttribs);
6121*8975f5c5SAndroid Build Coastguard Worker }
6122*8975f5c5SAndroid Build Coastguard Worker 
SourceRenderbufferTargetTextureExternal_helper(const EGLint * attribs)6123*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceRenderbufferTargetTextureExternal_helper(const EGLint *attribs)
6124*8975f5c5SAndroid Build Coastguard Worker {
6125*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6126*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasExternalExt() || !hasBaseExt() || !hasRenderbufferExt());
6127*8975f5c5SAndroid Build Coastguard Worker 
6128*8975f5c5SAndroid Build Coastguard Worker     // Ozone only supports external target for images created with EGL_EXT_image_dma_buf_import
6129*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone());
6130*8975f5c5SAndroid Build Coastguard Worker 
6131*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6132*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer source;
6133*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6134*8975f5c5SAndroid Build Coastguard Worker     createEGLImageRenderbufferSource(1, 1, GL_RGBA8_OES, attribs, source, &image);
6135*8975f5c5SAndroid Build Coastguard Worker 
6136*8975f5c5SAndroid Build Coastguard Worker     // Create a framebuffer with renderbuffer attachment and clear it
6137*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
6138*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
6139*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, source);
6140*8975f5c5SAndroid Build Coastguard Worker     glClearColor(kSrgbColor[0] / 255.0f, kSrgbColor[1] / 255.0f, kSrgbColor[2] / 255.0f,
6141*8975f5c5SAndroid Build Coastguard Worker                  kSrgbColor[3] / 255.0f);
6142*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6143*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6144*8975f5c5SAndroid Build Coastguard Worker 
6145*8975f5c5SAndroid Build Coastguard Worker     // Create the target
6146*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
6147*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
6148*8975f5c5SAndroid Build Coastguard Worker 
6149*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
6150*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternal(target, getExpected2DColorForAttribList(attribs));
6151*8975f5c5SAndroid Build Coastguard Worker 
6152*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6153*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6154*8975f5c5SAndroid Build Coastguard Worker }
6155*8975f5c5SAndroid Build Coastguard Worker 
6156*8975f5c5SAndroid Build Coastguard Worker // Test renderbuffer -> external texture EGL images using ESSL3 shaders.
TEST_P(ImageTestES3,SourceRenderbufferTargetTextureExternalESSL3)6157*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceRenderbufferTargetTextureExternalESSL3)
6158*8975f5c5SAndroid Build Coastguard Worker {
6159*8975f5c5SAndroid Build Coastguard Worker     SourceRenderbufferTargetTextureExternalESSL3_helper(kDefaultAttribs);
6160*8975f5c5SAndroid Build Coastguard Worker }
6161*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTestES3,SourceRenderbufferTargetTextureExternalESSL3_Colorspace)6162*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, SourceRenderbufferTargetTextureExternalESSL3_Colorspace)
6163*8975f5c5SAndroid Build Coastguard Worker {
6164*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
6165*8975f5c5SAndroid Build Coastguard Worker     SourceRenderbufferTargetTextureExternalESSL3_helper(kColorspaceAttribs);
6166*8975f5c5SAndroid Build Coastguard Worker }
6167*8975f5c5SAndroid Build Coastguard Worker 
SourceRenderbufferTargetTextureExternalESSL3_helper(const EGLint * attribs)6168*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceRenderbufferTargetTextureExternalESSL3_helper(const EGLint *attribs)
6169*8975f5c5SAndroid Build Coastguard Worker {
6170*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6171*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasExternalESSL3Ext() || !hasBaseExt() ||
6172*8975f5c5SAndroid Build Coastguard Worker                        !hasRenderbufferExt());
6173*8975f5c5SAndroid Build Coastguard Worker 
6174*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6175*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer source;
6176*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6177*8975f5c5SAndroid Build Coastguard Worker     createEGLImageRenderbufferSource(1, 1, GL_RGBA8_OES, attribs, source, &image);
6178*8975f5c5SAndroid Build Coastguard Worker 
6179*8975f5c5SAndroid Build Coastguard Worker     // Create a framebuffer with renderbuffer attachment and clear it
6180*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
6181*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
6182*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, source);
6183*8975f5c5SAndroid Build Coastguard Worker     glClearColor(kSrgbColor[0] / 255.0f, kSrgbColor[1] / 255.0f, kSrgbColor[2] / 255.0f,
6184*8975f5c5SAndroid Build Coastguard Worker                  kSrgbColor[3] / 255.0f);
6185*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6186*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6187*8975f5c5SAndroid Build Coastguard Worker 
6188*8975f5c5SAndroid Build Coastguard Worker     // Create the target
6189*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
6190*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
6191*8975f5c5SAndroid Build Coastguard Worker 
6192*8975f5c5SAndroid Build Coastguard Worker     // Verify that the target texture has the expected color
6193*8975f5c5SAndroid Build Coastguard Worker     verifyResultsExternalESSL3(target, getExpected2DColorForAttribList(attribs));
6194*8975f5c5SAndroid Build Coastguard Worker 
6195*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6196*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6197*8975f5c5SAndroid Build Coastguard Worker }
6198*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,SourceRenderbufferTargetRenderbuffer)6199*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceRenderbufferTargetRenderbuffer)
6200*8975f5c5SAndroid Build Coastguard Worker {
6201*8975f5c5SAndroid Build Coastguard Worker     SourceRenderbufferTargetRenderbuffer_helper(kDefaultAttribs);
6202*8975f5c5SAndroid Build Coastguard Worker }
6203*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,SourceRenderbufferTargetRenderbuffer_Colorspace)6204*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceRenderbufferTargetRenderbuffer_Colorspace)
6205*8975f5c5SAndroid Build Coastguard Worker {
6206*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_EXT_sRGB"));
6207*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
6208*8975f5c5SAndroid Build Coastguard Worker     SourceRenderbufferTargetRenderbuffer_helper(kColorspaceAttribs);
6209*8975f5c5SAndroid Build Coastguard Worker }
6210*8975f5c5SAndroid Build Coastguard Worker 
SourceRenderbufferTargetRenderbuffer_helper(const EGLint * attribs)6211*8975f5c5SAndroid Build Coastguard Worker void ImageTest::SourceRenderbufferTargetRenderbuffer_helper(const EGLint *attribs)
6212*8975f5c5SAndroid Build Coastguard Worker {
6213*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6214*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !hasRenderbufferExt());
6215*8975f5c5SAndroid Build Coastguard Worker 
6216*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6217*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer source;
6218*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6219*8975f5c5SAndroid Build Coastguard Worker     createEGLImageRenderbufferSource(1, 1, GL_RGBA8_OES, attribs, source, &image);
6220*8975f5c5SAndroid Build Coastguard Worker 
6221*8975f5c5SAndroid Build Coastguard Worker     // Create the target
6222*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer target;
6223*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetRenderbuffer(image, target);
6224*8975f5c5SAndroid Build Coastguard Worker 
6225*8975f5c5SAndroid Build Coastguard Worker     // Create a framebuffer with renderbuffer attachment and clear it
6226*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
6227*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
6228*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, target);
6229*8975f5c5SAndroid Build Coastguard Worker     glClearColor(kLinearColor[0] / 255.0f, kLinearColor[1] / 255.0f, kLinearColor[2] / 255.0f,
6230*8975f5c5SAndroid Build Coastguard Worker                  kLinearColor[3] / 255.0f);
6231*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
6232*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6233*8975f5c5SAndroid Build Coastguard Worker 
6234*8975f5c5SAndroid Build Coastguard Worker     // Verify that the render buffer has the expected color
6235*8975f5c5SAndroid Build Coastguard Worker     verifyResultsRenderbuffer(target,
6236*8975f5c5SAndroid Build Coastguard Worker                               getExpected2DColorForAttribList(attribs, EglImageUsage::Rendering));
6237*8975f5c5SAndroid Build Coastguard Worker 
6238*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6239*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6240*8975f5c5SAndroid Build Coastguard Worker }
6241*8975f5c5SAndroid Build Coastguard Worker 
FixedRatedCompressionBasicHelper(const GLint * attribs)6242*8975f5c5SAndroid Build Coastguard Worker void ImageTest::FixedRatedCompressionBasicHelper(const GLint *attribs)
6243*8975f5c5SAndroid Build Coastguard Worker {
6244*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t width  = 16;
6245*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t height = 16;
6246*8975f5c5SAndroid Build Coastguard Worker     GLTexture textureSource;
6247*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6248*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6249*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureStorage(width, height, GL_RGBA8, attribs, textureSource, &image);
6250*8975f5c5SAndroid Build Coastguard Worker 
6251*8975f5c5SAndroid Build Coastguard Worker     GLTexture textureAttachment;
6252*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureStorage(image, GL_TEXTURE_2D, textureAttachment, attribs);
6253*8975f5c5SAndroid Build Coastguard Worker 
6254*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6255*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6256*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6257*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureAttachment,
6258*8975f5c5SAndroid Build Coastguard Worker                            0);
6259*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6260*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
6261*8975f5c5SAndroid Build Coastguard Worker 
6262*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
6263*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0);
6264*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, width, height, GLColor::red);
6265*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6266*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6267*8975f5c5SAndroid Build Coastguard Worker }
6268*8975f5c5SAndroid Build Coastguard Worker 
6269*8975f5c5SAndroid Build Coastguard Worker // Test basic usage of extension GL_EXT_EGL_image_storage_compression
TEST_P(ImageTest,FixedRatedCompressionBasic)6270*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, FixedRatedCompressionBasic)
6271*8975f5c5SAndroid Build Coastguard Worker {
6272*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasEglImageStorageExt() || !hasEglImageStorageCompressionExt());
6273*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasTextureStorageCompressionExt());
6274*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint kAttribList[3][3] = {
6275*8975f5c5SAndroid Build Coastguard Worker         {GL_NONE, GL_NONE, GL_NONE},
6276*8975f5c5SAndroid Build Coastguard Worker         {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT, GL_NONE},
6277*8975f5c5SAndroid Build Coastguard Worker         {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT, GL_NONE},
6278*8975f5c5SAndroid Build Coastguard Worker     };
6279*8975f5c5SAndroid Build Coastguard Worker     for (const GLint *attribs : kAttribList)
6280*8975f5c5SAndroid Build Coastguard Worker     {
6281*8975f5c5SAndroid Build Coastguard Worker         FixedRatedCompressionBasicHelper(attribs);
6282*8975f5c5SAndroid Build Coastguard Worker     }
6283*8975f5c5SAndroid Build Coastguard Worker }
6284*8975f5c5SAndroid Build Coastguard Worker 
FixedRatedCompressionImageAttribCheck(EGLImageKHR image,const GLint * attribs,const GLint expectResult)6285*8975f5c5SAndroid Build Coastguard Worker void ImageTest::FixedRatedCompressionImageAttribCheck(EGLImageKHR image,
6286*8975f5c5SAndroid Build Coastguard Worker                                                       const GLint *attribs,
6287*8975f5c5SAndroid Build Coastguard Worker                                                       const GLint expectResult)
6288*8975f5c5SAndroid Build Coastguard Worker {
6289*8975f5c5SAndroid Build Coastguard Worker     GLTexture textureAttachment;
6290*8975f5c5SAndroid Build Coastguard Worker     // Create a target texture from the image
6291*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, textureAttachment);
6292*8975f5c5SAndroid Build Coastguard Worker     glEGLImageTargetTexStorageEXT(GL_TEXTURE_2D, image, attribs);
6293*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(expectResult);
6294*8975f5c5SAndroid Build Coastguard Worker }
6295*8975f5c5SAndroid Build Coastguard Worker 
6296*8975f5c5SAndroid Build Coastguard Worker // Test whether the result is expected when the attributes mismatched with source
TEST_P(ImageTest,FixedRatedCompressionMixedAttrib)6297*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, FixedRatedCompressionMixedAttrib)
6298*8975f5c5SAndroid Build Coastguard Worker {
6299*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasEglImageStorageExt() || !hasEglImageStorageCompressionExt());
6300*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasTextureStorageCompressionExt());
6301*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t width                 = 16;
6302*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t height                = 16;
6303*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window                      = getEGLWindow();
6304*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint textureAttribList[][3] = {
6305*8975f5c5SAndroid Build Coastguard Worker         {GL_NONE, GL_NONE, GL_NONE},
6306*8975f5c5SAndroid Build Coastguard Worker         {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT, GL_NONE},
6307*8975f5c5SAndroid Build Coastguard Worker         {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT, GL_NONE},
6308*8975f5c5SAndroid Build Coastguard Worker     };
6309*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint imageAttribList[][3] = {
6310*8975f5c5SAndroid Build Coastguard Worker         {GL_NONE, GL_NONE, GL_NONE},
6311*8975f5c5SAndroid Build Coastguard Worker         {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT, GL_NONE},
6312*8975f5c5SAndroid Build Coastguard Worker     };
6313*8975f5c5SAndroid Build Coastguard Worker 
6314*8975f5c5SAndroid Build Coastguard Worker     constexpr GLint invalidImageAttribList[][3] = {
6315*8975f5c5SAndroid Build Coastguard Worker         {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_EXT, GL_NONE},
6316*8975f5c5SAndroid Build Coastguard Worker         {GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT, GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT,
6317*8975f5c5SAndroid Build Coastguard Worker          GL_NONE},
6318*8975f5c5SAndroid Build Coastguard Worker     };
6319*8975f5c5SAndroid Build Coastguard Worker 
6320*8975f5c5SAndroid Build Coastguard Worker     for (const GLint *textureAttribs : textureAttribList)
6321*8975f5c5SAndroid Build Coastguard Worker     {
6322*8975f5c5SAndroid Build Coastguard Worker         GLTexture textureSource;
6323*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image;
6324*8975f5c5SAndroid Build Coastguard Worker         bool isFixRatedCompressed;
6325*8975f5c5SAndroid Build Coastguard Worker         createEGLImage2DTextureStorage(width, height, GL_RGBA8, textureAttribs, textureSource,
6326*8975f5c5SAndroid Build Coastguard Worker                                        &image);
6327*8975f5c5SAndroid Build Coastguard Worker         /* Query compression rate */
6328*8975f5c5SAndroid Build Coastguard Worker         GLint compressRate = GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT;
6329*8975f5c5SAndroid Build Coastguard Worker         glGetTexParameteriv(GL_TEXTURE_2D, GL_SURFACE_COMPRESSION_EXT, &compressRate);
6330*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
6331*8975f5c5SAndroid Build Coastguard Worker         isFixRatedCompressed = (compressRate == GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT ||
6332*8975f5c5SAndroid Build Coastguard Worker                                 (compressRate >= GL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT &&
6333*8975f5c5SAndroid Build Coastguard Worker                                  compressRate <= GL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT));
6334*8975f5c5SAndroid Build Coastguard Worker 
6335*8975f5c5SAndroid Build Coastguard Worker         for (const GLint *attribs : imageAttribList)
6336*8975f5c5SAndroid Build Coastguard Worker         {
6337*8975f5c5SAndroid Build Coastguard Worker             if (isFixRatedCompressed && attribs[0] == GL_SURFACE_COMPRESSION_EXT &&
6338*8975f5c5SAndroid Build Coastguard Worker                 attribs[1] == GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT)
6339*8975f5c5SAndroid Build Coastguard Worker             {
6340*8975f5c5SAndroid Build Coastguard Worker                 FixedRatedCompressionImageAttribCheck(image, attribs, GL_INVALID_OPERATION);
6341*8975f5c5SAndroid Build Coastguard Worker             }
6342*8975f5c5SAndroid Build Coastguard Worker             else
6343*8975f5c5SAndroid Build Coastguard Worker             {
6344*8975f5c5SAndroid Build Coastguard Worker                 FixedRatedCompressionImageAttribCheck(image, attribs, GL_NO_ERROR);
6345*8975f5c5SAndroid Build Coastguard Worker             }
6346*8975f5c5SAndroid Build Coastguard Worker         }
6347*8975f5c5SAndroid Build Coastguard Worker 
6348*8975f5c5SAndroid Build Coastguard Worker         for (const GLint *attribs : invalidImageAttribList)
6349*8975f5c5SAndroid Build Coastguard Worker         {
6350*8975f5c5SAndroid Build Coastguard Worker             FixedRatedCompressionImageAttribCheck(image, attribs, GL_INVALID_VALUE);
6351*8975f5c5SAndroid Build Coastguard Worker         }
6352*8975f5c5SAndroid Build Coastguard Worker 
6353*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
6354*8975f5c5SAndroid Build Coastguard Worker     }
6355*8975f5c5SAndroid Build Coastguard Worker }
6356*8975f5c5SAndroid Build Coastguard Worker 
6357*8975f5c5SAndroid Build Coastguard Worker // Delete the source texture and EGL image.  The image targets should still have the same data
6358*8975f5c5SAndroid Build Coastguard Worker // because
6359*8975f5c5SAndroid Build Coastguard Worker // they hold refs to the image.
TEST_P(ImageTest,Deletion)6360*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Deletion)
6361*8975f5c5SAndroid Build Coastguard Worker {
6362*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6363*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6364*8975f5c5SAndroid Build Coastguard Worker 
6365*8975f5c5SAndroid Build Coastguard Worker     GLubyte originalData[4] = {255, 0, 255, 255};
6366*8975f5c5SAndroid Build Coastguard Worker     GLubyte updateData[4]   = {0, 255, 0, 255};
6367*8975f5c5SAndroid Build Coastguard Worker 
6368*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6369*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
6370*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6371*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs, originalData,
6372*8975f5c5SAndroid Build Coastguard Worker                                   source, &image);
6373*8975f5c5SAndroid Build Coastguard Worker 
6374*8975f5c5SAndroid Build Coastguard Worker     // Create multiple targets
6375*8975f5c5SAndroid Build Coastguard Worker     GLTexture targetTexture;
6376*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, targetTexture);
6377*8975f5c5SAndroid Build Coastguard Worker 
6378*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer targetRenderbuffer;
6379*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetRenderbuffer(image, targetRenderbuffer);
6380*8975f5c5SAndroid Build Coastguard Worker 
6381*8975f5c5SAndroid Build Coastguard Worker     // Delete the source texture
6382*8975f5c5SAndroid Build Coastguard Worker     source.reset();
6383*8975f5c5SAndroid Build Coastguard Worker 
6384*8975f5c5SAndroid Build Coastguard Worker     // Expect that both the targets have the original data
6385*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(targetTexture, originalData);
6386*8975f5c5SAndroid Build Coastguard Worker     verifyResultsRenderbuffer(targetRenderbuffer, originalData);
6387*8975f5c5SAndroid Build Coastguard Worker 
6388*8975f5c5SAndroid Build Coastguard Worker     // Update the data of the target
6389*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, targetTexture);
6390*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, updateData);
6391*8975f5c5SAndroid Build Coastguard Worker 
6392*8975f5c5SAndroid Build Coastguard Worker     // Expect that both targets have the updated data
6393*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(targetTexture, updateData);
6394*8975f5c5SAndroid Build Coastguard Worker     verifyResultsRenderbuffer(targetRenderbuffer, updateData);
6395*8975f5c5SAndroid Build Coastguard Worker 
6396*8975f5c5SAndroid Build Coastguard Worker     // Delete the EGL image
6397*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6398*8975f5c5SAndroid Build Coastguard Worker     image = EGL_NO_IMAGE_KHR;
6399*8975f5c5SAndroid Build Coastguard Worker 
6400*8975f5c5SAndroid Build Coastguard Worker     // Update the data of the target back to the original data
6401*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, targetTexture);
6402*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, originalData);
6403*8975f5c5SAndroid Build Coastguard Worker 
6404*8975f5c5SAndroid Build Coastguard Worker     // Expect that both targets have the original data again
6405*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(targetTexture, originalData);
6406*8975f5c5SAndroid Build Coastguard Worker     verifyResultsRenderbuffer(targetRenderbuffer, originalData);
6407*8975f5c5SAndroid Build Coastguard Worker }
6408*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(ImageTest,MipLevels)6409*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, MipLevels)
6410*8975f5c5SAndroid Build Coastguard Worker {
6411*8975f5c5SAndroid Build Coastguard Worker     // Driver returns OOM in read pixels, some internal error.
6412*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone() && IsOpenGLES());
6413*8975f5c5SAndroid Build Coastguard Worker     // Also fails on NVIDIA Shield TV bot.
6414*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42262494
6415*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsNVIDIAShield() && IsOpenGLES());
6416*8975f5c5SAndroid Build Coastguard Worker     // On Vulkan, the clear operation in the loop is optimized with a render pass loadOp=Clear.  On
6417*8975f5c5SAndroid Build Coastguard Worker     // Linux/Intel, that operation is mistakenly clearing the rest of the mips to 0.
6418*8975f5c5SAndroid Build Coastguard Worker     // http://anglebug.com/42261962
6419*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan() && IsLinux() && IsIntel());
6420*8975f5c5SAndroid Build Coastguard Worker 
6421*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6422*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6423*8975f5c5SAndroid Build Coastguard Worker 
6424*8975f5c5SAndroid Build Coastguard Worker     const size_t mipLevels   = 3;
6425*8975f5c5SAndroid Build Coastguard Worker     const size_t textureSize = 4;
6426*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> mip0Data(textureSize * textureSize, GLColor::red);
6427*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> mip1Data(mip0Data.size() << 1, GLColor::green);
6428*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> mip2Data(mip0Data.size() << 2, GLColor::blue);
6429*8975f5c5SAndroid Build Coastguard Worker     GLubyte *data[mipLevels] = {
6430*8975f5c5SAndroid Build Coastguard Worker         reinterpret_cast<GLubyte *>(&mip0Data[0]),
6431*8975f5c5SAndroid Build Coastguard Worker         reinterpret_cast<GLubyte *>(&mip1Data[0]),
6432*8975f5c5SAndroid Build Coastguard Worker         reinterpret_cast<GLubyte *>(&mip2Data[0]),
6433*8975f5c5SAndroid Build Coastguard Worker     };
6434*8975f5c5SAndroid Build Coastguard Worker 
6435*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
6436*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, source);
6437*8975f5c5SAndroid Build Coastguard Worker 
6438*8975f5c5SAndroid Build Coastguard Worker     for (size_t level = 0; level < mipLevels; level++)
6439*8975f5c5SAndroid Build Coastguard Worker     {
6440*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, static_cast<GLint>(level), GL_RGBA, textureSize >> level,
6441*8975f5c5SAndroid Build Coastguard Worker                      textureSize >> level, 0, GL_RGBA, GL_UNSIGNED_BYTE, data[level]);
6442*8975f5c5SAndroid Build Coastguard Worker     }
6443*8975f5c5SAndroid Build Coastguard Worker 
6444*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6445*8975f5c5SAndroid Build Coastguard Worker 
6446*8975f5c5SAndroid Build Coastguard Worker     for (size_t level = 0; level < mipLevels; level++)
6447*8975f5c5SAndroid Build Coastguard Worker     {
6448*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
6449*8975f5c5SAndroid Build Coastguard Worker         EGLint attribs[] = {
6450*8975f5c5SAndroid Build Coastguard Worker             EGL_GL_TEXTURE_LEVEL_KHR,
6451*8975f5c5SAndroid Build Coastguard Worker             static_cast<EGLint>(level),
6452*8975f5c5SAndroid Build Coastguard Worker             EGL_NONE,
6453*8975f5c5SAndroid Build Coastguard Worker         };
6454*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image =
6455*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
6456*8975f5c5SAndroid Build Coastguard Worker                               reinterpretHelper<EGLClientBuffer>(source), attribs);
6457*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
6458*8975f5c5SAndroid Build Coastguard Worker 
6459*8975f5c5SAndroid Build Coastguard Worker         // Create a texture and renderbuffer target
6460*8975f5c5SAndroid Build Coastguard Worker         GLTexture textureTarget;
6461*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetTexture2D(image, textureTarget);
6462*8975f5c5SAndroid Build Coastguard Worker 
6463*8975f5c5SAndroid Build Coastguard Worker         // Disable mipmapping
6464*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textureTarget);
6465*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6466*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6467*8975f5c5SAndroid Build Coastguard Worker 
6468*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer renderbufferTarget;
6469*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetRenderbuffer(image, renderbufferTarget);
6470*8975f5c5SAndroid Build Coastguard Worker 
6471*8975f5c5SAndroid Build Coastguard Worker         // Expect that the targets have the same color as the source texture
6472*8975f5c5SAndroid Build Coastguard Worker         verifyResults2D(textureTarget, data[level]);
6473*8975f5c5SAndroid Build Coastguard Worker         verifyResultsRenderbuffer(renderbufferTarget, data[level]);
6474*8975f5c5SAndroid Build Coastguard Worker 
6475*8975f5c5SAndroid Build Coastguard Worker         // Update the data by uploading data to the texture
6476*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLuint> textureUpdateData(textureSize * textureSize, level);
6477*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textureTarget);
6478*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, textureSize >> level, textureSize >> level, GL_RGBA,
6479*8975f5c5SAndroid Build Coastguard Worker                         GL_UNSIGNED_BYTE, textureUpdateData.data());
6480*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
6481*8975f5c5SAndroid Build Coastguard Worker 
6482*8975f5c5SAndroid Build Coastguard Worker         // Expect that both the texture and renderbuffer see the updated texture data
6483*8975f5c5SAndroid Build Coastguard Worker         verifyResults2D(textureTarget, reinterpret_cast<GLubyte *>(textureUpdateData.data()));
6484*8975f5c5SAndroid Build Coastguard Worker         verifyResultsRenderbuffer(renderbufferTarget,
6485*8975f5c5SAndroid Build Coastguard Worker                                   reinterpret_cast<GLubyte *>(textureUpdateData.data()));
6486*8975f5c5SAndroid Build Coastguard Worker 
6487*8975f5c5SAndroid Build Coastguard Worker         // Update the renderbuffer by clearing it
6488*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
6489*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6490*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
6491*8975f5c5SAndroid Build Coastguard Worker                                   renderbufferTarget);
6492*8975f5c5SAndroid Build Coastguard Worker 
6493*8975f5c5SAndroid Build Coastguard Worker         GLubyte clearValue = static_cast<GLubyte>(level);
6494*8975f5c5SAndroid Build Coastguard Worker         GLubyte renderbufferClearData[4]{clearValue, clearValue, clearValue, clearValue};
6495*8975f5c5SAndroid Build Coastguard Worker         glClearColor(renderbufferClearData[0] / 255.0f, renderbufferClearData[1] / 255.0f,
6496*8975f5c5SAndroid Build Coastguard Worker                      renderbufferClearData[2] / 255.0f, renderbufferClearData[3] / 255.0f);
6497*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
6498*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
6499*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
6500*8975f5c5SAndroid Build Coastguard Worker 
6501*8975f5c5SAndroid Build Coastguard Worker         // Expect that both the texture and renderbuffer see the cleared renderbuffer data
6502*8975f5c5SAndroid Build Coastguard Worker         verifyResults2D(textureTarget, renderbufferClearData);
6503*8975f5c5SAndroid Build Coastguard Worker         verifyResultsRenderbuffer(renderbufferTarget, renderbufferClearData);
6504*8975f5c5SAndroid Build Coastguard Worker 
6505*8975f5c5SAndroid Build Coastguard Worker         // Clean up
6506*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
6507*8975f5c5SAndroid Build Coastguard Worker     }
6508*8975f5c5SAndroid Build Coastguard Worker }
6509*8975f5c5SAndroid Build Coastguard Worker 
6510*8975f5c5SAndroid Build Coastguard Worker // Respecify the source texture, orphaning it.  The target texture should not have updated data.
TEST_P(ImageTest,Respecification)6511*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, Respecification)
6512*8975f5c5SAndroid Build Coastguard Worker {
6513*8975f5c5SAndroid Build Coastguard Worker     // Respecification of textures that does not change the size of the level attached to the EGL
6514*8975f5c5SAndroid Build Coastguard Worker     // image does not cause orphaning on Qualcomm devices. http://anglebug.com/42261452
6515*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
6516*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsOzone() && IsOpenGLES());
6517*8975f5c5SAndroid Build Coastguard Worker 
6518*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6519*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6520*8975f5c5SAndroid Build Coastguard Worker 
6521*8975f5c5SAndroid Build Coastguard Worker     GLubyte originalData[4] = {255, 0, 255, 255};
6522*8975f5c5SAndroid Build Coastguard Worker     GLubyte updateData[4]   = {0, 255, 0, 255};
6523*8975f5c5SAndroid Build Coastguard Worker 
6524*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6525*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
6526*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6527*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs, originalData,
6528*8975f5c5SAndroid Build Coastguard Worker                                   source, &image);
6529*8975f5c5SAndroid Build Coastguard Worker 
6530*8975f5c5SAndroid Build Coastguard Worker     // Create the target
6531*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
6532*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
6533*8975f5c5SAndroid Build Coastguard Worker 
6534*8975f5c5SAndroid Build Coastguard Worker     // Respecify source
6535*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, source);
6536*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, updateData);
6537*8975f5c5SAndroid Build Coastguard Worker 
6538*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the original data
6539*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, originalData);
6540*8975f5c5SAndroid Build Coastguard Worker 
6541*8975f5c5SAndroid Build Coastguard Worker     // Expect that the source texture has the updated data
6542*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(source, updateData);
6543*8975f5c5SAndroid Build Coastguard Worker 
6544*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6545*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6546*8975f5c5SAndroid Build Coastguard Worker }
6547*8975f5c5SAndroid Build Coastguard Worker 
6548*8975f5c5SAndroid Build Coastguard Worker // Respecify the source texture with a different size, orphaning it.  The target texture should not
6549*8975f5c5SAndroid Build Coastguard Worker // have updated data.
TEST_P(ImageTest,RespecificationDifferentSize)6550*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, RespecificationDifferentSize)
6551*8975f5c5SAndroid Build Coastguard Worker {
6552*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6553*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6554*8975f5c5SAndroid Build Coastguard Worker 
6555*8975f5c5SAndroid Build Coastguard Worker     GLubyte originalData[4] = {255, 0, 255, 255};
6556*8975f5c5SAndroid Build Coastguard Worker     GLubyte updateData[16]  = {0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255};
6557*8975f5c5SAndroid Build Coastguard Worker 
6558*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6559*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
6560*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6561*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs, originalData,
6562*8975f5c5SAndroid Build Coastguard Worker                                   source, &image);
6563*8975f5c5SAndroid Build Coastguard Worker 
6564*8975f5c5SAndroid Build Coastguard Worker     // Create the target
6565*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
6566*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
6567*8975f5c5SAndroid Build Coastguard Worker 
6568*8975f5c5SAndroid Build Coastguard Worker     // Respecify source
6569*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, source);
6570*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, updateData);
6571*8975f5c5SAndroid Build Coastguard Worker 
6572*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target texture has the original data
6573*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, originalData);
6574*8975f5c5SAndroid Build Coastguard Worker 
6575*8975f5c5SAndroid Build Coastguard Worker     // Expect that the source texture has the updated data
6576*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(source, updateData);
6577*8975f5c5SAndroid Build Coastguard Worker 
6578*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6579*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6580*8975f5c5SAndroid Build Coastguard Worker }
6581*8975f5c5SAndroid Build Coastguard Worker 
6582*8975f5c5SAndroid Build Coastguard Worker // First render to a target texture, then respecify the source texture, orphaning it.
6583*8975f5c5SAndroid Build Coastguard Worker // The target texture's FBO should be notified of the target texture's orphaning.
TEST_P(ImageTest,RespecificationWithFBO)6584*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, RespecificationWithFBO)
6585*8975f5c5SAndroid Build Coastguard Worker {
6586*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6587*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6588*8975f5c5SAndroid Build Coastguard Worker 
6589*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
6590*8975f5c5SAndroid Build Coastguard Worker 
6591*8975f5c5SAndroid Build Coastguard Worker     GLubyte originalData[4] = {255, 0, 255, 255};
6592*8975f5c5SAndroid Build Coastguard Worker     GLubyte updateData[4]   = {0, 255, 0, 255};
6593*8975f5c5SAndroid Build Coastguard Worker 
6594*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6595*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
6596*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6597*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs, originalData,
6598*8975f5c5SAndroid Build Coastguard Worker                                   source, &image);
6599*8975f5c5SAndroid Build Coastguard Worker 
6600*8975f5c5SAndroid Build Coastguard Worker     // Create the target
6601*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
6602*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
6603*8975f5c5SAndroid Build Coastguard Worker 
6604*8975f5c5SAndroid Build Coastguard Worker     // Render to the target texture
6605*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
6606*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
6607*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, target, 0);
6608*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
6609*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
6610*8975f5c5SAndroid Build Coastguard Worker 
6611*8975f5c5SAndroid Build Coastguard Worker     // Respecify source with same parameters. This should not change the texture storage in D3D11.
6612*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, source);
6613*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, updateData);
6614*8975f5c5SAndroid Build Coastguard Worker 
6615*8975f5c5SAndroid Build Coastguard Worker     // Expect that the source texture has the updated data
6616*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(source, updateData);
6617*8975f5c5SAndroid Build Coastguard Worker 
6618*8975f5c5SAndroid Build Coastguard Worker     // Render to the target texture again and verify it gets the rendered pixels.
6619*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
6620*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
6621*8975f5c5SAndroid Build Coastguard Worker 
6622*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6623*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6624*8975f5c5SAndroid Build Coastguard Worker }
6625*8975f5c5SAndroid Build Coastguard Worker 
6626*8975f5c5SAndroid Build Coastguard Worker // Test that respecifying a level of the target texture orphans it and keeps a copy of the EGLimage
6627*8975f5c5SAndroid Build Coastguard Worker // data
TEST_P(ImageTest,RespecificationOfOtherLevel)6628*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, RespecificationOfOtherLevel)
6629*8975f5c5SAndroid Build Coastguard Worker {
6630*8975f5c5SAndroid Build Coastguard Worker     // Respecification of textures that does not change the size of the level attached to the EGL
6631*8975f5c5SAndroid Build Coastguard Worker     // image does not cause orphaning on Qualcomm devices. http://anglebug.com/42261452
6632*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
6633*8975f5c5SAndroid Build Coastguard Worker 
6634*8975f5c5SAndroid Build Coastguard Worker     // It is undefined what happens to the mip 0 of the dest texture after it is orphaned. Some
6635*8975f5c5SAndroid Build Coastguard Worker     // backends explicitly copy the data but Vulkan does not.
6636*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsVulkan());
6637*8975f5c5SAndroid Build Coastguard Worker 
6638*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6639*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6640*8975f5c5SAndroid Build Coastguard Worker 
6641*8975f5c5SAndroid Build Coastguard Worker     GLubyte originalData[2 * 2 * 4] = {
6642*8975f5c5SAndroid Build Coastguard Worker         255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255,
6643*8975f5c5SAndroid Build Coastguard Worker     };
6644*8975f5c5SAndroid Build Coastguard Worker 
6645*8975f5c5SAndroid Build Coastguard Worker     GLubyte updateData[2 * 2 * 4] = {
6646*8975f5c5SAndroid Build Coastguard Worker         0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255,
6647*8975f5c5SAndroid Build Coastguard Worker     };
6648*8975f5c5SAndroid Build Coastguard Worker 
6649*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6650*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
6651*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6652*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(2, 2, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs, originalData,
6653*8975f5c5SAndroid Build Coastguard Worker                                   source, &image);
6654*8975f5c5SAndroid Build Coastguard Worker 
6655*8975f5c5SAndroid Build Coastguard Worker     // Create the target
6656*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
6657*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, target);
6658*8975f5c5SAndroid Build Coastguard Worker 
6659*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target and source textures have the original data
6660*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(source, originalData);
6661*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, originalData);
6662*8975f5c5SAndroid Build Coastguard Worker 
6663*8975f5c5SAndroid Build Coastguard Worker     // Add a new mipLevel to the target, orphaning it
6664*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, target);
6665*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, originalData);
6666*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
6667*8975f5c5SAndroid Build Coastguard Worker 
6668*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target and source textures still have the original data
6669*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(source, originalData);
6670*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, originalData);
6671*8975f5c5SAndroid Build Coastguard Worker 
6672*8975f5c5SAndroid Build Coastguard Worker     // Update the source's data
6673*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, source);
6674*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, updateData);
6675*8975f5c5SAndroid Build Coastguard Worker 
6676*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target still has the original data and source has the updated data
6677*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(source, updateData);
6678*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(target, originalData);
6679*8975f5c5SAndroid Build Coastguard Worker 
6680*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6681*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6682*8975f5c5SAndroid Build Coastguard Worker }
6683*8975f5c5SAndroid Build Coastguard Worker 
6684*8975f5c5SAndroid Build Coastguard Worker // Update the data of the source and target textures.  All image siblings should have the new data.
TEST_P(ImageTest,UpdatedData)6685*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, UpdatedData)
6686*8975f5c5SAndroid Build Coastguard Worker {
6687*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6688*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6689*8975f5c5SAndroid Build Coastguard Worker 
6690*8975f5c5SAndroid Build Coastguard Worker     GLubyte originalData[4] = {255, 0, 255, 255};
6691*8975f5c5SAndroid Build Coastguard Worker     GLubyte updateData[4]   = {0, 255, 0, 255};
6692*8975f5c5SAndroid Build Coastguard Worker 
6693*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6694*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
6695*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6696*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs, originalData,
6697*8975f5c5SAndroid Build Coastguard Worker                                   source, &image);
6698*8975f5c5SAndroid Build Coastguard Worker 
6699*8975f5c5SAndroid Build Coastguard Worker     // Create multiple targets
6700*8975f5c5SAndroid Build Coastguard Worker     GLTexture targetTexture;
6701*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, targetTexture);
6702*8975f5c5SAndroid Build Coastguard Worker 
6703*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer targetRenderbuffer;
6704*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetRenderbuffer(image, targetRenderbuffer);
6705*8975f5c5SAndroid Build Coastguard Worker 
6706*8975f5c5SAndroid Build Coastguard Worker     // Expect that both the source and targets have the original data
6707*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(source, originalData);
6708*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(targetTexture, originalData);
6709*8975f5c5SAndroid Build Coastguard Worker     verifyResultsRenderbuffer(targetRenderbuffer, originalData);
6710*8975f5c5SAndroid Build Coastguard Worker 
6711*8975f5c5SAndroid Build Coastguard Worker     // Update the data of the source
6712*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, source);
6713*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, updateData);
6714*8975f5c5SAndroid Build Coastguard Worker 
6715*8975f5c5SAndroid Build Coastguard Worker     // Expect that both the source and targets have the updated data
6716*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(source, updateData);
6717*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(targetTexture, updateData);
6718*8975f5c5SAndroid Build Coastguard Worker     verifyResultsRenderbuffer(targetRenderbuffer, updateData);
6719*8975f5c5SAndroid Build Coastguard Worker 
6720*8975f5c5SAndroid Build Coastguard Worker     // Update the data of the target back to the original data
6721*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, targetTexture);
6722*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, originalData);
6723*8975f5c5SAndroid Build Coastguard Worker 
6724*8975f5c5SAndroid Build Coastguard Worker     // Expect that both the source and targets have the original data again
6725*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(source, originalData);
6726*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(targetTexture, originalData);
6727*8975f5c5SAndroid Build Coastguard Worker     verifyResultsRenderbuffer(targetRenderbuffer, originalData);
6728*8975f5c5SAndroid Build Coastguard Worker 
6729*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6730*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6731*8975f5c5SAndroid Build Coastguard Worker }
6732*8975f5c5SAndroid Build Coastguard Worker 
6733*8975f5c5SAndroid Build Coastguard Worker // Check that the external texture is successfully updated when only glTexSubImage2D is called.
TEST_P(ImageTest,AHBUpdatedExternalTexture)6734*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, AHBUpdatedExternalTexture)
6735*8975f5c5SAndroid Build Coastguard Worker {
6736*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6737*8975f5c5SAndroid Build Coastguard Worker 
6738*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6739*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
6740*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
6741*8975f5c5SAndroid Build Coastguard Worker 
6742*8975f5c5SAndroid Build Coastguard Worker     GLubyte originalData[4]      = {255, 0, 255, 255};
6743*8975f5c5SAndroid Build Coastguard Worker     GLubyte updateData[4]        = {0, 255, 0, 255};
6744*8975f5c5SAndroid Build Coastguard Worker     const uint32_t bytesPerPixel = 4;
6745*8975f5c5SAndroid Build Coastguard Worker 
6746*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6747*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
6748*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6749*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
6750*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs,
6751*8975f5c5SAndroid Build Coastguard Worker                                               {{originalData, bytesPerPixel}}, &source, &image);
6752*8975f5c5SAndroid Build Coastguard Worker 
6753*8975f5c5SAndroid Build Coastguard Worker     // Create target
6754*8975f5c5SAndroid Build Coastguard Worker     GLTexture targetTexture;
6755*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, targetTexture);
6756*8975f5c5SAndroid Build Coastguard Worker 
6757*8975f5c5SAndroid Build Coastguard Worker     // Expect that both the target have the original data
6758*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(targetTexture, originalData);
6759*8975f5c5SAndroid Build Coastguard Worker 
6760*8975f5c5SAndroid Build Coastguard Worker     // Update the data of the source
6761*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, targetTexture);
6762*8975f5c5SAndroid Build Coastguard Worker     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, updateData);
6763*8975f5c5SAndroid Build Coastguard Worker 
6764*8975f5c5SAndroid Build Coastguard Worker     // Set sync object and flush the GL commands
6765*8975f5c5SAndroid Build Coastguard Worker     EGLSyncKHR fence = eglCreateSyncKHR(window->getDisplay(), EGL_SYNC_FENCE_KHR, NULL);
6766*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(fence, EGL_NO_SYNC_KHR);
6767*8975f5c5SAndroid Build Coastguard Worker     glFlush();
6768*8975f5c5SAndroid Build Coastguard Worker 
6769*8975f5c5SAndroid Build Coastguard Worker     // Delete the target texture
6770*8975f5c5SAndroid Build Coastguard Worker     targetTexture.reset();
6771*8975f5c5SAndroid Build Coastguard Worker 
6772*8975f5c5SAndroid Build Coastguard Worker     // Wait that the flush command is finished
6773*8975f5c5SAndroid Build Coastguard Worker     EGLint result = eglClientWaitSyncKHR(window->getDisplay(), fence, 0, 1000000000);
6774*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result, EGL_CONDITION_SATISFIED_KHR);
6775*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_TRUE(eglDestroySyncKHR(window->getDisplay(), fence));
6776*8975f5c5SAndroid Build Coastguard Worker 
6777*8975f5c5SAndroid Build Coastguard Worker     // Delete the EGL image
6778*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6779*8975f5c5SAndroid Build Coastguard Worker 
6780*8975f5c5SAndroid Build Coastguard Worker     // Access the android hardware buffer directly to check the data is updated
6781*8975f5c5SAndroid Build Coastguard Worker     verifyResultAHB(source, {{updateData, bytesPerPixel}});
6782*8975f5c5SAndroid Build Coastguard Worker 
6783*8975f5c5SAndroid Build Coastguard Worker     // Create the EGL image again
6784*8975f5c5SAndroid Build Coastguard Worker     image =
6785*8975f5c5SAndroid Build Coastguard Worker         eglCreateImageKHR(window->getDisplay(), EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
6786*8975f5c5SAndroid Build Coastguard Worker                           angle::android::AHardwareBufferToClientBuffer(source), kDefaultAttribs);
6787*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6788*8975f5c5SAndroid Build Coastguard Worker 
6789*8975f5c5SAndroid Build Coastguard Worker     // Create the target texture again
6790*8975f5c5SAndroid Build Coastguard Worker     GLTexture targetTexture2;
6791*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, targetTexture2);
6792*8975f5c5SAndroid Build Coastguard Worker 
6793*8975f5c5SAndroid Build Coastguard Worker     // Expect that the target have the update data
6794*8975f5c5SAndroid Build Coastguard Worker     verifyResults2D(targetTexture2, updateData);
6795*8975f5c5SAndroid Build Coastguard Worker 
6796*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6797*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6798*8975f5c5SAndroid Build Coastguard Worker     destroyAndroidHardwareBuffer(source);
6799*8975f5c5SAndroid Build Coastguard Worker }
6800*8975f5c5SAndroid Build Coastguard Worker 
6801*8975f5c5SAndroid Build Coastguard Worker // Check that the texture successfully updates when an image is deleted
TEST_P(ImageTest,DeletedImageWithSameSizeAndFormat)6802*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, DeletedImageWithSameSizeAndFormat)
6803*8975f5c5SAndroid Build Coastguard Worker {
6804*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6805*8975f5c5SAndroid Build Coastguard Worker 
6806*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6807*8975f5c5SAndroid Build Coastguard Worker 
6808*8975f5c5SAndroid Build Coastguard Worker     GLubyte originalData[4] = {255, 0, 255, 255};
6809*8975f5c5SAndroid Build Coastguard Worker     GLubyte updateData[4]   = {0, 255, 0, 255};
6810*8975f5c5SAndroid Build Coastguard Worker 
6811*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6812*8975f5c5SAndroid Build Coastguard Worker     GLTexture source;
6813*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6814*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs, originalData,
6815*8975f5c5SAndroid Build Coastguard Worker                                   source, &image);
6816*8975f5c5SAndroid Build Coastguard Worker 
6817*8975f5c5SAndroid Build Coastguard Worker     // Create texture & bind to Image
6818*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
6819*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image, texture);
6820*8975f5c5SAndroid Build Coastguard Worker 
6821*8975f5c5SAndroid Build Coastguard Worker     // Delete Image
6822*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
6823*8975f5c5SAndroid Build Coastguard Worker 
6824*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
6825*8975f5c5SAndroid Build Coastguard Worker 
6826*8975f5c5SAndroid Build Coastguard Worker     // Redefine Texture
6827*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, updateData);
6828*8975f5c5SAndroid Build Coastguard Worker 
6829*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6830*8975f5c5SAndroid Build Coastguard Worker }
6831*8975f5c5SAndroid Build Coastguard Worker 
6832*8975f5c5SAndroid Build Coastguard Worker // Check that create a source cube texture and then redefine the same target texture with each face
6833*8975f5c5SAndroid Build Coastguard Worker // of source cube texture renders correctly
TEST_P(ImageTest,SourceCubeAndSameTargetTextureWithEachCubeFace)6834*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, SourceCubeAndSameTargetTextureWithEachCubeFace)
6835*8975f5c5SAndroid Build Coastguard Worker {
6836*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6837*8975f5c5SAndroid Build Coastguard Worker 
6838*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6839*8975f5c5SAndroid Build Coastguard Worker 
6840*8975f5c5SAndroid Build Coastguard Worker     // Create a source cube map texture
6841*8975f5c5SAndroid Build Coastguard Worker     GLTexture sourceTexture;
6842*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, sourceTexture);
6843*8975f5c5SAndroid Build Coastguard Worker     uint8_t *data     = reinterpret_cast<uint8_t *>(kLinearColorCube);
6844*8975f5c5SAndroid Build Coastguard Worker     size_t dataStride = sizeof(GLubyte) * 4;
6845*8975f5c5SAndroid Build Coastguard Worker     for (GLenum faceIdx = 0; faceIdx < 6; faceIdx++)
6846*8975f5c5SAndroid Build Coastguard Worker     {
6847*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(faceIdx + GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 1, 1, 0, GL_RGBA,
6848*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, data + (faceIdx * dataStride));
6849*8975f5c5SAndroid Build Coastguard Worker     }
6850*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6851*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6852*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
6853*8975f5c5SAndroid Build Coastguard Worker 
6854*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR images[6];
6855*8975f5c5SAndroid Build Coastguard Worker     GLTexture targetTexture;
6856*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, targetTexture);
6857*8975f5c5SAndroid Build Coastguard Worker 
6858*8975f5c5SAndroid Build Coastguard Worker     for (GLenum faceIdx = 0; faceIdx < 6; faceIdx++)
6859*8975f5c5SAndroid Build Coastguard Worker     {
6860*8975f5c5SAndroid Build Coastguard Worker         // Create the Image with EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR
6861*8975f5c5SAndroid Build Coastguard Worker         images[faceIdx] =
6862*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), window->getContext(),
6863*8975f5c5SAndroid Build Coastguard Worker                               EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR + faceIdx,
6864*8975f5c5SAndroid Build Coastguard Worker                               reinterpretHelper<EGLClientBuffer>(sourceTexture), kDefaultAttribs);
6865*8975f5c5SAndroid Build Coastguard Worker 
6866*8975f5c5SAndroid Build Coastguard Worker         // Create a target texture from the image
6867*8975f5c5SAndroid Build Coastguard Worker         glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, images[faceIdx]);
6868*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6869*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6870*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
6871*8975f5c5SAndroid Build Coastguard Worker         // Expect that the target texture has the same color as the source texture
6872*8975f5c5SAndroid Build Coastguard Worker         verifyResults2D(targetTexture, &kLinearColorCube[faceIdx * 4]);
6873*8975f5c5SAndroid Build Coastguard Worker     }
6874*8975f5c5SAndroid Build Coastguard Worker 
6875*8975f5c5SAndroid Build Coastguard Worker     // Clean up
6876*8975f5c5SAndroid Build Coastguard Worker     for (GLenum faceIdx = 0; faceIdx < 6; faceIdx++)
6877*8975f5c5SAndroid Build Coastguard Worker     {
6878*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), images[faceIdx]);
6879*8975f5c5SAndroid Build Coastguard Worker     }
6880*8975f5c5SAndroid Build Coastguard Worker }
6881*8975f5c5SAndroid Build Coastguard Worker 
6882*8975f5c5SAndroid Build Coastguard Worker // Case for testing External Texture support in MEC.
6883*8975f5c5SAndroid Build Coastguard Worker // To run this test with the right capture setting, make sure to set these environment variables:
6884*8975f5c5SAndroid Build Coastguard Worker //
6885*8975f5c5SAndroid Build Coastguard Worker // For Linux:
6886*8975f5c5SAndroid Build Coastguard Worker //      export ANGLE_CAPTURE_FRAME_START=2
6887*8975f5c5SAndroid Build Coastguard Worker //      export ANGLE_CAPTURE_FRAME_END=2
6888*8975f5c5SAndroid Build Coastguard Worker //      export ANGLE_CAPTURE_LABEL=external_textures
6889*8975f5c5SAndroid Build Coastguard Worker //      export ANGLE_CAPTURE_OUT_DIR=[PATH_TO_ANGLE]/src/tests/restricted_traces/external_textures/
6890*8975f5c5SAndroid Build Coastguard Worker //
6891*8975f5c5SAndroid Build Coastguard Worker // For Android:
6892*8975f5c5SAndroid Build Coastguard Worker //      adb shell setprop debug.angle.capture.frame_start 2
6893*8975f5c5SAndroid Build Coastguard Worker //      adb shell setprop debug.angle.capture.frame_end 2
6894*8975f5c5SAndroid Build Coastguard Worker //      adb shell setprop debug.angle.capture.label external_textures
6895*8975f5c5SAndroid Build Coastguard Worker //      adb shell setprop debug.angle.capture.out_dir /data/data/externaltextures/angle_capture/
TEST_P(ImageTest,AppTraceExternalTextureDefaultAttribs)6896*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, AppTraceExternalTextureDefaultAttribs)
6897*8975f5c5SAndroid Build Coastguard Worker {
6898*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
6899*8975f5c5SAndroid Build Coastguard Worker                        !hasExternalESSL3Ext());
6900*8975f5c5SAndroid Build Coastguard Worker 
6901*8975f5c5SAndroid Build Coastguard Worker     constexpr EGLint attribs[] = {
6902*8975f5c5SAndroid Build Coastguard Worker         EGL_IMAGE_PRESERVED,
6903*8975f5c5SAndroid Build Coastguard Worker         EGL_TRUE,
6904*8975f5c5SAndroid Build Coastguard Worker         EGL_NONE,
6905*8975f5c5SAndroid Build Coastguard Worker     };
6906*8975f5c5SAndroid Build Coastguard Worker 
6907*8975f5c5SAndroid Build Coastguard Worker     externalTextureTracerTestHelper(attribs);
6908*8975f5c5SAndroid Build Coastguard Worker }
6909*8975f5c5SAndroid Build Coastguard Worker 
6910*8975f5c5SAndroid Build Coastguard Worker // Same as AppTraceExternalTextureUseCase, except we will pass additional attrib_list values in
6911*8975f5c5SAndroid Build Coastguard Worker // EGLAttrib* for eglCreateImageKHR calls
TEST_P(ImageTest,AppTraceExternalTextureOtherAttribs)6912*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, AppTraceExternalTextureOtherAttribs)
6913*8975f5c5SAndroid Build Coastguard Worker {
6914*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
6915*8975f5c5SAndroid Build Coastguard Worker                        !hasExternalESSL3Ext());
6916*8975f5c5SAndroid Build Coastguard Worker 
6917*8975f5c5SAndroid Build Coastguard Worker     constexpr EGLint attribs[] = {
6918*8975f5c5SAndroid Build Coastguard Worker         EGL_IMAGE_PRESERVED, EGL_TRUE, EGL_GL_TEXTURE_LEVEL, 0, EGL_NONE,
6919*8975f5c5SAndroid Build Coastguard Worker     };
6920*8975f5c5SAndroid Build Coastguard Worker 
6921*8975f5c5SAndroid Build Coastguard Worker     externalTextureTracerTestHelper(attribs);
6922*8975f5c5SAndroid Build Coastguard Worker }
6923*8975f5c5SAndroid Build Coastguard Worker 
6924*8975f5c5SAndroid Build Coastguard Worker // Same as AppTraceExternalTextureUseCase, except we will pass nullptr as EGLAttrib* for
6925*8975f5c5SAndroid Build Coastguard Worker // eglCreateImageKHR calls
TEST_P(ImageTest,AppTraceExternalTextureNullAttribs)6926*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, AppTraceExternalTextureNullAttribs)
6927*8975f5c5SAndroid Build Coastguard Worker {
6928*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt() ||
6929*8975f5c5SAndroid Build Coastguard Worker                        !hasExternalESSL3Ext());
6930*8975f5c5SAndroid Build Coastguard Worker 
6931*8975f5c5SAndroid Build Coastguard Worker     externalTextureTracerTestHelper(nullptr);
6932*8975f5c5SAndroid Build Coastguard Worker }
6933*8975f5c5SAndroid Build Coastguard Worker 
6934*8975f5c5SAndroid Build Coastguard Worker // Alternate case for testing External Texture (created with AHB) support in MEC.
6935*8975f5c5SAndroid Build Coastguard Worker // Make sure to use the following environment variables for the right capture setting on Android:
6936*8975f5c5SAndroid Build Coastguard Worker //
6937*8975f5c5SAndroid Build Coastguard Worker // adb shell setprop debug.angle.capture.frame_start 2
6938*8975f5c5SAndroid Build Coastguard Worker // adb shell setprop debug.angle.capture.frame_end 2
6939*8975f5c5SAndroid Build Coastguard Worker // adb shell setprop debug.angle.capture.label AHB_textures
6940*8975f5c5SAndroid Build Coastguard Worker // adb shell setprop debug.angle.capture.out_dir /data/data/AHBtextures/angle_capture/
TEST_P(ImageTest,AppTraceExternalTextureWithAHBUseCase)6941*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, AppTraceExternalTextureWithAHBUseCase)
6942*8975f5c5SAndroid Build Coastguard Worker {
6943*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
6944*8975f5c5SAndroid Build Coastguard Worker 
6945*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
6946*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
6947*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
6948*8975f5c5SAndroid Build Coastguard Worker 
6949*8975f5c5SAndroid Build Coastguard Worker     GLubyte data[4] = {7, 51, 197, 231};
6950*8975f5c5SAndroid Build Coastguard Worker 
6951*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
6952*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
6953*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
6954*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
6955*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{data, 4}},
6956*8975f5c5SAndroid Build Coastguard Worker                                               &source, &image);
6957*8975f5c5SAndroid Build Coastguard Worker 
6958*8975f5c5SAndroid Build Coastguard Worker     // Create a texture target to bind the egl image & disable mipmapping
6959*8975f5c5SAndroid Build Coastguard Worker     GLTexture target;
6960*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target);
6961*8975f5c5SAndroid Build Coastguard Worker 
6962*8975f5c5SAndroid Build Coastguard Worker     // Calls On EndFrame(), with MidExecutionSetup to restore external target texture above
6963*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay display = getEGLWindow()->getDisplay();
6964*8975f5c5SAndroid Build Coastguard Worker     EGLSurface surface = getEGLWindow()->getSurface();
6965*8975f5c5SAndroid Build Coastguard Worker     eglSwapBuffers(display, surface);
6966*8975f5c5SAndroid Build Coastguard Worker 
6967*8975f5c5SAndroid Build Coastguard Worker     // Create another eglImage with another associated texture
6968*8975f5c5SAndroid Build Coastguard Worker     // Draw using the eglImage target texture created in frame 1
6969*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source2;
6970*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image2;
6971*8975f5c5SAndroid Build Coastguard Worker     createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
6972*8975f5c5SAndroid Build Coastguard Worker                                               kDefaultAHBUsage, kDefaultAttribs, {{data, 4}},
6973*8975f5c5SAndroid Build Coastguard Worker                                               &source2, &image2);
6974*8975f5c5SAndroid Build Coastguard Worker 
6975*8975f5c5SAndroid Build Coastguard Worker     // Create another texture target to bind the egl image & disable mipmapping
6976*8975f5c5SAndroid Build Coastguard Worker     GLTexture target2;
6977*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTextureExternal(image, target2);
6978*8975f5c5SAndroid Build Coastguard Worker 
6979*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureExternalProgram);
6980*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, target);
6981*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureExternalUniformLocation, 0);
6982*8975f5c5SAndroid Build Coastguard Worker 
6983*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
6984*8975f5c5SAndroid Build Coastguard Worker 
6985*8975f5c5SAndroid Build Coastguard Worker     // Calls On EndFrame() to save the gl calls creating external texture target2;
6986*8975f5c5SAndroid Build Coastguard Worker     // We use this as a reference to check the gl calls we restore for GLTexture target
6987*8975f5c5SAndroid Build Coastguard Worker     // in MidExecutionSetup
6988*8975f5c5SAndroid Build Coastguard Worker     eglSwapBuffers(display, surface);
6989*8975f5c5SAndroid Build Coastguard Worker 
6990*8975f5c5SAndroid Build Coastguard Worker     // Draw a quad with the GLTexture target2
6991*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureExternalProgram);
6992*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_EXTERNAL_OES, target2);
6993*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureExternalUniformLocation, 0);
6994*8975f5c5SAndroid Build Coastguard Worker 
6995*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureExternalProgram, "position", 0.5f);
6996*8975f5c5SAndroid Build Coastguard Worker 
6997*8975f5c5SAndroid Build Coastguard Worker     eglSwapBuffers(display, surface);
6998*8975f5c5SAndroid Build Coastguard Worker 
6999*8975f5c5SAndroid Build Coastguard Worker     // Clean up
7000*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image);
7001*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image2);
7002*8975f5c5SAndroid Build Coastguard Worker }
7003*8975f5c5SAndroid Build Coastguard Worker 
7004*8975f5c5SAndroid Build Coastguard Worker // Thread 0 creates the AHB and binds it to a texture, thread 1 uses it without synchronization.
TEST_P(ImageTest,MultithreadedAHBImportAndUseAsTexture)7005*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, MultithreadedAHBImportAndUseAsTexture)
7006*8975f5c5SAndroid Build Coastguard Worker {
7007*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
7008*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
7009*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
7010*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!platformSupportsMultithreading());
7011*8975f5c5SAndroid Build Coastguard Worker 
7012*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
7013*8975f5c5SAndroid Build Coastguard Worker 
7014*8975f5c5SAndroid Build Coastguard Worker     GLuint sharedTexture = 0;
7015*8975f5c5SAndroid Build Coastguard Worker 
7016*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
7017*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
7018*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
7019*8975f5c5SAndroid Build Coastguard Worker 
7020*8975f5c5SAndroid Build Coastguard Worker     constexpr GLubyte kInitialData[4] = {127, 63, 191, 255};
7021*8975f5c5SAndroid Build Coastguard Worker 
7022*8975f5c5SAndroid Build Coastguard Worker     std::mutex mutex;
7023*8975f5c5SAndroid Build Coastguard Worker     std::condition_variable condVar;
7024*8975f5c5SAndroid Build Coastguard Worker 
7025*8975f5c5SAndroid Build Coastguard Worker     enum class Step
7026*8975f5c5SAndroid Build Coastguard Worker     {
7027*8975f5c5SAndroid Build Coastguard Worker         Start,
7028*8975f5c5SAndroid Build Coastguard Worker         Thread0CreatedTexture,
7029*8975f5c5SAndroid Build Coastguard Worker         Thread1UsedTexture,
7030*8975f5c5SAndroid Build Coastguard Worker         Finish,
7031*8975f5c5SAndroid Build Coastguard Worker         Abort,
7032*8975f5c5SAndroid Build Coastguard Worker     };
7033*8975f5c5SAndroid Build Coastguard Worker     Step currentStep = Step::Start;
7034*8975f5c5SAndroid Build Coastguard Worker 
7035*8975f5c5SAndroid Build Coastguard Worker     auto thread0 = [&](EGLDisplay dpy, EGLSurface surface, EGLContext context) {
7036*8975f5c5SAndroid Build Coastguard Worker         ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
7037*8975f5c5SAndroid Build Coastguard Worker 
7038*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, surface, surface, context));
7039*8975f5c5SAndroid Build Coastguard Worker 
7040*8975f5c5SAndroid Build Coastguard Worker         createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
7041*8975f5c5SAndroid Build Coastguard Worker                                                   kDefaultAHBUsage, kDefaultAttribs,
7042*8975f5c5SAndroid Build Coastguard Worker                                                   {{kInitialData, 4}}, &source, &image);
7043*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7044*8975f5c5SAndroid Build Coastguard Worker 
7045*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
7046*8975f5c5SAndroid Build Coastguard Worker         sharedTexture = texture;
7047*8975f5c5SAndroid Build Coastguard Worker 
7048*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetTextureExternal(image, sharedTexture);
7049*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7050*8975f5c5SAndroid Build Coastguard Worker 
7051*8975f5c5SAndroid Build Coastguard Worker         // Wait for the other thread to use it.
7052*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Thread0CreatedTexture);
7053*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread1UsedTexture));
7054*8975f5c5SAndroid Build Coastguard Worker 
7055*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
7056*8975f5c5SAndroid Build Coastguard Worker         texture.reset();
7057*8975f5c5SAndroid Build Coastguard Worker 
7058*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Finish);
7059*8975f5c5SAndroid Build Coastguard Worker 
7060*8975f5c5SAndroid Build Coastguard Worker         // Clean up
7061*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7062*8975f5c5SAndroid Build Coastguard Worker     };
7063*8975f5c5SAndroid Build Coastguard Worker 
7064*8975f5c5SAndroid Build Coastguard Worker     auto thread1 = [&](EGLDisplay dpy, EGLSurface surface, EGLContext context) {
7065*8975f5c5SAndroid Build Coastguard Worker         ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
7066*8975f5c5SAndroid Build Coastguard Worker 
7067*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, surface, surface, context));
7068*8975f5c5SAndroid Build Coastguard Worker 
7069*8975f5c5SAndroid Build Coastguard Worker         // Wait for thread 0 to set up
7070*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread0CreatedTexture));
7071*8975f5c5SAndroid Build Coastguard Worker 
7072*8975f5c5SAndroid Build Coastguard Worker         // Sample from the texture
7073*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(drawTexture, getVS(), getTextureExternalFS());
7074*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(drawTexture);
7075*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_EXTERNAL_OES, sharedTexture);
7076*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTextureExternalUniformLocation, 0);
7077*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7078*8975f5c5SAndroid Build Coastguard Worker 
7079*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawTexture, "position", 0.5f);
7080*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7081*8975f5c5SAndroid Build Coastguard Worker 
7082*8975f5c5SAndroid Build Coastguard Worker         // Make a submission
7083*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(
7084*8975f5c5SAndroid Build Coastguard Worker             0, 0, GLColor(kInitialData[0], kInitialData[1], kInitialData[2], kInitialData[3]), 1);
7085*8975f5c5SAndroid Build Coastguard Worker 
7086*8975f5c5SAndroid Build Coastguard Worker         // Notify the other thread that it's finished using the texture.
7087*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Thread1UsedTexture);
7088*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Finish));
7089*8975f5c5SAndroid Build Coastguard Worker 
7090*8975f5c5SAndroid Build Coastguard Worker         // Clean up
7091*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7092*8975f5c5SAndroid Build Coastguard Worker     };
7093*8975f5c5SAndroid Build Coastguard Worker 
7094*8975f5c5SAndroid Build Coastguard Worker     std::array<LockStepThreadFunc, 2> threadFuncs = {
7095*8975f5c5SAndroid Build Coastguard Worker         std::move(thread0),
7096*8975f5c5SAndroid Build Coastguard Worker         std::move(thread1),
7097*8975f5c5SAndroid Build Coastguard Worker     };
7098*8975f5c5SAndroid Build Coastguard Worker 
7099*8975f5c5SAndroid Build Coastguard Worker     RunLockStepThreads(getEGLWindow(), threadFuncs.size(), threadFuncs.data());
7100*8975f5c5SAndroid Build Coastguard Worker 
7101*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(currentStep, Step::Abort);
7102*8975f5c5SAndroid Build Coastguard Worker }
7103*8975f5c5SAndroid Build Coastguard Worker 
7104*8975f5c5SAndroid Build Coastguard Worker // Thread 0 creates the AHB and binds it to a renderbuffer, thread 1 uses it without
7105*8975f5c5SAndroid Build Coastguard Worker // synchronization.
TEST_P(ImageTest,MultithreadedAHBImportAndUseAsRenderbuffer)7106*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, MultithreadedAHBImportAndUseAsRenderbuffer)
7107*8975f5c5SAndroid Build Coastguard Worker {
7108*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !hasRenderbufferExt());
7109*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport());
7110*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasAhbLockPlanesSupport());
7111*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!platformSupportsMultithreading());
7112*8975f5c5SAndroid Build Coastguard Worker 
7113*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
7114*8975f5c5SAndroid Build Coastguard Worker 
7115*8975f5c5SAndroid Build Coastguard Worker     GLuint sharedRenderbuffer = 0;
7116*8975f5c5SAndroid Build Coastguard Worker 
7117*8975f5c5SAndroid Build Coastguard Worker     // Create the Image
7118*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *source;
7119*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image;
7120*8975f5c5SAndroid Build Coastguard Worker 
7121*8975f5c5SAndroid Build Coastguard Worker     constexpr GLubyte kInitialData[4] = {127, 63, 191, 255};
7122*8975f5c5SAndroid Build Coastguard Worker 
7123*8975f5c5SAndroid Build Coastguard Worker     std::mutex mutex;
7124*8975f5c5SAndroid Build Coastguard Worker     std::condition_variable condVar;
7125*8975f5c5SAndroid Build Coastguard Worker 
7126*8975f5c5SAndroid Build Coastguard Worker     enum class Step
7127*8975f5c5SAndroid Build Coastguard Worker     {
7128*8975f5c5SAndroid Build Coastguard Worker         Start,
7129*8975f5c5SAndroid Build Coastguard Worker         Thread0CreatedRenderbuffer,
7130*8975f5c5SAndroid Build Coastguard Worker         Thread1UsedRenderbuffer,
7131*8975f5c5SAndroid Build Coastguard Worker         Finish,
7132*8975f5c5SAndroid Build Coastguard Worker         Abort,
7133*8975f5c5SAndroid Build Coastguard Worker     };
7134*8975f5c5SAndroid Build Coastguard Worker     Step currentStep = Step::Start;
7135*8975f5c5SAndroid Build Coastguard Worker 
7136*8975f5c5SAndroid Build Coastguard Worker     auto thread0 = [&](EGLDisplay dpy, EGLSurface surface, EGLContext context) {
7137*8975f5c5SAndroid Build Coastguard Worker         ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
7138*8975f5c5SAndroid Build Coastguard Worker 
7139*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, surface, surface, context));
7140*8975f5c5SAndroid Build Coastguard Worker 
7141*8975f5c5SAndroid Build Coastguard Worker         createEGLImageAndroidHardwareBufferSource(1, 1, 1, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
7142*8975f5c5SAndroid Build Coastguard Worker                                                   kDefaultAHBUsage, kDefaultAttribs,
7143*8975f5c5SAndroid Build Coastguard Worker                                                   {{kInitialData, 4}}, &source, &image);
7144*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7145*8975f5c5SAndroid Build Coastguard Worker 
7146*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer renderbuffer;
7147*8975f5c5SAndroid Build Coastguard Worker         sharedRenderbuffer = renderbuffer;
7148*8975f5c5SAndroid Build Coastguard Worker 
7149*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetRenderbuffer(image, sharedRenderbuffer);
7150*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7151*8975f5c5SAndroid Build Coastguard Worker 
7152*8975f5c5SAndroid Build Coastguard Worker         // Wait for the other thread to use it.
7153*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Thread0CreatedRenderbuffer);
7154*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread1UsedRenderbuffer));
7155*8975f5c5SAndroid Build Coastguard Worker 
7156*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
7157*8975f5c5SAndroid Build Coastguard Worker         renderbuffer.reset();
7158*8975f5c5SAndroid Build Coastguard Worker 
7159*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Finish);
7160*8975f5c5SAndroid Build Coastguard Worker 
7161*8975f5c5SAndroid Build Coastguard Worker         // Clean up
7162*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7163*8975f5c5SAndroid Build Coastguard Worker     };
7164*8975f5c5SAndroid Build Coastguard Worker 
7165*8975f5c5SAndroid Build Coastguard Worker     auto thread1 = [&](EGLDisplay dpy, EGLSurface surface, EGLContext context) {
7166*8975f5c5SAndroid Build Coastguard Worker         ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
7167*8975f5c5SAndroid Build Coastguard Worker 
7168*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, surface, surface, context));
7169*8975f5c5SAndroid Build Coastguard Worker 
7170*8975f5c5SAndroid Build Coastguard Worker         // Wait for thread 0 to set up
7171*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread0CreatedRenderbuffer));
7172*8975f5c5SAndroid Build Coastguard Worker 
7173*8975f5c5SAndroid Build Coastguard Worker         // Blend into the renderbuffer
7174*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
7175*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7176*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
7177*8975f5c5SAndroid Build Coastguard Worker                                   sharedRenderbuffer);
7178*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7179*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7180*8975f5c5SAndroid Build Coastguard Worker 
7181*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_BLEND);
7182*8975f5c5SAndroid Build Coastguard Worker         glBlendFunc(GL_ONE, GL_ONE);
7183*8975f5c5SAndroid Build Coastguard Worker 
7184*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
7185*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.5f);
7186*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7187*8975f5c5SAndroid Build Coastguard Worker 
7188*8975f5c5SAndroid Build Coastguard Worker         // Make a submission
7189*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, kInitialData[1], kInitialData[2], 255), 1);
7190*8975f5c5SAndroid Build Coastguard Worker 
7191*8975f5c5SAndroid Build Coastguard Worker         // Notify the other thread that it's finished using the renderbuffer.
7192*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Thread1UsedRenderbuffer);
7193*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Finish));
7194*8975f5c5SAndroid Build Coastguard Worker 
7195*8975f5c5SAndroid Build Coastguard Worker         // Clean up
7196*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7197*8975f5c5SAndroid Build Coastguard Worker     };
7198*8975f5c5SAndroid Build Coastguard Worker 
7199*8975f5c5SAndroid Build Coastguard Worker     std::array<LockStepThreadFunc, 2> threadFuncs = {
7200*8975f5c5SAndroid Build Coastguard Worker         std::move(thread0),
7201*8975f5c5SAndroid Build Coastguard Worker         std::move(thread1),
7202*8975f5c5SAndroid Build Coastguard Worker     };
7203*8975f5c5SAndroid Build Coastguard Worker 
7204*8975f5c5SAndroid Build Coastguard Worker     RunLockStepThreads(getEGLWindow(), threadFuncs.size(), threadFuncs.data());
7205*8975f5c5SAndroid Build Coastguard Worker 
7206*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(currentStep, Step::Abort);
7207*8975f5c5SAndroid Build Coastguard Worker }
7208*8975f5c5SAndroid Build Coastguard Worker 
FramebufferAttachmentDeletedWhileInUseHelper(bool useTextureAttachment,bool deleteSourceTextureLast)7209*8975f5c5SAndroid Build Coastguard Worker void ImageTest::FramebufferAttachmentDeletedWhileInUseHelper(bool useTextureAttachment,
7210*8975f5c5SAndroid Build Coastguard Worker                                                              bool deleteSourceTextureLast)
7211*8975f5c5SAndroid Build Coastguard Worker {
7212*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt());
7213*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(useTextureAttachment && !has2DTextureExt());
7214*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!useTextureAttachment && !hasRenderbufferExt());
7215*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!platformSupportsMultithreading());
7216*8975f5c5SAndroid Build Coastguard Worker 
7217*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
7218*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image = EGL_NO_IMAGE_KHR;
7219*8975f5c5SAndroid Build Coastguard Worker 
7220*8975f5c5SAndroid Build Coastguard Worker     std::mutex mutex;
7221*8975f5c5SAndroid Build Coastguard Worker     std::condition_variable condVar;
7222*8975f5c5SAndroid Build Coastguard Worker     EGLSyncKHR sync;
7223*8975f5c5SAndroid Build Coastguard Worker 
7224*8975f5c5SAndroid Build Coastguard Worker     enum class Step
7225*8975f5c5SAndroid Build Coastguard Worker     {
7226*8975f5c5SAndroid Build Coastguard Worker         Start,
7227*8975f5c5SAndroid Build Coastguard Worker         Thread0CreatedImage,
7228*8975f5c5SAndroid Build Coastguard Worker         Thread1UsedImage,
7229*8975f5c5SAndroid Build Coastguard Worker         Finish,
7230*8975f5c5SAndroid Build Coastguard Worker         Abort,
7231*8975f5c5SAndroid Build Coastguard Worker     };
7232*8975f5c5SAndroid Build Coastguard Worker     Step currentStep = Step::Start;
7233*8975f5c5SAndroid Build Coastguard Worker 
7234*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(window->makeCurrent(EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7235*8975f5c5SAndroid Build Coastguard Worker 
7236*8975f5c5SAndroid Build Coastguard Worker     // This thread will use window context
7237*8975f5c5SAndroid Build Coastguard Worker     std::thread thread0([&]() {
7238*8975f5c5SAndroid Build Coastguard Worker         ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
7239*8975f5c5SAndroid Build Coastguard Worker 
7240*8975f5c5SAndroid Build Coastguard Worker         window->makeCurrent();
7241*8975f5c5SAndroid Build Coastguard Worker 
7242*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
7243*8975f5c5SAndroid Build Coastguard Worker         GLTexture source;
7244*8975f5c5SAndroid Build Coastguard Worker         createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs,
7245*8975f5c5SAndroid Build Coastguard Worker                                       kLinearColor, source, &image);
7246*8975f5c5SAndroid Build Coastguard Worker 
7247*8975f5c5SAndroid Build Coastguard Worker         sync = eglCreateSyncKHR(window->getDisplay(), EGL_SYNC_FENCE_KHR, nullptr);
7248*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7249*8975f5c5SAndroid Build Coastguard Worker 
7250*8975f5c5SAndroid Build Coastguard Worker         // Wait thread 1 finish using the Image
7251*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Thread0CreatedImage);
7252*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread1UsedImage));
7253*8975f5c5SAndroid Build Coastguard Worker 
7254*8975f5c5SAndroid Build Coastguard Worker         if (!deleteSourceTextureLast)
7255*8975f5c5SAndroid Build Coastguard Worker         {
7256*8975f5c5SAndroid Build Coastguard Worker             // Delete "source" texture first - image buffer will be deleted with the "image"
7257*8975f5c5SAndroid Build Coastguard Worker             source.reset();
7258*8975f5c5SAndroid Build Coastguard Worker         }
7259*8975f5c5SAndroid Build Coastguard Worker 
7260*8975f5c5SAndroid Build Coastguard Worker         // Destroy Image
7261*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
7262*8975f5c5SAndroid Build Coastguard Worker 
7263*8975f5c5SAndroid Build Coastguard Worker         if (deleteSourceTextureLast)
7264*8975f5c5SAndroid Build Coastguard Worker         {
7265*8975f5c5SAndroid Build Coastguard Worker             // Delete "source" texture last - this will delete image buffer
7266*8975f5c5SAndroid Build Coastguard Worker             source.reset();
7267*8975f5c5SAndroid Build Coastguard Worker         }
7268*8975f5c5SAndroid Build Coastguard Worker 
7269*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Finish);
7270*8975f5c5SAndroid Build Coastguard Worker 
7271*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(window->makeCurrent(EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7272*8975f5c5SAndroid Build Coastguard Worker     });
7273*8975f5c5SAndroid Build Coastguard Worker 
7274*8975f5c5SAndroid Build Coastguard Worker     // This thread will use non Shared context
7275*8975f5c5SAndroid Build Coastguard Worker     auto thread1 = [&](EGLDisplay dpy, EGLSurface surface, EGLContext context) {
7276*8975f5c5SAndroid Build Coastguard Worker         ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
7277*8975f5c5SAndroid Build Coastguard Worker 
7278*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread0CreatedImage));
7279*8975f5c5SAndroid Build Coastguard Worker 
7280*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, surface, surface, context));
7281*8975f5c5SAndroid Build Coastguard Worker         eglWaitSyncKHR(dpy, sync, 0);
7282*8975f5c5SAndroid Build Coastguard Worker 
7283*8975f5c5SAndroid Build Coastguard Worker         // Create the target and set up a framebuffer to render into the Image
7284*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
7285*8975f5c5SAndroid Build Coastguard Worker         GLTexture targetTexture;
7286*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer targetRenderbuffer;
7287*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7288*8975f5c5SAndroid Build Coastguard Worker         if (useTextureAttachment)
7289*8975f5c5SAndroid Build Coastguard Worker         {
7290*8975f5c5SAndroid Build Coastguard Worker             createEGLImageTargetTexture2D(image, targetTexture);
7291*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
7292*8975f5c5SAndroid Build Coastguard Worker                                    targetTexture, 0);
7293*8975f5c5SAndroid Build Coastguard Worker         }
7294*8975f5c5SAndroid Build Coastguard Worker         else
7295*8975f5c5SAndroid Build Coastguard Worker         {
7296*8975f5c5SAndroid Build Coastguard Worker             createEGLImageTargetRenderbuffer(image, targetRenderbuffer);
7297*8975f5c5SAndroid Build Coastguard Worker             glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
7298*8975f5c5SAndroid Build Coastguard Worker                                       targetRenderbuffer);
7299*8975f5c5SAndroid Build Coastguard Worker         }
7300*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7301*8975f5c5SAndroid Build Coastguard Worker 
7302*8975f5c5SAndroid Build Coastguard Worker         // Test that framebuffer has source content
7303*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(0, 0, kLinearColor[0], kLinearColor[1], kLinearColor[2], kLinearColor[3]);
7304*8975f5c5SAndroid Build Coastguard Worker 
7305*8975f5c5SAndroid Build Coastguard Worker         // Create additional target texture
7306*8975f5c5SAndroid Build Coastguard Worker         GLTexture targetTexture2;
7307*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetTexture2D(image, targetTexture2);
7308*8975f5c5SAndroid Build Coastguard Worker 
7309*8975f5c5SAndroid Build Coastguard Worker         // Enable additive blend
7310*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_BLEND);
7311*8975f5c5SAndroid Build Coastguard Worker         glBlendFunc(GL_ONE, GL_ONE);
7312*8975f5c5SAndroid Build Coastguard Worker 
7313*8975f5c5SAndroid Build Coastguard Worker         // Draw Red quad into the framebuffer
7314*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
7315*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.0f);
7316*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7317*8975f5c5SAndroid Build Coastguard Worker 
7318*8975f5c5SAndroid Build Coastguard Worker         // Delete "targetTexture2" that may affect RenderPass because it uses same Image
7319*8975f5c5SAndroid Build Coastguard Worker         targetTexture2.reset();
7320*8975f5c5SAndroid Build Coastguard Worker 
7321*8975f5c5SAndroid Build Coastguard Worker         // Clear previous draw
7322*8975f5c5SAndroid Build Coastguard Worker         glClearColor(128 / 255.0f, 128 / 255.0f, 128 / 255.0f, 1.0f);
7323*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
7324*8975f5c5SAndroid Build Coastguard Worker 
7325*8975f5c5SAndroid Build Coastguard Worker         // Draw Green quad into the framebuffer
7326*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
7327*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.0f);
7328*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7329*8975f5c5SAndroid Build Coastguard Worker 
7330*8975f5c5SAndroid Build Coastguard Worker         // Test that clear and second draw worked as expected
7331*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(0, 0, 128, 255, 128, 255);
7332*8975f5c5SAndroid Build Coastguard Worker 
7333*8975f5c5SAndroid Build Coastguard Worker         // Draw again to open RenderPass after the read pixels
7334*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.0f);
7335*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7336*8975f5c5SAndroid Build Coastguard Worker 
7337*8975f5c5SAndroid Build Coastguard Worker         // Delete resources
7338*8975f5c5SAndroid Build Coastguard Worker         fbo.reset();
7339*8975f5c5SAndroid Build Coastguard Worker         targetTexture.reset();
7340*8975f5c5SAndroid Build Coastguard Worker         targetRenderbuffer.reset();
7341*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7342*8975f5c5SAndroid Build Coastguard Worker 
7343*8975f5c5SAndroid Build Coastguard Worker         // Wait thread 0 destroys the Image and source
7344*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Thread1UsedImage);
7345*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Finish));
7346*8975f5c5SAndroid Build Coastguard Worker 
7347*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7348*8975f5c5SAndroid Build Coastguard Worker     };
7349*8975f5c5SAndroid Build Coastguard Worker 
7350*8975f5c5SAndroid Build Coastguard Worker     std::array<LockStepThreadFunc, 1> threadFuncs = {
7351*8975f5c5SAndroid Build Coastguard Worker         std::move(thread1),
7352*8975f5c5SAndroid Build Coastguard Worker     };
7353*8975f5c5SAndroid Build Coastguard Worker 
7354*8975f5c5SAndroid Build Coastguard Worker     RunLockStepThreads(getEGLWindow(), threadFuncs.size(), threadFuncs.data());
7355*8975f5c5SAndroid Build Coastguard Worker     thread0.join();
7356*8975f5c5SAndroid Build Coastguard Worker 
7357*8975f5c5SAndroid Build Coastguard Worker     window->makeCurrent();
7358*8975f5c5SAndroid Build Coastguard Worker 
7359*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(currentStep, Step::Abort);
7360*8975f5c5SAndroid Build Coastguard Worker }
7361*8975f5c5SAndroid Build Coastguard Worker 
7362*8975f5c5SAndroid Build Coastguard Worker // Testing Target 2D Texture deleted while still used in the RenderPass (Image destroyed last).
TEST_P(ImageTest,TargetTexture2DDeletedWhileInUse)7363*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, TargetTexture2DDeletedWhileInUse)
7364*8975f5c5SAndroid Build Coastguard Worker {
7365*8975f5c5SAndroid Build Coastguard Worker     FramebufferAttachmentDeletedWhileInUseHelper(true, false);
7366*8975f5c5SAndroid Build Coastguard Worker }
7367*8975f5c5SAndroid Build Coastguard Worker 
7368*8975f5c5SAndroid Build Coastguard Worker // Testing Target 2D Texture deleted while still used in the RenderPass (Source deleted last).
TEST_P(ImageTest,TargetTexture2DDeletedWhileInUse2)7369*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, TargetTexture2DDeletedWhileInUse2)
7370*8975f5c5SAndroid Build Coastguard Worker {
7371*8975f5c5SAndroid Build Coastguard Worker     FramebufferAttachmentDeletedWhileInUseHelper(true, true);
7372*8975f5c5SAndroid Build Coastguard Worker }
7373*8975f5c5SAndroid Build Coastguard Worker 
7374*8975f5c5SAndroid Build Coastguard Worker // Testing Target Renderbuffer deleted while still used in the RenderPass (Image destroyed last).
TEST_P(ImageTest,TargetRenderbufferDeletedWhileInUse)7375*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, TargetRenderbufferDeletedWhileInUse)
7376*8975f5c5SAndroid Build Coastguard Worker {
7377*8975f5c5SAndroid Build Coastguard Worker     FramebufferAttachmentDeletedWhileInUseHelper(false, false);
7378*8975f5c5SAndroid Build Coastguard Worker }
7379*8975f5c5SAndroid Build Coastguard Worker 
7380*8975f5c5SAndroid Build Coastguard Worker // Testing Target Renderbuffer deleted while still used in the RenderPass (Source deleted last).
TEST_P(ImageTest,TargetRenderbufferDeletedWhileInUse2)7381*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, TargetRenderbufferDeletedWhileInUse2)
7382*8975f5c5SAndroid Build Coastguard Worker {
7383*8975f5c5SAndroid Build Coastguard Worker     FramebufferAttachmentDeletedWhileInUseHelper(false, true);
7384*8975f5c5SAndroid Build Coastguard Worker }
7385*8975f5c5SAndroid Build Coastguard Worker 
FramebufferResolveAttachmentDeletedWhileInUseHelper(bool useTextureAttachment,bool deleteSourceTextureLast)7386*8975f5c5SAndroid Build Coastguard Worker void ImageTest::FramebufferResolveAttachmentDeletedWhileInUseHelper(bool useTextureAttachment,
7387*8975f5c5SAndroid Build Coastguard Worker                                                                     bool deleteSourceTextureLast)
7388*8975f5c5SAndroid Build Coastguard Worker {
7389*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt());
7390*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(useTextureAttachment && !has2DTextureExt());
7391*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!useTextureAttachment && !hasRenderbufferExt());
7392*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!platformSupportsMultithreading());
7393*8975f5c5SAndroid Build Coastguard Worker 
7394*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
7395*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image = EGL_NO_IMAGE_KHR;
7396*8975f5c5SAndroid Build Coastguard Worker 
7397*8975f5c5SAndroid Build Coastguard Worker     std::mutex mutex;
7398*8975f5c5SAndroid Build Coastguard Worker     std::condition_variable condVar;
7399*8975f5c5SAndroid Build Coastguard Worker     EGLSyncKHR sync;
7400*8975f5c5SAndroid Build Coastguard Worker 
7401*8975f5c5SAndroid Build Coastguard Worker     enum class Step
7402*8975f5c5SAndroid Build Coastguard Worker     {
7403*8975f5c5SAndroid Build Coastguard Worker         Start,
7404*8975f5c5SAndroid Build Coastguard Worker         Thread0CreatedImage,
7405*8975f5c5SAndroid Build Coastguard Worker         Thread1UsedImage,
7406*8975f5c5SAndroid Build Coastguard Worker         Finish,
7407*8975f5c5SAndroid Build Coastguard Worker         Abort,
7408*8975f5c5SAndroid Build Coastguard Worker     };
7409*8975f5c5SAndroid Build Coastguard Worker     Step currentStep = Step::Start;
7410*8975f5c5SAndroid Build Coastguard Worker 
7411*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(window->makeCurrent(EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7412*8975f5c5SAndroid Build Coastguard Worker 
7413*8975f5c5SAndroid Build Coastguard Worker     // This thread will use window context
7414*8975f5c5SAndroid Build Coastguard Worker     std::thread thread0([&]() {
7415*8975f5c5SAndroid Build Coastguard Worker         ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
7416*8975f5c5SAndroid Build Coastguard Worker 
7417*8975f5c5SAndroid Build Coastguard Worker         window->makeCurrent();
7418*8975f5c5SAndroid Build Coastguard Worker 
7419*8975f5c5SAndroid Build Coastguard Worker         // Create the Image
7420*8975f5c5SAndroid Build Coastguard Worker         GLTexture source;
7421*8975f5c5SAndroid Build Coastguard Worker         createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs,
7422*8975f5c5SAndroid Build Coastguard Worker                                       kLinearColor, source, &image);
7423*8975f5c5SAndroid Build Coastguard Worker 
7424*8975f5c5SAndroid Build Coastguard Worker         sync = eglCreateSyncKHR(window->getDisplay(), EGL_SYNC_FENCE_KHR, nullptr);
7425*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7426*8975f5c5SAndroid Build Coastguard Worker 
7427*8975f5c5SAndroid Build Coastguard Worker         // Wait thread 1 finish using the Image
7428*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Thread0CreatedImage);
7429*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread1UsedImage));
7430*8975f5c5SAndroid Build Coastguard Worker 
7431*8975f5c5SAndroid Build Coastguard Worker         if (!deleteSourceTextureLast)
7432*8975f5c5SAndroid Build Coastguard Worker         {
7433*8975f5c5SAndroid Build Coastguard Worker             // Delete "source" texture first - image buffer will be deleted with the "image"
7434*8975f5c5SAndroid Build Coastguard Worker             source.reset();
7435*8975f5c5SAndroid Build Coastguard Worker         }
7436*8975f5c5SAndroid Build Coastguard Worker 
7437*8975f5c5SAndroid Build Coastguard Worker         // Destroy Image
7438*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
7439*8975f5c5SAndroid Build Coastguard Worker 
7440*8975f5c5SAndroid Build Coastguard Worker         if (deleteSourceTextureLast)
7441*8975f5c5SAndroid Build Coastguard Worker         {
7442*8975f5c5SAndroid Build Coastguard Worker             // Delete "source" texture last - this will delete image buffer
7443*8975f5c5SAndroid Build Coastguard Worker             source.reset();
7444*8975f5c5SAndroid Build Coastguard Worker         }
7445*8975f5c5SAndroid Build Coastguard Worker 
7446*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Finish);
7447*8975f5c5SAndroid Build Coastguard Worker 
7448*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(window->makeCurrent(EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7449*8975f5c5SAndroid Build Coastguard Worker     });
7450*8975f5c5SAndroid Build Coastguard Worker 
7451*8975f5c5SAndroid Build Coastguard Worker     // This thread will use non Shared context
7452*8975f5c5SAndroid Build Coastguard Worker     auto thread1 = [&](EGLDisplay dpy, EGLSurface surface, EGLContext context) {
7453*8975f5c5SAndroid Build Coastguard Worker         ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
7454*8975f5c5SAndroid Build Coastguard Worker 
7455*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread0CreatedImage));
7456*8975f5c5SAndroid Build Coastguard Worker 
7457*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, surface, surface, context));
7458*8975f5c5SAndroid Build Coastguard Worker         eglWaitSyncKHR(dpy, sync, 0);
7459*8975f5c5SAndroid Build Coastguard Worker 
7460*8975f5c5SAndroid Build Coastguard Worker         // Create the target and set up a framebuffer to render into the Image
7461*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fbo;
7462*8975f5c5SAndroid Build Coastguard Worker         GLTexture targetTexture;
7463*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer targetRenderbuffer;
7464*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7465*8975f5c5SAndroid Build Coastguard Worker         if (useTextureAttachment)
7466*8975f5c5SAndroid Build Coastguard Worker         {
7467*8975f5c5SAndroid Build Coastguard Worker             createEGLImageTargetTexture2D(image, targetTexture);
7468*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
7469*8975f5c5SAndroid Build Coastguard Worker                                    targetTexture, 0);
7470*8975f5c5SAndroid Build Coastguard Worker         }
7471*8975f5c5SAndroid Build Coastguard Worker         else
7472*8975f5c5SAndroid Build Coastguard Worker         {
7473*8975f5c5SAndroid Build Coastguard Worker             createEGLImageTargetRenderbuffer(image, targetRenderbuffer);
7474*8975f5c5SAndroid Build Coastguard Worker             glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
7475*8975f5c5SAndroid Build Coastguard Worker                                       targetRenderbuffer);
7476*8975f5c5SAndroid Build Coastguard Worker         }
7477*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7478*8975f5c5SAndroid Build Coastguard Worker 
7479*8975f5c5SAndroid Build Coastguard Worker         // Test that framebuffer has source content
7480*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(0, 0, kLinearColor[0], kLinearColor[1], kLinearColor[2], kLinearColor[3]);
7481*8975f5c5SAndroid Build Coastguard Worker 
7482*8975f5c5SAndroid Build Coastguard Worker         // Create additional target texture
7483*8975f5c5SAndroid Build Coastguard Worker         GLTexture targetTexture2;
7484*8975f5c5SAndroid Build Coastguard Worker         createEGLImageTargetTexture2D(image, targetTexture2);
7485*8975f5c5SAndroid Build Coastguard Worker 
7486*8975f5c5SAndroid Build Coastguard Worker         // Create MSAA framebuffer
7487*8975f5c5SAndroid Build Coastguard Worker         GLTexture msaaColor;
7488*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msaaColor);
7489*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, 1, 1, false);
7490*8975f5c5SAndroid Build Coastguard Worker 
7491*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer msaaFBO;
7492*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
7493*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
7494*8975f5c5SAndroid Build Coastguard Worker                                msaaColor, 0);
7495*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7496*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7497*8975f5c5SAndroid Build Coastguard Worker 
7498*8975f5c5SAndroid Build Coastguard Worker         // Draw Red quad into the MSAA framebuffer
7499*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
7500*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.0f);
7501*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7502*8975f5c5SAndroid Build Coastguard Worker 
7503*8975f5c5SAndroid Build Coastguard Worker         // Resolve into image
7504*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
7505*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
7506*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7507*8975f5c5SAndroid Build Coastguard Worker 
7508*8975f5c5SAndroid Build Coastguard Worker         // Delete "targetTexture2" that may affect RenderPass because it uses same Image
7509*8975f5c5SAndroid Build Coastguard Worker         targetTexture2.reset();
7510*8975f5c5SAndroid Build Coastguard Worker 
7511*8975f5c5SAndroid Build Coastguard Worker         // Start another render pass and blend into the image.
7512*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_BLEND);
7513*8975f5c5SAndroid Build Coastguard Worker         glBlendFunc(GL_ONE, GL_ONE);
7514*8975f5c5SAndroid Build Coastguard Worker 
7515*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_PROGRAM(drawGreen, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
7516*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.0f);
7517*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7518*8975f5c5SAndroid Build Coastguard Worker 
7519*8975f5c5SAndroid Build Coastguard Worker         // Test that resolve and draw worked
7520*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
7521*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
7522*8975f5c5SAndroid Build Coastguard Worker 
7523*8975f5c5SAndroid Build Coastguard Worker         // Draw again to open RenderPass after the read pixels
7524*8975f5c5SAndroid Build Coastguard Worker         glDisable(GL_BLEND);
7525*8975f5c5SAndroid Build Coastguard Worker         drawQuad(drawGreen, essl1_shaders::PositionAttrib(), 0.0f);
7526*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7527*8975f5c5SAndroid Build Coastguard Worker 
7528*8975f5c5SAndroid Build Coastguard Worker         // Delete resources
7529*8975f5c5SAndroid Build Coastguard Worker         fbo.reset();
7530*8975f5c5SAndroid Build Coastguard Worker         targetTexture.reset();
7531*8975f5c5SAndroid Build Coastguard Worker         targetRenderbuffer.reset();
7532*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7533*8975f5c5SAndroid Build Coastguard Worker 
7534*8975f5c5SAndroid Build Coastguard Worker         // Wait thread 0 destroys the Image and source
7535*8975f5c5SAndroid Build Coastguard Worker         threadSynchronization.nextStep(Step::Thread1UsedImage);
7536*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(threadSynchronization.waitForStep(Step::Finish));
7537*8975f5c5SAndroid Build Coastguard Worker 
7538*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
7539*8975f5c5SAndroid Build Coastguard Worker     };
7540*8975f5c5SAndroid Build Coastguard Worker 
7541*8975f5c5SAndroid Build Coastguard Worker     std::array<LockStepThreadFunc, 1> threadFuncs = {
7542*8975f5c5SAndroid Build Coastguard Worker         std::move(thread1),
7543*8975f5c5SAndroid Build Coastguard Worker     };
7544*8975f5c5SAndroid Build Coastguard Worker 
7545*8975f5c5SAndroid Build Coastguard Worker     RunLockStepThreads(getEGLWindow(), threadFuncs.size(), threadFuncs.data());
7546*8975f5c5SAndroid Build Coastguard Worker     thread0.join();
7547*8975f5c5SAndroid Build Coastguard Worker 
7548*8975f5c5SAndroid Build Coastguard Worker     window->makeCurrent();
7549*8975f5c5SAndroid Build Coastguard Worker 
7550*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(currentStep, Step::Abort);
7551*8975f5c5SAndroid Build Coastguard Worker }
7552*8975f5c5SAndroid Build Coastguard Worker 
7553*8975f5c5SAndroid Build Coastguard Worker // Testing Target 2D Texture deleted while still used in the RenderPass as resolve attachment (Image
7554*8975f5c5SAndroid Build Coastguard Worker // destroyed last).
TEST_P(ImageTestES31,TargetTexture2DDeletedWhileInUseAsResolve)7555*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES31, TargetTexture2DDeletedWhileInUseAsResolve)
7556*8975f5c5SAndroid Build Coastguard Worker {
7557*8975f5c5SAndroid Build Coastguard Worker     FramebufferResolveAttachmentDeletedWhileInUseHelper(true, false);
7558*8975f5c5SAndroid Build Coastguard Worker }
7559*8975f5c5SAndroid Build Coastguard Worker 
7560*8975f5c5SAndroid Build Coastguard Worker // Testing Target 2D Texture deleted while still used in the RenderPass as resolve attachment
7561*8975f5c5SAndroid Build Coastguard Worker // (Source deleted last).
TEST_P(ImageTestES31,TargetTexture2DDeletedWhileInUseAsResolve2)7562*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES31, TargetTexture2DDeletedWhileInUseAsResolve2)
7563*8975f5c5SAndroid Build Coastguard Worker {
7564*8975f5c5SAndroid Build Coastguard Worker     FramebufferResolveAttachmentDeletedWhileInUseHelper(true, true);
7565*8975f5c5SAndroid Build Coastguard Worker }
7566*8975f5c5SAndroid Build Coastguard Worker 
7567*8975f5c5SAndroid Build Coastguard Worker // Testing Target Renderbuffer deleted while still used in the RenderPass as resolve attachment
7568*8975f5c5SAndroid Build Coastguard Worker // (Image destroyed last).
TEST_P(ImageTestES31,TargetRenderbufferDeletedWhileInUseAsResolve)7569*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES31, TargetRenderbufferDeletedWhileInUseAsResolve)
7570*8975f5c5SAndroid Build Coastguard Worker {
7571*8975f5c5SAndroid Build Coastguard Worker     FramebufferResolveAttachmentDeletedWhileInUseHelper(false, false);
7572*8975f5c5SAndroid Build Coastguard Worker }
7573*8975f5c5SAndroid Build Coastguard Worker 
7574*8975f5c5SAndroid Build Coastguard Worker // Testing Target Renderbuffer deleted while still used in the RenderPass as resolve attachment
7575*8975f5c5SAndroid Build Coastguard Worker // (Source deleted last).
TEST_P(ImageTestES31,TargetRenderbufferDeletedWhileInUseAsResolve2)7576*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES31, TargetRenderbufferDeletedWhileInUseAsResolve2)
7577*8975f5c5SAndroid Build Coastguard Worker {
7578*8975f5c5SAndroid Build Coastguard Worker     FramebufferResolveAttachmentDeletedWhileInUseHelper(false, true);
7579*8975f5c5SAndroid Build Coastguard Worker }
7580*8975f5c5SAndroid Build Coastguard Worker 
7581*8975f5c5SAndroid Build Coastguard Worker // Test redefining the same GL texture with different EGLImages
TEST_P(ImageTest,RedefineWithMultipleImages)7582*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTest, RedefineWithMultipleImages)
7583*8975f5c5SAndroid Build Coastguard Worker {
7584*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
7585*8975f5c5SAndroid Build Coastguard Worker 
7586*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
7587*8975f5c5SAndroid Build Coastguard Worker 
7588*8975f5c5SAndroid Build Coastguard Worker     GLubyte originalData[4] = {255, 0, 255, 255};
7589*8975f5c5SAndroid Build Coastguard Worker     GLubyte updateData[4]   = {0, 255, 0, 255};
7590*8975f5c5SAndroid Build Coastguard Worker 
7591*8975f5c5SAndroid Build Coastguard Worker     // Create the Images
7592*8975f5c5SAndroid Build Coastguard Worker     GLTexture source1, source2;
7593*8975f5c5SAndroid Build Coastguard Worker     EGLImageKHR image1, image2;
7594*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs, originalData,
7595*8975f5c5SAndroid Build Coastguard Worker                                   source1, &image1);
7596*8975f5c5SAndroid Build Coastguard Worker     createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, kDefaultAttribs, originalData,
7597*8975f5c5SAndroid Build Coastguard Worker                                   source2, &image2);
7598*8975f5c5SAndroid Build Coastguard Worker 
7599*8975f5c5SAndroid Build Coastguard Worker     // Create texture & bind to Image
7600*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
7601*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image1, texture);
7602*8975f5c5SAndroid Build Coastguard Worker 
7603*8975f5c5SAndroid Build Coastguard Worker     // Upload some data between the redefinition
7604*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
7605*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, updateData);
7606*8975f5c5SAndroid Build Coastguard Worker 
7607*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
7608*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
7609*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
7610*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
7611*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7612*8975f5c5SAndroid Build Coastguard Worker 
7613*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
7614*8975f5c5SAndroid Build Coastguard Worker 
7615*8975f5c5SAndroid Build Coastguard Worker     // Bind the second image to this texture
7616*8975f5c5SAndroid Build Coastguard Worker     createEGLImageTargetTexture2D(image2, texture);
7617*8975f5c5SAndroid Build Coastguard Worker 
7618*8975f5c5SAndroid Build Coastguard Worker     // Delete Image
7619*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image1);
7620*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(window->getDisplay(), image2);
7621*8975f5c5SAndroid Build Coastguard Worker 
7622*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
7623*8975f5c5SAndroid Build Coastguard Worker 
7624*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
7625*8975f5c5SAndroid Build Coastguard Worker }
7626*8975f5c5SAndroid Build Coastguard Worker 
7627*8975f5c5SAndroid Build Coastguard Worker // Regression test to check that sRGB texture can be used to create image in sRGB colorspace.
7628*8975f5c5SAndroid Build Coastguard Worker // Also check that creating image using sRGB texture in linear colorspace wouldn't fail.
TEST_P(ImageTestES3,CreatesRGBImages)7629*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImageTestES3, CreatesRGBImages)
7630*8975f5c5SAndroid Build Coastguard Worker {
7631*8975f5c5SAndroid Build Coastguard Worker     EGLWindow *window = getEGLWindow();
7632*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt());
7633*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_sRGB"));
7634*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
7635*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
7636*8975f5c5SAndroid Build Coastguard Worker         !IsEGLDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_colorspace"));
7637*8975f5c5SAndroid Build Coastguard Worker 
7638*8975f5c5SAndroid Build Coastguard Worker     std::vector<EGLint> colorSpaces = {EGL_GL_COLORSPACE_SRGB_KHR, EGL_GL_COLORSPACE_LINEAR_KHR};
7639*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kWidth        = 2;
7640*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kHeight       = 2;
7641*8975f5c5SAndroid Build Coastguard Worker 
7642*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < colorSpaces.size(); i++)
7643*8975f5c5SAndroid Build Coastguard Worker     {
7644*8975f5c5SAndroid Build Coastguard Worker         // Create sRGB texture
7645*8975f5c5SAndroid Build Coastguard Worker         GLTexture sRGBTexture;
7646*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, sRGBTexture);
7647*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, kWidth, kHeight, 0, GL_RGBA,
7648*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, nullptr);
7649*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7650*8975f5c5SAndroid Build Coastguard Worker 
7651*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
7652*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
7653*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
7654*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
7655*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
7656*8975f5c5SAndroid Build Coastguard Worker 
7657*8975f5c5SAndroid Build Coastguard Worker         EGLint createImageAttribs[] = {
7658*8975f5c5SAndroid Build Coastguard Worker             EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_GL_COLORSPACE_KHR, colorSpaces[i], EGL_NONE,
7659*8975f5c5SAndroid Build Coastguard Worker         };
7660*8975f5c5SAndroid Build Coastguard Worker 
7661*8975f5c5SAndroid Build Coastguard Worker         // Create the Image using sRGB texture
7662*8975f5c5SAndroid Build Coastguard Worker         EGLImageKHR image =
7663*8975f5c5SAndroid Build Coastguard Worker             eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
7664*8975f5c5SAndroid Build Coastguard Worker                               reinterpretHelper<EGLClientBuffer>(sRGBTexture), createImageAttribs);
7665*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS();
7666*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(image, EGL_NO_IMAGE_KHR);
7667*8975f5c5SAndroid Build Coastguard Worker 
7668*8975f5c5SAndroid Build Coastguard Worker         // Clean up
7669*8975f5c5SAndroid Build Coastguard Worker         eglDestroyImageKHR(window->getDisplay(), image);
7670*8975f5c5SAndroid Build Coastguard Worker     }
7671*8975f5c5SAndroid Build Coastguard Worker }
7672*8975f5c5SAndroid Build Coastguard Worker 
7673*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ImageTest);
7674*8975f5c5SAndroid Build Coastguard Worker 
7675*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ImageTestES3);
7676*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(ImageTestES3);
7677*8975f5c5SAndroid Build Coastguard Worker 
7678*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ImageTestES31);
7679*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(ImageTestES31);
7680*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
7681