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