xref: /aosp_15_r20/external/angle/src/tests/egl_tests/EGLProtectedContentTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 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 // EGLProtectedContentTest.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //   EGL extension EGL_EXT_protected_content
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include <gtest/gtest.h>
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include <chrono>
13*8975f5c5SAndroid Build Coastguard Worker #include <iostream>
14*8975f5c5SAndroid Build Coastguard Worker #include <thread>
15*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "util/EGLWindow.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "util/OSWindow.h"
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker constexpr bool kSleepForVisualVerification = false;
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker using namespace std::chrono_literals;
22*8975f5c5SAndroid Build Coastguard Worker 
23*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLProtectedContentTest);
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker class EGLProtectedContentTest : public ANGLETest<>
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker   public:
EGLProtectedContentTest()30*8975f5c5SAndroid Build Coastguard Worker     EGLProtectedContentTest() : mDisplay(EGL_NO_DISPLAY) {}
31*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()32*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
33*8975f5c5SAndroid Build Coastguard Worker     {
34*8975f5c5SAndroid Build Coastguard Worker         EGLint dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE};
35*8975f5c5SAndroid Build Coastguard Worker         mDisplay           = eglGetPlatformDisplayEXT(
36*8975f5c5SAndroid Build Coastguard Worker             EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs);
37*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY);
38*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr));
39*8975f5c5SAndroid Build Coastguard Worker         mMajorVersion = GetParam().majorVersion;
40*8975f5c5SAndroid Build Coastguard Worker     }
41*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()42*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
43*8975f5c5SAndroid Build Coastguard Worker     {
44*8975f5c5SAndroid Build Coastguard Worker         if (mDisplay != EGL_NO_DISPLAY)
45*8975f5c5SAndroid Build Coastguard Worker         {
46*8975f5c5SAndroid Build Coastguard Worker             eglTerminate(mDisplay);
47*8975f5c5SAndroid Build Coastguard Worker             eglReleaseThread();
48*8975f5c5SAndroid Build Coastguard Worker             mDisplay = EGL_NO_DISPLAY;
49*8975f5c5SAndroid Build Coastguard Worker         }
50*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "Error during test TearDown";
51*8975f5c5SAndroid Build Coastguard Worker     }
52*8975f5c5SAndroid Build Coastguard Worker 
chooseConfig(EGLConfig * config,bool mutableRenderBuffer=false)53*8975f5c5SAndroid Build Coastguard Worker     bool chooseConfig(EGLConfig *config, bool mutableRenderBuffer = false)
54*8975f5c5SAndroid Build Coastguard Worker     {
55*8975f5c5SAndroid Build Coastguard Worker         EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT;
56*8975f5c5SAndroid Build Coastguard Worker         EGLint attribs[]     = {
57*8975f5c5SAndroid Build Coastguard Worker             EGL_RED_SIZE,
58*8975f5c5SAndroid Build Coastguard Worker             8,
59*8975f5c5SAndroid Build Coastguard Worker             EGL_GREEN_SIZE,
60*8975f5c5SAndroid Build Coastguard Worker             8,
61*8975f5c5SAndroid Build Coastguard Worker             EGL_BLUE_SIZE,
62*8975f5c5SAndroid Build Coastguard Worker             8,
63*8975f5c5SAndroid Build Coastguard Worker             EGL_ALPHA_SIZE,
64*8975f5c5SAndroid Build Coastguard Worker             8,
65*8975f5c5SAndroid Build Coastguard Worker             EGL_RENDERABLE_TYPE,
66*8975f5c5SAndroid Build Coastguard Worker             clientVersion,
67*8975f5c5SAndroid Build Coastguard Worker             EGL_SURFACE_TYPE,
68*8975f5c5SAndroid Build Coastguard Worker             EGL_WINDOW_BIT |
69*8975f5c5SAndroid Build Coastguard Worker                 (mutableRenderBuffer ? EGL_MUTABLE_RENDER_BUFFER_BIT_KHR : EGL_PBUFFER_BIT),
70*8975f5c5SAndroid Build Coastguard Worker             EGL_BIND_TO_TEXTURE_RGBA,
71*8975f5c5SAndroid Build Coastguard Worker             EGL_TRUE,
72*8975f5c5SAndroid Build Coastguard Worker             EGL_NONE};
73*8975f5c5SAndroid Build Coastguard Worker 
74*8975f5c5SAndroid Build Coastguard Worker         EGLint count = 0;
75*8975f5c5SAndroid Build Coastguard Worker         bool result  = eglChooseConfig(mDisplay, attribs, config, 1, &count);
76*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(result);
77*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_TRUE(count > 0);
78*8975f5c5SAndroid Build Coastguard Worker         return result;
79*8975f5c5SAndroid Build Coastguard Worker     }
80*8975f5c5SAndroid Build Coastguard Worker 
createContext(EGLBoolean isProtected,EGLConfig config,EGLContext * context)81*8975f5c5SAndroid Build Coastguard Worker     bool createContext(EGLBoolean isProtected, EGLConfig config, EGLContext *context)
82*8975f5c5SAndroid Build Coastguard Worker     {
83*8975f5c5SAndroid Build Coastguard Worker         bool result                 = false;
84*8975f5c5SAndroid Build Coastguard Worker         EGLint attribsProtected[]   = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion,
85*8975f5c5SAndroid Build Coastguard Worker                                        EGL_PROTECTED_CONTENT_EXT, EGL_TRUE, EGL_NONE};
86*8975f5c5SAndroid Build Coastguard Worker         EGLint attribsUnProtected[] = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion, EGL_NONE};
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker         *context = eglCreateContext(mDisplay, config, nullptr,
89*8975f5c5SAndroid Build Coastguard Worker                                     (isProtected ? attribsProtected : attribsUnProtected));
90*8975f5c5SAndroid Build Coastguard Worker         result   = (*context != EGL_NO_CONTEXT);
91*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
92*8975f5c5SAndroid Build Coastguard Worker         return result;
93*8975f5c5SAndroid Build Coastguard Worker     }
94*8975f5c5SAndroid Build Coastguard Worker 
createPbufferSurface(EGLBoolean isProtected,EGLConfig config,EGLSurface * surface)95*8975f5c5SAndroid Build Coastguard Worker     bool createPbufferSurface(EGLBoolean isProtected, EGLConfig config, EGLSurface *surface)
96*8975f5c5SAndroid Build Coastguard Worker     {
97*8975f5c5SAndroid Build Coastguard Worker         bool result                 = false;
98*8975f5c5SAndroid Build Coastguard Worker         EGLint attribsProtected[]   = {EGL_WIDTH,
99*8975f5c5SAndroid Build Coastguard Worker                                        kWidth,
100*8975f5c5SAndroid Build Coastguard Worker                                        EGL_HEIGHT,
101*8975f5c5SAndroid Build Coastguard Worker                                        kHeight,
102*8975f5c5SAndroid Build Coastguard Worker                                        EGL_TEXTURE_FORMAT,
103*8975f5c5SAndroid Build Coastguard Worker                                        EGL_TEXTURE_RGBA,
104*8975f5c5SAndroid Build Coastguard Worker                                        EGL_TEXTURE_TARGET,
105*8975f5c5SAndroid Build Coastguard Worker                                        EGL_TEXTURE_2D,
106*8975f5c5SAndroid Build Coastguard Worker                                        EGL_PROTECTED_CONTENT_EXT,
107*8975f5c5SAndroid Build Coastguard Worker                                        EGL_TRUE,
108*8975f5c5SAndroid Build Coastguard Worker                                        EGL_NONE};
109*8975f5c5SAndroid Build Coastguard Worker         EGLint attribsUnProtected[] = {EGL_WIDTH,
110*8975f5c5SAndroid Build Coastguard Worker                                        kWidth,
111*8975f5c5SAndroid Build Coastguard Worker                                        EGL_HEIGHT,
112*8975f5c5SAndroid Build Coastguard Worker                                        kHeight,
113*8975f5c5SAndroid Build Coastguard Worker                                        EGL_TEXTURE_FORMAT,
114*8975f5c5SAndroid Build Coastguard Worker                                        EGL_TEXTURE_RGBA,
115*8975f5c5SAndroid Build Coastguard Worker                                        EGL_TEXTURE_TARGET,
116*8975f5c5SAndroid Build Coastguard Worker                                        EGL_TEXTURE_2D,
117*8975f5c5SAndroid Build Coastguard Worker                                        EGL_NONE};
118*8975f5c5SAndroid Build Coastguard Worker 
119*8975f5c5SAndroid Build Coastguard Worker         *surface = eglCreatePbufferSurface(mDisplay, config,
120*8975f5c5SAndroid Build Coastguard Worker                                            (isProtected ? attribsProtected : attribsUnProtected));
121*8975f5c5SAndroid Build Coastguard Worker         result   = (*surface != EGL_NO_SURFACE);
122*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
123*8975f5c5SAndroid Build Coastguard Worker         return result;
124*8975f5c5SAndroid Build Coastguard Worker     }
125*8975f5c5SAndroid Build Coastguard Worker 
createWindowSurface(EGLBoolean isProtected,EGLConfig config,EGLNativeWindowType win,EGLSurface * surface)126*8975f5c5SAndroid Build Coastguard Worker     bool createWindowSurface(EGLBoolean isProtected,
127*8975f5c5SAndroid Build Coastguard Worker                              EGLConfig config,
128*8975f5c5SAndroid Build Coastguard Worker                              EGLNativeWindowType win,
129*8975f5c5SAndroid Build Coastguard Worker                              EGLSurface *surface)
130*8975f5c5SAndroid Build Coastguard Worker     {
131*8975f5c5SAndroid Build Coastguard Worker         bool result                 = false;
132*8975f5c5SAndroid Build Coastguard Worker         EGLint attribsProtected[]   = {EGL_PROTECTED_CONTENT_EXT, EGL_TRUE, EGL_NONE};
133*8975f5c5SAndroid Build Coastguard Worker         EGLint attribsUnProtected[] = {EGL_NONE};
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker         *surface = eglCreateWindowSurface(mDisplay, config, win,
136*8975f5c5SAndroid Build Coastguard Worker                                           (isProtected ? attribsProtected : attribsUnProtected));
137*8975f5c5SAndroid Build Coastguard Worker         result   = (*surface != EGL_NO_SURFACE);
138*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
139*8975f5c5SAndroid Build Coastguard Worker         return result;
140*8975f5c5SAndroid Build Coastguard Worker     }
141*8975f5c5SAndroid Build Coastguard Worker 
createImage(EGLBoolean isProtected,EGLContext context,EGLenum target,EGLClientBuffer buffer,EGLImage * image)142*8975f5c5SAndroid Build Coastguard Worker     bool createImage(EGLBoolean isProtected,
143*8975f5c5SAndroid Build Coastguard Worker                      EGLContext context,
144*8975f5c5SAndroid Build Coastguard Worker                      EGLenum target,
145*8975f5c5SAndroid Build Coastguard Worker                      EGLClientBuffer buffer,
146*8975f5c5SAndroid Build Coastguard Worker                      EGLImage *image)
147*8975f5c5SAndroid Build Coastguard Worker     {
148*8975f5c5SAndroid Build Coastguard Worker         bool result                  = false;
149*8975f5c5SAndroid Build Coastguard Worker         EGLAttrib attribsProtected[] = {EGL_PROTECTED_CONTENT_EXT, EGL_TRUE, EGL_NONE};
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker         *image = eglCreateImage(mDisplay, context, target, buffer,
152*8975f5c5SAndroid Build Coastguard Worker                                 (isProtected ? attribsProtected : nullptr));
153*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_SUCCESS();
154*8975f5c5SAndroid Build Coastguard Worker         result = (*image != EGL_NO_SURFACE);
155*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
156*8975f5c5SAndroid Build Coastguard Worker         return result;
157*8975f5c5SAndroid Build Coastguard Worker     }
158*8975f5c5SAndroid Build Coastguard Worker 
createTexture(EGLBoolean isProtected,GLuint * textureId)159*8975f5c5SAndroid Build Coastguard Worker     bool createTexture(EGLBoolean isProtected, GLuint *textureId)
160*8975f5c5SAndroid Build Coastguard Worker     {
161*8975f5c5SAndroid Build Coastguard Worker         bool result    = false;
162*8975f5c5SAndroid Build Coastguard Worker         GLuint texture = 0;
163*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &texture);
164*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
165*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
166*8975f5c5SAndroid Build Coastguard Worker                      nullptr);
167*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
168*8975f5c5SAndroid Build Coastguard Worker         if (isProtected)
169*8975f5c5SAndroid Build Coastguard Worker         {
170*8975f5c5SAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_PROTECTED_EXT, GL_TRUE);
171*8975f5c5SAndroid Build Coastguard Worker             // GL_INVALID_OPERATION expected when context is not protected too.
172*8975f5c5SAndroid Build Coastguard Worker             GLenum error = glGetError();
173*8975f5c5SAndroid Build Coastguard Worker             if (error == GL_INVALID_OPERATION)
174*8975f5c5SAndroid Build Coastguard Worker             {
175*8975f5c5SAndroid Build Coastguard Worker                 return false;
176*8975f5c5SAndroid Build Coastguard Worker             }
177*8975f5c5SAndroid Build Coastguard Worker         }
178*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
179*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
180*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
181*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
182*8975f5c5SAndroid Build Coastguard Worker         result = (texture != 0);
183*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
184*8975f5c5SAndroid Build Coastguard Worker         *textureId = texture;
185*8975f5c5SAndroid Build Coastguard Worker         return result;
186*8975f5c5SAndroid Build Coastguard Worker     }
187*8975f5c5SAndroid Build Coastguard Worker 
createTextureFromImage(EGLImage image,GLuint * textureId)188*8975f5c5SAndroid Build Coastguard Worker     bool createTextureFromImage(EGLImage image, GLuint *textureId)
189*8975f5c5SAndroid Build Coastguard Worker     {
190*8975f5c5SAndroid Build Coastguard Worker         bool result    = false;
191*8975f5c5SAndroid Build Coastguard Worker         GLuint texture = 0;
192*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &texture);
193*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
194*8975f5c5SAndroid Build Coastguard Worker         glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
195*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
196*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
197*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
198*8975f5c5SAndroid Build Coastguard Worker         result = (texture != 0);
199*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
200*8975f5c5SAndroid Build Coastguard Worker         *textureId = texture;
201*8975f5c5SAndroid Build Coastguard Worker         return result;
202*8975f5c5SAndroid Build Coastguard Worker     }
203*8975f5c5SAndroid Build Coastguard Worker 
createTextureFromPbuffer(EGLSurface pBuffer,GLuint * textureId)204*8975f5c5SAndroid Build Coastguard Worker     bool createTextureFromPbuffer(EGLSurface pBuffer, GLuint *textureId)
205*8975f5c5SAndroid Build Coastguard Worker     {
206*8975f5c5SAndroid Build Coastguard Worker         bool result    = false;
207*8975f5c5SAndroid Build Coastguard Worker         GLuint texture = 0;
208*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &texture);
209*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
210*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
211*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
212*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
213*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
214*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
215*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(texture != 0);
216*8975f5c5SAndroid Build Coastguard Worker         result = eglBindTexImage(mDisplay, pBuffer, EGL_BACK_BUFFER);
217*8975f5c5SAndroid Build Coastguard Worker         glViewport(0, 0, kWidth, kHeight);
218*8975f5c5SAndroid Build Coastguard Worker         *textureId = texture;
219*8975f5c5SAndroid Build Coastguard Worker         return result;
220*8975f5c5SAndroid Build Coastguard Worker     }
221*8975f5c5SAndroid Build Coastguard Worker 
fillTexture(GLuint textureId,GLColor color)222*8975f5c5SAndroid Build Coastguard Worker     bool fillTexture(GLuint textureId, GLColor color)
223*8975f5c5SAndroid Build Coastguard Worker     {
224*8975f5c5SAndroid Build Coastguard Worker         GLuint pixels[kWidth * kHeight];
225*8975f5c5SAndroid Build Coastguard Worker         for (uint32_t i = 0; i < (kWidth * kHeight); i++)
226*8975f5c5SAndroid Build Coastguard Worker         {
227*8975f5c5SAndroid Build Coastguard Worker             pixels[i] = *(GLuint *)(color.data());
228*8975f5c5SAndroid Build Coastguard Worker         }
229*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textureId);
230*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
231*8975f5c5SAndroid Build Coastguard Worker                         (void *)pixels);
232*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
233*8975f5c5SAndroid Build Coastguard Worker         return true;
234*8975f5c5SAndroid Build Coastguard Worker     }
235*8975f5c5SAndroid Build Coastguard Worker 
renderTexture(GLuint textureId)236*8975f5c5SAndroid Build Coastguard Worker     bool renderTexture(GLuint textureId)
237*8975f5c5SAndroid Build Coastguard Worker     {
238*8975f5c5SAndroid Build Coastguard Worker         const char *kVertexShader   = R"(
239*8975f5c5SAndroid Build Coastguard Worker             precision highp float;
240*8975f5c5SAndroid Build Coastguard Worker             attribute vec4 position;
241*8975f5c5SAndroid Build Coastguard Worker             varying vec2 texcoord;
242*8975f5c5SAndroid Build Coastguard Worker 
243*8975f5c5SAndroid Build Coastguard Worker             void main()
244*8975f5c5SAndroid Build Coastguard Worker             {
245*8975f5c5SAndroid Build Coastguard Worker                 gl_Position = vec4(position.xy, 0.0, 1.0);
246*8975f5c5SAndroid Build Coastguard Worker                 texcoord = (position.xy * 0.5) + 0.5;
247*8975f5c5SAndroid Build Coastguard Worker             }
248*8975f5c5SAndroid Build Coastguard Worker         )";
249*8975f5c5SAndroid Build Coastguard Worker         const char *kFragmentShader = R"(
250*8975f5c5SAndroid Build Coastguard Worker             precision highp float;
251*8975f5c5SAndroid Build Coastguard Worker             uniform sampler2D tex;
252*8975f5c5SAndroid Build Coastguard Worker             varying vec2 texcoord;
253*8975f5c5SAndroid Build Coastguard Worker 
254*8975f5c5SAndroid Build Coastguard Worker             void main()
255*8975f5c5SAndroid Build Coastguard Worker             {
256*8975f5c5SAndroid Build Coastguard Worker                 gl_FragColor = texture2D(tex, texcoord);
257*8975f5c5SAndroid Build Coastguard Worker             }
258*8975f5c5SAndroid Build Coastguard Worker         )";
259*8975f5c5SAndroid Build Coastguard Worker 
260*8975f5c5SAndroid Build Coastguard Worker         GLuint program = CompileProgram(kVertexShader, kFragmentShader);
261*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(program);
262*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, textureId);
263*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
264*8975f5c5SAndroid Build Coastguard Worker         GLint texture2DUniformLocation = glGetUniformLocation(program, "tex");
265*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(texture2DUniformLocation, 0);
266*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "position", 0.5f);
267*8975f5c5SAndroid Build Coastguard Worker         glDeleteProgram(program);
268*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
269*8975f5c5SAndroid Build Coastguard Worker         return true;
270*8975f5c5SAndroid Build Coastguard Worker     }
271*8975f5c5SAndroid Build Coastguard Worker 
createRenderbuffer(GLuint * renderbuffer)272*8975f5c5SAndroid Build Coastguard Worker     bool createRenderbuffer(GLuint *renderbuffer)
273*8975f5c5SAndroid Build Coastguard Worker     {
274*8975f5c5SAndroid Build Coastguard Worker         bool result   = false;
275*8975f5c5SAndroid Build Coastguard Worker         *renderbuffer = 0;
276*8975f5c5SAndroid Build Coastguard Worker         glGenRenderbuffers(1, renderbuffer);
277*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, *renderbuffer);
278*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, kWidth, kHeight);
279*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
280*8975f5c5SAndroid Build Coastguard Worker         result = (*renderbuffer != 0);
281*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
282*8975f5c5SAndroid Build Coastguard Worker         return result;
283*8975f5c5SAndroid Build Coastguard Worker     }
284*8975f5c5SAndroid Build Coastguard Worker 
createRenderbufferFromImage(EGLImage image,GLuint * renderbuffer)285*8975f5c5SAndroid Build Coastguard Worker     bool createRenderbufferFromImage(EGLImage image, GLuint *renderbuffer)
286*8975f5c5SAndroid Build Coastguard Worker     {
287*8975f5c5SAndroid Build Coastguard Worker         bool result   = false;
288*8975f5c5SAndroid Build Coastguard Worker         *renderbuffer = 0;
289*8975f5c5SAndroid Build Coastguard Worker         glGenRenderbuffers(1, renderbuffer);
290*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, *renderbuffer);
291*8975f5c5SAndroid Build Coastguard Worker         glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, image);
292*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
293*8975f5c5SAndroid Build Coastguard Worker         result = (*renderbuffer != 0);
294*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
295*8975f5c5SAndroid Build Coastguard Worker         return result;
296*8975f5c5SAndroid Build Coastguard Worker     }
297*8975f5c5SAndroid Build Coastguard Worker 
createAndroidClientBuffer(bool useProtected,bool useRenderbuffer,bool useTexture,EGLClientBuffer * clientBuffer)298*8975f5c5SAndroid Build Coastguard Worker     bool createAndroidClientBuffer(bool useProtected,
299*8975f5c5SAndroid Build Coastguard Worker                                    bool useRenderbuffer,
300*8975f5c5SAndroid Build Coastguard Worker                                    bool useTexture,
301*8975f5c5SAndroid Build Coastguard Worker                                    EGLClientBuffer *clientBuffer)
302*8975f5c5SAndroid Build Coastguard Worker     {
303*8975f5c5SAndroid Build Coastguard Worker         bool result = false;
304*8975f5c5SAndroid Build Coastguard Worker         EGLint nativeBufferUsage =
305*8975f5c5SAndroid Build Coastguard Worker             0 | (useProtected ? EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID : 0) |
306*8975f5c5SAndroid Build Coastguard Worker             (useRenderbuffer ? EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID : 0) |
307*8975f5c5SAndroid Build Coastguard Worker             (useTexture ? EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID : 0);
308*8975f5c5SAndroid Build Coastguard Worker 
309*8975f5c5SAndroid Build Coastguard Worker         EGLint attribs[] = {EGL_WIDTH,
310*8975f5c5SAndroid Build Coastguard Worker                             kWidth,
311*8975f5c5SAndroid Build Coastguard Worker                             EGL_HEIGHT,
312*8975f5c5SAndroid Build Coastguard Worker                             kHeight,
313*8975f5c5SAndroid Build Coastguard Worker                             EGL_RED_SIZE,
314*8975f5c5SAndroid Build Coastguard Worker                             8,
315*8975f5c5SAndroid Build Coastguard Worker                             EGL_GREEN_SIZE,
316*8975f5c5SAndroid Build Coastguard Worker                             8,
317*8975f5c5SAndroid Build Coastguard Worker                             EGL_BLUE_SIZE,
318*8975f5c5SAndroid Build Coastguard Worker                             8,
319*8975f5c5SAndroid Build Coastguard Worker                             EGL_ALPHA_SIZE,
320*8975f5c5SAndroid Build Coastguard Worker                             8,
321*8975f5c5SAndroid Build Coastguard Worker                             EGL_NATIVE_BUFFER_USAGE_ANDROID,
322*8975f5c5SAndroid Build Coastguard Worker                             nativeBufferUsage,
323*8975f5c5SAndroid Build Coastguard Worker                             EGL_NONE};
324*8975f5c5SAndroid Build Coastguard Worker 
325*8975f5c5SAndroid Build Coastguard Worker         *clientBuffer = eglCreateNativeClientBufferANDROID(attribs);
326*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EGL_SUCCESS();
327*8975f5c5SAndroid Build Coastguard Worker         result = (*clientBuffer != nullptr);
328*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(result);
329*8975f5c5SAndroid Build Coastguard Worker         return result;
330*8975f5c5SAndroid Build Coastguard Worker     }
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker     void pbufferTest(bool isProtectedContext, bool isProtectedSurface);
333*8975f5c5SAndroid Build Coastguard Worker     void windowTest(bool isProtectedContext,
334*8975f5c5SAndroid Build Coastguard Worker                     bool isProtectedSurface,
335*8975f5c5SAndroid Build Coastguard Worker                     bool mutableRenderBuffer = false);
336*8975f5c5SAndroid Build Coastguard Worker     void textureTest(bool isProtectedContext, bool isProtectedTexture);
337*8975f5c5SAndroid Build Coastguard Worker     void textureFromImageTest(bool isProtectedContext, bool isProtectedTexture);
338*8975f5c5SAndroid Build Coastguard Worker     void textureFromPbufferTest(bool isProtectedContext, bool isProtectedTexture);
339*8975f5c5SAndroid Build Coastguard Worker     void textureFromAndroidNativeBufferTest(bool isProtectedContext, bool isProtectedTexture);
340*8975f5c5SAndroid Build Coastguard Worker 
checkSwapBuffersResult(const std::string color,bool isProtectedContext,bool isProtectedSurface)341*8975f5c5SAndroid Build Coastguard Worker     void checkSwapBuffersResult(const std::string color,
342*8975f5c5SAndroid Build Coastguard Worker                                 bool isProtectedContext,
343*8975f5c5SAndroid Build Coastguard Worker                                 bool isProtectedSurface)
344*8975f5c5SAndroid Build Coastguard Worker     {
345*8975f5c5SAndroid Build Coastguard Worker         if (kSleepForVisualVerification)
346*8975f5c5SAndroid Build Coastguard Worker         {
347*8975f5c5SAndroid Build Coastguard Worker             std::this_thread::sleep_for(1s);
348*8975f5c5SAndroid Build Coastguard Worker         }
349*8975f5c5SAndroid Build Coastguard Worker         if (isProtectedContext)
350*8975f5c5SAndroid Build Coastguard Worker         {
351*8975f5c5SAndroid Build Coastguard Worker             if (isProtectedSurface)
352*8975f5c5SAndroid Build Coastguard Worker             {
353*8975f5c5SAndroid Build Coastguard Worker                 std::cout << "Operator should see color: " << color << std::endl;
354*8975f5c5SAndroid Build Coastguard Worker             }
355*8975f5c5SAndroid Build Coastguard Worker             else
356*8975f5c5SAndroid Build Coastguard Worker             {
357*8975f5c5SAndroid Build Coastguard Worker                 std::cout << "Operator should see color: BLACK" << std::endl;
358*8975f5c5SAndroid Build Coastguard Worker             }
359*8975f5c5SAndroid Build Coastguard Worker         }
360*8975f5c5SAndroid Build Coastguard Worker         else
361*8975f5c5SAndroid Build Coastguard Worker         {
362*8975f5c5SAndroid Build Coastguard Worker             if (isProtectedSurface)
363*8975f5c5SAndroid Build Coastguard Worker             {
364*8975f5c5SAndroid Build Coastguard Worker                 std::cout << "Operator should see color: BLACK" << std::endl;
365*8975f5c5SAndroid Build Coastguard Worker             }
366*8975f5c5SAndroid Build Coastguard Worker             else
367*8975f5c5SAndroid Build Coastguard Worker             {
368*8975f5c5SAndroid Build Coastguard Worker                 std::cout << "Operator should see color: " << color << std::endl;
369*8975f5c5SAndroid Build Coastguard Worker             }
370*8975f5c5SAndroid Build Coastguard Worker         }
371*8975f5c5SAndroid Build Coastguard Worker     }
372*8975f5c5SAndroid Build Coastguard Worker 
373*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay mDisplay         = EGL_NO_DISPLAY;
374*8975f5c5SAndroid Build Coastguard Worker     EGLint mMajorVersion        = 0;
375*8975f5c5SAndroid Build Coastguard Worker     static const EGLint kWidth  = 16;
376*8975f5c5SAndroid Build Coastguard Worker     static const EGLint kHeight = 16;
377*8975f5c5SAndroid Build Coastguard Worker };
378*8975f5c5SAndroid Build Coastguard Worker 
pbufferTest(bool isProtectedContext,bool isProtectedSurface)379*8975f5c5SAndroid Build Coastguard Worker void EGLProtectedContentTest::pbufferTest(bool isProtectedContext, bool isProtectedSurface)
380*8975f5c5SAndroid Build Coastguard Worker {
381*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
382*8975f5c5SAndroid Build Coastguard Worker 
383*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
384*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
385*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
386*8975f5c5SAndroid Build Coastguard Worker 
387*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
388*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(isProtectedContext, config, &context));
389*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
390*8975f5c5SAndroid Build Coastguard Worker 
391*8975f5c5SAndroid Build Coastguard Worker     EGLSurface pBufferSurface = EGL_NO_SURFACE;
392*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createPbufferSurface(isProtectedSurface, config, &pBufferSurface));
393*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreatePbufferSurface failed.";
394*8975f5c5SAndroid Build Coastguard Worker 
395*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, pBufferSurface, pBufferSurface, context));
396*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
397*8975f5c5SAndroid Build Coastguard Worker 
398*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
399*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
400*8975f5c5SAndroid Build Coastguard Worker 
401*8975f5c5SAndroid Build Coastguard Worker     glFinish();
402*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR() << "glFinish failed";
403*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
404*8975f5c5SAndroid Build Coastguard Worker 
405*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
406*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
407*8975f5c5SAndroid Build Coastguard Worker 
408*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, pBufferSurface);
409*8975f5c5SAndroid Build Coastguard Worker     pBufferSurface = EGL_NO_SURFACE;
410*8975f5c5SAndroid Build Coastguard Worker 
411*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
412*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
413*8975f5c5SAndroid Build Coastguard Worker }
414*8975f5c5SAndroid Build Coastguard Worker 
415*8975f5c5SAndroid Build Coastguard Worker // Unprotected context with Unprotected PbufferSurface
TEST_P(EGLProtectedContentTest,UnprotectedContextWithUnprotectedPbufferSurface)416*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedPbufferSurface)
417*8975f5c5SAndroid Build Coastguard Worker {
418*8975f5c5SAndroid Build Coastguard Worker     pbufferTest(false, false);
419*8975f5c5SAndroid Build Coastguard Worker }
420*8975f5c5SAndroid Build Coastguard Worker 
windowTest(bool isProtectedContext,bool isProtectedSurface,bool mutableRenderBuffer)421*8975f5c5SAndroid Build Coastguard Worker void EGLProtectedContentTest::windowTest(bool isProtectedContext,
422*8975f5c5SAndroid Build Coastguard Worker                                          bool isProtectedSurface,
423*8975f5c5SAndroid Build Coastguard Worker                                          bool mutableRenderBuffer)
424*8975f5c5SAndroid Build Coastguard Worker {
425*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
426*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(mutableRenderBuffer &&
427*8975f5c5SAndroid Build Coastguard Worker                        !IsEGLDisplayExtensionEnabled(mDisplay, "EGL_KHR_mutable_render_buffer"));
428*8975f5c5SAndroid Build Coastguard Worker 
429*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
430*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config, mutableRenderBuffer));
431*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
432*8975f5c5SAndroid Build Coastguard Worker 
433*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
434*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(isProtectedContext, config, &context));
435*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
436*8975f5c5SAndroid Build Coastguard Worker 
437*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
438*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("ProtectedContentTest", kWidth, kHeight);
439*8975f5c5SAndroid Build Coastguard Worker     EGLSurface windowSurface          = EGL_NO_SURFACE;
440*8975f5c5SAndroid Build Coastguard Worker     EGLBoolean createWinSurfaceResult = createWindowSurface(
441*8975f5c5SAndroid Build Coastguard Worker         isProtectedSurface, config, osWindow->getNativeWindow(), &windowSurface);
442*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWinSurfaceResult);
443*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
444*8975f5c5SAndroid Build Coastguard Worker 
445*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context));
446*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
447*8975f5c5SAndroid Build Coastguard Worker 
448*8975f5c5SAndroid Build Coastguard Worker     if (mutableRenderBuffer)
449*8975f5c5SAndroid Build Coastguard Worker     {
450*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(
451*8975f5c5SAndroid Build Coastguard Worker             eglSurfaceAttrib(mDisplay, windowSurface, EGL_RENDER_BUFFER, EGL_SINGLE_BUFFER));
452*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "eglSurfaceAttrib failed.";
453*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(mDisplay, windowSurface);
454*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
455*8975f5c5SAndroid Build Coastguard Worker     }
456*8975f5c5SAndroid Build Coastguard Worker 
457*8975f5c5SAndroid Build Coastguard Worker     // Red
458*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
459*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
460*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR() << "glClear failed";
461*8975f5c5SAndroid Build Coastguard Worker     eglSwapBuffers(mDisplay, windowSurface);
462*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
463*8975f5c5SAndroid Build Coastguard Worker     checkSwapBuffersResult("RED", isProtectedContext, isProtectedSurface);
464*8975f5c5SAndroid Build Coastguard Worker 
465*8975f5c5SAndroid Build Coastguard Worker     // Green
466*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0, 1.0, 0.0, 1.0);
467*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
468*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR() << "glClear failed";
469*8975f5c5SAndroid Build Coastguard Worker     eglSwapBuffers(mDisplay, windowSurface);
470*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
471*8975f5c5SAndroid Build Coastguard Worker     checkSwapBuffersResult("GREEN", isProtectedContext, isProtectedSurface);
472*8975f5c5SAndroid Build Coastguard Worker 
473*8975f5c5SAndroid Build Coastguard Worker     // Blue
474*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0, 0.0, 1.0, 1.0);
475*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
476*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR() << "glClear failed";
477*8975f5c5SAndroid Build Coastguard Worker     eglSwapBuffers(mDisplay, windowSurface);
478*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
479*8975f5c5SAndroid Build Coastguard Worker     checkSwapBuffersResult("BLUE", isProtectedContext, isProtectedSurface);
480*8975f5c5SAndroid Build Coastguard Worker 
481*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
482*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
483*8975f5c5SAndroid Build Coastguard Worker 
484*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, windowSurface);
485*8975f5c5SAndroid Build Coastguard Worker     windowSurface = EGL_NO_SURFACE;
486*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
487*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
488*8975f5c5SAndroid Build Coastguard Worker 
489*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
490*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
491*8975f5c5SAndroid Build Coastguard Worker }
492*8975f5c5SAndroid Build Coastguard Worker 
493*8975f5c5SAndroid Build Coastguard Worker // Unprotected context with Unprotected WindowSurface
TEST_P(EGLProtectedContentTest,UnprotectedContextWithUnprotectedWindowSurface)494*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedWindowSurface)
495*8975f5c5SAndroid Build Coastguard Worker {
496*8975f5c5SAndroid Build Coastguard Worker     windowTest(false, false);
497*8975f5c5SAndroid Build Coastguard Worker }
498*8975f5c5SAndroid Build Coastguard Worker 
499*8975f5c5SAndroid Build Coastguard Worker // Protected context with Protected WindowSurface
TEST_P(EGLProtectedContentTest,ProtectedContextWithProtectedWindowSurface)500*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedWindowSurface)
501*8975f5c5SAndroid Build Coastguard Worker {
502*8975f5c5SAndroid Build Coastguard Worker     windowTest(true, true);
503*8975f5c5SAndroid Build Coastguard Worker }
504*8975f5c5SAndroid Build Coastguard Worker 
505*8975f5c5SAndroid Build Coastguard Worker // Protected context with Protected Mutable Render Buffer WindowSurface.
TEST_P(EGLProtectedContentTest,ProtectedContextWithProtectedMutableRenderBufferWindowSurface)506*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedMutableRenderBufferWindowSurface)
507*8975f5c5SAndroid Build Coastguard Worker {
508*8975f5c5SAndroid Build Coastguard Worker     windowTest(true, true, true);
509*8975f5c5SAndroid Build Coastguard Worker }
510*8975f5c5SAndroid Build Coastguard Worker 
textureTest(bool isProtectedContext,bool isProtectedTexture)511*8975f5c5SAndroid Build Coastguard Worker void EGLProtectedContentTest::textureTest(bool isProtectedContext, bool isProtectedTexture)
512*8975f5c5SAndroid Build Coastguard Worker {
513*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
514*8975f5c5SAndroid Build Coastguard Worker 
515*8975f5c5SAndroid Build Coastguard Worker     bool isProtectedSurface = isProtectedTexture;
516*8975f5c5SAndroid Build Coastguard Worker 
517*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
518*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
519*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
520*8975f5c5SAndroid Build Coastguard Worker 
521*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
522*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(isProtectedContext, config, &context));
523*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
524*8975f5c5SAndroid Build Coastguard Worker 
525*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
526*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("ProtectedContentTest", kWidth, kHeight);
527*8975f5c5SAndroid Build Coastguard Worker     EGLSurface windowSurface          = EGL_NO_SURFACE;
528*8975f5c5SAndroid Build Coastguard Worker     EGLBoolean createWinSurfaceResult = createWindowSurface(
529*8975f5c5SAndroid Build Coastguard Worker         isProtectedSurface, config, osWindow->getNativeWindow(), &windowSurface);
530*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWinSurfaceResult);
531*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
532*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
533*8975f5c5SAndroid Build Coastguard Worker 
534*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context));
535*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
536*8975f5c5SAndroid Build Coastguard Worker 
537*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_protected_textures"))
538*8975f5c5SAndroid Build Coastguard Worker     {
539*8975f5c5SAndroid Build Coastguard Worker         GLuint texture = 0;
540*8975f5c5SAndroid Build Coastguard Worker         bool result    = createTexture(isProtectedTexture, &texture);
541*8975f5c5SAndroid Build Coastguard Worker         if (isProtectedTexture && !isProtectedContext)
542*8975f5c5SAndroid Build Coastguard Worker         {
543*8975f5c5SAndroid Build Coastguard Worker             std::cout << "Can't create protected Texture for Unprotected Context" << std::endl;
544*8975f5c5SAndroid Build Coastguard Worker             ASSERT_FALSE(result);
545*8975f5c5SAndroid Build Coastguard Worker         }
546*8975f5c5SAndroid Build Coastguard Worker         else
547*8975f5c5SAndroid Build Coastguard Worker         {
548*8975f5c5SAndroid Build Coastguard Worker             ASSERT_TRUE(result);
549*8975f5c5SAndroid Build Coastguard Worker 
550*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(fillTexture(texture, GLColor::red));
551*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(renderTexture(texture));
552*8975f5c5SAndroid Build Coastguard Worker 
553*8975f5c5SAndroid Build Coastguard Worker             eglSwapBuffers(mDisplay, windowSurface);
554*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
555*8975f5c5SAndroid Build Coastguard Worker             checkSwapBuffersResult("RED", isProtectedContext, isProtectedSurface);
556*8975f5c5SAndroid Build Coastguard Worker 
557*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, 0);
558*8975f5c5SAndroid Build Coastguard Worker             glDeleteTextures(1, &texture);
559*8975f5c5SAndroid Build Coastguard Worker         }
560*8975f5c5SAndroid Build Coastguard Worker     }
561*8975f5c5SAndroid Build Coastguard Worker     else
562*8975f5c5SAndroid Build Coastguard Worker     {
563*8975f5c5SAndroid Build Coastguard Worker         std::cout << "Skipping tests, GL_EXT_protected_textures not supported" << std::endl;
564*8975f5c5SAndroid Build Coastguard Worker     }
565*8975f5c5SAndroid Build Coastguard Worker 
566*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
567*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
568*8975f5c5SAndroid Build Coastguard Worker 
569*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, windowSurface);
570*8975f5c5SAndroid Build Coastguard Worker     windowSurface = EGL_NO_SURFACE;
571*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
572*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
573*8975f5c5SAndroid Build Coastguard Worker 
574*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
575*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
576*8975f5c5SAndroid Build Coastguard Worker }
577*8975f5c5SAndroid Build Coastguard Worker 
578*8975f5c5SAndroid Build Coastguard Worker // Unprotected context with unprotected texture
TEST_P(EGLProtectedContentTest,UnprotectedContextWithUnprotectedTexture)579*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedTexture)
580*8975f5c5SAndroid Build Coastguard Worker {
581*8975f5c5SAndroid Build Coastguard Worker     textureTest(false, false);
582*8975f5c5SAndroid Build Coastguard Worker }
583*8975f5c5SAndroid Build Coastguard Worker 
584*8975f5c5SAndroid Build Coastguard Worker // Protected context with protected texture
TEST_P(EGLProtectedContentTest,ProtectedContextWithProtectedTexture)585*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedTexture)
586*8975f5c5SAndroid Build Coastguard Worker {
587*8975f5c5SAndroid Build Coastguard Worker     textureTest(true, true);
588*8975f5c5SAndroid Build Coastguard Worker }
589*8975f5c5SAndroid Build Coastguard Worker 
textureFromImageTest(bool isProtectedContext,bool isProtectedTexture)590*8975f5c5SAndroid Build Coastguard Worker void EGLProtectedContentTest::textureFromImageTest(bool isProtectedContext, bool isProtectedTexture)
591*8975f5c5SAndroid Build Coastguard Worker {
592*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
593*8975f5c5SAndroid Build Coastguard Worker 
594*8975f5c5SAndroid Build Coastguard Worker     bool isProtectedSurface = isProtectedTexture;
595*8975f5c5SAndroid Build Coastguard Worker 
596*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
597*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
598*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
599*8975f5c5SAndroid Build Coastguard Worker 
600*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
601*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(isProtectedContext, config, &context));
602*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
603*8975f5c5SAndroid Build Coastguard Worker 
604*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
605*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("ProtectedContentTest", kWidth, kHeight);
606*8975f5c5SAndroid Build Coastguard Worker     EGLSurface windowSurface          = EGL_NO_SURFACE;
607*8975f5c5SAndroid Build Coastguard Worker     EGLBoolean createWinSurfaceResult = createWindowSurface(
608*8975f5c5SAndroid Build Coastguard Worker         isProtectedSurface, config, osWindow->getNativeWindow(), &windowSurface);
609*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWinSurfaceResult);
610*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
611*8975f5c5SAndroid Build Coastguard Worker 
612*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context));
613*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
614*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
615*8975f5c5SAndroid Build Coastguard Worker 
616*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_OES_EGL_image") &&
617*8975f5c5SAndroid Build Coastguard Worker         IsGLExtensionEnabled("GL_EXT_protected_textures"))
618*8975f5c5SAndroid Build Coastguard Worker     {
619*8975f5c5SAndroid Build Coastguard Worker         GLuint srcTexture = 0;
620*8975f5c5SAndroid Build Coastguard Worker         if (isProtectedTexture && !isProtectedContext)
621*8975f5c5SAndroid Build Coastguard Worker         {
622*8975f5c5SAndroid Build Coastguard Worker             std::cout << "Can't create protected Texture for Unprotected Context, Skipping"
623*8975f5c5SAndroid Build Coastguard Worker                       << std::endl;
624*8975f5c5SAndroid Build Coastguard Worker             ASSERT_FALSE(createTexture(isProtectedTexture, &srcTexture));
625*8975f5c5SAndroid Build Coastguard Worker         }
626*8975f5c5SAndroid Build Coastguard Worker         else
627*8975f5c5SAndroid Build Coastguard Worker         {
628*8975f5c5SAndroid Build Coastguard Worker             ASSERT_TRUE(createTexture(isProtectedTexture, &srcTexture));
629*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(fillTexture(srcTexture, GLColor::red));
630*8975f5c5SAndroid Build Coastguard Worker 
631*8975f5c5SAndroid Build Coastguard Worker             EGLImage image = EGL_NO_IMAGE;
632*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(createImage(isProtectedTexture, context, EGL_GL_TEXTURE_2D,
633*8975f5c5SAndroid Build Coastguard Worker                                     (void *)(static_cast<intptr_t>(srcTexture)), &image));
634*8975f5c5SAndroid Build Coastguard Worker 
635*8975f5c5SAndroid Build Coastguard Worker             GLuint dstTexture = 0;
636*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(createTextureFromImage(image, &dstTexture));
637*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(renderTexture(dstTexture));
638*8975f5c5SAndroid Build Coastguard Worker 
639*8975f5c5SAndroid Build Coastguard Worker             eglSwapBuffers(mDisplay, windowSurface);
640*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
641*8975f5c5SAndroid Build Coastguard Worker             checkSwapBuffersResult("RED", isProtectedContext, isProtectedSurface);
642*8975f5c5SAndroid Build Coastguard Worker 
643*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, 0);
644*8975f5c5SAndroid Build Coastguard Worker             glDeleteTextures(1, &dstTexture);
645*8975f5c5SAndroid Build Coastguard Worker             glDeleteTextures(1, &srcTexture);
646*8975f5c5SAndroid Build Coastguard Worker 
647*8975f5c5SAndroid Build Coastguard Worker             eglDestroyImage(mDisplay, image);
648*8975f5c5SAndroid Build Coastguard Worker             image = EGL_NO_IMAGE;
649*8975f5c5SAndroid Build Coastguard Worker         }
650*8975f5c5SAndroid Build Coastguard Worker     }
651*8975f5c5SAndroid Build Coastguard Worker     else
652*8975f5c5SAndroid Build Coastguard Worker     {
653*8975f5c5SAndroid Build Coastguard Worker         std::cout << "Skipping tests, GL_OES_EGL_image or GL_EXT_protected_textures not supported"
654*8975f5c5SAndroid Build Coastguard Worker                   << std::endl;
655*8975f5c5SAndroid Build Coastguard Worker     }
656*8975f5c5SAndroid Build Coastguard Worker 
657*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
658*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
659*8975f5c5SAndroid Build Coastguard Worker 
660*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, windowSurface);
661*8975f5c5SAndroid Build Coastguard Worker     windowSurface = EGL_NO_SURFACE;
662*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
663*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
664*8975f5c5SAndroid Build Coastguard Worker 
665*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
666*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
667*8975f5c5SAndroid Build Coastguard Worker }
668*8975f5c5SAndroid Build Coastguard Worker 
669*8975f5c5SAndroid Build Coastguard Worker // Unprotected context with unprotected texture from EGL image
TEST_P(EGLProtectedContentTest,UnprotectedContextWithUnprotectedTextureFromImage)670*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedTextureFromImage)
671*8975f5c5SAndroid Build Coastguard Worker {
672*8975f5c5SAndroid Build Coastguard Worker     textureFromImageTest(false, false);
673*8975f5c5SAndroid Build Coastguard Worker }
674*8975f5c5SAndroid Build Coastguard Worker 
675*8975f5c5SAndroid Build Coastguard Worker // Protected context with protected texture from EGL image
TEST_P(EGLProtectedContentTest,ProtectedContextWithProtectedTextureFromImage)676*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedTextureFromImage)
677*8975f5c5SAndroid Build Coastguard Worker {
678*8975f5c5SAndroid Build Coastguard Worker     textureFromImageTest(true, true);
679*8975f5c5SAndroid Build Coastguard Worker }
680*8975f5c5SAndroid Build Coastguard Worker 
textureFromPbufferTest(bool isProtectedContext,bool isProtectedTexture)681*8975f5c5SAndroid Build Coastguard Worker void EGLProtectedContentTest::textureFromPbufferTest(bool isProtectedContext,
682*8975f5c5SAndroid Build Coastguard Worker                                                      bool isProtectedTexture)
683*8975f5c5SAndroid Build Coastguard Worker {
684*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
685*8975f5c5SAndroid Build Coastguard Worker 
686*8975f5c5SAndroid Build Coastguard Worker     bool isProtectedSurface = isProtectedTexture;
687*8975f5c5SAndroid Build Coastguard Worker 
688*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
689*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
690*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
691*8975f5c5SAndroid Build Coastguard Worker 
692*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
693*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(isProtectedContext, config, &context));
694*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
695*8975f5c5SAndroid Build Coastguard Worker 
696*8975f5c5SAndroid Build Coastguard Worker     EGLSurface pBufferSurface = EGL_NO_SURFACE;
697*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createPbufferSurface(isProtectedSurface, config, &pBufferSurface));
698*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreatePbufferSurface failed.";
699*8975f5c5SAndroid Build Coastguard Worker 
700*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, pBufferSurface, pBufferSurface, context));
701*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
702*8975f5c5SAndroid Build Coastguard Worker 
703*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
704*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
705*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
706*8975f5c5SAndroid Build Coastguard Worker 
707*8975f5c5SAndroid Build Coastguard Worker     glFinish();
708*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR() << "glFinish failed";
709*8975f5c5SAndroid Build Coastguard Worker 
710*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
711*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("ProtectedContentTest", kWidth, kHeight);
712*8975f5c5SAndroid Build Coastguard Worker     EGLSurface windowSurface          = EGL_NO_SURFACE;
713*8975f5c5SAndroid Build Coastguard Worker     EGLBoolean createWinSurfaceResult = createWindowSurface(
714*8975f5c5SAndroid Build Coastguard Worker         isProtectedSurface, config, osWindow->getNativeWindow(), &windowSurface);
715*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWinSurfaceResult);
716*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
717*8975f5c5SAndroid Build Coastguard Worker 
718*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context));
719*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
720*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
721*8975f5c5SAndroid Build Coastguard Worker 
722*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_protected_textures"))
723*8975f5c5SAndroid Build Coastguard Worker     {
724*8975f5c5SAndroid Build Coastguard Worker         GLuint texture = 0;
725*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(createTextureFromPbuffer(pBufferSurface, &texture));
726*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(renderTexture(texture));
727*8975f5c5SAndroid Build Coastguard Worker 
728*8975f5c5SAndroid Build Coastguard Worker         eglSwapBuffers(mDisplay, windowSurface);
729*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
730*8975f5c5SAndroid Build Coastguard Worker         checkSwapBuffersResult("RED", isProtectedContext, isProtectedTexture);
731*8975f5c5SAndroid Build Coastguard Worker 
732*8975f5c5SAndroid Build Coastguard Worker         eglReleaseTexImage(mDisplay, pBufferSurface, EGL_BACK_BUFFER);
733*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &texture);
734*8975f5c5SAndroid Build Coastguard Worker     }
735*8975f5c5SAndroid Build Coastguard Worker     else
736*8975f5c5SAndroid Build Coastguard Worker     {
737*8975f5c5SAndroid Build Coastguard Worker         std::cout << "Skipping tests, GL_EXT_protected_textures not supported" << std::endl;
738*8975f5c5SAndroid Build Coastguard Worker     }
739*8975f5c5SAndroid Build Coastguard Worker 
740*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
741*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
742*8975f5c5SAndroid Build Coastguard Worker 
743*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, windowSurface);
744*8975f5c5SAndroid Build Coastguard Worker     windowSurface = EGL_NO_SURFACE;
745*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
746*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
747*8975f5c5SAndroid Build Coastguard Worker 
748*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, pBufferSurface);
749*8975f5c5SAndroid Build Coastguard Worker     pBufferSurface = EGL_NO_SURFACE;
750*8975f5c5SAndroid Build Coastguard Worker 
751*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
752*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
753*8975f5c5SAndroid Build Coastguard Worker }
754*8975f5c5SAndroid Build Coastguard Worker 
755*8975f5c5SAndroid Build Coastguard Worker // Unprotected context with unprotected texture from BindTex of PBufferSurface
TEST_P(EGLProtectedContentTest,UnprotectedContextWithUnprotectedTextureFromPBuffer)756*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedTextureFromPBuffer)
757*8975f5c5SAndroid Build Coastguard Worker {
758*8975f5c5SAndroid Build Coastguard Worker     textureFromPbufferTest(false, false);
759*8975f5c5SAndroid Build Coastguard Worker }
760*8975f5c5SAndroid Build Coastguard Worker 
761*8975f5c5SAndroid Build Coastguard Worker // Protected context with protected texture from BindTex of PBufferSurface
TEST_P(EGLProtectedContentTest,ProtectedContextWithProtectedTextureFromPbuffer)762*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedTextureFromPbuffer)
763*8975f5c5SAndroid Build Coastguard Worker {
764*8975f5c5SAndroid Build Coastguard Worker     textureFromPbufferTest(true, true);
765*8975f5c5SAndroid Build Coastguard Worker }
766*8975f5c5SAndroid Build Coastguard Worker 
textureFromAndroidNativeBufferTest(bool isProtectedContext,bool isProtectedTexture)767*8975f5c5SAndroid Build Coastguard Worker void EGLProtectedContentTest::textureFromAndroidNativeBufferTest(bool isProtectedContext,
768*8975f5c5SAndroid Build Coastguard Worker                                                                  bool isProtectedTexture)
769*8975f5c5SAndroid Build Coastguard Worker {
770*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
771*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
772*8975f5c5SAndroid Build Coastguard Worker         !IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANDROID_get_native_client_buffer"));
773*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANDROID_image_native_buffer"));
774*8975f5c5SAndroid Build Coastguard Worker 
775*8975f5c5SAndroid Build Coastguard Worker     bool isProtectedSurface = isProtectedTexture;
776*8975f5c5SAndroid Build Coastguard Worker 
777*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
778*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
779*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
780*8975f5c5SAndroid Build Coastguard Worker 
781*8975f5c5SAndroid Build Coastguard Worker     EGLContext context = EGL_NO_CONTEXT;
782*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(isProtectedContext, config, &context));
783*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
784*8975f5c5SAndroid Build Coastguard Worker 
785*8975f5c5SAndroid Build Coastguard Worker     OSWindow *osWindow = OSWindow::New();
786*8975f5c5SAndroid Build Coastguard Worker     osWindow->initialize("ProtectedContentTest", kWidth, kHeight);
787*8975f5c5SAndroid Build Coastguard Worker     EGLSurface windowSurface          = EGL_NO_SURFACE;
788*8975f5c5SAndroid Build Coastguard Worker     EGLBoolean createWinSurfaceResult = createWindowSurface(
789*8975f5c5SAndroid Build Coastguard Worker         isProtectedSurface, config, osWindow->getNativeWindow(), &windowSurface);
790*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createWinSurfaceResult);
791*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
792*8975f5c5SAndroid Build Coastguard Worker 
793*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context));
794*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
795*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
796*8975f5c5SAndroid Build Coastguard Worker 
797*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_protected_textures"))
798*8975f5c5SAndroid Build Coastguard Worker     {
799*8975f5c5SAndroid Build Coastguard Worker         EGLClientBuffer clientBuffer = nullptr;
800*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(createAndroidClientBuffer(isProtectedTexture, false, true, &clientBuffer));
801*8975f5c5SAndroid Build Coastguard Worker 
802*8975f5c5SAndroid Build Coastguard Worker         EGLImage image = EGL_NO_IMAGE;
803*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(createImage(isProtectedTexture, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
804*8975f5c5SAndroid Build Coastguard Worker                                 clientBuffer, &image));
805*8975f5c5SAndroid Build Coastguard Worker 
806*8975f5c5SAndroid Build Coastguard Worker         GLuint texture = 0;
807*8975f5c5SAndroid Build Coastguard Worker         if (isProtectedTexture && !isProtectedContext)
808*8975f5c5SAndroid Build Coastguard Worker         {
809*8975f5c5SAndroid Build Coastguard Worker             std::cout << "Can't create protected Texture for Unprotected Context, Skipping"
810*8975f5c5SAndroid Build Coastguard Worker                       << std::endl;
811*8975f5c5SAndroid Build Coastguard Worker             ASSERT_FALSE(createTextureFromImage(image, &texture));
812*8975f5c5SAndroid Build Coastguard Worker         }
813*8975f5c5SAndroid Build Coastguard Worker         else
814*8975f5c5SAndroid Build Coastguard Worker         {
815*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(createTextureFromImage(image, &texture));
816*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(fillTexture(texture, GLColor::red));
817*8975f5c5SAndroid Build Coastguard Worker             EXPECT_TRUE(renderTexture(texture));
818*8975f5c5SAndroid Build Coastguard Worker 
819*8975f5c5SAndroid Build Coastguard Worker             eglSwapBuffers(mDisplay, windowSurface);
820*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
821*8975f5c5SAndroid Build Coastguard Worker             checkSwapBuffersResult("RED", isProtectedContext, isProtectedTexture);
822*8975f5c5SAndroid Build Coastguard Worker 
823*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, 0);
824*8975f5c5SAndroid Build Coastguard Worker             glDeleteTextures(1, &texture);
825*8975f5c5SAndroid Build Coastguard Worker 
826*8975f5c5SAndroid Build Coastguard Worker             eglDestroyImage(mDisplay, image);
827*8975f5c5SAndroid Build Coastguard Worker             image = EGL_NO_IMAGE;
828*8975f5c5SAndroid Build Coastguard Worker         }
829*8975f5c5SAndroid Build Coastguard Worker     }
830*8975f5c5SAndroid Build Coastguard Worker     else
831*8975f5c5SAndroid Build Coastguard Worker     {
832*8975f5c5SAndroid Build Coastguard Worker         std::cout << "Skipping tests, GL_EXT_protected_textures not supported" << std::endl;
833*8975f5c5SAndroid Build Coastguard Worker     }
834*8975f5c5SAndroid Build Coastguard Worker 
835*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
836*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
837*8975f5c5SAndroid Build Coastguard Worker 
838*8975f5c5SAndroid Build Coastguard Worker     eglDestroySurface(mDisplay, windowSurface);
839*8975f5c5SAndroid Build Coastguard Worker     windowSurface = EGL_NO_SURFACE;
840*8975f5c5SAndroid Build Coastguard Worker     osWindow->destroy();
841*8975f5c5SAndroid Build Coastguard Worker     OSWindow::Delete(&osWindow);
842*8975f5c5SAndroid Build Coastguard Worker 
843*8975f5c5SAndroid Build Coastguard Worker     eglDestroyContext(mDisplay, context);
844*8975f5c5SAndroid Build Coastguard Worker     context = EGL_NO_CONTEXT;
845*8975f5c5SAndroid Build Coastguard Worker }
846*8975f5c5SAndroid Build Coastguard Worker 
847*8975f5c5SAndroid Build Coastguard Worker // Unprotected context with unprotected texture from EGL image from Android native buffer
TEST_P(EGLProtectedContentTest,UnprotectedContextWithUnprotectedTextureFromAndroidNativeBuffer)848*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedTextureFromAndroidNativeBuffer)
849*8975f5c5SAndroid Build Coastguard Worker {
850*8975f5c5SAndroid Build Coastguard Worker     textureFromAndroidNativeBufferTest(false, false);
851*8975f5c5SAndroid Build Coastguard Worker }
852*8975f5c5SAndroid Build Coastguard Worker 
853*8975f5c5SAndroid Build Coastguard Worker // Protected context with protected texture from EGL image from Android native buffer
TEST_P(EGLProtectedContentTest,ProtectedContextWithProtectedTextureFromAndroidNativeBuffer)854*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedTextureFromAndroidNativeBuffer)
855*8975f5c5SAndroid Build Coastguard Worker {
856*8975f5c5SAndroid Build Coastguard Worker     textureFromAndroidNativeBufferTest(true, true);
857*8975f5c5SAndroid Build Coastguard Worker }
858*8975f5c5SAndroid Build Coastguard Worker 
859*8975f5c5SAndroid Build Coastguard Worker // Retrieve the EGL_PROTECTED_CONTENT_EXT attribute via eglQueryContext
TEST_P(EGLProtectedContentTest,QueryContext)860*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLProtectedContentTest, QueryContext)
861*8975f5c5SAndroid Build Coastguard Worker {
862*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
863*8975f5c5SAndroid Build Coastguard Worker 
864*8975f5c5SAndroid Build Coastguard Worker     EGLConfig config = EGL_NO_CONFIG_KHR;
865*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(chooseConfig(&config));
866*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
867*8975f5c5SAndroid Build Coastguard Worker 
868*8975f5c5SAndroid Build Coastguard Worker     bool isProtectedContext = true;
869*8975f5c5SAndroid Build Coastguard Worker     EGLContext context      = EGL_NO_CONTEXT;
870*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(createContext(isProtectedContext, config, &context));
871*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
872*8975f5c5SAndroid Build Coastguard Worker 
873*8975f5c5SAndroid Build Coastguard Worker     EGLint value = 0;
874*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglQueryContext(mDisplay, context, EGL_PROTECTED_CONTENT_EXT, &value));
875*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS() << "eglQueryContext failed.";
876*8975f5c5SAndroid Build Coastguard Worker 
877*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(value, 1);
878*8975f5c5SAndroid Build Coastguard Worker }
879*8975f5c5SAndroid Build Coastguard Worker 
880*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(EGLProtectedContentTest,
881*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_OPENGLES()),
882*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_OPENGLES()),
883*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES2_VULKAN()),
884*8975f5c5SAndroid Build Coastguard Worker                        WithNoFixture(ES3_VULKAN()));
885