xref: /aosp_15_r20/external/skia/tests/EGLImageTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2015 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker 
9*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker 
12*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GL
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkAlphaType.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorType.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLBackendSurface.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLDirectContext.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLFunctions.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLInterface.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLTypes.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTemplates.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/RefCntedCallback.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorInfo.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProxyProvider.h"
36*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrShaderCaps.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
38*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
39*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTexture.h"
40*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTextureProxy.h"
41*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceContext.h"
42*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceFillContext.h" // IWYU pragma: keep
43*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLCaps.h"
44*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLDefines.h"
45*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLGpu.h"
46*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLUtil.h"
47*c8dee2aaSAndroid Build Coastguard Worker #include "tests/CtsEnforcement.h"
48*c8dee2aaSAndroid Build Coastguard Worker #include "tests/TestUtils.h"
49*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ManagedBackendTexture.h"
50*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/gl/GLTestContext.h"
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
53*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
54*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions;
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker using sk_gpu_test::GLTestContext;
61*c8dee2aaSAndroid Build Coastguard Worker 
cleanup(GLTestContext * glctx0,GrGLuint texID0,GLTestContext * glctx1,const sk_sp<GrDirectContext> & dContext,GrEGLImage image1)62*c8dee2aaSAndroid Build Coastguard Worker static void cleanup(GLTestContext* glctx0,
63*c8dee2aaSAndroid Build Coastguard Worker                     GrGLuint texID0,
64*c8dee2aaSAndroid Build Coastguard Worker                     GLTestContext* glctx1,
65*c8dee2aaSAndroid Build Coastguard Worker                     const sk_sp<GrDirectContext>& dContext,
66*c8dee2aaSAndroid Build Coastguard Worker                     GrEGLImage image1) {
67*c8dee2aaSAndroid Build Coastguard Worker     if (glctx1) {
68*c8dee2aaSAndroid Build Coastguard Worker         glctx1->makeCurrent();
69*c8dee2aaSAndroid Build Coastguard Worker         if (GR_EGL_NO_IMAGE != image1) {
70*c8dee2aaSAndroid Build Coastguard Worker             glctx1->destroyEGLImage(image1);
71*c8dee2aaSAndroid Build Coastguard Worker         }
72*c8dee2aaSAndroid Build Coastguard Worker     }
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     glctx0->makeCurrent();
75*c8dee2aaSAndroid Build Coastguard Worker     if (texID0) {
76*c8dee2aaSAndroid Build Coastguard Worker         GR_GL_CALL(glctx0->gl(), DeleteTextures(1, &texID0));
77*c8dee2aaSAndroid Build Coastguard Worker     }
78*c8dee2aaSAndroid Build Coastguard Worker }
79*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST_FOR_GL_CONTEXT(EGLImageTest,reporter,ctxInfo,CtsEnforcement::kApiLevel_T)80*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_GL_CONTEXT(EGLImageTest, reporter, ctxInfo, CtsEnforcement::kApiLevel_T) {
81*c8dee2aaSAndroid Build Coastguard Worker     auto context0 = ctxInfo.directContext();
82*c8dee2aaSAndroid Build Coastguard Worker     sk_gpu_test::GLTestContext* glCtx0 = ctxInfo.glContext();
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker     // Try to create a second GL context and then check if the contexts have necessary
85*c8dee2aaSAndroid Build Coastguard Worker     // extensions to run this test.
86*c8dee2aaSAndroid Build Coastguard Worker 
87*c8dee2aaSAndroid Build Coastguard Worker     if (kGLES_GrGLStandard != glCtx0->gl()->fStandard) {
88*c8dee2aaSAndroid Build Coastguard Worker         return;
89*c8dee2aaSAndroid Build Coastguard Worker     }
90*c8dee2aaSAndroid Build Coastguard Worker     GrGLGpu* gpu0 = static_cast<GrGLGpu*>(context0->priv().getGpu());
91*c8dee2aaSAndroid Build Coastguard Worker     if (!gpu0->glCaps().shaderCaps()->fExternalTextureSupport) {
92*c8dee2aaSAndroid Build Coastguard Worker         return;
93*c8dee2aaSAndroid Build Coastguard Worker     }
94*c8dee2aaSAndroid Build Coastguard Worker 
95*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GLTestContext> glCtx1 = glCtx0->makeNew();
96*c8dee2aaSAndroid Build Coastguard Worker     if (!glCtx1) {
97*c8dee2aaSAndroid Build Coastguard Worker         return;
98*c8dee2aaSAndroid Build Coastguard Worker     }
99*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrDirectContext> context1 = GrDirectContexts::MakeGL(sk_ref_sp(glCtx1->gl()));
100*c8dee2aaSAndroid Build Coastguard Worker     GrEGLImage image = GR_EGL_NO_IMAGE;
101*c8dee2aaSAndroid Build Coastguard Worker     GrGLTextureInfo externalTexture;
102*c8dee2aaSAndroid Build Coastguard Worker     externalTexture.fID = 0;
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker     if (!context1) {
105*c8dee2aaSAndroid Build Coastguard Worker         cleanup(glCtx0, externalTexture.fID, glCtx1.get(), context1, image);
106*c8dee2aaSAndroid Build Coastguard Worker         return;
107*c8dee2aaSAndroid Build Coastguard Worker     }
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker     if (!glCtx1->gl()->hasExtension("EGL_KHR_image") ||
110*c8dee2aaSAndroid Build Coastguard Worker         !glCtx1->gl()->hasExtension("EGL_KHR_gl_texture_2D_image")) {
111*c8dee2aaSAndroid Build Coastguard Worker         cleanup(glCtx0, externalTexture.fID, glCtx1.get(), context1, image);
112*c8dee2aaSAndroid Build Coastguard Worker         return;
113*c8dee2aaSAndroid Build Coastguard Worker     }
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////// CONTEXT 1 ///////////////////////////////////
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker     // Use GL Context 1 to create a texture unknown to context 0.
118*c8dee2aaSAndroid Build Coastguard Worker     context1->flushAndSubmit();
119*c8dee2aaSAndroid Build Coastguard Worker     static const int kSize = 100;
120*c8dee2aaSAndroid Build Coastguard Worker 
121*c8dee2aaSAndroid Build Coastguard Worker     auto mbet = sk_gpu_test::ManagedBackendTexture::MakeWithoutData(context1.get(),
122*c8dee2aaSAndroid Build Coastguard Worker                                                                     kSize,
123*c8dee2aaSAndroid Build Coastguard Worker                                                                     kSize,
124*c8dee2aaSAndroid Build Coastguard Worker                                                                     kRGBA_8888_SkColorType,
125*c8dee2aaSAndroid Build Coastguard Worker                                                                     skgpu::Mipmapped::kNo,
126*c8dee2aaSAndroid Build Coastguard Worker                                                                     GrRenderable::kNo,
127*c8dee2aaSAndroid Build Coastguard Worker                                                                     GrProtected::kNo);
128*c8dee2aaSAndroid Build Coastguard Worker 
129*c8dee2aaSAndroid Build Coastguard Worker     if (!mbet) {
130*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Error creating texture for EGL Image");
131*c8dee2aaSAndroid Build Coastguard Worker         cleanup(glCtx0, externalTexture.fID, glCtx1.get(), context1, image);
132*c8dee2aaSAndroid Build Coastguard Worker         return;
133*c8dee2aaSAndroid Build Coastguard Worker     }
134*c8dee2aaSAndroid Build Coastguard Worker 
135*c8dee2aaSAndroid Build Coastguard Worker     GrGLTextureInfo texInfo;
136*c8dee2aaSAndroid Build Coastguard Worker     if (!GrBackendTextures::GetGLTextureInfo(mbet->texture(), &texInfo)) {
137*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Failed to get GrGLTextureInfo");
138*c8dee2aaSAndroid Build Coastguard Worker         return;
139*c8dee2aaSAndroid Build Coastguard Worker     }
140*c8dee2aaSAndroid Build Coastguard Worker 
141*c8dee2aaSAndroid Build Coastguard Worker     if (GR_GL_TEXTURE_2D != texInfo.fTarget) {
142*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Expected backend texture to be 2D");
143*c8dee2aaSAndroid Build Coastguard Worker         cleanup(glCtx0, externalTexture.fID, glCtx1.get(), context1, image);
144*c8dee2aaSAndroid Build Coastguard Worker         return;
145*c8dee2aaSAndroid Build Coastguard Worker     }
146*c8dee2aaSAndroid Build Coastguard Worker 
147*c8dee2aaSAndroid Build Coastguard Worker     // Wrap the texture in an EGLImage
148*c8dee2aaSAndroid Build Coastguard Worker     image = glCtx1->texture2DToEGLImage(texInfo.fID);
149*c8dee2aaSAndroid Build Coastguard Worker     if (GR_EGL_NO_IMAGE == image) {
150*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Error creating EGL Image from texture");
151*c8dee2aaSAndroid Build Coastguard Worker         cleanup(glCtx0, externalTexture.fID, glCtx1.get(), context1, image);
152*c8dee2aaSAndroid Build Coastguard Worker         return;
153*c8dee2aaSAndroid Build Coastguard Worker     }
154*c8dee2aaSAndroid Build Coastguard Worker 
155*c8dee2aaSAndroid Build Coastguard Worker     // Since we are dealing with two different GL contexts here, we need to call finish so that the
156*c8dee2aaSAndroid Build Coastguard Worker     // clearing of the texture that happens in createTextingOnlyBackendTexture occurs before we call
157*c8dee2aaSAndroid Build Coastguard Worker     // TexSubImage below on the other context. Otherwise, it is possible the calls get reordered and
158*c8dee2aaSAndroid Build Coastguard Worker     // the clearing overwrites the TexSubImage writes.
159*c8dee2aaSAndroid Build Coastguard Worker     GR_GL_CALL(glCtx1->gl(), Finish());
160*c8dee2aaSAndroid Build Coastguard Worker 
161*c8dee2aaSAndroid Build Coastguard Worker     // Populate the texture using GL context 1. Important to use TexSubImage as TexImage orphans
162*c8dee2aaSAndroid Build Coastguard Worker     // the EGL image. Also, this must be done after creating the EGLImage as the texture
163*c8dee2aaSAndroid Build Coastguard Worker     // contents may not be preserved when the image is created.
164*c8dee2aaSAndroid Build Coastguard Worker     AutoTMalloc<uint32_t> pixels(kSize * kSize);
165*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < kSize*kSize; ++i) {
166*c8dee2aaSAndroid Build Coastguard Worker         pixels.get()[i] = 0xDDAABBCC;
167*c8dee2aaSAndroid Build Coastguard Worker     }
168*c8dee2aaSAndroid Build Coastguard Worker     GR_GL_CALL(glCtx1->gl(), ActiveTexture(GR_GL_TEXTURE0));
169*c8dee2aaSAndroid Build Coastguard Worker     GR_GL_CALL(glCtx1->gl(), BindTexture(texInfo.fTarget, texInfo.fID));
170*c8dee2aaSAndroid Build Coastguard Worker     GR_GL_CALL(glCtx1->gl(), TexSubImage2D(texInfo.fTarget, 0, 0, 0, kSize, kSize,
171*c8dee2aaSAndroid Build Coastguard Worker                                            GR_GL_RGBA, GR_GL_UNSIGNED_BYTE, pixels.get()));
172*c8dee2aaSAndroid Build Coastguard Worker     GR_GL_CALL(glCtx1->gl(), Finish());
173*c8dee2aaSAndroid Build Coastguard Worker     // We've been making direct GL calls in GL context 1, let GrDirectContext 1 know its internal
174*c8dee2aaSAndroid Build Coastguard Worker     // state is invalid.
175*c8dee2aaSAndroid Build Coastguard Worker     context1->resetContext();
176*c8dee2aaSAndroid Build Coastguard Worker 
177*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////// CONTEXT 0 ///////////////////////////////////
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker     // Make a new texture ID in GL Context 0 from the EGL Image
180*c8dee2aaSAndroid Build Coastguard Worker     glCtx0->makeCurrent();
181*c8dee2aaSAndroid Build Coastguard Worker     externalTexture.fTarget = GR_GL_TEXTURE_EXTERNAL;
182*c8dee2aaSAndroid Build Coastguard Worker     externalTexture.fID = glCtx0->eglImageToExternalTexture(image);
183*c8dee2aaSAndroid Build Coastguard Worker     externalTexture.fFormat = GR_GL_RGBA8;
184*c8dee2aaSAndroid Build Coastguard Worker     if (0 == externalTexture.fID) {
185*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Error converting EGL Image back to texture");
186*c8dee2aaSAndroid Build Coastguard Worker         cleanup(glCtx0, externalTexture.fID, glCtx1.get(), context1, image);
187*c8dee2aaSAndroid Build Coastguard Worker         return;
188*c8dee2aaSAndroid Build Coastguard Worker     }
189*c8dee2aaSAndroid Build Coastguard Worker 
190*c8dee2aaSAndroid Build Coastguard Worker     // Wrap this texture ID in a GrTexture
191*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture backendTex =
192*c8dee2aaSAndroid Build Coastguard Worker             GrBackendTextures::MakeGL(kSize, kSize, skgpu::Mipmapped::kNo, externalTexture);
193*c8dee2aaSAndroid Build Coastguard Worker 
194*c8dee2aaSAndroid Build Coastguard Worker     GrColorInfo colorInfo(GrColorType::kRGBA_8888, kPremul_SkAlphaType, nullptr);
195*c8dee2aaSAndroid Build Coastguard Worker     // TODO: If I make this TopLeft origin to match resolve_origin calls for kDefault, this test
196*c8dee2aaSAndroid Build Coastguard Worker     // fails on the Nexus5. Why?
197*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin;
198*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrSurfaceProxy> texProxy = context0->priv().proxyProvider()->wrapBackendTexture(
199*c8dee2aaSAndroid Build Coastguard Worker             backendTex, kBorrow_GrWrapOwnership, GrWrapCacheable::kNo, kRW_GrIOType);
200*c8dee2aaSAndroid Build Coastguard Worker     if (!texProxy) {
201*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Error wrapping external texture in GrTextureProxy.");
202*c8dee2aaSAndroid Build Coastguard Worker         cleanup(glCtx0, externalTexture.fID, glCtx1.get(), context1, image);
203*c8dee2aaSAndroid Build Coastguard Worker         return;
204*c8dee2aaSAndroid Build Coastguard Worker     }
205*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Swizzle swizzle = context0->priv().caps()->getReadSwizzle(texProxy->backendFormat(),
206*c8dee2aaSAndroid Build Coastguard Worker                                                                      colorInfo.colorType());
207*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceProxyView view(std::move(texProxy), origin, swizzle);
208*c8dee2aaSAndroid Build Coastguard Worker     auto surfaceContext = context0->priv().makeSC(std::move(view), colorInfo);
209*c8dee2aaSAndroid Build Coastguard Worker 
210*c8dee2aaSAndroid Build Coastguard Worker     if (!surfaceContext) {
211*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Error wrapping external texture in SurfaceContext.");
212*c8dee2aaSAndroid Build Coastguard Worker         cleanup(glCtx0, externalTexture.fID, glCtx1.get(), context1, image);
213*c8dee2aaSAndroid Build Coastguard Worker         return;
214*c8dee2aaSAndroid Build Coastguard Worker     }
215*c8dee2aaSAndroid Build Coastguard Worker 
216*c8dee2aaSAndroid Build Coastguard Worker     GrTextureProxy* proxy = surfaceContext->asTextureProxy();
217*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, proxy->mipmapped() == skgpu::Mipmapped::kNo);
218*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, proxy->peekTexture()->mipmapped() == skgpu::Mipmapped::kNo);
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, proxy->textureType() == GrTextureType::kExternal);
221*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, proxy->peekTexture()->textureType() == GrTextureType::kExternal);
222*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, proxy->hasRestrictedSampling());
223*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, proxy->peekTexture()->hasRestrictedSampling());
224*c8dee2aaSAndroid Build Coastguard Worker 
225*c8dee2aaSAndroid Build Coastguard Worker     // Should not be able to wrap as a RT
226*c8dee2aaSAndroid Build Coastguard Worker     {
227*c8dee2aaSAndroid Build Coastguard Worker         auto temp = context0->priv().makeSFCFromBackendTexture(colorInfo,
228*c8dee2aaSAndroid Build Coastguard Worker                                                                backendTex,
229*c8dee2aaSAndroid Build Coastguard Worker                                                                1,
230*c8dee2aaSAndroid Build Coastguard Worker                                                                origin,
231*c8dee2aaSAndroid Build Coastguard Worker                                                                /*release helper*/ nullptr);
232*c8dee2aaSAndroid Build Coastguard Worker         if (temp) {
233*c8dee2aaSAndroid Build Coastguard Worker             ERRORF(reporter, "Should not be able to wrap an EXTERNAL texture as a RT.");
234*c8dee2aaSAndroid Build Coastguard Worker         }
235*c8dee2aaSAndroid Build Coastguard Worker     }
236*c8dee2aaSAndroid Build Coastguard Worker 
237*c8dee2aaSAndroid Build Coastguard Worker     //TestReadPixels(reporter, context0, surfaceContext.get(), pixels.get(), "EGLImageTest-read");
238*c8dee2aaSAndroid Build Coastguard Worker 
239*c8dee2aaSAndroid Build Coastguard Worker     // We should not be able to write to an EXTERNAL texture
240*c8dee2aaSAndroid Build Coastguard Worker     TestWritePixels(reporter, context0, surfaceContext.get(), false, "EGLImageTest-write");
241*c8dee2aaSAndroid Build Coastguard Worker 
242*c8dee2aaSAndroid Build Coastguard Worker     // Only test RT-config
243*c8dee2aaSAndroid Build Coastguard Worker     // TODO: why do we always need to draw to copy from an external texture?
244*c8dee2aaSAndroid Build Coastguard Worker     TestCopyFromSurface(reporter,
245*c8dee2aaSAndroid Build Coastguard Worker                         context0,
246*c8dee2aaSAndroid Build Coastguard Worker                         surfaceContext->asSurfaceProxyRef(),
247*c8dee2aaSAndroid Build Coastguard Worker                         surfaceContext->origin(),
248*c8dee2aaSAndroid Build Coastguard Worker                         colorInfo.colorType(),
249*c8dee2aaSAndroid Build Coastguard Worker                         pixels.get(),
250*c8dee2aaSAndroid Build Coastguard Worker                         "EGLImageTest-copy");
251*c8dee2aaSAndroid Build Coastguard Worker 
252*c8dee2aaSAndroid Build Coastguard Worker     cleanup(glCtx0, externalTexture.fID, glCtx1.get(), context1, image);
253*c8dee2aaSAndroid Build Coastguard Worker }
254*c8dee2aaSAndroid Build Coastguard Worker 
255*c8dee2aaSAndroid Build Coastguard Worker #endif  // SK_GL
256