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(¤tStep, &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(¤tStep, &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(¤tStep, &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(¤tStep, &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(¤tStep, &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(¤tStep, &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(¤tStep, &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(¤tStep, &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