xref: /aosp_15_r20/external/deqp/modules/egl/teglImageFormatTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program EGL Module
3*35238bceSAndroid Build Coastguard Worker  * ---------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief EGL image tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "teglImageFormatTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deSTLUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuTexture.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "tcuCommandLine.hpp"
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker #include "egluNativeDisplay.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "egluNativeWindow.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "egluNativePixmap.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "egluConfigFilter.hpp"
40*35238bceSAndroid Build Coastguard Worker #include "egluUnique.hpp"
41*35238bceSAndroid Build Coastguard Worker #include "egluUtil.hpp"
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker #include "eglwLibrary.hpp"
44*35238bceSAndroid Build Coastguard Worker #include "eglwEnums.hpp"
45*35238bceSAndroid Build Coastguard Worker 
46*35238bceSAndroid Build Coastguard Worker #include "gluCallLogWrapper.hpp"
47*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
48*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
49*35238bceSAndroid Build Coastguard Worker #include "gluTexture.hpp"
50*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
51*35238bceSAndroid Build Coastguard Worker #include "gluObjectWrapper.hpp"
52*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
53*35238bceSAndroid Build Coastguard Worker 
54*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
55*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
56*35238bceSAndroid Build Coastguard Worker 
57*35238bceSAndroid Build Coastguard Worker #include "teglImageUtil.hpp"
58*35238bceSAndroid Build Coastguard Worker #include "teglAndroidUtil.hpp"
59*35238bceSAndroid Build Coastguard Worker 
60*35238bceSAndroid Build Coastguard Worker #include <vector>
61*35238bceSAndroid Build Coastguard Worker #include <string>
62*35238bceSAndroid Build Coastguard Worker #include <set>
63*35238bceSAndroid Build Coastguard Worker 
64*35238bceSAndroid Build Coastguard Worker using std::set;
65*35238bceSAndroid Build Coastguard Worker using std::string;
66*35238bceSAndroid Build Coastguard Worker using std::vector;
67*35238bceSAndroid Build Coastguard Worker 
68*35238bceSAndroid Build Coastguard Worker using de::MovePtr;
69*35238bceSAndroid Build Coastguard Worker using de::UniquePtr;
70*35238bceSAndroid Build Coastguard Worker 
71*35238bceSAndroid Build Coastguard Worker using glu::Framebuffer;
72*35238bceSAndroid Build Coastguard Worker using glu::Renderbuffer;
73*35238bceSAndroid Build Coastguard Worker using glu::Texture;
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker using eglu::UniqueImage;
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker using tcu::ConstPixelBufferAccess;
78*35238bceSAndroid Build Coastguard Worker 
79*35238bceSAndroid Build Coastguard Worker using namespace glw;
80*35238bceSAndroid Build Coastguard Worker using namespace eglw;
81*35238bceSAndroid Build Coastguard Worker 
82*35238bceSAndroid Build Coastguard Worker namespace deqp
83*35238bceSAndroid Build Coastguard Worker {
84*35238bceSAndroid Build Coastguard Worker namespace egl
85*35238bceSAndroid Build Coastguard Worker {
86*35238bceSAndroid Build Coastguard Worker 
87*35238bceSAndroid Build Coastguard Worker namespace
88*35238bceSAndroid Build Coastguard Worker {
89*35238bceSAndroid Build Coastguard Worker 
programSources(const string & vertexSource,const string & fragmentSource)90*35238bceSAndroid Build Coastguard Worker glu::ProgramSources programSources(const string &vertexSource, const string &fragmentSource)
91*35238bceSAndroid Build Coastguard Worker {
92*35238bceSAndroid Build Coastguard Worker     glu::ProgramSources sources;
93*35238bceSAndroid Build Coastguard Worker 
94*35238bceSAndroid Build Coastguard Worker     sources << glu::VertexSource(vertexSource) << glu::FragmentSource(fragmentSource);
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker     return sources;
97*35238bceSAndroid Build Coastguard Worker }
98*35238bceSAndroid Build Coastguard Worker 
99*35238bceSAndroid Build Coastguard Worker class Program : public glu::ShaderProgram
100*35238bceSAndroid Build Coastguard Worker {
101*35238bceSAndroid Build Coastguard Worker public:
Program(const glw::Functions & gl,const char * vertexSource,const char * fragmentSource)102*35238bceSAndroid Build Coastguard Worker     Program(const glw::Functions &gl, const char *vertexSource, const char *fragmentSource)
103*35238bceSAndroid Build Coastguard Worker         : glu::ShaderProgram(gl, programSources(vertexSource, fragmentSource))
104*35238bceSAndroid Build Coastguard Worker     {
105*35238bceSAndroid Build Coastguard Worker     }
106*35238bceSAndroid Build Coastguard Worker };
107*35238bceSAndroid Build Coastguard Worker 
108*35238bceSAndroid Build Coastguard Worker } // namespace
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker namespace Image
111*35238bceSAndroid Build Coastguard Worker {
112*35238bceSAndroid Build Coastguard Worker 
113*35238bceSAndroid Build Coastguard Worker class ImageApi;
114*35238bceSAndroid Build Coastguard Worker 
115*35238bceSAndroid Build Coastguard Worker class IllegalRendererException : public std::exception
116*35238bceSAndroid Build Coastguard Worker {
117*35238bceSAndroid Build Coastguard Worker };
118*35238bceSAndroid Build Coastguard Worker 
119*35238bceSAndroid Build Coastguard Worker class Action
120*35238bceSAndroid Build Coastguard Worker {
121*35238bceSAndroid Build Coastguard Worker public:
~Action(void)122*35238bceSAndroid Build Coastguard Worker     virtual ~Action(void)
123*35238bceSAndroid Build Coastguard Worker     {
124*35238bceSAndroid Build Coastguard Worker     }
125*35238bceSAndroid Build Coastguard Worker     virtual bool invoke(ImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &refImg) const = 0;
126*35238bceSAndroid Build Coastguard Worker     virtual string getRequiredExtension(void) const                                               = 0;
127*35238bceSAndroid Build Coastguard Worker };
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker struct TestSpec
130*35238bceSAndroid Build Coastguard Worker {
131*35238bceSAndroid Build Coastguard Worker     std::string name;
132*35238bceSAndroid Build Coastguard Worker     std::string desc;
133*35238bceSAndroid Build Coastguard Worker 
134*35238bceSAndroid Build Coastguard Worker     enum ApiContext
135*35238bceSAndroid Build Coastguard Worker     {
136*35238bceSAndroid Build Coastguard Worker         API_GLES2 = 0,
137*35238bceSAndroid Build Coastguard Worker         API_GLES3,
138*35238bceSAndroid Build Coastguard Worker         //API_VG
139*35238bceSAndroid Build Coastguard Worker         //API_GLES1
140*35238bceSAndroid Build Coastguard Worker 
141*35238bceSAndroid Build Coastguard Worker         API_LAST
142*35238bceSAndroid Build Coastguard Worker     };
143*35238bceSAndroid Build Coastguard Worker 
144*35238bceSAndroid Build Coastguard Worker     struct Operation
145*35238bceSAndroid Build Coastguard Worker     {
Operationdeqp::egl::Image::TestSpec::Operation146*35238bceSAndroid Build Coastguard Worker         Operation(int apiIndex_, const Action &action_) : apiIndex(apiIndex_), action(&action_)
147*35238bceSAndroid Build Coastguard Worker         {
148*35238bceSAndroid Build Coastguard Worker         }
149*35238bceSAndroid Build Coastguard Worker         int apiIndex;
150*35238bceSAndroid Build Coastguard Worker         const Action *action;
151*35238bceSAndroid Build Coastguard Worker     };
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker     vector<ApiContext> contexts;
154*35238bceSAndroid Build Coastguard Worker     vector<Operation> operations;
155*35238bceSAndroid Build Coastguard Worker };
156*35238bceSAndroid Build Coastguard Worker 
157*35238bceSAndroid Build Coastguard Worker class ImageApi
158*35238bceSAndroid Build Coastguard Worker {
159*35238bceSAndroid Build Coastguard Worker public:
160*35238bceSAndroid Build Coastguard Worker     ImageApi(const Library &egl, int contextId, EGLDisplay display, EGLSurface surface);
~ImageApi(void)161*35238bceSAndroid Build Coastguard Worker     virtual ~ImageApi(void)
162*35238bceSAndroid Build Coastguard Worker     {
163*35238bceSAndroid Build Coastguard Worker     }
164*35238bceSAndroid Build Coastguard Worker 
165*35238bceSAndroid Build Coastguard Worker protected:
166*35238bceSAndroid Build Coastguard Worker     const Library &m_egl;
167*35238bceSAndroid Build Coastguard Worker     int m_contextId;
168*35238bceSAndroid Build Coastguard Worker     EGLDisplay m_display;
169*35238bceSAndroid Build Coastguard Worker     EGLSurface m_surface;
170*35238bceSAndroid Build Coastguard Worker };
171*35238bceSAndroid Build Coastguard Worker 
ImageApi(const Library & egl,int contextId,EGLDisplay display,EGLSurface surface)172*35238bceSAndroid Build Coastguard Worker ImageApi::ImageApi(const Library &egl, int contextId, EGLDisplay display, EGLSurface surface)
173*35238bceSAndroid Build Coastguard Worker     : m_egl(egl)
174*35238bceSAndroid Build Coastguard Worker     , m_contextId(contextId)
175*35238bceSAndroid Build Coastguard Worker     , m_display(display)
176*35238bceSAndroid Build Coastguard Worker     , m_surface(surface)
177*35238bceSAndroid Build Coastguard Worker {
178*35238bceSAndroid Build Coastguard Worker }
179*35238bceSAndroid Build Coastguard Worker 
180*35238bceSAndroid Build Coastguard Worker class GLESImageApi : public ImageApi, private glu::CallLogWrapper
181*35238bceSAndroid Build Coastguard Worker {
182*35238bceSAndroid Build Coastguard Worker public:
183*35238bceSAndroid Build Coastguard Worker     class GLESAction : public Action
184*35238bceSAndroid Build Coastguard Worker     {
185*35238bceSAndroid Build Coastguard Worker     public:
186*35238bceSAndroid Build Coastguard Worker         bool invoke(ImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const;
187*35238bceSAndroid Build Coastguard Worker         virtual bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const = 0;
188*35238bceSAndroid Build Coastguard Worker     };
189*35238bceSAndroid Build Coastguard Worker 
190*35238bceSAndroid Build Coastguard Worker     class Create : public GLESAction
191*35238bceSAndroid Build Coastguard Worker     {
192*35238bceSAndroid Build Coastguard Worker     public:
Create(MovePtr<ImageSource> imgSource,uint32_t numLayers=1u)193*35238bceSAndroid Build Coastguard Worker         Create(MovePtr<ImageSource> imgSource, uint32_t numLayers = 1u) : m_imgSource(imgSource), m_numLayers(numLayers)
194*35238bceSAndroid Build Coastguard Worker         {
195*35238bceSAndroid Build Coastguard Worker         }
getRequiredExtension(void) const196*35238bceSAndroid Build Coastguard Worker         string getRequiredExtension(void) const
197*35238bceSAndroid Build Coastguard Worker         {
198*35238bceSAndroid Build Coastguard Worker             return m_imgSource->getRequiredExtension();
199*35238bceSAndroid Build Coastguard Worker         }
200*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const;
getNumLayers(void) const201*35238bceSAndroid Build Coastguard Worker         uint32_t getNumLayers(void) const
202*35238bceSAndroid Build Coastguard Worker         {
203*35238bceSAndroid Build Coastguard Worker             return m_numLayers;
204*35238bceSAndroid Build Coastguard Worker         }
getEffectiveFormat(void) const205*35238bceSAndroid Build Coastguard Worker         glw::GLenum getEffectiveFormat(void) const
206*35238bceSAndroid Build Coastguard Worker         {
207*35238bceSAndroid Build Coastguard Worker             return m_imgSource->getEffectiveFormat();
208*35238bceSAndroid Build Coastguard Worker         }
isYUVFormatImage(void) const209*35238bceSAndroid Build Coastguard Worker         bool isYUVFormatImage(void) const
210*35238bceSAndroid Build Coastguard Worker         {
211*35238bceSAndroid Build Coastguard Worker             return m_imgSource->isYUVFormatImage();
212*35238bceSAndroid Build Coastguard Worker         }
213*35238bceSAndroid Build Coastguard Worker 
214*35238bceSAndroid Build Coastguard Worker     private:
215*35238bceSAndroid Build Coastguard Worker         UniquePtr<ImageSource> m_imgSource;
216*35238bceSAndroid Build Coastguard Worker         uint32_t m_numLayers;
217*35238bceSAndroid Build Coastguard Worker     };
218*35238bceSAndroid Build Coastguard Worker 
219*35238bceSAndroid Build Coastguard Worker     class Render : public GLESAction
220*35238bceSAndroid Build Coastguard Worker     {
221*35238bceSAndroid Build Coastguard Worker     public:
getRequiredExtension(void) const222*35238bceSAndroid Build Coastguard Worker         virtual string getRequiredExtension(void) const
223*35238bceSAndroid Build Coastguard Worker         {
224*35238bceSAndroid Build Coastguard Worker             return "GL_OES_EGL_image";
225*35238bceSAndroid Build Coastguard Worker         }
226*35238bceSAndroid Build Coastguard Worker     };
227*35238bceSAndroid Build Coastguard Worker 
228*35238bceSAndroid Build Coastguard Worker     class RenderTexture2D : public Render
229*35238bceSAndroid Build Coastguard Worker     {
230*35238bceSAndroid Build Coastguard Worker     public:
231*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
232*35238bceSAndroid Build Coastguard Worker     };
233*35238bceSAndroid Build Coastguard Worker     class RenderTextureCubemap : public Render
234*35238bceSAndroid Build Coastguard Worker     {
235*35238bceSAndroid Build Coastguard Worker     public:
236*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
237*35238bceSAndroid Build Coastguard Worker     };
238*35238bceSAndroid Build Coastguard Worker     class RenderReadPixelsRenderbuffer : public Render
239*35238bceSAndroid Build Coastguard Worker     {
240*35238bceSAndroid Build Coastguard Worker     public:
241*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
242*35238bceSAndroid Build Coastguard Worker     };
243*35238bceSAndroid Build Coastguard Worker     class RenderDepthbuffer : public Render
244*35238bceSAndroid Build Coastguard Worker     {
245*35238bceSAndroid Build Coastguard Worker     public:
246*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
247*35238bceSAndroid Build Coastguard Worker     };
248*35238bceSAndroid Build Coastguard Worker     class RenderStencilbuffer : public Render
249*35238bceSAndroid Build Coastguard Worker     {
250*35238bceSAndroid Build Coastguard Worker     public:
251*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
252*35238bceSAndroid Build Coastguard Worker     };
253*35238bceSAndroid Build Coastguard Worker     class RenderTryAll : public Render
254*35238bceSAndroid Build Coastguard Worker     {
255*35238bceSAndroid Build Coastguard Worker     public:
256*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
257*35238bceSAndroid Build Coastguard Worker     };
258*35238bceSAndroid Build Coastguard Worker 
259*35238bceSAndroid Build Coastguard Worker     class RenderTexture2DArray : public Render
260*35238bceSAndroid Build Coastguard Worker     {
261*35238bceSAndroid Build Coastguard Worker     public:
262*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
getRequiredExtension(void) const263*35238bceSAndroid Build Coastguard Worker         string getRequiredExtension(void) const override
264*35238bceSAndroid Build Coastguard Worker         {
265*35238bceSAndroid Build Coastguard Worker             return "GL_EXT_EGL_image_array";
266*35238bceSAndroid Build Coastguard Worker         }
267*35238bceSAndroid Build Coastguard Worker     };
268*35238bceSAndroid Build Coastguard Worker 
269*35238bceSAndroid Build Coastguard Worker     class RenderExternalTexture : public Render
270*35238bceSAndroid Build Coastguard Worker     {
271*35238bceSAndroid Build Coastguard Worker     public:
272*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
getRequiredExtension(void) const273*35238bceSAndroid Build Coastguard Worker         string getRequiredExtension(void) const override
274*35238bceSAndroid Build Coastguard Worker         {
275*35238bceSAndroid Build Coastguard Worker             return "GL_OES_EGL_image_external";
276*35238bceSAndroid Build Coastguard Worker         }
277*35238bceSAndroid Build Coastguard Worker     };
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker     class RenderExternalTextureSamplerArray : public Render
280*35238bceSAndroid Build Coastguard Worker     {
281*35238bceSAndroid Build Coastguard Worker     public:
282*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
getRequiredExtension(void) const283*35238bceSAndroid Build Coastguard Worker         string getRequiredExtension(void) const override
284*35238bceSAndroid Build Coastguard Worker         {
285*35238bceSAndroid Build Coastguard Worker             return "GL_OES_EGL_image_external";
286*35238bceSAndroid Build Coastguard Worker         }
287*35238bceSAndroid Build Coastguard Worker     };
288*35238bceSAndroid Build Coastguard Worker     class RenderYUVTexture : public Render
289*35238bceSAndroid Build Coastguard Worker     {
290*35238bceSAndroid Build Coastguard Worker     public:
291*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
getRequiredExtension(void) const292*35238bceSAndroid Build Coastguard Worker         string getRequiredExtension(void) const override
293*35238bceSAndroid Build Coastguard Worker         {
294*35238bceSAndroid Build Coastguard Worker             return "GL_EXT_YUV_target";
295*35238bceSAndroid Build Coastguard Worker         }
296*35238bceSAndroid Build Coastguard Worker     };
297*35238bceSAndroid Build Coastguard Worker     class RenderSampleTexture2DArray : public RenderTexture2DArray
298*35238bceSAndroid Build Coastguard Worker     {
299*35238bceSAndroid Build Coastguard Worker     public:
300*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const override;
getRequiredExtension(void) const301*35238bceSAndroid Build Coastguard Worker         string getRequiredExtension(void) const override
302*35238bceSAndroid Build Coastguard Worker         {
303*35238bceSAndroid Build Coastguard Worker             return "GL_EXT_EGL_image_array";
304*35238bceSAndroid Build Coastguard Worker         }
305*35238bceSAndroid Build Coastguard Worker     };
306*35238bceSAndroid Build Coastguard Worker     class Modify : public GLESAction
307*35238bceSAndroid Build Coastguard Worker     {
308*35238bceSAndroid Build Coastguard Worker     public:
getRequiredExtension(void) const309*35238bceSAndroid Build Coastguard Worker         string getRequiredExtension(void) const
310*35238bceSAndroid Build Coastguard Worker         {
311*35238bceSAndroid Build Coastguard Worker             return "GL_OES_EGL_image";
312*35238bceSAndroid Build Coastguard Worker         }
313*35238bceSAndroid Build Coastguard Worker     };
314*35238bceSAndroid Build Coastguard Worker 
315*35238bceSAndroid Build Coastguard Worker     class ModifyTexSubImage : public Modify
316*35238bceSAndroid Build Coastguard Worker     {
317*35238bceSAndroid Build Coastguard Worker     public:
ModifyTexSubImage(GLenum format,GLenum type)318*35238bceSAndroid Build Coastguard Worker         ModifyTexSubImage(GLenum format, GLenum type) : m_format(format), m_type(type)
319*35238bceSAndroid Build Coastguard Worker         {
320*35238bceSAndroid Build Coastguard Worker         }
321*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const;
getFormat(void) const322*35238bceSAndroid Build Coastguard Worker         GLenum getFormat(void) const
323*35238bceSAndroid Build Coastguard Worker         {
324*35238bceSAndroid Build Coastguard Worker             return m_format;
325*35238bceSAndroid Build Coastguard Worker         }
getType(void) const326*35238bceSAndroid Build Coastguard Worker         GLenum getType(void) const
327*35238bceSAndroid Build Coastguard Worker         {
328*35238bceSAndroid Build Coastguard Worker             return m_type;
329*35238bceSAndroid Build Coastguard Worker         }
330*35238bceSAndroid Build Coastguard Worker 
331*35238bceSAndroid Build Coastguard Worker     private:
332*35238bceSAndroid Build Coastguard Worker         GLenum m_format;
333*35238bceSAndroid Build Coastguard Worker         GLenum m_type;
334*35238bceSAndroid Build Coastguard Worker     };
335*35238bceSAndroid Build Coastguard Worker 
336*35238bceSAndroid Build Coastguard Worker     class ModifyRenderbuffer : public Modify
337*35238bceSAndroid Build Coastguard Worker     {
338*35238bceSAndroid Build Coastguard Worker     public:
339*35238bceSAndroid Build Coastguard Worker         bool invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const;
340*35238bceSAndroid Build Coastguard Worker 
341*35238bceSAndroid Build Coastguard Worker     protected:
342*35238bceSAndroid Build Coastguard Worker         virtual void initializeRbo(GLESImageApi &api, GLuint rbo, tcu::Texture2D &ref) const = 0;
343*35238bceSAndroid Build Coastguard Worker     };
344*35238bceSAndroid Build Coastguard Worker 
345*35238bceSAndroid Build Coastguard Worker     class ModifyRenderbufferClearColor : public ModifyRenderbuffer
346*35238bceSAndroid Build Coastguard Worker     {
347*35238bceSAndroid Build Coastguard Worker     public:
ModifyRenderbufferClearColor(tcu::Vec4 color)348*35238bceSAndroid Build Coastguard Worker         ModifyRenderbufferClearColor(tcu::Vec4 color) : m_color(color)
349*35238bceSAndroid Build Coastguard Worker         {
350*35238bceSAndroid Build Coastguard Worker         }
351*35238bceSAndroid Build Coastguard Worker 
352*35238bceSAndroid Build Coastguard Worker     protected:
353*35238bceSAndroid Build Coastguard Worker         void initializeRbo(GLESImageApi &api, GLuint rbo, tcu::Texture2D &ref) const;
354*35238bceSAndroid Build Coastguard Worker 
355*35238bceSAndroid Build Coastguard Worker         tcu::Vec4 m_color;
356*35238bceSAndroid Build Coastguard Worker     };
357*35238bceSAndroid Build Coastguard Worker 
358*35238bceSAndroid Build Coastguard Worker     class ModifyRenderbufferClearDepth : public ModifyRenderbuffer
359*35238bceSAndroid Build Coastguard Worker     {
360*35238bceSAndroid Build Coastguard Worker     public:
ModifyRenderbufferClearDepth(GLfloat depth)361*35238bceSAndroid Build Coastguard Worker         ModifyRenderbufferClearDepth(GLfloat depth) : m_depth(depth)
362*35238bceSAndroid Build Coastguard Worker         {
363*35238bceSAndroid Build Coastguard Worker         }
364*35238bceSAndroid Build Coastguard Worker 
365*35238bceSAndroid Build Coastguard Worker     protected:
366*35238bceSAndroid Build Coastguard Worker         void initializeRbo(GLESImageApi &api, GLuint rbo, tcu::Texture2D &ref) const;
367*35238bceSAndroid Build Coastguard Worker 
368*35238bceSAndroid Build Coastguard Worker         GLfloat m_depth;
369*35238bceSAndroid Build Coastguard Worker     };
370*35238bceSAndroid Build Coastguard Worker 
371*35238bceSAndroid Build Coastguard Worker     class ModifyRenderbufferClearStencil : public ModifyRenderbuffer
372*35238bceSAndroid Build Coastguard Worker     {
373*35238bceSAndroid Build Coastguard Worker     public:
ModifyRenderbufferClearStencil(GLint stencil)374*35238bceSAndroid Build Coastguard Worker         ModifyRenderbufferClearStencil(GLint stencil) : m_stencil(stencil)
375*35238bceSAndroid Build Coastguard Worker         {
376*35238bceSAndroid Build Coastguard Worker         }
377*35238bceSAndroid Build Coastguard Worker 
378*35238bceSAndroid Build Coastguard Worker     protected:
379*35238bceSAndroid Build Coastguard Worker         void initializeRbo(GLESImageApi &api, GLuint rbo, tcu::Texture2D &ref) const;
380*35238bceSAndroid Build Coastguard Worker 
381*35238bceSAndroid Build Coastguard Worker         GLint m_stencil;
382*35238bceSAndroid Build Coastguard Worker     };
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker     GLESImageApi(const Library &egl, const glw::Functions &gl, int contextId, tcu::TestLog &log, EGLDisplay display,
385*35238bceSAndroid Build Coastguard Worker                  EGLSurface surface, EGLConfig config, EGLint apiVersion);
386*35238bceSAndroid Build Coastguard Worker     ~GLESImageApi(void);
387*35238bceSAndroid Build Coastguard Worker 
388*35238bceSAndroid Build Coastguard Worker private:
389*35238bceSAndroid Build Coastguard Worker     EGLContext m_context;
390*35238bceSAndroid Build Coastguard Worker     const glw::Functions &m_gl;
391*35238bceSAndroid Build Coastguard Worker 
392*35238bceSAndroid Build Coastguard Worker     MovePtr<UniqueImage> createImage(const ImageSource &source, const ClientBuffer &buffer) const;
393*35238bceSAndroid Build Coastguard Worker };
394*35238bceSAndroid Build Coastguard Worker 
GLESImageApi(const Library & egl,const glw::Functions & gl,int contextId,tcu::TestLog & log,EGLDisplay display,EGLSurface surface,EGLConfig config,EGLint apiVersion)395*35238bceSAndroid Build Coastguard Worker GLESImageApi::GLESImageApi(const Library &egl, const glw::Functions &gl, int contextId, tcu::TestLog &log,
396*35238bceSAndroid Build Coastguard Worker                            EGLDisplay display, EGLSurface surface, EGLConfig config, EGLint apiVersion)
397*35238bceSAndroid Build Coastguard Worker     : ImageApi(egl, contextId, display, surface)
398*35238bceSAndroid Build Coastguard Worker     , glu::CallLogWrapper(gl, log)
399*35238bceSAndroid Build Coastguard Worker     , m_context(DE_NULL)
400*35238bceSAndroid Build Coastguard Worker     , m_gl(gl)
401*35238bceSAndroid Build Coastguard Worker {
402*35238bceSAndroid Build Coastguard Worker     const EGLint attriblist[] = {EGL_CONTEXT_CLIENT_VERSION, apiVersion, EGL_NONE};
403*35238bceSAndroid Build Coastguard Worker 
404*35238bceSAndroid Build Coastguard Worker     EGLint configId = -1;
405*35238bceSAndroid Build Coastguard Worker     EGLU_CHECK_CALL(m_egl, getConfigAttrib(m_display, config, EGL_CONFIG_ID, &configId));
406*35238bceSAndroid Build Coastguard Worker     getLog() << tcu::TestLog::Message << "Creating gles" << apiVersion << " context with config id: " << configId
407*35238bceSAndroid Build Coastguard Worker              << " context: " << m_contextId << tcu::TestLog::EndMessage;
408*35238bceSAndroid Build Coastguard Worker     egl.bindAPI(EGL_OPENGL_ES_API);
409*35238bceSAndroid Build Coastguard Worker     m_context = m_egl.createContext(m_display, config, EGL_NO_CONTEXT, attriblist);
410*35238bceSAndroid Build Coastguard Worker     EGLU_CHECK_MSG(m_egl, "Failed to create GLES context");
411*35238bceSAndroid Build Coastguard Worker 
412*35238bceSAndroid Build Coastguard Worker     egl.makeCurrent(display, m_surface, m_surface, m_context);
413*35238bceSAndroid Build Coastguard Worker     EGLU_CHECK_MSG(m_egl, "Failed to make context current");
414*35238bceSAndroid Build Coastguard Worker }
415*35238bceSAndroid Build Coastguard Worker 
~GLESImageApi(void)416*35238bceSAndroid Build Coastguard Worker GLESImageApi::~GLESImageApi(void)
417*35238bceSAndroid Build Coastguard Worker {
418*35238bceSAndroid Build Coastguard Worker     m_egl.makeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
419*35238bceSAndroid Build Coastguard Worker     m_egl.destroyContext(m_display, m_context);
420*35238bceSAndroid Build Coastguard Worker }
421*35238bceSAndroid Build Coastguard Worker 
invoke(ImageApi & api,MovePtr<UniqueImage> & image,tcu::Texture2D & ref) const422*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::GLESAction::invoke(ImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const
423*35238bceSAndroid Build Coastguard Worker {
424*35238bceSAndroid Build Coastguard Worker     GLESImageApi &glesApi = dynamic_cast<GLESImageApi &>(api);
425*35238bceSAndroid Build Coastguard Worker 
426*35238bceSAndroid Build Coastguard Worker     glesApi.m_egl.makeCurrent(glesApi.m_display, glesApi.m_surface, glesApi.m_surface, glesApi.m_context);
427*35238bceSAndroid Build Coastguard Worker     return invokeGLES(glesApi, image, ref);
428*35238bceSAndroid Build Coastguard Worker }
429*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & image,tcu::Texture2D & ref) const430*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::Create::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &image, tcu::Texture2D &ref) const
431*35238bceSAndroid Build Coastguard Worker {
432*35238bceSAndroid Build Coastguard Worker     de::UniquePtr<ClientBuffer> buffer(m_imgSource->createBuffer(api.m_egl, api.m_gl, &ref));
433*35238bceSAndroid Build Coastguard Worker 
434*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(api.m_gl, finish());
435*35238bceSAndroid Build Coastguard Worker 
436*35238bceSAndroid Build Coastguard Worker     image = api.createImage(*m_imgSource, *buffer);
437*35238bceSAndroid Build Coastguard Worker     return true;
438*35238bceSAndroid Build Coastguard Worker }
439*35238bceSAndroid Build Coastguard Worker 
createImage(const ImageSource & source,const ClientBuffer & buffer) const440*35238bceSAndroid Build Coastguard Worker MovePtr<UniqueImage> GLESImageApi::createImage(const ImageSource &source, const ClientBuffer &buffer) const
441*35238bceSAndroid Build Coastguard Worker {
442*35238bceSAndroid Build Coastguard Worker     const EGLImageKHR image = source.createImage(m_egl, m_display, m_context, buffer.get());
443*35238bceSAndroid Build Coastguard Worker     return MovePtr<UniqueImage>(new UniqueImage(m_egl, m_display, image));
444*35238bceSAndroid Build Coastguard Worker }
445*35238bceSAndroid Build Coastguard Worker 
imageTargetTexture2D(const Library & egl,const glw::Functions & gl,GLeglImageOES img)446*35238bceSAndroid Build Coastguard Worker static void imageTargetTexture2D(const Library &egl, const glw::Functions &gl, GLeglImageOES img)
447*35238bceSAndroid Build Coastguard Worker {
448*35238bceSAndroid Build Coastguard Worker     gl.eglImageTargetTexture2DOES(GL_TEXTURE_2D, img);
449*35238bceSAndroid Build Coastguard Worker     {
450*35238bceSAndroid Build Coastguard Worker         const GLenum error = gl.getError();
451*35238bceSAndroid Build Coastguard Worker 
452*35238bceSAndroid Build Coastguard Worker         if (error == GL_INVALID_OPERATION)
453*35238bceSAndroid Build Coastguard Worker             TCU_THROW(NotSupportedError, "Creating texture2D from EGLImage type not supported");
454*35238bceSAndroid Build Coastguard Worker 
455*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(error, "glEGLImageTargetTexture2DOES()");
456*35238bceSAndroid Build Coastguard Worker         EGLU_CHECK_MSG(egl, "glEGLImageTargetTexture2DOES()");
457*35238bceSAndroid Build Coastguard Worker     }
458*35238bceSAndroid Build Coastguard Worker }
459*35238bceSAndroid Build Coastguard Worker 
imageTargetExternalTexture(const Library & egl,const glw::Functions & gl,GLeglImageOES img)460*35238bceSAndroid Build Coastguard Worker static void imageTargetExternalTexture(const Library &egl, const glw::Functions &gl, GLeglImageOES img)
461*35238bceSAndroid Build Coastguard Worker {
462*35238bceSAndroid Build Coastguard Worker     gl.eglImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, img);
463*35238bceSAndroid Build Coastguard Worker     {
464*35238bceSAndroid Build Coastguard Worker         const GLenum error = gl.getError();
465*35238bceSAndroid Build Coastguard Worker 
466*35238bceSAndroid Build Coastguard Worker         if (error == GL_INVALID_OPERATION)
467*35238bceSAndroid Build Coastguard Worker             TCU_THROW(NotSupportedError, "Creating external texture from EGLImage type not supported");
468*35238bceSAndroid Build Coastguard Worker 
469*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(error, "glEGLImageTargetTexture2DOES()");
470*35238bceSAndroid Build Coastguard Worker         EGLU_CHECK_MSG(egl, "glEGLImageTargetTexture2DOES()");
471*35238bceSAndroid Build Coastguard Worker     }
472*35238bceSAndroid Build Coastguard Worker }
473*35238bceSAndroid Build Coastguard Worker 
imageTargetTexture2DArray(const Library & egl,const glw::Functions & gl,GLeglImageOES img)474*35238bceSAndroid Build Coastguard Worker static void imageTargetTexture2DArray(const Library &egl, const glw::Functions &gl, GLeglImageOES img)
475*35238bceSAndroid Build Coastguard Worker {
476*35238bceSAndroid Build Coastguard Worker     gl.eglImageTargetTexture2DOES(GL_TEXTURE_2D_ARRAY, img);
477*35238bceSAndroid Build Coastguard Worker     {
478*35238bceSAndroid Build Coastguard Worker         const GLenum error = gl.getError();
479*35238bceSAndroid Build Coastguard Worker 
480*35238bceSAndroid Build Coastguard Worker         if (error == GL_INVALID_OPERATION)
481*35238bceSAndroid Build Coastguard Worker             TCU_THROW(NotSupportedError, "Creating texture2D array from EGLImage type not supported");
482*35238bceSAndroid Build Coastguard Worker 
483*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(error, "glEGLImageTargetTexture2DOES()");
484*35238bceSAndroid Build Coastguard Worker         EGLU_CHECK_MSG(egl, "glEGLImageTargetTexture2DOES()");
485*35238bceSAndroid Build Coastguard Worker     }
486*35238bceSAndroid Build Coastguard Worker }
487*35238bceSAndroid Build Coastguard Worker 
imageTargetRenderbuffer(const Library & egl,const glw::Functions & gl,GLeglImageOES img)488*35238bceSAndroid Build Coastguard Worker static void imageTargetRenderbuffer(const Library &egl, const glw::Functions &gl, GLeglImageOES img)
489*35238bceSAndroid Build Coastguard Worker {
490*35238bceSAndroid Build Coastguard Worker     gl.eglImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, img);
491*35238bceSAndroid Build Coastguard Worker     {
492*35238bceSAndroid Build Coastguard Worker         const GLenum error = gl.getError();
493*35238bceSAndroid Build Coastguard Worker 
494*35238bceSAndroid Build Coastguard Worker         if (error == GL_INVALID_OPERATION)
495*35238bceSAndroid Build Coastguard Worker             TCU_THROW(NotSupportedError, "Creating renderbuffer from EGLImage type not supported");
496*35238bceSAndroid Build Coastguard Worker 
497*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(error, "glEGLImageTargetRenderbufferStorageOES()");
498*35238bceSAndroid Build Coastguard Worker         EGLU_CHECK_MSG(egl, "glEGLImageTargetRenderbufferStorageOES()");
499*35238bceSAndroid Build Coastguard Worker     }
500*35238bceSAndroid Build Coastguard Worker }
501*35238bceSAndroid Build Coastguard Worker 
framebufferRenderbuffer(const glw::Functions & gl,GLenum attachment,GLuint rbo)502*35238bceSAndroid Build Coastguard Worker static void framebufferRenderbuffer(const glw::Functions &gl, GLenum attachment, GLuint rbo)
503*35238bceSAndroid Build Coastguard Worker {
504*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, framebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, rbo));
505*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_AND_THROW(
506*35238bceSAndroid Build Coastguard Worker         NotSupportedError, gl.checkFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE,
507*35238bceSAndroid Build Coastguard Worker         ("EGLImage as " + string(glu::getFramebufferAttachmentName(attachment)) + " not supported").c_str());
508*35238bceSAndroid Build Coastguard Worker }
509*35238bceSAndroid Build Coastguard Worker 
getSupportedExtensions(tcu::TestLog & log,const Library & egl,const EGLDisplay dpy,const glw::Functions gl)510*35238bceSAndroid Build Coastguard Worker static set<string> getSupportedExtensions(tcu::TestLog &log, const Library &egl, const EGLDisplay dpy,
511*35238bceSAndroid Build Coastguard Worker                                           const glw::Functions gl)
512*35238bceSAndroid Build Coastguard Worker {
513*35238bceSAndroid Build Coastguard Worker     set<string> exts;
514*35238bceSAndroid Build Coastguard Worker     const vector<string> glExts  = de::splitString((const char *)gl.getString(GL_EXTENSIONS));
515*35238bceSAndroid Build Coastguard Worker     const vector<string> eglExts = eglu::getDisplayExtensions(egl, dpy);
516*35238bceSAndroid Build Coastguard Worker 
517*35238bceSAndroid Build Coastguard Worker     exts.insert(glExts.begin(), glExts.end());
518*35238bceSAndroid Build Coastguard Worker     exts.insert(eglExts.begin(), eglExts.end());
519*35238bceSAndroid Build Coastguard Worker 
520*35238bceSAndroid Build Coastguard Worker     if (eglu::getVersion(egl, dpy) >= eglu::Version(1, 5))
521*35238bceSAndroid Build Coastguard Worker     {
522*35238bceSAndroid Build Coastguard Worker         // EGL 1.5 has built-in support for EGLImage and GL sources
523*35238bceSAndroid Build Coastguard Worker         exts.insert("EGL_KHR_image_base");
524*35238bceSAndroid Build Coastguard Worker         exts.insert("EGL_KHR_gl_texture_2D_image");
525*35238bceSAndroid Build Coastguard Worker         exts.insert("EGL_KHR_gl_texture_cubemap_image");
526*35238bceSAndroid Build Coastguard Worker         exts.insert("EGL_KHR_gl_renderbuffer_image");
527*35238bceSAndroid Build Coastguard Worker     }
528*35238bceSAndroid Build Coastguard Worker 
529*35238bceSAndroid Build Coastguard Worker     if (!de::contains(exts, "EGL_KHR_image_base") && !de::contains(exts, "EGL_KHR_image"))
530*35238bceSAndroid Build Coastguard Worker     {
531*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message
532*35238bceSAndroid Build Coastguard Worker             << "EGL version is under 1.5 and neither EGL_KHR_image nor EGL_KHR_image_base is supported."
533*35238bceSAndroid Build Coastguard Worker             << "One should be supported." << tcu::TestLog::EndMessage;
534*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, "Extension not supported: EGL_KHR_image_base");
535*35238bceSAndroid Build Coastguard Worker     }
536*35238bceSAndroid Build Coastguard Worker 
537*35238bceSAndroid Build Coastguard Worker     return exts;
538*35238bceSAndroid Build Coastguard Worker }
539*35238bceSAndroid Build Coastguard Worker 
540*35238bceSAndroid Build Coastguard Worker static const float squareTriangleCoords[] = {-1.0, -1.0, 1.0,  -1.0, 1.0,  1.0,
541*35238bceSAndroid Build Coastguard Worker 
542*35238bceSAndroid Build Coastguard Worker                                              1.0,  1.0,  -1.0, 1.0,  -1.0, -1.0};
543*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const544*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::RenderTexture2D::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
545*35238bceSAndroid Build Coastguard Worker                                                tcu::Texture2D &reference) const
546*35238bceSAndroid Build Coastguard Worker {
547*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
548*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log        = api.getLog();
549*35238bceSAndroid Build Coastguard Worker     Texture srcTex(gl);
550*35238bceSAndroid Build Coastguard Worker 
551*35238bceSAndroid Build Coastguard Worker     // Branch only taken in TryAll case
552*35238bceSAndroid Build Coastguard Worker     if (reference.getFormat().order == tcu::TextureFormat::DS || reference.getFormat().order == tcu::TextureFormat::D)
553*35238bceSAndroid Build Coastguard Worker         throw IllegalRendererException(); // Skip, GLES does not support sampling depth textures
554*35238bceSAndroid Build Coastguard Worker     if (reference.getFormat().order == tcu::TextureFormat::S)
555*35238bceSAndroid Build Coastguard Worker         throw IllegalRendererException(); // Skip, GLES does not support sampling stencil textures
556*35238bceSAndroid Build Coastguard Worker 
557*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0.0, 0.0, 0.0, 0.0);
558*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, reference.getWidth(), reference.getHeight());
559*35238bceSAndroid Build Coastguard Worker     gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
560*35238bceSAndroid Build Coastguard Worker     gl.disable(GL_DEPTH_TEST);
561*35238bceSAndroid Build Coastguard Worker 
562*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Rendering EGLImage as GL_TEXTURE_2D in context: " << api.m_contextId
563*35238bceSAndroid Build Coastguard Worker         << tcu::TestLog::EndMessage;
564*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(**img != EGL_NO_IMAGE_KHR);
565*35238bceSAndroid Build Coastguard Worker 
566*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_2D, *srcTex));
567*35238bceSAndroid Build Coastguard Worker     imageTargetTexture2D(api.m_egl, gl, **img);
568*35238bceSAndroid Build Coastguard Worker 
569*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
570*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
571*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
572*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
573*35238bceSAndroid Build Coastguard Worker 
574*35238bceSAndroid Build Coastguard Worker     const char *const vertexShader = "attribute highp vec2 a_coord;\n"
575*35238bceSAndroid Build Coastguard Worker                                      "varying mediump vec2 v_texCoord;\n"
576*35238bceSAndroid Build Coastguard Worker                                      "void main(void) {\n"
577*35238bceSAndroid Build Coastguard Worker                                      "\tv_texCoord = vec2((a_coord.x + 1.0) * 0.5, (a_coord.y + 1.0) * 0.5);\n"
578*35238bceSAndroid Build Coastguard Worker                                      "\tgl_Position = vec4(a_coord, -0.1, 1.0);\n"
579*35238bceSAndroid Build Coastguard Worker                                      "}\n";
580*35238bceSAndroid Build Coastguard Worker 
581*35238bceSAndroid Build Coastguard Worker     const char *const fragmentShader = "varying mediump vec2 v_texCoord;\n"
582*35238bceSAndroid Build Coastguard Worker                                        "uniform sampler2D u_sampler;\n"
583*35238bceSAndroid Build Coastguard Worker                                        "void main(void) {\n"
584*35238bceSAndroid Build Coastguard Worker                                        "\tmediump vec4 texColor = texture2D(u_sampler, v_texCoord);\n"
585*35238bceSAndroid Build Coastguard Worker                                        "\tgl_FragColor = vec4(texColor);\n"
586*35238bceSAndroid Build Coastguard Worker                                        "}";
587*35238bceSAndroid Build Coastguard Worker 
588*35238bceSAndroid Build Coastguard Worker     Program program(gl, vertexShader, fragmentShader);
589*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(program.isOk());
590*35238bceSAndroid Build Coastguard Worker 
591*35238bceSAndroid Build Coastguard Worker     GLuint glProgram = program.getProgram();
592*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, useProgram(glProgram));
593*35238bceSAndroid Build Coastguard Worker 
594*35238bceSAndroid Build Coastguard Worker     GLuint coordLoc = gl.getAttribLocation(glProgram, "a_coord");
595*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)coordLoc != -1, "Couldn't find attribute a_coord");
596*35238bceSAndroid Build Coastguard Worker 
597*35238bceSAndroid Build Coastguard Worker     GLuint samplerLoc = gl.getUniformLocation(glProgram, "u_sampler");
598*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)samplerLoc != (int)-1, "Couldn't find uniform u_sampler");
599*35238bceSAndroid Build Coastguard Worker 
600*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_2D, *srcTex));
601*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, uniform1i(samplerLoc, 0));
602*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enableVertexAttribArray(coordLoc));
603*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, squareTriangleCoords));
604*35238bceSAndroid Build Coastguard Worker 
605*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, drawArrays(GL_TRIANGLES, 0, 6));
606*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disableVertexAttribArray(coordLoc));
607*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_2D, 0));
608*35238bceSAndroid Build Coastguard Worker 
609*35238bceSAndroid Build Coastguard Worker     tcu::Surface refSurface(reference.getWidth(), reference.getHeight());
610*35238bceSAndroid Build Coastguard Worker     tcu::Surface screen(reference.getWidth(), reference.getHeight());
611*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
612*35238bceSAndroid Build Coastguard Worker                                       screen.getAccess().getDataPtr()));
613*35238bceSAndroid Build Coastguard Worker 
614*35238bceSAndroid Build Coastguard Worker     tcu::copy(refSurface.getAccess(), reference.getLevel(0));
615*35238bceSAndroid Build Coastguard Worker 
616*35238bceSAndroid Build Coastguard Worker     float threshold = 0.05f;
617*35238bceSAndroid Build Coastguard Worker     bool match = tcu::fuzzyCompare(log, "ComparisonResult", "Image comparison result", refSurface, screen, threshold,
618*35238bceSAndroid Build Coastguard Worker                                    tcu::COMPARE_LOG_RESULT);
619*35238bceSAndroid Build Coastguard Worker 
620*35238bceSAndroid Build Coastguard Worker     return match;
621*35238bceSAndroid Build Coastguard Worker }
622*35238bceSAndroid Build Coastguard Worker 
623*35238bceSAndroid Build Coastguard Worker // Renders using a single layer from a texture array.
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const624*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::RenderTexture2DArray::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
625*35238bceSAndroid Build Coastguard Worker                                                     tcu::Texture2D &reference) const
626*35238bceSAndroid Build Coastguard Worker {
627*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
628*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log        = api.getLog();
629*35238bceSAndroid Build Coastguard Worker     Texture srcTex(gl);
630*35238bceSAndroid Build Coastguard Worker 
631*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0.0, 0.0, 0.0, 0.0);
632*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, reference.getWidth(), reference.getHeight());
633*35238bceSAndroid Build Coastguard Worker     gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
634*35238bceSAndroid Build Coastguard Worker     gl.disable(GL_DEPTH_TEST);
635*35238bceSAndroid Build Coastguard Worker 
636*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Rendering EGLImage as GL_TEXTURE_2D_ARRAY in context: " << api.m_contextId
637*35238bceSAndroid Build Coastguard Worker         << tcu::TestLog::EndMessage;
638*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(**img != EGL_NO_IMAGE_KHR);
639*35238bceSAndroid Build Coastguard Worker 
640*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_2D_ARRAY, *srcTex));
641*35238bceSAndroid Build Coastguard Worker     imageTargetTexture2DArray(api.m_egl, gl, **img);
642*35238bceSAndroid Build Coastguard Worker 
643*35238bceSAndroid Build Coastguard Worker     glu::TransferFormat transferFormat = glu::getTransferFormat(reference.getFormat());
644*35238bceSAndroid Build Coastguard Worker     // Initializes layer 1.
645*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texSubImage3D(GL_TEXTURE_2D_ARRAY,
646*35238bceSAndroid Build Coastguard Worker                                          0,                                    // Mipmap level
647*35238bceSAndroid Build Coastguard Worker                                          0,                                    // X offset
648*35238bceSAndroid Build Coastguard Worker                                          0,                                    // Y offset
649*35238bceSAndroid Build Coastguard Worker                                          1,                                    // Z offset (layer)
650*35238bceSAndroid Build Coastguard Worker                                          reference.getWidth(),                 // Width
651*35238bceSAndroid Build Coastguard Worker                                          reference.getHeight(),                // Height
652*35238bceSAndroid Build Coastguard Worker                                          1u,                                   // Depth
653*35238bceSAndroid Build Coastguard Worker                                          transferFormat.format,                // Format
654*35238bceSAndroid Build Coastguard Worker                                          transferFormat.dataType,              // Type
655*35238bceSAndroid Build Coastguard Worker                                          reference.getLevel(0).getDataPtr())); // Pixel data
656*35238bceSAndroid Build Coastguard Worker 
657*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
658*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
659*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
660*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
661*35238bceSAndroid Build Coastguard Worker 
662*35238bceSAndroid Build Coastguard Worker     const char *const vertexShader = "#version 300 es\n"
663*35238bceSAndroid Build Coastguard Worker                                      "precision highp int;\n"
664*35238bceSAndroid Build Coastguard Worker                                      "precision highp float;\n"
665*35238bceSAndroid Build Coastguard Worker                                      "layout(location = 0) in vec2 pos_in;\n"
666*35238bceSAndroid Build Coastguard Worker                                      "out vec2 texcoord;\n"
667*35238bceSAndroid Build Coastguard Worker                                      "void main()\n"
668*35238bceSAndroid Build Coastguard Worker                                      "{\n"
669*35238bceSAndroid Build Coastguard Worker                                      "    gl_Position = vec4(pos_in, -0.1, 1.0);\n"
670*35238bceSAndroid Build Coastguard Worker                                      "    texcoord = vec2((pos_in.x + 1.0) * 0.5, (pos_in.y + 1.0) * 0.5);\n"
671*35238bceSAndroid Build Coastguard Worker                                      "}\n";
672*35238bceSAndroid Build Coastguard Worker 
673*35238bceSAndroid Build Coastguard Worker     const char *const fragmentShader = "#version 300 es\n"
674*35238bceSAndroid Build Coastguard Worker                                        "precision highp int;\n"
675*35238bceSAndroid Build Coastguard Worker                                        "precision highp float;\n"
676*35238bceSAndroid Build Coastguard Worker                                        "in vec2 texcoord;\n"
677*35238bceSAndroid Build Coastguard Worker                                        "layout(location = 0) out vec4 color_out;\n"
678*35238bceSAndroid Build Coastguard Worker                                        "uniform highp sampler2DArray tex_sampler;\n"
679*35238bceSAndroid Build Coastguard Worker                                        "void main()\n"
680*35238bceSAndroid Build Coastguard Worker                                        "{\n"
681*35238bceSAndroid Build Coastguard Worker                                        // Samples layer 1.
682*35238bceSAndroid Build Coastguard Worker                                        "    color_out = texture(tex_sampler, vec3(texcoord, 1));\n"
683*35238bceSAndroid Build Coastguard Worker                                        "}\n";
684*35238bceSAndroid Build Coastguard Worker 
685*35238bceSAndroid Build Coastguard Worker     Program program(gl, vertexShader, fragmentShader);
686*35238bceSAndroid Build Coastguard Worker 
687*35238bceSAndroid Build Coastguard Worker     if (!program.isOk())
688*35238bceSAndroid Build Coastguard Worker     {
689*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << "Shader build failed.\n"
690*35238bceSAndroid Build Coastguard Worker             << "Vertex: " << program.getShaderInfo(glu::SHADERTYPE_VERTEX).infoLog << "\n"
691*35238bceSAndroid Build Coastguard Worker             << vertexShader << "\n"
692*35238bceSAndroid Build Coastguard Worker             << "Fragment: " << program.getShaderInfo(glu::SHADERTYPE_FRAGMENT).infoLog << "\n"
693*35238bceSAndroid Build Coastguard Worker             << fragmentShader << "\n"
694*35238bceSAndroid Build Coastguard Worker             << "Program: " << program.getProgramInfo().infoLog << tcu::TestLog::EndMessage;
695*35238bceSAndroid Build Coastguard Worker     }
696*35238bceSAndroid Build Coastguard Worker 
697*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(program.isOk());
698*35238bceSAndroid Build Coastguard Worker 
699*35238bceSAndroid Build Coastguard Worker     GLuint glProgram = program.getProgram();
700*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, useProgram(glProgram));
701*35238bceSAndroid Build Coastguard Worker 
702*35238bceSAndroid Build Coastguard Worker     GLuint coordLoc = gl.getAttribLocation(glProgram, "pos_in");
703*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)coordLoc != -1, "Couldn't find attribute pos_in");
704*35238bceSAndroid Build Coastguard Worker 
705*35238bceSAndroid Build Coastguard Worker     GLuint samplerLoc = gl.getUniformLocation(glProgram, "tex_sampler");
706*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)samplerLoc != (int)-1, "Couldn't find uniform tex_sampler");
707*35238bceSAndroid Build Coastguard Worker 
708*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_2D_ARRAY, *srcTex));
709*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, uniform1i(samplerLoc, 0));
710*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enableVertexAttribArray(coordLoc));
711*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, squareTriangleCoords));
712*35238bceSAndroid Build Coastguard Worker 
713*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, drawArrays(GL_TRIANGLES, 0, 6));
714*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disableVertexAttribArray(coordLoc));
715*35238bceSAndroid Build Coastguard Worker 
716*35238bceSAndroid Build Coastguard Worker     tcu::Surface refSurface(reference.getWidth(), reference.getHeight());
717*35238bceSAndroid Build Coastguard Worker     tcu::Surface screen(reference.getWidth(), reference.getHeight());
718*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
719*35238bceSAndroid Build Coastguard Worker                                       screen.getAccess().getDataPtr()));
720*35238bceSAndroid Build Coastguard Worker 
721*35238bceSAndroid Build Coastguard Worker     tcu::copy(refSurface.getAccess(), reference.getLevel(0));
722*35238bceSAndroid Build Coastguard Worker 
723*35238bceSAndroid Build Coastguard Worker     float threshold = 0.05f;
724*35238bceSAndroid Build Coastguard Worker     bool match = tcu::fuzzyCompare(log, "ComparisonResult", "Image comparison result", refSurface, screen, threshold,
725*35238bceSAndroid Build Coastguard Worker                                    tcu::COMPARE_LOG_RESULT);
726*35238bceSAndroid Build Coastguard Worker 
727*35238bceSAndroid Build Coastguard Worker     return match;
728*35238bceSAndroid Build Coastguard Worker }
729*35238bceSAndroid Build Coastguard Worker 
730*35238bceSAndroid Build Coastguard Worker //Texture2D array can be both rendered and sampled as a texture.
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const731*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::RenderSampleTexture2DArray::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
732*35238bceSAndroid Build Coastguard Worker                                                           tcu::Texture2D &reference) const
733*35238bceSAndroid Build Coastguard Worker {
734*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
735*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log        = api.getLog();
736*35238bceSAndroid Build Coastguard Worker     Texture srcTex(gl);
737*35238bceSAndroid Build Coastguard Worker     Texture srcTexArray(gl);
738*35238bceSAndroid Build Coastguard Worker 
739*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0.0, 0.0, 0.0, 0.0);
740*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, reference.getWidth(), reference.getHeight());
741*35238bceSAndroid Build Coastguard Worker     gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
742*35238bceSAndroid Build Coastguard Worker     gl.disable(GL_DEPTH_TEST);
743*35238bceSAndroid Build Coastguard Worker 
744*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message
745*35238bceSAndroid Build Coastguard Worker         << "Rendering and sampling EGLImage as GL_TEXTURE_2D_ARRAY in context: " << api.m_contextId
746*35238bceSAndroid Build Coastguard Worker         << tcu::TestLog::EndMessage;
747*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(**img != EGL_NO_IMAGE_KHR);
748*35238bceSAndroid Build Coastguard Worker 
749*35238bceSAndroid Build Coastguard Worker     glu::TransferFormat transferFormat = glu::getTransferFormat(reference.getFormat());
750*35238bceSAndroid Build Coastguard Worker     uint32_t internalForat             = glu::getInternalFormat(reference.getFormat());
751*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_2D, *srcTex));
752*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texImage2D(GL_TEXTURE_2D,
753*35238bceSAndroid Build Coastguard Worker                                       0,                                    // Level
754*35238bceSAndroid Build Coastguard Worker                                       internalForat,                        // Internal format
755*35238bceSAndroid Build Coastguard Worker                                       reference.getWidth(),                 // Width
756*35238bceSAndroid Build Coastguard Worker                                       reference.getHeight(),                // Height
757*35238bceSAndroid Build Coastguard Worker                                       0,                                    // Border
758*35238bceSAndroid Build Coastguard Worker                                       transferFormat.format,                // Format
759*35238bceSAndroid Build Coastguard Worker                                       transferFormat.dataType,              // Type
760*35238bceSAndroid Build Coastguard Worker                                       reference.getLevel(0).getDataPtr())); // Pixel data
761*35238bceSAndroid Build Coastguard Worker 
762*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
763*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
764*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
765*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
766*35238bceSAndroid Build Coastguard Worker 
767*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_2D_ARRAY, *srcTexArray));
768*35238bceSAndroid Build Coastguard Worker     imageTargetTexture2DArray(api.m_egl, gl, **img);
769*35238bceSAndroid Build Coastguard Worker 
770*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
771*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
772*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
773*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
774*35238bceSAndroid Build Coastguard Worker 
775*35238bceSAndroid Build Coastguard Worker     /* Create FBO and attach source texture layer 0 */
776*35238bceSAndroid Build Coastguard Worker     glu::Framebuffer fbo(gl);
777*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, *fbo));
778*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, framebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, *srcTexArray, 0, 0));
779*35238bceSAndroid Build Coastguard Worker 
780*35238bceSAndroid Build Coastguard Worker     const char *const vertexShader0 = "attribute highp vec2 a_coord;\n"
781*35238bceSAndroid Build Coastguard Worker                                       "varying mediump vec2 v_texCoord;\n"
782*35238bceSAndroid Build Coastguard Worker                                       "void main(void) {\n"
783*35238bceSAndroid Build Coastguard Worker                                       "\tv_texCoord = vec2((a_coord.x + 1.0) * 0.5, (a_coord.y + 1.0) * 0.5);\n"
784*35238bceSAndroid Build Coastguard Worker                                       "\tgl_Position = vec4(a_coord, -0.1, 1.0);\n"
785*35238bceSAndroid Build Coastguard Worker                                       "}\n";
786*35238bceSAndroid Build Coastguard Worker 
787*35238bceSAndroid Build Coastguard Worker     const char *const fragmentShader0 = "varying mediump vec2 v_texCoord;\n"
788*35238bceSAndroid Build Coastguard Worker                                         "uniform sampler2D u_sampler;\n"
789*35238bceSAndroid Build Coastguard Worker                                         "void main(void) {\n"
790*35238bceSAndroid Build Coastguard Worker                                         "\tmediump vec4 texColor = texture2D(u_sampler, v_texCoord);\n"
791*35238bceSAndroid Build Coastguard Worker                                         "\tgl_FragColor = vec4(texColor);\n"
792*35238bceSAndroid Build Coastguard Worker                                         "}";
793*35238bceSAndroid Build Coastguard Worker 
794*35238bceSAndroid Build Coastguard Worker     Program program0(gl, vertexShader0, fragmentShader0);
795*35238bceSAndroid Build Coastguard Worker     if (!program0.isOk())
796*35238bceSAndroid Build Coastguard Worker     {
797*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << "Shader build failed.\n"
798*35238bceSAndroid Build Coastguard Worker             << "Vertex: " << program0.getShaderInfo(glu::SHADERTYPE_VERTEX).infoLog << "\n"
799*35238bceSAndroid Build Coastguard Worker             << vertexShader0 << "\n"
800*35238bceSAndroid Build Coastguard Worker             << "Fragment: " << program0.getShaderInfo(glu::SHADERTYPE_FRAGMENT).infoLog << "\n"
801*35238bceSAndroid Build Coastguard Worker             << fragmentShader0 << "\n"
802*35238bceSAndroid Build Coastguard Worker             << "Program: " << program0.getProgramInfo().infoLog << tcu::TestLog::EndMessage;
803*35238bceSAndroid Build Coastguard Worker     }
804*35238bceSAndroid Build Coastguard Worker 
805*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(program0.isOk());
806*35238bceSAndroid Build Coastguard Worker 
807*35238bceSAndroid Build Coastguard Worker     GLuint glProgram0 = program0.getProgram();
808*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, useProgram(glProgram0));
809*35238bceSAndroid Build Coastguard Worker 
810*35238bceSAndroid Build Coastguard Worker     GLuint coordLoc = gl.getAttribLocation(glProgram0, "a_coord");
811*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)coordLoc != -1, "Couldn't find attribute a_coord");
812*35238bceSAndroid Build Coastguard Worker     GLuint samplerLoc = gl.getUniformLocation(glProgram0, "u_sampler");
813*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)samplerLoc != (int)-1, "Couldn't find uniform u_sampler");
814*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, uniform1i(samplerLoc, 0));
815*35238bceSAndroid Build Coastguard Worker 
816*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enableVertexAttribArray(coordLoc));
817*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, squareTriangleCoords));
818*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, drawArrays(GL_TRIANGLES, 0, 6));
819*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disableVertexAttribArray(coordLoc));
820*35238bceSAndroid Build Coastguard Worker 
821*35238bceSAndroid Build Coastguard Worker     tcu::Surface refSurface0(reference.getWidth(), reference.getHeight());
822*35238bceSAndroid Build Coastguard Worker     tcu::Surface screen0(reference.getWidth(), reference.getHeight());
823*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, readPixels(0, 0, screen0.getWidth(), screen0.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
824*35238bceSAndroid Build Coastguard Worker                                       screen0.getAccess().getDataPtr()));
825*35238bceSAndroid Build Coastguard Worker 
826*35238bceSAndroid Build Coastguard Worker     tcu::copy(refSurface0.getAccess(), reference.getLevel(0));
827*35238bceSAndroid Build Coastguard Worker 
828*35238bceSAndroid Build Coastguard Worker     float threshold = 0.01f;
829*35238bceSAndroid Build Coastguard Worker     bool match = tcu::fuzzyCompare(log, "ComparisonResult", "Image comparison result", refSurface0, screen0, threshold,
830*35238bceSAndroid Build Coastguard Worker                                    tcu::COMPARE_LOG_RESULT);
831*35238bceSAndroid Build Coastguard Worker 
832*35238bceSAndroid Build Coastguard Worker     if (match == false)
833*35238bceSAndroid Build Coastguard Worker         return match;
834*35238bceSAndroid Build Coastguard Worker 
835*35238bceSAndroid Build Coastguard Worker     /* Bind texture to FBO. */
836*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *srcTex, 0));
837*35238bceSAndroid Build Coastguard Worker 
838*35238bceSAndroid Build Coastguard Worker     const char *const vertexShader = "#version 300 es\n"
839*35238bceSAndroid Build Coastguard Worker                                      "precision highp int;\n"
840*35238bceSAndroid Build Coastguard Worker                                      "precision highp float;\n"
841*35238bceSAndroid Build Coastguard Worker                                      "layout(location = 0) in vec2 pos_in;\n"
842*35238bceSAndroid Build Coastguard Worker                                      "out vec2 texcoord;\n"
843*35238bceSAndroid Build Coastguard Worker                                      "void main()\n"
844*35238bceSAndroid Build Coastguard Worker                                      "{\n"
845*35238bceSAndroid Build Coastguard Worker                                      "    gl_Position = vec4(pos_in, -0.1, 1.0);\n"
846*35238bceSAndroid Build Coastguard Worker                                      "    texcoord = vec2((pos_in.x + 1.0) * 0.5, (pos_in.y + 1.0) * 0.5);\n"
847*35238bceSAndroid Build Coastguard Worker                                      "}\n";
848*35238bceSAndroid Build Coastguard Worker 
849*35238bceSAndroid Build Coastguard Worker     const char *const fragmentShader = "#version 300 es\n"
850*35238bceSAndroid Build Coastguard Worker                                        "precision highp int;\n"
851*35238bceSAndroid Build Coastguard Worker                                        "precision highp float;\n"
852*35238bceSAndroid Build Coastguard Worker                                        "in vec2 texcoord;\n"
853*35238bceSAndroid Build Coastguard Worker                                        "layout(location = 0) out vec4 color_out;\n"
854*35238bceSAndroid Build Coastguard Worker                                        "uniform highp sampler2DArray tex_sampler;\n"
855*35238bceSAndroid Build Coastguard Worker                                        "void main()\n"
856*35238bceSAndroid Build Coastguard Worker                                        "{\n"
857*35238bceSAndroid Build Coastguard Worker                                        // Samples layer 0.
858*35238bceSAndroid Build Coastguard Worker                                        "    color_out = texture(tex_sampler, vec3(texcoord, 0));\n"
859*35238bceSAndroid Build Coastguard Worker                                        "}\n";
860*35238bceSAndroid Build Coastguard Worker 
861*35238bceSAndroid Build Coastguard Worker     Program program(gl, vertexShader, fragmentShader);
862*35238bceSAndroid Build Coastguard Worker 
863*35238bceSAndroid Build Coastguard Worker     if (!program.isOk())
864*35238bceSAndroid Build Coastguard Worker     {
865*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << "Shader build failed.\n"
866*35238bceSAndroid Build Coastguard Worker             << "Vertex: " << program.getShaderInfo(glu::SHADERTYPE_VERTEX).infoLog << "\n"
867*35238bceSAndroid Build Coastguard Worker             << vertexShader << "\n"
868*35238bceSAndroid Build Coastguard Worker             << "Fragment: " << program.getShaderInfo(glu::SHADERTYPE_FRAGMENT).infoLog << "\n"
869*35238bceSAndroid Build Coastguard Worker             << fragmentShader << "\n"
870*35238bceSAndroid Build Coastguard Worker             << "Program: " << program.getProgramInfo().infoLog << tcu::TestLog::EndMessage;
871*35238bceSAndroid Build Coastguard Worker     }
872*35238bceSAndroid Build Coastguard Worker 
873*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(program.isOk());
874*35238bceSAndroid Build Coastguard Worker 
875*35238bceSAndroid Build Coastguard Worker     GLuint glProgram = program.getProgram();
876*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, useProgram(glProgram));
877*35238bceSAndroid Build Coastguard Worker 
878*35238bceSAndroid Build Coastguard Worker     coordLoc = gl.getAttribLocation(glProgram, "pos_in");
879*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)coordLoc != -1, "Couldn't find attribute pos_in");
880*35238bceSAndroid Build Coastguard Worker 
881*35238bceSAndroid Build Coastguard Worker     samplerLoc = gl.getUniformLocation(glProgram, "tex_sampler");
882*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)samplerLoc != (int)-1, "Couldn't find uniform tex_sampler");
883*35238bceSAndroid Build Coastguard Worker 
884*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_2D_ARRAY, *srcTexArray));
885*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, uniform1i(samplerLoc, 0));
886*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enableVertexAttribArray(coordLoc));
887*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, squareTriangleCoords));
888*35238bceSAndroid Build Coastguard Worker 
889*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, drawArrays(GL_TRIANGLES, 0, 6));
890*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disableVertexAttribArray(coordLoc));
891*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, finish());
892*35238bceSAndroid Build Coastguard Worker 
893*35238bceSAndroid Build Coastguard Worker     tcu::Surface refSurface(reference.getWidth(), reference.getHeight());
894*35238bceSAndroid Build Coastguard Worker     tcu::Surface screen(reference.getWidth(), reference.getHeight());
895*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
896*35238bceSAndroid Build Coastguard Worker                                       screen.getAccess().getDataPtr()));
897*35238bceSAndroid Build Coastguard Worker 
898*35238bceSAndroid Build Coastguard Worker     tcu::copy(refSurface.getAccess(), reference.getLevel(0));
899*35238bceSAndroid Build Coastguard Worker 
900*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, 0));
901*35238bceSAndroid Build Coastguard Worker 
902*35238bceSAndroid Build Coastguard Worker     threshold = 0.01f;
903*35238bceSAndroid Build Coastguard Worker     match     = tcu::fuzzyCompare(log, "ComparisonResult", "Image comparison result", refSurface, screen, threshold,
904*35238bceSAndroid Build Coastguard Worker                                   tcu::COMPARE_LOG_RESULT);
905*35238bceSAndroid Build Coastguard Worker     return match;
906*35238bceSAndroid Build Coastguard Worker }
907*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const908*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::RenderExternalTexture::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
909*35238bceSAndroid Build Coastguard Worker                                                      tcu::Texture2D &reference) const
910*35238bceSAndroid Build Coastguard Worker {
911*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
912*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log        = api.getLog();
913*35238bceSAndroid Build Coastguard Worker     Texture srcTex(gl);
914*35238bceSAndroid Build Coastguard Worker 
915*35238bceSAndroid Build Coastguard Worker     // Branch only taken in TryAll case
916*35238bceSAndroid Build Coastguard Worker     if (reference.getFormat().order == tcu::TextureFormat::DS || reference.getFormat().order == tcu::TextureFormat::D)
917*35238bceSAndroid Build Coastguard Worker         throw IllegalRendererException(); // Skip, GLES2 does not support sampling depth textures
918*35238bceSAndroid Build Coastguard Worker     if (reference.getFormat().order == tcu::TextureFormat::S)
919*35238bceSAndroid Build Coastguard Worker         throw IllegalRendererException(); // Skip, GLES2 does not support sampling stencil textures
920*35238bceSAndroid Build Coastguard Worker 
921*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0.0, 0.0, 0.0, 0.0);
922*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, reference.getWidth(), reference.getHeight());
923*35238bceSAndroid Build Coastguard Worker     gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
924*35238bceSAndroid Build Coastguard Worker     gl.disable(GL_DEPTH_TEST);
925*35238bceSAndroid Build Coastguard Worker 
926*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Rendering EGLImage as GL_TEXTURE_EXTERNAL_OES in context: " << api.m_contextId
927*35238bceSAndroid Build Coastguard Worker         << tcu::TestLog::EndMessage;
928*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(**img != EGL_NO_IMAGE_KHR);
929*35238bceSAndroid Build Coastguard Worker 
930*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, *srcTex));
931*35238bceSAndroid Build Coastguard Worker     imageTargetExternalTexture(api.m_egl, gl, **img);
932*35238bceSAndroid Build Coastguard Worker 
933*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
934*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
935*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
936*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
937*35238bceSAndroid Build Coastguard Worker 
938*35238bceSAndroid Build Coastguard Worker     const char *const vertexShader = "attribute highp vec2 a_coord;\n"
939*35238bceSAndroid Build Coastguard Worker                                      "varying mediump vec2 v_texCoord;\n"
940*35238bceSAndroid Build Coastguard Worker                                      "void main(void) {\n"
941*35238bceSAndroid Build Coastguard Worker                                      "\tv_texCoord = vec2((a_coord.x + 1.0) * 0.5, (a_coord.y + 1.0) * 0.5);\n"
942*35238bceSAndroid Build Coastguard Worker                                      "\tgl_Position = vec4(a_coord, -0.1, 1.0);\n"
943*35238bceSAndroid Build Coastguard Worker                                      "}\n";
944*35238bceSAndroid Build Coastguard Worker 
945*35238bceSAndroid Build Coastguard Worker     const char *const fragmentShader = "#extension GL_OES_EGL_image_external : require\n"
946*35238bceSAndroid Build Coastguard Worker                                        "varying mediump vec2 v_texCoord;\n"
947*35238bceSAndroid Build Coastguard Worker                                        "uniform samplerExternalOES u_sampler;\n"
948*35238bceSAndroid Build Coastguard Worker                                        "void main(void) {\n"
949*35238bceSAndroid Build Coastguard Worker                                        "\tmediump vec4 texColor = texture2D(u_sampler, v_texCoord);\n"
950*35238bceSAndroid Build Coastguard Worker                                        "\tgl_FragColor = vec4(texColor);\n"
951*35238bceSAndroid Build Coastguard Worker                                        "}";
952*35238bceSAndroid Build Coastguard Worker 
953*35238bceSAndroid Build Coastguard Worker     Program program(gl, vertexShader, fragmentShader);
954*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(program.isOk());
955*35238bceSAndroid Build Coastguard Worker 
956*35238bceSAndroid Build Coastguard Worker     GLuint glProgram = program.getProgram();
957*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, useProgram(glProgram));
958*35238bceSAndroid Build Coastguard Worker 
959*35238bceSAndroid Build Coastguard Worker     GLuint coordLoc = gl.getAttribLocation(glProgram, "a_coord");
960*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)coordLoc != -1, "Couldn't find attribute a_coord");
961*35238bceSAndroid Build Coastguard Worker 
962*35238bceSAndroid Build Coastguard Worker     GLuint samplerLoc = gl.getUniformLocation(glProgram, "u_sampler");
963*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)samplerLoc != (int)-1, "Couldn't find uniform u_sampler");
964*35238bceSAndroid Build Coastguard Worker 
965*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, *srcTex));
966*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, uniform1i(samplerLoc, 0));
967*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enableVertexAttribArray(coordLoc));
968*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, squareTriangleCoords));
969*35238bceSAndroid Build Coastguard Worker 
970*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, drawArrays(GL_TRIANGLES, 0, 6));
971*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disableVertexAttribArray(coordLoc));
972*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, 0));
973*35238bceSAndroid Build Coastguard Worker 
974*35238bceSAndroid Build Coastguard Worker     tcu::Surface refSurface(reference.getWidth(), reference.getHeight());
975*35238bceSAndroid Build Coastguard Worker     tcu::Surface screen(reference.getWidth(), reference.getHeight());
976*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
977*35238bceSAndroid Build Coastguard Worker                                       screen.getAccess().getDataPtr()));
978*35238bceSAndroid Build Coastguard Worker 
979*35238bceSAndroid Build Coastguard Worker     tcu::copy(refSurface.getAccess(), reference.getLevel(0));
980*35238bceSAndroid Build Coastguard Worker 
981*35238bceSAndroid Build Coastguard Worker     float threshold = 0.05f;
982*35238bceSAndroid Build Coastguard Worker     bool match = tcu::fuzzyCompare(log, "ComparisonResult", "Image comparison result", refSurface, screen, threshold,
983*35238bceSAndroid Build Coastguard Worker                                    tcu::COMPARE_LOG_RESULT);
984*35238bceSAndroid Build Coastguard Worker 
985*35238bceSAndroid Build Coastguard Worker     return match;
986*35238bceSAndroid Build Coastguard Worker }
987*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const988*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::RenderYUVTexture::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
989*35238bceSAndroid Build Coastguard Worker                                                 tcu::Texture2D &reference) const
990*35238bceSAndroid Build Coastguard Worker {
991*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
992*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log        = api.getLog();
993*35238bceSAndroid Build Coastguard Worker     Texture srcTex(gl);
994*35238bceSAndroid Build Coastguard Worker 
995*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(reference.isYUVTextureUsed());
996*35238bceSAndroid Build Coastguard Worker 
997*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0.0, 0.0, 0.0, 0.0);
998*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, reference.getWidth(), reference.getHeight());
999*35238bceSAndroid Build Coastguard Worker     gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1000*35238bceSAndroid Build Coastguard Worker     gl.disable(GL_DEPTH_TEST);
1001*35238bceSAndroid Build Coastguard Worker 
1002*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Rendering EGLImage as GL_TEXTURE_EXTERNAL_OES in context: " << api.m_contextId
1003*35238bceSAndroid Build Coastguard Worker         << tcu::TestLog::EndMessage;
1004*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(**img != EGL_NO_IMAGE_KHR);
1005*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, *srcTex));
1006*35238bceSAndroid Build Coastguard Worker     imageTargetExternalTexture(api.m_egl, gl, **img);
1007*35238bceSAndroid Build Coastguard Worker     {
1008*35238bceSAndroid Build Coastguard Worker         /* init YUV texture with glClear, clear color value in YUV color space */
1009*35238bceSAndroid Build Coastguard Worker         glu::Framebuffer fbo(gl);
1010*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, *fbo));
1011*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(
1012*35238bceSAndroid Build Coastguard Worker             gl, framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, *srcTex, 0));
1013*35238bceSAndroid Build Coastguard Worker         const tcu::Vec4 colorValues[] = {
1014*35238bceSAndroid Build Coastguard Worker             tcu::Vec4(0.9f, 0.5f, 0.65f, 1.0f), tcu::Vec4(0.5f, 0.7f, 0.65f, 1.0f), tcu::Vec4(0.2f, 0.5f, 0.65f, 1.0f),
1015*35238bceSAndroid Build Coastguard Worker             tcu::Vec4(0.3f, 0.1f, 0.5f, 1.0f),  tcu::Vec4(0.8f, 0.2f, 0.3f, 1.0f),  tcu::Vec4(0.9f, 0.4f, 0.8f, 1.0f),
1016*35238bceSAndroid Build Coastguard Worker         };
1017*35238bceSAndroid Build Coastguard Worker         tcu::clear(reference.getLevel(0), tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
1018*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, enable(GL_SCISSOR_TEST));
1019*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(colorValues); ++ndx)
1020*35238bceSAndroid Build Coastguard Worker         {
1021*35238bceSAndroid Build Coastguard Worker             const tcu::IVec2 size =
1022*35238bceSAndroid Build Coastguard Worker                 tcu::IVec2((int)((float)(DE_LENGTH_OF_ARRAY(colorValues) - ndx) *
1023*35238bceSAndroid Build Coastguard Worker                                  ((float)reference.getWidth() / float(DE_LENGTH_OF_ARRAY(colorValues)))),
1024*35238bceSAndroid Build Coastguard Worker                            (int)((float)(DE_LENGTH_OF_ARRAY(colorValues) - ndx) *
1025*35238bceSAndroid Build Coastguard Worker                                  ((float)reference.getHeight() / float(DE_LENGTH_OF_ARRAY(colorValues)))));
1026*35238bceSAndroid Build Coastguard Worker 
1027*35238bceSAndroid Build Coastguard Worker             if (size.x() == 0 || size.y() == 0)
1028*35238bceSAndroid Build Coastguard Worker                 break;
1029*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_GLW_CALL(gl, scissor(0, 0, size.x(), size.y()));
1030*35238bceSAndroid Build Coastguard Worker 
1031*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_GLW_CALL(
1032*35238bceSAndroid Build Coastguard Worker                 gl, clearColor(colorValues[ndx].x(), colorValues[ndx].y(), colorValues[ndx].z(), colorValues[ndx].w()));
1033*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_GLW_CALL(gl, clear(GL_COLOR_BUFFER_BIT));
1034*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_GLW_CALL(gl, finish());
1035*35238bceSAndroid Build Coastguard Worker             uint8_t tmp[4] = {"0"};
1036*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_GLW_CALL(gl, readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void *)tmp));
1037*35238bceSAndroid Build Coastguard Worker             tcu::clear(tcu::getSubregion(reference.getLevel(0), 0, 0, size.x(), size.y()),
1038*35238bceSAndroid Build Coastguard Worker                        tcu::Vec4(tmp[0] / (255.0f), tmp[1] / (255.0f), tmp[2] / (255.0f), tmp[3] / (255.0f)));
1039*35238bceSAndroid Build Coastguard Worker         }
1040*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, disable(GL_SCISSOR_TEST));
1041*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl,
1042*35238bceSAndroid Build Coastguard Worker                            framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, 0, 0));
1043*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, 0));
1044*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, finish());
1045*35238bceSAndroid Build Coastguard Worker     }
1046*35238bceSAndroid Build Coastguard Worker 
1047*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
1048*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
1049*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
1050*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
1051*35238bceSAndroid Build Coastguard Worker 
1052*35238bceSAndroid Build Coastguard Worker     const char *const vertexShader = "attribute highp vec2 a_coord;\n"
1053*35238bceSAndroid Build Coastguard Worker                                      "varying mediump vec2 v_texCoord;\n"
1054*35238bceSAndroid Build Coastguard Worker                                      "void main(void) {\n"
1055*35238bceSAndroid Build Coastguard Worker                                      "\tv_texCoord = vec2((a_coord.x + 1.0) * 0.5, (a_coord.y + 1.0) * 0.5);\n"
1056*35238bceSAndroid Build Coastguard Worker                                      "\tgl_Position = vec4(a_coord, -0.1, 1.0);\n"
1057*35238bceSAndroid Build Coastguard Worker                                      "}\n";
1058*35238bceSAndroid Build Coastguard Worker 
1059*35238bceSAndroid Build Coastguard Worker     const char *const fragmentShader = "#extension GL_OES_EGL_image_external : require\n"
1060*35238bceSAndroid Build Coastguard Worker                                        "varying mediump vec2 v_texCoord;\n"
1061*35238bceSAndroid Build Coastguard Worker                                        "uniform samplerExternalOES u_sampler;\n"
1062*35238bceSAndroid Build Coastguard Worker                                        "void main(void) {\n"
1063*35238bceSAndroid Build Coastguard Worker                                        "\tmediump vec4 texColor = texture2D(u_sampler, v_texCoord);\n"
1064*35238bceSAndroid Build Coastguard Worker                                        "\tgl_FragColor = vec4(texColor);\n"
1065*35238bceSAndroid Build Coastguard Worker                                        "}";
1066*35238bceSAndroid Build Coastguard Worker 
1067*35238bceSAndroid Build Coastguard Worker     Program program(gl, vertexShader, fragmentShader);
1068*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(program.isOk());
1069*35238bceSAndroid Build Coastguard Worker 
1070*35238bceSAndroid Build Coastguard Worker     GLuint glProgram = program.getProgram();
1071*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, useProgram(glProgram));
1072*35238bceSAndroid Build Coastguard Worker 
1073*35238bceSAndroid Build Coastguard Worker     GLuint coordLoc = gl.getAttribLocation(glProgram, "a_coord");
1074*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)coordLoc != -1, "Couldn't find attribute a_coord");
1075*35238bceSAndroid Build Coastguard Worker 
1076*35238bceSAndroid Build Coastguard Worker     GLuint samplerLoc = gl.getUniformLocation(glProgram, "u_sampler");
1077*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)samplerLoc != (int)-1, "Couldn't find uniform u_sampler");
1078*35238bceSAndroid Build Coastguard Worker 
1079*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, *srcTex));
1080*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, uniform1i(samplerLoc, 0));
1081*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enableVertexAttribArray(coordLoc));
1082*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, squareTriangleCoords));
1083*35238bceSAndroid Build Coastguard Worker 
1084*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, drawArrays(GL_TRIANGLES, 0, 6));
1085*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disableVertexAttribArray(coordLoc));
1086*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, 0));
1087*35238bceSAndroid Build Coastguard Worker 
1088*35238bceSAndroid Build Coastguard Worker     tcu::Surface refSurface(reference.getWidth(), reference.getHeight());
1089*35238bceSAndroid Build Coastguard Worker     tcu::Surface screen(reference.getWidth(), reference.getHeight());
1090*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
1091*35238bceSAndroid Build Coastguard Worker                                       screen.getAccess().getDataPtr()));
1092*35238bceSAndroid Build Coastguard Worker 
1093*35238bceSAndroid Build Coastguard Worker     tcu::copy(refSurface.getAccess(), reference.getLevel(0));
1094*35238bceSAndroid Build Coastguard Worker 
1095*35238bceSAndroid Build Coastguard Worker     float threshold = 0.05f;
1096*35238bceSAndroid Build Coastguard Worker     bool match = tcu::fuzzyCompare(log, "ComparisonResult", "Image comparison result", refSurface, screen, threshold,
1097*35238bceSAndroid Build Coastguard Worker                                    tcu::COMPARE_LOG_RESULT);
1098*35238bceSAndroid Build Coastguard Worker 
1099*35238bceSAndroid Build Coastguard Worker     return match;
1100*35238bceSAndroid Build Coastguard Worker }
1101*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const1102*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::RenderExternalTextureSamplerArray::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
1103*35238bceSAndroid Build Coastguard Worker                                                                  tcu::Texture2D &reference) const
1104*35238bceSAndroid Build Coastguard Worker {
1105*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
1106*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log        = api.getLog();
1107*35238bceSAndroid Build Coastguard Worker     Texture srcTex(gl);
1108*35238bceSAndroid Build Coastguard Worker 
1109*35238bceSAndroid Build Coastguard Worker     // Branch only taken in TryAll case
1110*35238bceSAndroid Build Coastguard Worker     if (reference.getFormat().order == tcu::TextureFormat::DS || reference.getFormat().order == tcu::TextureFormat::D)
1111*35238bceSAndroid Build Coastguard Worker         throw IllegalRendererException(); // Skip, GLES2 does not support sampling depth textures
1112*35238bceSAndroid Build Coastguard Worker     if (reference.getFormat().order == tcu::TextureFormat::S)
1113*35238bceSAndroid Build Coastguard Worker         throw IllegalRendererException(); // Skip, GLES2 does not support sampling stencil textures
1114*35238bceSAndroid Build Coastguard Worker 
1115*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0.0, 0.0, 0.0, 0.0);
1116*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, reference.getWidth(), reference.getHeight());
1117*35238bceSAndroid Build Coastguard Worker     gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1118*35238bceSAndroid Build Coastguard Worker     gl.disable(GL_DEPTH_TEST);
1119*35238bceSAndroid Build Coastguard Worker 
1120*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message
1121*35238bceSAndroid Build Coastguard Worker         << "Rendering EGLImage as GL_TEXTURE_EXTERNAL_OES using sampler array in context: " << api.m_contextId
1122*35238bceSAndroid Build Coastguard Worker         << tcu::TestLog::EndMessage;
1123*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(**img != EGL_NO_IMAGE_KHR);
1124*35238bceSAndroid Build Coastguard Worker 
1125*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, *srcTex));
1126*35238bceSAndroid Build Coastguard Worker     imageTargetExternalTexture(api.m_egl, gl, **img);
1127*35238bceSAndroid Build Coastguard Worker 
1128*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
1129*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
1130*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
1131*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
1132*35238bceSAndroid Build Coastguard Worker 
1133*35238bceSAndroid Build Coastguard Worker     // Texture not associated with an external texture will return (0, 0, 0, 1) when sampled.
1134*35238bceSAndroid Build Coastguard Worker     GLuint emptyTex;
1135*35238bceSAndroid Build Coastguard Worker     gl.genTextures(1, &emptyTex);
1136*35238bceSAndroid Build Coastguard Worker     gl.activeTexture(GL_TEXTURE1);
1137*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, emptyTex));
1138*35238bceSAndroid Build Coastguard Worker 
1139*35238bceSAndroid Build Coastguard Worker     const char *const vertexShader = "attribute highp vec2 a_coord;\n"
1140*35238bceSAndroid Build Coastguard Worker                                      "varying mediump vec2 v_texCoord;\n"
1141*35238bceSAndroid Build Coastguard Worker                                      "void main(void) {\n"
1142*35238bceSAndroid Build Coastguard Worker                                      "\tv_texCoord = vec2((a_coord.x + 1.0) * 0.5, (a_coord.y + 1.0) * 0.5);\n"
1143*35238bceSAndroid Build Coastguard Worker                                      "\tgl_Position = vec4(a_coord, -0.1, 1.0);\n"
1144*35238bceSAndroid Build Coastguard Worker                                      "}\n";
1145*35238bceSAndroid Build Coastguard Worker 
1146*35238bceSAndroid Build Coastguard Worker     const char *const fragmentShader = "#extension GL_OES_EGL_image_external : require\n"
1147*35238bceSAndroid Build Coastguard Worker                                        "varying mediump vec2 v_texCoord;\n"
1148*35238bceSAndroid Build Coastguard Worker                                        "uniform samplerExternalOES u_sampler[4];\n"
1149*35238bceSAndroid Build Coastguard Worker                                        "void main(void) {\n"
1150*35238bceSAndroid Build Coastguard Worker                                        "\tmediump vec4 texColor = texture2D(u_sampler[2], v_texCoord);\n"
1151*35238bceSAndroid Build Coastguard Worker                                        "\t//These will sample (0, 0, 0, 1) and should not affect the results.\n"
1152*35238bceSAndroid Build Coastguard Worker                                        "\ttexColor += texture2D(u_sampler[0], v_texCoord) - vec4(0, 0, 0, 1);\n"
1153*35238bceSAndroid Build Coastguard Worker                                        "\ttexColor += texture2D(u_sampler[1], v_texCoord) - vec4(0, 0, 0, 1);\n"
1154*35238bceSAndroid Build Coastguard Worker                                        "\ttexColor += texture2D(u_sampler[3], v_texCoord) - vec4(0, 0, 0, 1);\n"
1155*35238bceSAndroid Build Coastguard Worker                                        "\tgl_FragColor = vec4(texColor);\n"
1156*35238bceSAndroid Build Coastguard Worker                                        "}";
1157*35238bceSAndroid Build Coastguard Worker 
1158*35238bceSAndroid Build Coastguard Worker     Program program(gl, vertexShader, fragmentShader);
1159*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(program.isOk());
1160*35238bceSAndroid Build Coastguard Worker 
1161*35238bceSAndroid Build Coastguard Worker     GLuint glProgram = program.getProgram();
1162*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, useProgram(glProgram));
1163*35238bceSAndroid Build Coastguard Worker 
1164*35238bceSAndroid Build Coastguard Worker     GLuint coordLoc = gl.getAttribLocation(glProgram, "a_coord");
1165*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)coordLoc != -1, "Couldn't find attribute a_coord");
1166*35238bceSAndroid Build Coastguard Worker 
1167*35238bceSAndroid Build Coastguard Worker     GLuint samplerLoc0 = gl.getUniformLocation(glProgram, "u_sampler[0]");
1168*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)samplerLoc0 != (int)-1, "Couldn't find uniform u_sampler[0]");
1169*35238bceSAndroid Build Coastguard Worker     GLuint samplerLoc1 = gl.getUniformLocation(glProgram, "u_sampler[1]");
1170*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)samplerLoc1 != (int)-1, "Couldn't find uniform u_sampler[1]");
1171*35238bceSAndroid Build Coastguard Worker     GLuint samplerLoc2 = gl.getUniformLocation(glProgram, "u_sampler[2]");
1172*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)samplerLoc2 != (int)-1, "Couldn't find uniform u_sampler[2]");
1173*35238bceSAndroid Build Coastguard Worker     GLuint samplerLoc3 = gl.getUniformLocation(glProgram, "u_sampler[3]");
1174*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)samplerLoc3 != (int)-1, "Couldn't find uniform u_sampler[3]");
1175*35238bceSAndroid Build Coastguard Worker 
1176*35238bceSAndroid Build Coastguard Worker     gl.activeTexture(GL_TEXTURE0);
1177*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, *srcTex));
1178*35238bceSAndroid Build Coastguard Worker     // One sampler reads a gradient and others opaque black.
1179*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, uniform1i(samplerLoc0, 1));
1180*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, uniform1i(samplerLoc1, 1));
1181*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, uniform1i(samplerLoc2, 0));
1182*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, uniform1i(samplerLoc3, 1));
1183*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enableVertexAttribArray(coordLoc));
1184*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, squareTriangleCoords));
1185*35238bceSAndroid Build Coastguard Worker 
1186*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, drawArrays(GL_TRIANGLES, 0, 6));
1187*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disableVertexAttribArray(coordLoc));
1188*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, 0));
1189*35238bceSAndroid Build Coastguard Worker     gl.activeTexture(GL_TEXTURE1);
1190*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_EXTERNAL_OES, 0));
1191*35238bceSAndroid Build Coastguard Worker     gl.deleteTextures(1, &emptyTex);
1192*35238bceSAndroid Build Coastguard Worker     gl.activeTexture(GL_TEXTURE0);
1193*35238bceSAndroid Build Coastguard Worker 
1194*35238bceSAndroid Build Coastguard Worker     tcu::Surface refSurface(reference.getWidth(), reference.getHeight());
1195*35238bceSAndroid Build Coastguard Worker     tcu::Surface screen(reference.getWidth(), reference.getHeight());
1196*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
1197*35238bceSAndroid Build Coastguard Worker                                       screen.getAccess().getDataPtr()));
1198*35238bceSAndroid Build Coastguard Worker 
1199*35238bceSAndroid Build Coastguard Worker     tcu::copy(refSurface.getAccess(), reference.getLevel(0));
1200*35238bceSAndroid Build Coastguard Worker 
1201*35238bceSAndroid Build Coastguard Worker     float threshold = 0.05f;
1202*35238bceSAndroid Build Coastguard Worker     bool match = tcu::fuzzyCompare(log, "ComparisonResult", "Image comparison result", refSurface, screen, threshold,
1203*35238bceSAndroid Build Coastguard Worker                                    tcu::COMPARE_LOG_RESULT);
1204*35238bceSAndroid Build Coastguard Worker 
1205*35238bceSAndroid Build Coastguard Worker     return match;
1206*35238bceSAndroid Build Coastguard Worker }
1207*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const1208*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::RenderDepthbuffer::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
1209*35238bceSAndroid Build Coastguard Worker                                                  tcu::Texture2D &reference) const
1210*35238bceSAndroid Build Coastguard Worker {
1211*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
1212*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log        = api.getLog();
1213*35238bceSAndroid Build Coastguard Worker     Framebuffer framebuffer(gl);
1214*35238bceSAndroid Build Coastguard Worker     Renderbuffer renderbufferColor(gl);
1215*35238bceSAndroid Build Coastguard Worker     Renderbuffer renderbufferDepth(gl);
1216*35238bceSAndroid Build Coastguard Worker     const tcu::RGBA compareThreshold(32, 32, 32, 32); // layer colors are far apart, large thresholds are ok
1217*35238bceSAndroid Build Coastguard Worker 
1218*35238bceSAndroid Build Coastguard Worker     // Branch only taken in TryAll case
1219*35238bceSAndroid Build Coastguard Worker     if (reference.getFormat().order != tcu::TextureFormat::DS && reference.getFormat().order != tcu::TextureFormat::D)
1220*35238bceSAndroid Build Coastguard Worker         throw IllegalRendererException(); // Skip, interpreting non-depth data as depth data is not meaningful
1221*35238bceSAndroid Build Coastguard Worker 
1222*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Rendering with depth buffer" << tcu::TestLog::EndMessage;
1223*35238bceSAndroid Build Coastguard Worker 
1224*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, *framebuffer));
1225*35238bceSAndroid Build Coastguard Worker 
1226*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, *renderbufferColor));
1227*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, renderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, reference.getWidth(), reference.getHeight()));
1228*35238bceSAndroid Build Coastguard Worker     framebufferRenderbuffer(gl, GL_COLOR_ATTACHMENT0, *renderbufferColor);
1229*35238bceSAndroid Build Coastguard Worker 
1230*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, *renderbufferDepth));
1231*35238bceSAndroid Build Coastguard Worker     imageTargetRenderbuffer(api.m_egl, gl, **img);
1232*35238bceSAndroid Build Coastguard Worker     framebufferRenderbuffer(gl, GL_DEPTH_ATTACHMENT, *renderbufferDepth);
1233*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, 0));
1234*35238bceSAndroid Build Coastguard Worker 
1235*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, viewport(0, 0, reference.getWidth(), reference.getHeight()));
1236*35238bceSAndroid Build Coastguard Worker 
1237*35238bceSAndroid Build Coastguard Worker     // Render
1238*35238bceSAndroid Build Coastguard Worker     const char *vertexShader = "attribute highp vec2 a_coord;\n"
1239*35238bceSAndroid Build Coastguard Worker                                "uniform highp float u_depth;\n"
1240*35238bceSAndroid Build Coastguard Worker                                "void main(void) {\n"
1241*35238bceSAndroid Build Coastguard Worker                                "\tgl_Position = vec4(a_coord, u_depth, 1.0);\n"
1242*35238bceSAndroid Build Coastguard Worker                                "}\n";
1243*35238bceSAndroid Build Coastguard Worker 
1244*35238bceSAndroid Build Coastguard Worker     const char *fragmentShader = "uniform mediump vec4 u_color;\n"
1245*35238bceSAndroid Build Coastguard Worker                                  "void main(void) {\n"
1246*35238bceSAndroid Build Coastguard Worker                                  "\tgl_FragColor = u_color;\n"
1247*35238bceSAndroid Build Coastguard Worker                                  "}";
1248*35238bceSAndroid Build Coastguard Worker 
1249*35238bceSAndroid Build Coastguard Worker     Program program(gl, vertexShader, fragmentShader);
1250*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(program.isOk());
1251*35238bceSAndroid Build Coastguard Worker 
1252*35238bceSAndroid Build Coastguard Worker     GLuint glProgram = program.getProgram();
1253*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, useProgram(glProgram));
1254*35238bceSAndroid Build Coastguard Worker 
1255*35238bceSAndroid Build Coastguard Worker     GLuint coordLoc = gl.getAttribLocation(glProgram, "a_coord");
1256*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)coordLoc != -1, "Couldn't find attribute a_coord");
1257*35238bceSAndroid Build Coastguard Worker 
1258*35238bceSAndroid Build Coastguard Worker     GLuint colorLoc = gl.getUniformLocation(glProgram, "u_color");
1259*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)colorLoc != (int)-1, "Couldn't find uniform u_color");
1260*35238bceSAndroid Build Coastguard Worker 
1261*35238bceSAndroid Build Coastguard Worker     GLuint depthLoc = gl.getUniformLocation(glProgram, "u_depth");
1262*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)depthLoc != (int)-1, "Couldn't find uniform u_depth");
1263*35238bceSAndroid Build Coastguard Worker 
1264*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clearColor(0.5f, 1.0f, 0.5f, 1.0f));
1265*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clear(GL_COLOR_BUFFER_BIT));
1266*35238bceSAndroid Build Coastguard Worker 
1267*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 depthLevelColors[] = {
1268*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f),
1269*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), tcu::Vec4(1.0f, 0.0f, 1.0f, 1.0f),
1270*35238bceSAndroid Build Coastguard Worker 
1271*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f), tcu::Vec4(0.5f, 0.0f, 0.0f, 1.0f),
1272*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.0f, 0.5f, 0.0f, 1.0f), tcu::Vec4(0.5f, 0.5f, 0.0f, 1.0f)};
1273*35238bceSAndroid Build Coastguard Worker 
1274*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enableVertexAttribArray(coordLoc));
1275*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, squareTriangleCoords));
1276*35238bceSAndroid Build Coastguard Worker 
1277*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enable(GL_DEPTH_TEST));
1278*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, depthFunc(GL_LESS));
1279*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, depthMask(GL_FALSE));
1280*35238bceSAndroid Build Coastguard Worker 
1281*35238bceSAndroid Build Coastguard Worker     for (int level = 0; level < DE_LENGTH_OF_ARRAY(depthLevelColors); level++)
1282*35238bceSAndroid Build Coastguard Worker     {
1283*35238bceSAndroid Build Coastguard Worker         const tcu::Vec4 color = depthLevelColors[level];
1284*35238bceSAndroid Build Coastguard Worker         const float clipDepth = ((float)(level + 1) * 0.1f) * 2.0f - 1.0f; // depth in clip coords
1285*35238bceSAndroid Build Coastguard Worker 
1286*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, uniform4f(colorLoc, color.x(), color.y(), color.z(), color.w()));
1287*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, uniform1f(depthLoc, clipDepth));
1288*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, drawArrays(GL_TRIANGLES, 0, 6));
1289*35238bceSAndroid Build Coastguard Worker     }
1290*35238bceSAndroid Build Coastguard Worker 
1291*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, depthMask(GL_TRUE));
1292*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disable(GL_DEPTH_TEST));
1293*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disableVertexAttribArray(coordLoc));
1294*35238bceSAndroid Build Coastguard Worker 
1295*35238bceSAndroid Build Coastguard Worker     const ConstPixelBufferAccess &refAccess = reference.getLevel(0);
1296*35238bceSAndroid Build Coastguard Worker     tcu::Surface screen(reference.getWidth(), reference.getHeight());
1297*35238bceSAndroid Build Coastguard Worker     tcu::Surface referenceScreen(reference.getWidth(), reference.getHeight());
1298*35238bceSAndroid Build Coastguard Worker 
1299*35238bceSAndroid Build Coastguard Worker     gl.readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
1300*35238bceSAndroid Build Coastguard Worker                   screen.getAccess().getDataPtr());
1301*35238bceSAndroid Build Coastguard Worker 
1302*35238bceSAndroid Build Coastguard Worker     tcu::Texture2D tmpDepth(refAccess.getFormat(), 1, 1);
1303*35238bceSAndroid Build Coastguard Worker     tmpDepth.allocLevel(0);
1304*35238bceSAndroid Build Coastguard Worker     for (int y = 0; y < reference.getHeight(); y++)
1305*35238bceSAndroid Build Coastguard Worker     {
1306*35238bceSAndroid Build Coastguard Worker         for (int x = 0; x < reference.getWidth(); x++)
1307*35238bceSAndroid Build Coastguard Worker         {
1308*35238bceSAndroid Build Coastguard Worker             tcu::Vec4 result = tcu::Vec4(0.5f, 1.0f, 0.5f, 1.0f);
1309*35238bceSAndroid Build Coastguard Worker 
1310*35238bceSAndroid Build Coastguard Worker             for (int level = 0; level < DE_LENGTH_OF_ARRAY(depthLevelColors); level++)
1311*35238bceSAndroid Build Coastguard Worker             {
1312*35238bceSAndroid Build Coastguard Worker                 tcu::clearDepth(tmpDepth.getLevel(0), (float)(level + 1) * 0.1f);
1313*35238bceSAndroid Build Coastguard Worker                 if (tmpDepth.getLevel(0).getPixDepth(0, 0) < refAccess.getPixDepth(x, y))
1314*35238bceSAndroid Build Coastguard Worker                     result = depthLevelColors[level];
1315*35238bceSAndroid Build Coastguard Worker             }
1316*35238bceSAndroid Build Coastguard Worker 
1317*35238bceSAndroid Build Coastguard Worker             referenceScreen.getAccess().setPixel(result, x, y);
1318*35238bceSAndroid Build Coastguard Worker         }
1319*35238bceSAndroid Build Coastguard Worker     }
1320*35238bceSAndroid Build Coastguard Worker 
1321*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, 0));
1322*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, finish());
1323*35238bceSAndroid Build Coastguard Worker 
1324*35238bceSAndroid Build Coastguard Worker     return tcu::pixelThresholdCompare(log, "Depth buffer rendering result", "Result from rendering with depth buffer",
1325*35238bceSAndroid Build Coastguard Worker                                       referenceScreen, screen, compareThreshold, tcu::COMPARE_LOG_RESULT);
1326*35238bceSAndroid Build Coastguard Worker }
1327*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const1328*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::RenderStencilbuffer::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
1329*35238bceSAndroid Build Coastguard Worker                                                    tcu::Texture2D &reference) const
1330*35238bceSAndroid Build Coastguard Worker {
1331*35238bceSAndroid Build Coastguard Worker     // Branch only taken in TryAll case
1332*35238bceSAndroid Build Coastguard Worker     if (reference.getFormat().order != tcu::TextureFormat::DS && reference.getFormat().order != tcu::TextureFormat::S)
1333*35238bceSAndroid Build Coastguard Worker         throw IllegalRendererException(); // Skip, interpreting non-stencil data as stencil data is not meaningful
1334*35238bceSAndroid Build Coastguard Worker 
1335*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
1336*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log        = api.getLog();
1337*35238bceSAndroid Build Coastguard Worker     Framebuffer framebuffer(gl);
1338*35238bceSAndroid Build Coastguard Worker     Renderbuffer renderbufferColor(gl);
1339*35238bceSAndroid Build Coastguard Worker     Renderbuffer renderbufferStencil(gl);
1340*35238bceSAndroid Build Coastguard Worker     const tcu::RGBA compareThreshold(32, 32, 32, 32); // layer colors are far apart, large thresholds are ok
1341*35238bceSAndroid Build Coastguard Worker     const uint32_t numStencilBits =
1342*35238bceSAndroid Build Coastguard Worker         tcu::getTextureFormatBitDepth(
1343*35238bceSAndroid Build Coastguard Worker             tcu::getEffectiveDepthStencilTextureFormat(reference.getLevel(0).getFormat(), tcu::Sampler::MODE_STENCIL))
1344*35238bceSAndroid Build Coastguard Worker             .x();
1345*35238bceSAndroid Build Coastguard Worker     const uint32_t maxStencil = deBitMask32(0, numStencilBits);
1346*35238bceSAndroid Build Coastguard Worker 
1347*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Rendering with stencil buffer" << tcu::TestLog::EndMessage;
1348*35238bceSAndroid Build Coastguard Worker 
1349*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, *framebuffer));
1350*35238bceSAndroid Build Coastguard Worker 
1351*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, *renderbufferColor));
1352*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, renderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, reference.getWidth(), reference.getHeight()));
1353*35238bceSAndroid Build Coastguard Worker     framebufferRenderbuffer(gl, GL_COLOR_ATTACHMENT0, *renderbufferColor);
1354*35238bceSAndroid Build Coastguard Worker 
1355*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, *renderbufferStencil));
1356*35238bceSAndroid Build Coastguard Worker     imageTargetRenderbuffer(api.m_egl, gl, **img);
1357*35238bceSAndroid Build Coastguard Worker     framebufferRenderbuffer(gl, GL_STENCIL_ATTACHMENT, *renderbufferStencil);
1358*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, 0));
1359*35238bceSAndroid Build Coastguard Worker 
1360*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, viewport(0, 0, reference.getWidth(), reference.getHeight()));
1361*35238bceSAndroid Build Coastguard Worker 
1362*35238bceSAndroid Build Coastguard Worker     // Render
1363*35238bceSAndroid Build Coastguard Worker     const char *vertexShader = "attribute highp vec2 a_coord;\n"
1364*35238bceSAndroid Build Coastguard Worker                                "void main(void) {\n"
1365*35238bceSAndroid Build Coastguard Worker                                "\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
1366*35238bceSAndroid Build Coastguard Worker                                "}\n";
1367*35238bceSAndroid Build Coastguard Worker 
1368*35238bceSAndroid Build Coastguard Worker     const char *fragmentShader = "uniform mediump vec4 u_color;\n"
1369*35238bceSAndroid Build Coastguard Worker                                  "void main(void) {\n"
1370*35238bceSAndroid Build Coastguard Worker                                  "\tgl_FragColor = u_color;\n"
1371*35238bceSAndroid Build Coastguard Worker                                  "}";
1372*35238bceSAndroid Build Coastguard Worker 
1373*35238bceSAndroid Build Coastguard Worker     Program program(gl, vertexShader, fragmentShader);
1374*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(program.isOk());
1375*35238bceSAndroid Build Coastguard Worker 
1376*35238bceSAndroid Build Coastguard Worker     GLuint glProgram = program.getProgram();
1377*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, useProgram(glProgram));
1378*35238bceSAndroid Build Coastguard Worker 
1379*35238bceSAndroid Build Coastguard Worker     GLuint coordLoc = gl.getAttribLocation(glProgram, "a_coord");
1380*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)coordLoc != -1, "Couldn't find attribute a_coord");
1381*35238bceSAndroid Build Coastguard Worker 
1382*35238bceSAndroid Build Coastguard Worker     GLuint colorLoc = gl.getUniformLocation(glProgram, "u_color");
1383*35238bceSAndroid Build Coastguard Worker     TCU_CHECK_MSG((int)colorLoc != (int)-1, "Couldn't find uniform u_color");
1384*35238bceSAndroid Build Coastguard Worker 
1385*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clearColor(0.5f, 1.0f, 0.5f, 1.0f));
1386*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clear(GL_COLOR_BUFFER_BIT));
1387*35238bceSAndroid Build Coastguard Worker 
1388*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 stencilLevelColors[] = {
1389*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f),
1390*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), tcu::Vec4(1.0f, 0.0f, 1.0f, 1.0f),
1391*35238bceSAndroid Build Coastguard Worker 
1392*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f), tcu::Vec4(0.5f, 0.0f, 0.0f, 1.0f),
1393*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.0f, 0.5f, 0.0f, 1.0f), tcu::Vec4(0.5f, 0.5f, 0.0f, 1.0f)};
1394*35238bceSAndroid Build Coastguard Worker 
1395*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enableVertexAttribArray(coordLoc));
1396*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, squareTriangleCoords));
1397*35238bceSAndroid Build Coastguard Worker 
1398*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enable(GL_STENCIL_TEST));
1399*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, stencilOp(GL_KEEP, GL_KEEP, GL_KEEP));
1400*35238bceSAndroid Build Coastguard Worker 
1401*35238bceSAndroid Build Coastguard Worker     for (int level = 0; level < DE_LENGTH_OF_ARRAY(stencilLevelColors); level++)
1402*35238bceSAndroid Build Coastguard Worker     {
1403*35238bceSAndroid Build Coastguard Worker         const tcu::Vec4 color = stencilLevelColors[level];
1404*35238bceSAndroid Build Coastguard Worker         const int stencil     = (int)(((float)(level + 1) * 0.1f) * (float)maxStencil);
1405*35238bceSAndroid Build Coastguard Worker 
1406*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, stencilFunc(GL_LESS, stencil, 0xFFFFFFFFu));
1407*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, uniform4f(colorLoc, color.x(), color.y(), color.z(), color.w()));
1408*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, drawArrays(GL_TRIANGLES, 0, 6));
1409*35238bceSAndroid Build Coastguard Worker     }
1410*35238bceSAndroid Build Coastguard Worker 
1411*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disable(GL_STENCIL_TEST));
1412*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disableVertexAttribArray(coordLoc));
1413*35238bceSAndroid Build Coastguard Worker 
1414*35238bceSAndroid Build Coastguard Worker     const ConstPixelBufferAccess &refAccess = reference.getLevel(0);
1415*35238bceSAndroid Build Coastguard Worker     tcu::Surface screen(reference.getWidth(), reference.getHeight());
1416*35238bceSAndroid Build Coastguard Worker     tcu::Surface referenceScreen(reference.getWidth(), reference.getHeight());
1417*35238bceSAndroid Build Coastguard Worker 
1418*35238bceSAndroid Build Coastguard Worker     gl.readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
1419*35238bceSAndroid Build Coastguard Worker                   screen.getAccess().getDataPtr());
1420*35238bceSAndroid Build Coastguard Worker 
1421*35238bceSAndroid Build Coastguard Worker     for (int y = 0; y < reference.getHeight(); y++)
1422*35238bceSAndroid Build Coastguard Worker         for (int x = 0; x < reference.getWidth(); x++)
1423*35238bceSAndroid Build Coastguard Worker         {
1424*35238bceSAndroid Build Coastguard Worker             tcu::Vec4 result = tcu::Vec4(0.5f, 1.0f, 0.5f, 1.0f);
1425*35238bceSAndroid Build Coastguard Worker 
1426*35238bceSAndroid Build Coastguard Worker             for (int level = 0; level < DE_LENGTH_OF_ARRAY(stencilLevelColors); level++)
1427*35238bceSAndroid Build Coastguard Worker             {
1428*35238bceSAndroid Build Coastguard Worker                 const int levelStencil = (int)(((float)(level + 1) * 0.1f) * (float)maxStencil);
1429*35238bceSAndroid Build Coastguard Worker                 if (levelStencil < refAccess.getPixStencil(x, y))
1430*35238bceSAndroid Build Coastguard Worker                     result = stencilLevelColors[level];
1431*35238bceSAndroid Build Coastguard Worker             }
1432*35238bceSAndroid Build Coastguard Worker 
1433*35238bceSAndroid Build Coastguard Worker             referenceScreen.getAccess().setPixel(result, x, y);
1434*35238bceSAndroid Build Coastguard Worker         }
1435*35238bceSAndroid Build Coastguard Worker 
1436*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, 0));
1437*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, finish());
1438*35238bceSAndroid Build Coastguard Worker 
1439*35238bceSAndroid Build Coastguard Worker     return tcu::pixelThresholdCompare(log, "StencilResult", "Result from rendering with stencil buffer",
1440*35238bceSAndroid Build Coastguard Worker                                       referenceScreen, screen, compareThreshold, tcu::COMPARE_LOG_RESULT);
1441*35238bceSAndroid Build Coastguard Worker }
1442*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const1443*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::RenderReadPixelsRenderbuffer::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
1444*35238bceSAndroid Build Coastguard Worker                                                             tcu::Texture2D &reference) const
1445*35238bceSAndroid Build Coastguard Worker {
1446*35238bceSAndroid Build Coastguard Worker     switch (glu::getInternalFormat(reference.getFormat()))
1447*35238bceSAndroid Build Coastguard Worker     {
1448*35238bceSAndroid Build Coastguard Worker     case GL_RGBA4:
1449*35238bceSAndroid Build Coastguard Worker     case GL_RGB5_A1:
1450*35238bceSAndroid Build Coastguard Worker     case GL_RGB565:
1451*35238bceSAndroid Build Coastguard Worker         break;
1452*35238bceSAndroid Build Coastguard Worker     default:
1453*35238bceSAndroid Build Coastguard Worker         // Skip, not in the list of allowed render buffer formats for GLES.
1454*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("Image format not allowed for glReadPixels.");
1455*35238bceSAndroid Build Coastguard Worker     }
1456*35238bceSAndroid Build Coastguard Worker 
1457*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl  = api.m_gl;
1458*35238bceSAndroid Build Coastguard Worker     const tcu::IVec4 bitDepth = tcu::getTextureFormatMantissaBitDepth(reference.getFormat());
1459*35238bceSAndroid Build Coastguard Worker     const tcu::IVec4 threshold(2 * (tcu::IVec4(1) << (tcu::IVec4(8) - bitDepth)));
1460*35238bceSAndroid Build Coastguard Worker     const tcu::RGBA threshold8((uint8_t)(de::clamp(threshold[0], 0, 255)), (uint8_t)(de::clamp(threshold[1], 0, 255)),
1461*35238bceSAndroid Build Coastguard Worker                                (uint8_t)(de::clamp(threshold[2], 0, 255)), (uint8_t)(de::clamp(threshold[3], 0, 255)));
1462*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log = api.getLog();
1463*35238bceSAndroid Build Coastguard Worker     Framebuffer framebuffer(gl);
1464*35238bceSAndroid Build Coastguard Worker     Renderbuffer renderbuffer(gl);
1465*35238bceSAndroid Build Coastguard Worker     tcu::Surface screen(reference.getWidth(), reference.getHeight());
1466*35238bceSAndroid Build Coastguard Worker     tcu::Surface refSurface(reference.getWidth(), reference.getHeight());
1467*35238bceSAndroid Build Coastguard Worker 
1468*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Reading with ReadPixels from renderbuffer" << tcu::TestLog::EndMessage;
1469*35238bceSAndroid Build Coastguard Worker 
1470*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, *framebuffer));
1471*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, *renderbuffer));
1472*35238bceSAndroid Build Coastguard Worker     imageTargetRenderbuffer(api.m_egl, gl, **img);
1473*35238bceSAndroid Build Coastguard Worker 
1474*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "imageTargetRenderbuffer");
1475*35238bceSAndroid Build Coastguard Worker     framebufferRenderbuffer(gl, GL_COLOR_ATTACHMENT0, *renderbuffer);
1476*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "framebufferRenderbuffer");
1477*35238bceSAndroid Build Coastguard Worker 
1478*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, viewport(0, 0, reference.getWidth(), reference.getHeight()));
1479*35238bceSAndroid Build Coastguard Worker 
1480*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
1481*35238bceSAndroid Build Coastguard Worker                                       screen.getAccess().getDataPtr()));
1482*35238bceSAndroid Build Coastguard Worker 
1483*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, 0));
1484*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, 0));
1485*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, finish());
1486*35238bceSAndroid Build Coastguard Worker 
1487*35238bceSAndroid Build Coastguard Worker     tcu::copy(refSurface.getAccess(), reference.getLevel(0));
1488*35238bceSAndroid Build Coastguard Worker 
1489*35238bceSAndroid Build Coastguard Worker     return tcu::pixelThresholdCompare(log, "Renderbuffer read", "Result from reading renderbuffer", refSurface, screen,
1490*35238bceSAndroid Build Coastguard Worker                                       threshold8, tcu::COMPARE_LOG_RESULT);
1491*35238bceSAndroid Build Coastguard Worker }
1492*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const1493*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::RenderTryAll::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
1494*35238bceSAndroid Build Coastguard Worker                                             tcu::Texture2D &reference) const
1495*35238bceSAndroid Build Coastguard Worker {
1496*35238bceSAndroid Build Coastguard Worker     bool foundSupported = false;
1497*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log   = api.getLog();
1498*35238bceSAndroid Build Coastguard Worker     GLESImageApi::RenderTexture2D renderTex2D;
1499*35238bceSAndroid Build Coastguard Worker     GLESImageApi::RenderExternalTexture renderExternal;
1500*35238bceSAndroid Build Coastguard Worker     GLESImageApi::RenderExternalTextureSamplerArray renderExternalSamplerArray;
1501*35238bceSAndroid Build Coastguard Worker     GLESImageApi::RenderReadPixelsRenderbuffer renderReadPixels;
1502*35238bceSAndroid Build Coastguard Worker     GLESImageApi::RenderDepthbuffer renderDepth;
1503*35238bceSAndroid Build Coastguard Worker     GLESImageApi::RenderStencilbuffer renderStencil;
1504*35238bceSAndroid Build Coastguard Worker     Action *actions[] = {&renderTex2D,      &renderExternal, &renderExternalSamplerArray,
1505*35238bceSAndroid Build Coastguard Worker                          &renderReadPixels, &renderDepth,    &renderStencil};
1506*35238bceSAndroid Build Coastguard Worker     set<string> exts  = getSupportedExtensions(log, api.m_egl, api.m_display, api.m_gl);
1507*35238bceSAndroid Build Coastguard Worker 
1508*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(actions); ++ndx)
1509*35238bceSAndroid Build Coastguard Worker     {
1510*35238bceSAndroid Build Coastguard Worker         try
1511*35238bceSAndroid Build Coastguard Worker         {
1512*35238bceSAndroid Build Coastguard Worker             const string ext = actions[ndx]->getRequiredExtension();
1513*35238bceSAndroid Build Coastguard Worker 
1514*35238bceSAndroid Build Coastguard Worker             if (!de::contains(exts, ext))
1515*35238bceSAndroid Build Coastguard Worker                 TCU_THROW_EXPR(NotSupportedError, "Extension not supported", ext.c_str());
1516*35238bceSAndroid Build Coastguard Worker 
1517*35238bceSAndroid Build Coastguard Worker             if (!actions[ndx]->invoke(api, img, reference))
1518*35238bceSAndroid Build Coastguard Worker                 return false;
1519*35238bceSAndroid Build Coastguard Worker 
1520*35238bceSAndroid Build Coastguard Worker             foundSupported = true;
1521*35238bceSAndroid Build Coastguard Worker         }
1522*35238bceSAndroid Build Coastguard Worker         catch (const tcu::NotSupportedError &error)
1523*35238bceSAndroid Build Coastguard Worker         {
1524*35238bceSAndroid Build Coastguard Worker             log << tcu::TestLog::Message << error.what() << tcu::TestLog::EndMessage;
1525*35238bceSAndroid Build Coastguard Worker         }
1526*35238bceSAndroid Build Coastguard Worker         catch (const IllegalRendererException &)
1527*35238bceSAndroid Build Coastguard Worker         {
1528*35238bceSAndroid Build Coastguard Worker             // not valid renderer
1529*35238bceSAndroid Build Coastguard Worker         }
1530*35238bceSAndroid Build Coastguard Worker     }
1531*35238bceSAndroid Build Coastguard Worker 
1532*35238bceSAndroid Build Coastguard Worker     if (!foundSupported)
1533*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("Rendering not supported", "", __FILE__, __LINE__);
1534*35238bceSAndroid Build Coastguard Worker 
1535*35238bceSAndroid Build Coastguard Worker     return true;
1536*35238bceSAndroid Build Coastguard Worker }
1537*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const1538*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::ModifyTexSubImage::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
1539*35238bceSAndroid Build Coastguard Worker                                                  tcu::Texture2D &reference) const
1540*35238bceSAndroid Build Coastguard Worker {
1541*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
1542*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log        = api.getLog();
1543*35238bceSAndroid Build Coastguard Worker     glu::Texture srcTex(gl);
1544*35238bceSAndroid Build Coastguard Worker     const int xOffset = 8;
1545*35238bceSAndroid Build Coastguard Worker     const int yOffset = 16;
1546*35238bceSAndroid Build Coastguard Worker     const int xSize   = de::clamp(16, 0, reference.getWidth() - xOffset);
1547*35238bceSAndroid Build Coastguard Worker     const int ySize   = de::clamp(16, 0, reference.getHeight() - yOffset);
1548*35238bceSAndroid Build Coastguard Worker     tcu::Texture2D src(glu::mapGLTransferFormat(m_format, m_type), xSize, ySize);
1549*35238bceSAndroid Build Coastguard Worker 
1550*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Modifying EGLImage with gl.texSubImage2D" << tcu::TestLog::EndMessage;
1551*35238bceSAndroid Build Coastguard Worker 
1552*35238bceSAndroid Build Coastguard Worker     src.allocLevel(0);
1553*35238bceSAndroid Build Coastguard Worker     tcu::fillWithComponentGradients(src.getLevel(0), tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f),
1554*35238bceSAndroid Build Coastguard Worker                                     tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
1555*35238bceSAndroid Build Coastguard Worker 
1556*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_2D, *srcTex));
1557*35238bceSAndroid Build Coastguard Worker     imageTargetTexture2D(api.m_egl, gl, **img);
1558*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, texSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, src.getWidth(), src.getHeight(), m_format,
1559*35238bceSAndroid Build Coastguard Worker                                          m_type, src.getLevel(0).getDataPtr()));
1560*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(GL_TEXTURE_2D, 0));
1561*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, finish());
1562*35238bceSAndroid Build Coastguard Worker 
1563*35238bceSAndroid Build Coastguard Worker     tcu::copy(tcu::getSubregion(reference.getLevel(0), xOffset, yOffset, 0, xSize, ySize, 1), src.getLevel(0));
1564*35238bceSAndroid Build Coastguard Worker 
1565*35238bceSAndroid Build Coastguard Worker     return true;
1566*35238bceSAndroid Build Coastguard Worker }
1567*35238bceSAndroid Build Coastguard Worker 
invokeGLES(GLESImageApi & api,MovePtr<UniqueImage> & img,tcu::Texture2D & reference) const1568*35238bceSAndroid Build Coastguard Worker bool GLESImageApi::ModifyRenderbuffer::invokeGLES(GLESImageApi &api, MovePtr<UniqueImage> &img,
1569*35238bceSAndroid Build Coastguard Worker                                                   tcu::Texture2D &reference) const
1570*35238bceSAndroid Build Coastguard Worker {
1571*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
1572*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log        = api.getLog();
1573*35238bceSAndroid Build Coastguard Worker     glu::Framebuffer framebuffer(gl);
1574*35238bceSAndroid Build Coastguard Worker     glu::Renderbuffer renderbuffer(gl);
1575*35238bceSAndroid Build Coastguard Worker 
1576*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Modifying EGLImage with glClear to renderbuffer" << tcu::TestLog::EndMessage;
1577*35238bceSAndroid Build Coastguard Worker 
1578*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, *framebuffer));
1579*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, *renderbuffer));
1580*35238bceSAndroid Build Coastguard Worker 
1581*35238bceSAndroid Build Coastguard Worker     imageTargetRenderbuffer(api.m_egl, gl, **img);
1582*35238bceSAndroid Build Coastguard Worker 
1583*35238bceSAndroid Build Coastguard Worker     initializeRbo(api, *renderbuffer, reference);
1584*35238bceSAndroid Build Coastguard Worker 
1585*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, 0));
1586*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, 0));
1587*35238bceSAndroid Build Coastguard Worker 
1588*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, finish());
1589*35238bceSAndroid Build Coastguard Worker 
1590*35238bceSAndroid Build Coastguard Worker     return true;
1591*35238bceSAndroid Build Coastguard Worker }
1592*35238bceSAndroid Build Coastguard Worker 
initializeRbo(GLESImageApi & api,GLuint renderbuffer,tcu::Texture2D & reference) const1593*35238bceSAndroid Build Coastguard Worker void GLESImageApi::ModifyRenderbufferClearColor::initializeRbo(GLESImageApi &api, GLuint renderbuffer,
1594*35238bceSAndroid Build Coastguard Worker                                                                tcu::Texture2D &reference) const
1595*35238bceSAndroid Build Coastguard Worker {
1596*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
1597*35238bceSAndroid Build Coastguard Worker 
1598*35238bceSAndroid Build Coastguard Worker     framebufferRenderbuffer(gl, GL_COLOR_ATTACHMENT0, renderbuffer);
1599*35238bceSAndroid Build Coastguard Worker 
1600*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, viewport(0, 0, reference.getWidth(), reference.getHeight()));
1601*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clearColor(m_color.x(), m_color.y(), m_color.z(), m_color.w()));
1602*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clear(GL_COLOR_BUFFER_BIT));
1603*35238bceSAndroid Build Coastguard Worker 
1604*35238bceSAndroid Build Coastguard Worker     tcu::clear(reference.getLevel(0), m_color);
1605*35238bceSAndroid Build Coastguard Worker }
1606*35238bceSAndroid Build Coastguard Worker 
initializeRbo(GLESImageApi & api,GLuint renderbuffer,tcu::Texture2D & reference) const1607*35238bceSAndroid Build Coastguard Worker void GLESImageApi::ModifyRenderbufferClearDepth::initializeRbo(GLESImageApi &api, GLuint renderbuffer,
1608*35238bceSAndroid Build Coastguard Worker                                                                tcu::Texture2D &reference) const
1609*35238bceSAndroid Build Coastguard Worker {
1610*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
1611*35238bceSAndroid Build Coastguard Worker 
1612*35238bceSAndroid Build Coastguard Worker     framebufferRenderbuffer(gl, GL_DEPTH_ATTACHMENT, renderbuffer);
1613*35238bceSAndroid Build Coastguard Worker 
1614*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, viewport(0, 0, reference.getWidth(), reference.getHeight()));
1615*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clearDepthf(m_depth));
1616*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clear(GL_DEPTH_BUFFER_BIT));
1617*35238bceSAndroid Build Coastguard Worker 
1618*35238bceSAndroid Build Coastguard Worker     tcu::clearDepth(reference.getLevel(0), m_depth);
1619*35238bceSAndroid Build Coastguard Worker }
1620*35238bceSAndroid Build Coastguard Worker 
initializeRbo(GLESImageApi & api,GLuint renderbuffer,tcu::Texture2D & reference) const1621*35238bceSAndroid Build Coastguard Worker void GLESImageApi::ModifyRenderbufferClearStencil::initializeRbo(GLESImageApi &api, GLuint renderbuffer,
1622*35238bceSAndroid Build Coastguard Worker                                                                  tcu::Texture2D &reference) const
1623*35238bceSAndroid Build Coastguard Worker {
1624*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = api.m_gl;
1625*35238bceSAndroid Build Coastguard Worker 
1626*35238bceSAndroid Build Coastguard Worker     framebufferRenderbuffer(gl, GL_STENCIL_ATTACHMENT, renderbuffer);
1627*35238bceSAndroid Build Coastguard Worker 
1628*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, viewport(0, 0, reference.getWidth(), reference.getHeight()));
1629*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clearStencil(m_stencil));
1630*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clear(GL_STENCIL_BUFFER_BIT));
1631*35238bceSAndroid Build Coastguard Worker 
1632*35238bceSAndroid Build Coastguard Worker     tcu::clearStencil(reference.getLevel(0), m_stencil);
1633*35238bceSAndroid Build Coastguard Worker }
1634*35238bceSAndroid Build Coastguard Worker 
1635*35238bceSAndroid Build Coastguard Worker class ImageFormatCase : public TestCase, private glu::CallLogWrapper
1636*35238bceSAndroid Build Coastguard Worker {
1637*35238bceSAndroid Build Coastguard Worker public:
1638*35238bceSAndroid Build Coastguard Worker     ImageFormatCase(EglTestContext &eglTestCtx, const TestSpec &spec);
1639*35238bceSAndroid Build Coastguard Worker     ~ImageFormatCase(void);
1640*35238bceSAndroid Build Coastguard Worker 
1641*35238bceSAndroid Build Coastguard Worker     void init(void);
1642*35238bceSAndroid Build Coastguard Worker     void deinit(void);
1643*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
1644*35238bceSAndroid Build Coastguard Worker     void checkExtensions(void);
1645*35238bceSAndroid Build Coastguard Worker 
1646*35238bceSAndroid Build Coastguard Worker private:
1647*35238bceSAndroid Build Coastguard Worker     EGLConfig getConfig(void);
1648*35238bceSAndroid Build Coastguard Worker 
1649*35238bceSAndroid Build Coastguard Worker     const TestSpec m_spec;
1650*35238bceSAndroid Build Coastguard Worker 
1651*35238bceSAndroid Build Coastguard Worker     vector<ImageApi *> m_apiContexts;
1652*35238bceSAndroid Build Coastguard Worker 
1653*35238bceSAndroid Build Coastguard Worker     EGLDisplay m_display;
1654*35238bceSAndroid Build Coastguard Worker     eglu::NativeWindow *m_window;
1655*35238bceSAndroid Build Coastguard Worker     EGLSurface m_surface;
1656*35238bceSAndroid Build Coastguard Worker     EGLConfig m_config;
1657*35238bceSAndroid Build Coastguard Worker     int m_curIter;
1658*35238bceSAndroid Build Coastguard Worker     MovePtr<UniqueImage> m_img;
1659*35238bceSAndroid Build Coastguard Worker     tcu::Texture2D m_refImg;
1660*35238bceSAndroid Build Coastguard Worker     glw::Functions m_gl;
1661*35238bceSAndroid Build Coastguard Worker };
1662*35238bceSAndroid Build Coastguard Worker 
getConfig(void)1663*35238bceSAndroid Build Coastguard Worker EGLConfig ImageFormatCase::getConfig(void)
1664*35238bceSAndroid Build Coastguard Worker {
1665*35238bceSAndroid Build Coastguard Worker     const GLint glesApi       = m_spec.contexts[0] == TestSpec::API_GLES3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT;
1666*35238bceSAndroid Build Coastguard Worker     const EGLint attribList[] = {EGL_RENDERABLE_TYPE, glesApi, EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1667*35238bceSAndroid Build Coastguard Worker                                  EGL_RED_SIZE,        8,       EGL_BLUE_SIZE,    8,
1668*35238bceSAndroid Build Coastguard Worker                                  EGL_GREEN_SIZE,      8,       EGL_ALPHA_SIZE,   8,
1669*35238bceSAndroid Build Coastguard Worker                                  EGL_DEPTH_SIZE,      8,       EGL_NONE};
1670*35238bceSAndroid Build Coastguard Worker 
1671*35238bceSAndroid Build Coastguard Worker     return eglu::chooseSingleConfig(m_eglTestCtx.getLibrary(), m_display, attribList);
1672*35238bceSAndroid Build Coastguard Worker }
1673*35238bceSAndroid Build Coastguard Worker 
ImageFormatCase(EglTestContext & eglTestCtx,const TestSpec & spec)1674*35238bceSAndroid Build Coastguard Worker ImageFormatCase::ImageFormatCase(EglTestContext &eglTestCtx, const TestSpec &spec)
1675*35238bceSAndroid Build Coastguard Worker     : TestCase(eglTestCtx, spec.name.c_str(), spec.desc.c_str())
1676*35238bceSAndroid Build Coastguard Worker     , glu::CallLogWrapper(m_gl, eglTestCtx.getTestContext().getLog())
1677*35238bceSAndroid Build Coastguard Worker     , m_spec(spec)
1678*35238bceSAndroid Build Coastguard Worker     , m_display(EGL_NO_DISPLAY)
1679*35238bceSAndroid Build Coastguard Worker     , m_window(DE_NULL)
1680*35238bceSAndroid Build Coastguard Worker     , m_surface(EGL_NO_SURFACE)
1681*35238bceSAndroid Build Coastguard Worker     , m_config(0)
1682*35238bceSAndroid Build Coastguard Worker     , m_curIter(0)
1683*35238bceSAndroid Build Coastguard Worker     , m_refImg(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), 1, 1)
1684*35238bceSAndroid Build Coastguard Worker {
1685*35238bceSAndroid Build Coastguard Worker }
1686*35238bceSAndroid Build Coastguard Worker 
~ImageFormatCase(void)1687*35238bceSAndroid Build Coastguard Worker ImageFormatCase::~ImageFormatCase(void)
1688*35238bceSAndroid Build Coastguard Worker {
1689*35238bceSAndroid Build Coastguard Worker     deinit();
1690*35238bceSAndroid Build Coastguard Worker }
1691*35238bceSAndroid Build Coastguard Worker 
checkExtensions(void)1692*35238bceSAndroid Build Coastguard Worker void ImageFormatCase::checkExtensions(void)
1693*35238bceSAndroid Build Coastguard Worker {
1694*35238bceSAndroid Build Coastguard Worker     set<string> exts = getSupportedExtensions(getLog(), m_eglTestCtx.getLibrary(), m_display, m_gl);
1695*35238bceSAndroid Build Coastguard Worker 
1696*35238bceSAndroid Build Coastguard Worker     for (int operationNdx = 0; operationNdx < (int)m_spec.operations.size(); operationNdx++)
1697*35238bceSAndroid Build Coastguard Worker     {
1698*35238bceSAndroid Build Coastguard Worker         const TestSpec::Operation &op = m_spec.operations[operationNdx];
1699*35238bceSAndroid Build Coastguard Worker         const string ext              = op.action->getRequiredExtension();
1700*35238bceSAndroid Build Coastguard Worker 
1701*35238bceSAndroid Build Coastguard Worker         if (!de::contains(exts, ext))
1702*35238bceSAndroid Build Coastguard Worker             TCU_THROW_EXPR(NotSupportedError, "Extension not supported", ext.c_str());
1703*35238bceSAndroid Build Coastguard Worker     }
1704*35238bceSAndroid Build Coastguard Worker }
1705*35238bceSAndroid Build Coastguard Worker 
init(void)1706*35238bceSAndroid Build Coastguard Worker void ImageFormatCase::init(void)
1707*35238bceSAndroid Build Coastguard Worker {
1708*35238bceSAndroid Build Coastguard Worker     const Library &egl = m_eglTestCtx.getLibrary();
1709*35238bceSAndroid Build Coastguard Worker     const eglu::NativeWindowFactory &windowFactory =
1710*35238bceSAndroid Build Coastguard Worker         eglu::selectNativeWindowFactory(m_eglTestCtx.getNativeDisplayFactory(), m_testCtx.getCommandLine());
1711*35238bceSAndroid Build Coastguard Worker 
1712*35238bceSAndroid Build Coastguard Worker     try
1713*35238bceSAndroid Build Coastguard Worker     {
1714*35238bceSAndroid Build Coastguard Worker         m_display = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
1715*35238bceSAndroid Build Coastguard Worker 
1716*35238bceSAndroid Build Coastguard Worker         // GLES3 requires either EGL 1.5 or EGL_KHR_create_context extension.
1717*35238bceSAndroid Build Coastguard Worker         if (m_spec.contexts[0] == TestSpec::API_GLES3 && eglu::getVersion(egl, m_display) < eglu::Version(1, 5))
1718*35238bceSAndroid Build Coastguard Worker         {
1719*35238bceSAndroid Build Coastguard Worker             set<string> exts;
1720*35238bceSAndroid Build Coastguard Worker             const vector<string> eglExts = eglu::getDisplayExtensions(egl, m_display);
1721*35238bceSAndroid Build Coastguard Worker             exts.insert(eglExts.begin(), eglExts.end());
1722*35238bceSAndroid Build Coastguard Worker 
1723*35238bceSAndroid Build Coastguard Worker             if (!de::contains(exts, "EGL_KHR_create_context"))
1724*35238bceSAndroid Build Coastguard Worker             {
1725*35238bceSAndroid Build Coastguard Worker                 getLog() << tcu::TestLog::Message << "EGL version is under 1.5 and the test is using OpenGL ES 3.2."
1726*35238bceSAndroid Build Coastguard Worker                          << "This requires EGL_KHR_create_context extension." << tcu::TestLog::EndMessage;
1727*35238bceSAndroid Build Coastguard Worker                 TCU_THROW(NotSupportedError, "Extension not supported: EGL_KHR_create_context");
1728*35238bceSAndroid Build Coastguard Worker             }
1729*35238bceSAndroid Build Coastguard Worker         }
1730*35238bceSAndroid Build Coastguard Worker 
1731*35238bceSAndroid Build Coastguard Worker         m_config = getConfig();
1732*35238bceSAndroid Build Coastguard Worker         m_window = windowFactory.createWindow(
1733*35238bceSAndroid Build Coastguard Worker             &m_eglTestCtx.getNativeDisplay(), m_display, m_config, DE_NULL,
1734*35238bceSAndroid Build Coastguard Worker             eglu::WindowParams(480, 480, eglu::parseWindowVisibility(m_testCtx.getCommandLine())));
1735*35238bceSAndroid Build Coastguard Worker         m_surface = eglu::createWindowSurface(m_eglTestCtx.getNativeDisplay(), *m_window, m_display, m_config, DE_NULL);
1736*35238bceSAndroid Build Coastguard Worker 
1737*35238bceSAndroid Build Coastguard Worker         {
1738*35238bceSAndroid Build Coastguard Worker             const char *extensions[] = {"GL_OES_EGL_image"};
1739*35238bceSAndroid Build Coastguard Worker             int major                = 2;
1740*35238bceSAndroid Build Coastguard Worker             int minor                = 0;
1741*35238bceSAndroid Build Coastguard Worker 
1742*35238bceSAndroid Build Coastguard Worker             if (m_spec.contexts[0] == TestSpec::API_GLES3)
1743*35238bceSAndroid Build Coastguard Worker             {
1744*35238bceSAndroid Build Coastguard Worker                 major = 3;
1745*35238bceSAndroid Build Coastguard Worker                 minor = 2;
1746*35238bceSAndroid Build Coastguard Worker             }
1747*35238bceSAndroid Build Coastguard Worker             m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(major, minor), DE_LENGTH_OF_ARRAY(extensions),
1748*35238bceSAndroid Build Coastguard Worker                                          &extensions[0]);
1749*35238bceSAndroid Build Coastguard Worker         }
1750*35238bceSAndroid Build Coastguard Worker 
1751*35238bceSAndroid Build Coastguard Worker         for (int contextNdx = 0; contextNdx < (int)m_spec.contexts.size(); contextNdx++)
1752*35238bceSAndroid Build Coastguard Worker         {
1753*35238bceSAndroid Build Coastguard Worker             ImageApi *api = DE_NULL;
1754*35238bceSAndroid Build Coastguard Worker             switch (m_spec.contexts[contextNdx])
1755*35238bceSAndroid Build Coastguard Worker             {
1756*35238bceSAndroid Build Coastguard Worker             case TestSpec::API_GLES2:
1757*35238bceSAndroid Build Coastguard Worker             {
1758*35238bceSAndroid Build Coastguard Worker                 api = new GLESImageApi(egl, m_gl, contextNdx, getLog(), m_display, m_surface, m_config, 2);
1759*35238bceSAndroid Build Coastguard Worker                 break;
1760*35238bceSAndroid Build Coastguard Worker             }
1761*35238bceSAndroid Build Coastguard Worker 
1762*35238bceSAndroid Build Coastguard Worker             case TestSpec::API_GLES3:
1763*35238bceSAndroid Build Coastguard Worker             {
1764*35238bceSAndroid Build Coastguard Worker                 api = new GLESImageApi(egl, m_gl, contextNdx, getLog(), m_display, m_surface, m_config, 3);
1765*35238bceSAndroid Build Coastguard Worker                 break;
1766*35238bceSAndroid Build Coastguard Worker             }
1767*35238bceSAndroid Build Coastguard Worker 
1768*35238bceSAndroid Build Coastguard Worker             default:
1769*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1770*35238bceSAndroid Build Coastguard Worker                 break;
1771*35238bceSAndroid Build Coastguard Worker             }
1772*35238bceSAndroid Build Coastguard Worker             m_apiContexts.push_back(api);
1773*35238bceSAndroid Build Coastguard Worker         }
1774*35238bceSAndroid Build Coastguard Worker         checkExtensions();
1775*35238bceSAndroid Build Coastguard Worker     }
1776*35238bceSAndroid Build Coastguard Worker     catch (...)
1777*35238bceSAndroid Build Coastguard Worker     {
1778*35238bceSAndroid Build Coastguard Worker         deinit();
1779*35238bceSAndroid Build Coastguard Worker         throw;
1780*35238bceSAndroid Build Coastguard Worker     }
1781*35238bceSAndroid Build Coastguard Worker }
1782*35238bceSAndroid Build Coastguard Worker 
deinit(void)1783*35238bceSAndroid Build Coastguard Worker void ImageFormatCase::deinit(void)
1784*35238bceSAndroid Build Coastguard Worker {
1785*35238bceSAndroid Build Coastguard Worker     const Library &egl = m_eglTestCtx.getLibrary();
1786*35238bceSAndroid Build Coastguard Worker 
1787*35238bceSAndroid Build Coastguard Worker     m_img.clear();
1788*35238bceSAndroid Build Coastguard Worker 
1789*35238bceSAndroid Build Coastguard Worker     for (int contexNdx = 0; contexNdx < (int)m_apiContexts.size(); contexNdx++)
1790*35238bceSAndroid Build Coastguard Worker         delete m_apiContexts[contexNdx];
1791*35238bceSAndroid Build Coastguard Worker 
1792*35238bceSAndroid Build Coastguard Worker     m_apiContexts.clear();
1793*35238bceSAndroid Build Coastguard Worker 
1794*35238bceSAndroid Build Coastguard Worker     if (m_surface != EGL_NO_SURFACE)
1795*35238bceSAndroid Build Coastguard Worker     {
1796*35238bceSAndroid Build Coastguard Worker         egl.destroySurface(m_display, m_surface);
1797*35238bceSAndroid Build Coastguard Worker         m_surface = EGL_NO_SURFACE;
1798*35238bceSAndroid Build Coastguard Worker     }
1799*35238bceSAndroid Build Coastguard Worker 
1800*35238bceSAndroid Build Coastguard Worker     delete m_window;
1801*35238bceSAndroid Build Coastguard Worker     m_window = DE_NULL;
1802*35238bceSAndroid Build Coastguard Worker 
1803*35238bceSAndroid Build Coastguard Worker     if (m_display != EGL_NO_DISPLAY)
1804*35238bceSAndroid Build Coastguard Worker     {
1805*35238bceSAndroid Build Coastguard Worker         egl.terminate(m_display);
1806*35238bceSAndroid Build Coastguard Worker         m_display = EGL_NO_DISPLAY;
1807*35238bceSAndroid Build Coastguard Worker     }
1808*35238bceSAndroid Build Coastguard Worker }
1809*35238bceSAndroid Build Coastguard Worker 
iterate(void)1810*35238bceSAndroid Build Coastguard Worker TestCase::IterateResult ImageFormatCase::iterate(void)
1811*35238bceSAndroid Build Coastguard Worker {
1812*35238bceSAndroid Build Coastguard Worker     const TestSpec::Operation &op = m_spec.operations[m_curIter++];
1813*35238bceSAndroid Build Coastguard Worker     ImageApi &api                 = *m_apiContexts[op.apiIndex];
1814*35238bceSAndroid Build Coastguard Worker     const bool isOk               = op.action->invoke(api, m_img, m_refImg);
1815*35238bceSAndroid Build Coastguard Worker 
1816*35238bceSAndroid Build Coastguard Worker     if (isOk && m_curIter < (int)m_spec.operations.size())
1817*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
1818*35238bceSAndroid Build Coastguard Worker     else if (isOk)
1819*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1820*35238bceSAndroid Build Coastguard Worker     else
1821*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1822*35238bceSAndroid Build Coastguard Worker 
1823*35238bceSAndroid Build Coastguard Worker     return STOP;
1824*35238bceSAndroid Build Coastguard Worker }
1825*35238bceSAndroid Build Coastguard Worker 
1826*35238bceSAndroid Build Coastguard Worker struct LabeledAction
1827*35238bceSAndroid Build Coastguard Worker {
1828*35238bceSAndroid Build Coastguard Worker     string label;
1829*35238bceSAndroid Build Coastguard Worker     MovePtr<Action> action;
1830*35238bceSAndroid Build Coastguard Worker };
1831*35238bceSAndroid Build Coastguard Worker 
1832*35238bceSAndroid Build Coastguard Worker // A simple vector mockup that we need because MovePtr isn't copy-constructible.
1833*35238bceSAndroid Build Coastguard Worker struct LabeledActions
1834*35238bceSAndroid Build Coastguard Worker {
LabeledActionsdeqp::egl::Image::LabeledActions1835*35238bceSAndroid Build Coastguard Worker     LabeledActions(void) : m_numActions(0)
1836*35238bceSAndroid Build Coastguard Worker     {
1837*35238bceSAndroid Build Coastguard Worker     }
operator []deqp::egl::Image::LabeledActions1838*35238bceSAndroid Build Coastguard Worker     LabeledAction &operator[](int ndx)
1839*35238bceSAndroid Build Coastguard Worker     {
1840*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(0 <= ndx && ndx < m_numActions);
1841*35238bceSAndroid Build Coastguard Worker         return m_actions[ndx];
1842*35238bceSAndroid Build Coastguard Worker     }
1843*35238bceSAndroid Build Coastguard Worker     void add(const string &label, MovePtr<Action> action);
sizedeqp::egl::Image::LabeledActions1844*35238bceSAndroid Build Coastguard Worker     int size(void) const
1845*35238bceSAndroid Build Coastguard Worker     {
1846*35238bceSAndroid Build Coastguard Worker         return m_numActions;
1847*35238bceSAndroid Build Coastguard Worker     }
1848*35238bceSAndroid Build Coastguard Worker 
1849*35238bceSAndroid Build Coastguard Worker private:
1850*35238bceSAndroid Build Coastguard Worker     LabeledAction m_actions[64];
1851*35238bceSAndroid Build Coastguard Worker     int m_numActions;
1852*35238bceSAndroid Build Coastguard Worker };
1853*35238bceSAndroid Build Coastguard Worker 
add(const string & label,MovePtr<Action> action)1854*35238bceSAndroid Build Coastguard Worker void LabeledActions::add(const string &label, MovePtr<Action> action)
1855*35238bceSAndroid Build Coastguard Worker {
1856*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(m_numActions < DE_LENGTH_OF_ARRAY(m_actions));
1857*35238bceSAndroid Build Coastguard Worker     m_actions[m_numActions].label  = label;
1858*35238bceSAndroid Build Coastguard Worker     m_actions[m_numActions].action = action;
1859*35238bceSAndroid Build Coastguard Worker     ++m_numActions;
1860*35238bceSAndroid Build Coastguard Worker }
1861*35238bceSAndroid Build Coastguard Worker 
1862*35238bceSAndroid Build Coastguard Worker class ImageTests : public TestCaseGroup
1863*35238bceSAndroid Build Coastguard Worker {
1864*35238bceSAndroid Build Coastguard Worker protected:
ImageTests(EglTestContext & eglTestCtx,const string & name,const string & desc)1865*35238bceSAndroid Build Coastguard Worker     ImageTests(EglTestContext &eglTestCtx, const string &name, const string &desc)
1866*35238bceSAndroid Build Coastguard Worker         : TestCaseGroup(eglTestCtx, name.c_str(), desc.c_str())
1867*35238bceSAndroid Build Coastguard Worker     {
1868*35238bceSAndroid Build Coastguard Worker     }
1869*35238bceSAndroid Build Coastguard Worker 
1870*35238bceSAndroid Build Coastguard Worker     void addCreateTexture(const string &name, EGLenum source, GLenum internalFormat, GLenum format, GLenum type);
1871*35238bceSAndroid Build Coastguard Worker     void addCreateRenderbuffer(const string &name, GLenum format);
1872*35238bceSAndroid Build Coastguard Worker     void addCreateAndroidNative(const string &name, GLenum format, bool isYUV);
1873*35238bceSAndroid Build Coastguard Worker     void addCreateAndroidNativeArray(const string &name, GLenum format, uint32_t numLayers);
1874*35238bceSAndroid Build Coastguard Worker     void addCreateTexture2DActions(const string &prefix);
1875*35238bceSAndroid Build Coastguard Worker     void addCreateTextureCubemapActions(const string &suffix, GLenum internalFormat, GLenum format, GLenum type);
1876*35238bceSAndroid Build Coastguard Worker     void addCreateRenderbufferActions(void);
1877*35238bceSAndroid Build Coastguard Worker     void addCreateAndroidNativeActions(void);
1878*35238bceSAndroid Build Coastguard Worker 
1879*35238bceSAndroid Build Coastguard Worker     LabeledActions m_createActions;
1880*35238bceSAndroid Build Coastguard Worker };
1881*35238bceSAndroid Build Coastguard Worker 
addCreateTexture(const string & name,EGLenum source,GLenum internalFormat,GLenum format,GLenum type)1882*35238bceSAndroid Build Coastguard Worker void ImageTests::addCreateTexture(const string &name, EGLenum source, GLenum internalFormat, GLenum format, GLenum type)
1883*35238bceSAndroid Build Coastguard Worker {
1884*35238bceSAndroid Build Coastguard Worker     m_createActions.add(name, MovePtr<Action>(new GLESImageApi::Create(
1885*35238bceSAndroid Build Coastguard Worker                                   createTextureImageSource(source, internalFormat, format, type))));
1886*35238bceSAndroid Build Coastguard Worker }
1887*35238bceSAndroid Build Coastguard Worker 
addCreateRenderbuffer(const string & name,GLenum format)1888*35238bceSAndroid Build Coastguard Worker void ImageTests::addCreateRenderbuffer(const string &name, GLenum format)
1889*35238bceSAndroid Build Coastguard Worker {
1890*35238bceSAndroid Build Coastguard Worker     m_createActions.add(name, MovePtr<Action>(new GLESImageApi::Create(createRenderbufferImageSource(format))));
1891*35238bceSAndroid Build Coastguard Worker }
1892*35238bceSAndroid Build Coastguard Worker 
addCreateAndroidNative(const string & name,GLenum format,bool isYUV=false)1893*35238bceSAndroid Build Coastguard Worker void ImageTests::addCreateAndroidNative(const string &name, GLenum format, bool isYUV = false)
1894*35238bceSAndroid Build Coastguard Worker {
1895*35238bceSAndroid Build Coastguard Worker     m_createActions.add(name,
1896*35238bceSAndroid Build Coastguard Worker                         MovePtr<Action>(new GLESImageApi::Create(createAndroidNativeImageSource(format, 1u, isYUV))));
1897*35238bceSAndroid Build Coastguard Worker }
1898*35238bceSAndroid Build Coastguard Worker 
addCreateAndroidNativeArray(const string & name,GLenum format,uint32_t numLayers)1899*35238bceSAndroid Build Coastguard Worker void ImageTests::addCreateAndroidNativeArray(const string &name, GLenum format, uint32_t numLayers)
1900*35238bceSAndroid Build Coastguard Worker {
1901*35238bceSAndroid Build Coastguard Worker     m_createActions.add(name, MovePtr<Action>(new GLESImageApi::Create(
1902*35238bceSAndroid Build Coastguard Worker                                   createAndroidNativeImageSource(format, numLayers, false), numLayers)));
1903*35238bceSAndroid Build Coastguard Worker }
1904*35238bceSAndroid Build Coastguard Worker 
addCreateTexture2DActions(const string & prefix)1905*35238bceSAndroid Build Coastguard Worker void ImageTests::addCreateTexture2DActions(const string &prefix)
1906*35238bceSAndroid Build Coastguard Worker {
1907*35238bceSAndroid Build Coastguard Worker     addCreateTexture(prefix + "rgb8", EGL_GL_TEXTURE_2D_KHR, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE);
1908*35238bceSAndroid Build Coastguard Worker     addCreateTexture(prefix + "rgb565", EGL_GL_TEXTURE_2D_KHR, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
1909*35238bceSAndroid Build Coastguard Worker     addCreateTexture(prefix + "rgba8", EGL_GL_TEXTURE_2D_KHR, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE);
1910*35238bceSAndroid Build Coastguard Worker     addCreateTexture(prefix + "rgb5_a1", EGL_GL_TEXTURE_2D_KHR, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
1911*35238bceSAndroid Build Coastguard Worker     addCreateTexture(prefix + "rgba4", EGL_GL_TEXTURE_2D_KHR, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
1912*35238bceSAndroid Build Coastguard Worker }
1913*35238bceSAndroid Build Coastguard Worker 
addCreateTextureCubemapActions(const string & suffix,GLenum internalFormat,GLenum format,GLenum type)1914*35238bceSAndroid Build Coastguard Worker void ImageTests::addCreateTextureCubemapActions(const string &suffix, GLenum internalFormat, GLenum format, GLenum type)
1915*35238bceSAndroid Build Coastguard Worker {
1916*35238bceSAndroid Build Coastguard Worker     addCreateTexture("cubemap_positive_x" + suffix, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR, internalFormat, format,
1917*35238bceSAndroid Build Coastguard Worker                      type);
1918*35238bceSAndroid Build Coastguard Worker     addCreateTexture("cubemap_positive_y" + suffix, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR, internalFormat, format,
1919*35238bceSAndroid Build Coastguard Worker                      type);
1920*35238bceSAndroid Build Coastguard Worker     addCreateTexture("cubemap_positive_z" + suffix, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR, internalFormat, format,
1921*35238bceSAndroid Build Coastguard Worker                      type);
1922*35238bceSAndroid Build Coastguard Worker     addCreateTexture("cubemap_negative_x" + suffix, EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR, internalFormat, format,
1923*35238bceSAndroid Build Coastguard Worker                      type);
1924*35238bceSAndroid Build Coastguard Worker     addCreateTexture("cubemap_negative_y" + suffix, EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR, internalFormat, format,
1925*35238bceSAndroid Build Coastguard Worker                      type);
1926*35238bceSAndroid Build Coastguard Worker     addCreateTexture("cubemap_negative_z" + suffix, EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR, internalFormat, format,
1927*35238bceSAndroid Build Coastguard Worker                      type);
1928*35238bceSAndroid Build Coastguard Worker }
1929*35238bceSAndroid Build Coastguard Worker 
addCreateRenderbufferActions(void)1930*35238bceSAndroid Build Coastguard Worker void ImageTests::addCreateRenderbufferActions(void)
1931*35238bceSAndroid Build Coastguard Worker {
1932*35238bceSAndroid Build Coastguard Worker     addCreateRenderbuffer("renderbuffer_rgba4", GL_RGBA4);
1933*35238bceSAndroid Build Coastguard Worker     addCreateRenderbuffer("renderbuffer_rgb5_a1", GL_RGB5_A1);
1934*35238bceSAndroid Build Coastguard Worker     addCreateRenderbuffer("renderbuffer_rgb565", GL_RGB565);
1935*35238bceSAndroid Build Coastguard Worker     addCreateRenderbuffer("renderbuffer_depth16", GL_DEPTH_COMPONENT16);
1936*35238bceSAndroid Build Coastguard Worker     addCreateRenderbuffer("renderbuffer_stencil", GL_STENCIL_INDEX8);
1937*35238bceSAndroid Build Coastguard Worker }
1938*35238bceSAndroid Build Coastguard Worker 
addCreateAndroidNativeActions(void)1939*35238bceSAndroid Build Coastguard Worker void ImageTests::addCreateAndroidNativeActions(void)
1940*35238bceSAndroid Build Coastguard Worker {
1941*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_rgba4", GL_RGBA4);
1942*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_rgb5_a1", GL_RGB5_A1);
1943*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_rgb565", GL_RGB565);
1944*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_rgb8", GL_RGB8);
1945*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_rgba8", GL_RGBA8);
1946*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_d16", GL_DEPTH_COMPONENT16);
1947*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_d24", GL_DEPTH_COMPONENT24);
1948*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_d24s8", GL_DEPTH24_STENCIL8);
1949*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_d32f", GL_DEPTH_COMPONENT32F);
1950*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_d32fs8", GL_DEPTH32F_STENCIL8);
1951*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_rgb10a2", GL_RGB10_A2);
1952*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_rgba16f", GL_RGBA16F);
1953*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_s8", GL_STENCIL_INDEX8);
1954*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNative("android_native_yuv420", GL_RGBA8, true);
1955*35238bceSAndroid Build Coastguard Worker 
1956*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNativeArray("android_native_array_rgba4", GL_RGBA4, 4u);
1957*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNativeArray("android_native_array_rgb5_a1", GL_RGB5_A1, 4u);
1958*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNativeArray("android_native_array_rgb565", GL_RGB565, 4u);
1959*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNativeArray("android_native_array_rgb8", GL_RGB8, 4u);
1960*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNativeArray("android_native_array_rgba8", GL_RGBA8, 4u);
1961*35238bceSAndroid Build Coastguard Worker }
1962*35238bceSAndroid Build Coastguard Worker 
1963*35238bceSAndroid Build Coastguard Worker class RenderTests : public ImageTests
1964*35238bceSAndroid Build Coastguard Worker {
1965*35238bceSAndroid Build Coastguard Worker protected:
RenderTests(EglTestContext & eglTestCtx,const string & name,const string & desc)1966*35238bceSAndroid Build Coastguard Worker     RenderTests(EglTestContext &eglTestCtx, const string &name, const string &desc) : ImageTests(eglTestCtx, name, desc)
1967*35238bceSAndroid Build Coastguard Worker     {
1968*35238bceSAndroid Build Coastguard Worker     }
1969*35238bceSAndroid Build Coastguard Worker 
1970*35238bceSAndroid Build Coastguard Worker     void addRenderActions(void);
1971*35238bceSAndroid Build Coastguard Worker     LabeledActions m_renderActions;
1972*35238bceSAndroid Build Coastguard Worker };
1973*35238bceSAndroid Build Coastguard Worker 
addRenderActions(void)1974*35238bceSAndroid Build Coastguard Worker void RenderTests::addRenderActions(void)
1975*35238bceSAndroid Build Coastguard Worker {
1976*35238bceSAndroid Build Coastguard Worker     m_renderActions.add("texture", MovePtr<Action>(new GLESImageApi::RenderTexture2D()));
1977*35238bceSAndroid Build Coastguard Worker     m_renderActions.add("texture_array", MovePtr<Action>(new GLESImageApi::RenderTexture2DArray()));
1978*35238bceSAndroid Build Coastguard Worker     m_renderActions.add("read_pixels", MovePtr<Action>(new GLESImageApi::RenderReadPixelsRenderbuffer()));
1979*35238bceSAndroid Build Coastguard Worker     m_renderActions.add("depth_buffer", MovePtr<Action>(new GLESImageApi::RenderDepthbuffer()));
1980*35238bceSAndroid Build Coastguard Worker     m_renderActions.add("stencil_buffer", MovePtr<Action>(new GLESImageApi::RenderStencilbuffer()));
1981*35238bceSAndroid Build Coastguard Worker     m_renderActions.add("yuv_texture", MovePtr<Action>(new GLESImageApi::RenderYUVTexture()));
1982*35238bceSAndroid Build Coastguard Worker     m_renderActions.add("render_sample_texture_array", MovePtr<Action>(new GLESImageApi::RenderSampleTexture2DArray()));
1983*35238bceSAndroid Build Coastguard Worker }
1984*35238bceSAndroid Build Coastguard Worker 
1985*35238bceSAndroid Build Coastguard Worker class SimpleCreationTests : public RenderTests
1986*35238bceSAndroid Build Coastguard Worker {
1987*35238bceSAndroid Build Coastguard Worker public:
SimpleCreationTests(EglTestContext & eglTestCtx,const string & name,const string & desc)1988*35238bceSAndroid Build Coastguard Worker     SimpleCreationTests(EglTestContext &eglTestCtx, const string &name, const string &desc)
1989*35238bceSAndroid Build Coastguard Worker         : RenderTests(eglTestCtx, name, desc)
1990*35238bceSAndroid Build Coastguard Worker     {
1991*35238bceSAndroid Build Coastguard Worker     }
1992*35238bceSAndroid Build Coastguard Worker     void init(void);
1993*35238bceSAndroid Build Coastguard Worker };
1994*35238bceSAndroid Build Coastguard Worker 
isDepthFormat(GLenum format)1995*35238bceSAndroid Build Coastguard Worker bool isDepthFormat(GLenum format)
1996*35238bceSAndroid Build Coastguard Worker {
1997*35238bceSAndroid Build Coastguard Worker     switch (format)
1998*35238bceSAndroid Build Coastguard Worker     {
1999*35238bceSAndroid Build Coastguard Worker     case GL_RGB:
2000*35238bceSAndroid Build Coastguard Worker     case GL_RGB8:
2001*35238bceSAndroid Build Coastguard Worker     case GL_RGB565:
2002*35238bceSAndroid Build Coastguard Worker     case GL_RGBA:
2003*35238bceSAndroid Build Coastguard Worker     case GL_RGBA4:
2004*35238bceSAndroid Build Coastguard Worker     case GL_RGBA8:
2005*35238bceSAndroid Build Coastguard Worker     case GL_RGB5_A1:
2006*35238bceSAndroid Build Coastguard Worker     case GL_RGB10_A2:
2007*35238bceSAndroid Build Coastguard Worker     case GL_RGBA16F:
2008*35238bceSAndroid Build Coastguard Worker         return false;
2009*35238bceSAndroid Build Coastguard Worker 
2010*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH_COMPONENT16:
2011*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH_COMPONENT24:
2012*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH_COMPONENT32:
2013*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH_COMPONENT32F:
2014*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH24_STENCIL8:
2015*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH32F_STENCIL8:
2016*35238bceSAndroid Build Coastguard Worker         return true;
2017*35238bceSAndroid Build Coastguard Worker 
2018*35238bceSAndroid Build Coastguard Worker     case GL_STENCIL_INDEX8:
2019*35238bceSAndroid Build Coastguard Worker         return false;
2020*35238bceSAndroid Build Coastguard Worker 
2021*35238bceSAndroid Build Coastguard Worker     default:
2022*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
2023*35238bceSAndroid Build Coastguard Worker         return false;
2024*35238bceSAndroid Build Coastguard Worker     }
2025*35238bceSAndroid Build Coastguard Worker }
2026*35238bceSAndroid Build Coastguard Worker 
isStencilFormat(GLenum format)2027*35238bceSAndroid Build Coastguard Worker bool isStencilFormat(GLenum format)
2028*35238bceSAndroid Build Coastguard Worker {
2029*35238bceSAndroid Build Coastguard Worker     switch (format)
2030*35238bceSAndroid Build Coastguard Worker     {
2031*35238bceSAndroid Build Coastguard Worker     case GL_RGB:
2032*35238bceSAndroid Build Coastguard Worker     case GL_RGB8:
2033*35238bceSAndroid Build Coastguard Worker     case GL_RGB565:
2034*35238bceSAndroid Build Coastguard Worker     case GL_RGBA:
2035*35238bceSAndroid Build Coastguard Worker     case GL_RGBA4:
2036*35238bceSAndroid Build Coastguard Worker     case GL_RGBA8:
2037*35238bceSAndroid Build Coastguard Worker     case GL_RGB5_A1:
2038*35238bceSAndroid Build Coastguard Worker     case GL_RGB10_A2:
2039*35238bceSAndroid Build Coastguard Worker     case GL_RGBA16F:
2040*35238bceSAndroid Build Coastguard Worker         return false;
2041*35238bceSAndroid Build Coastguard Worker 
2042*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH_COMPONENT16:
2043*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH_COMPONENT24:
2044*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH_COMPONENT32:
2045*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH_COMPONENT32F:
2046*35238bceSAndroid Build Coastguard Worker         return false;
2047*35238bceSAndroid Build Coastguard Worker 
2048*35238bceSAndroid Build Coastguard Worker     case GL_STENCIL_INDEX8:
2049*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH24_STENCIL8:
2050*35238bceSAndroid Build Coastguard Worker     case GL_DEPTH32F_STENCIL8:
2051*35238bceSAndroid Build Coastguard Worker         return true;
2052*35238bceSAndroid Build Coastguard Worker 
2053*35238bceSAndroid Build Coastguard Worker     default:
2054*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
2055*35238bceSAndroid Build Coastguard Worker         return false;
2056*35238bceSAndroid Build Coastguard Worker     }
2057*35238bceSAndroid Build Coastguard Worker }
2058*35238bceSAndroid Build Coastguard Worker 
isCompatibleCreateAndRenderActions(const Action & create,const Action & render)2059*35238bceSAndroid Build Coastguard Worker bool isCompatibleCreateAndRenderActions(const Action &create, const Action &render)
2060*35238bceSAndroid Build Coastguard Worker {
2061*35238bceSAndroid Build Coastguard Worker     if (const GLESImageApi::Create *glesCreate = dynamic_cast<const GLESImageApi::Create *>(&create))
2062*35238bceSAndroid Build Coastguard Worker     {
2063*35238bceSAndroid Build Coastguard Worker         bool yuvFormatTest = glesCreate->isYUVFormatImage();
2064*35238bceSAndroid Build Coastguard Worker         // this path only for none-yuv format tests
2065*35238bceSAndroid Build Coastguard Worker         if (!yuvFormatTest)
2066*35238bceSAndroid Build Coastguard Worker         {
2067*35238bceSAndroid Build Coastguard Worker             const GLenum createFormat = glesCreate->getEffectiveFormat();
2068*35238bceSAndroid Build Coastguard Worker 
2069*35238bceSAndroid Build Coastguard Worker             if (dynamic_cast<const GLESImageApi::RenderTexture2DArray *>(&render))
2070*35238bceSAndroid Build Coastguard Worker             {
2071*35238bceSAndroid Build Coastguard Worker                 // Makes sense only for texture arrays.
2072*35238bceSAndroid Build Coastguard Worker                 if (glesCreate->getNumLayers() <= 1u)
2073*35238bceSAndroid Build Coastguard Worker                     return false;
2074*35238bceSAndroid Build Coastguard Worker             }
2075*35238bceSAndroid Build Coastguard Worker             else if (glesCreate->getNumLayers() != 1u)
2076*35238bceSAndroid Build Coastguard Worker             {
2077*35238bceSAndroid Build Coastguard Worker                 // Skip other render actions for texture arrays.
2078*35238bceSAndroid Build Coastguard Worker                 return false;
2079*35238bceSAndroid Build Coastguard Worker             }
2080*35238bceSAndroid Build Coastguard Worker 
2081*35238bceSAndroid Build Coastguard Worker             if (dynamic_cast<const GLESImageApi::RenderTexture2D *>(&render))
2082*35238bceSAndroid Build Coastguard Worker             {
2083*35238bceSAndroid Build Coastguard Worker                 // GLES does not have depth or stencil textures
2084*35238bceSAndroid Build Coastguard Worker                 if (isDepthFormat(createFormat) || isStencilFormat(createFormat))
2085*35238bceSAndroid Build Coastguard Worker                     return false;
2086*35238bceSAndroid Build Coastguard Worker             }
2087*35238bceSAndroid Build Coastguard Worker 
2088*35238bceSAndroid Build Coastguard Worker             if (dynamic_cast<const GLESImageApi::RenderReadPixelsRenderbuffer *>(&render))
2089*35238bceSAndroid Build Coastguard Worker             {
2090*35238bceSAndroid Build Coastguard Worker                 // GLES does not support readPixels for depth or stencil.
2091*35238bceSAndroid Build Coastguard Worker                 if (isDepthFormat(createFormat) || isStencilFormat(createFormat))
2092*35238bceSAndroid Build Coastguard Worker                     return false;
2093*35238bceSAndroid Build Coastguard Worker             }
2094*35238bceSAndroid Build Coastguard Worker 
2095*35238bceSAndroid Build Coastguard Worker             if (dynamic_cast<const GLESImageApi::RenderDepthbuffer *>(&render))
2096*35238bceSAndroid Build Coastguard Worker             {
2097*35238bceSAndroid Build Coastguard Worker                 // Copying non-depth data to depth renderbuffer and expecting meaningful
2098*35238bceSAndroid Build Coastguard Worker                 // results just doesn't make any sense.
2099*35238bceSAndroid Build Coastguard Worker                 if (!isDepthFormat(createFormat))
2100*35238bceSAndroid Build Coastguard Worker                     return false;
2101*35238bceSAndroid Build Coastguard Worker             }
2102*35238bceSAndroid Build Coastguard Worker 
2103*35238bceSAndroid Build Coastguard Worker             if (dynamic_cast<const GLESImageApi::RenderStencilbuffer *>(&render))
2104*35238bceSAndroid Build Coastguard Worker             {
2105*35238bceSAndroid Build Coastguard Worker                 // Copying non-stencil data to stencil renderbuffer and expecting meaningful
2106*35238bceSAndroid Build Coastguard Worker                 // results just doesn't make any sense.
2107*35238bceSAndroid Build Coastguard Worker                 if (!isStencilFormat(createFormat))
2108*35238bceSAndroid Build Coastguard Worker                     return false;
2109*35238bceSAndroid Build Coastguard Worker             }
2110*35238bceSAndroid Build Coastguard Worker 
2111*35238bceSAndroid Build Coastguard Worker             if (dynamic_cast<const GLESImageApi::RenderYUVTexture *>(&render))
2112*35238bceSAndroid Build Coastguard Worker             {
2113*35238bceSAndroid Build Coastguard Worker                 // In yuv path rendering with non-yuv format native buffer and expecting meaningful
2114*35238bceSAndroid Build Coastguard Worker                 // results just doesn't make any sense
2115*35238bceSAndroid Build Coastguard Worker                 return false;
2116*35238bceSAndroid Build Coastguard Worker             }
2117*35238bceSAndroid Build Coastguard Worker 
2118*35238bceSAndroid Build Coastguard Worker             return true;
2119*35238bceSAndroid Build Coastguard Worker         }
2120*35238bceSAndroid Build Coastguard Worker         else if (dynamic_cast<const GLESImageApi::RenderYUVTexture *>(&render))
2121*35238bceSAndroid Build Coastguard Worker         {
2122*35238bceSAndroid Build Coastguard Worker             return true;
2123*35238bceSAndroid Build Coastguard Worker         }
2124*35238bceSAndroid Build Coastguard Worker     }
2125*35238bceSAndroid Build Coastguard Worker     else
2126*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
2127*35238bceSAndroid Build Coastguard Worker 
2128*35238bceSAndroid Build Coastguard Worker     return false;
2129*35238bceSAndroid Build Coastguard Worker }
2130*35238bceSAndroid Build Coastguard Worker 
init(void)2131*35238bceSAndroid Build Coastguard Worker void SimpleCreationTests::init(void)
2132*35238bceSAndroid Build Coastguard Worker {
2133*35238bceSAndroid Build Coastguard Worker     addCreateTexture2DActions("texture_");
2134*35238bceSAndroid Build Coastguard Worker     addCreateTextureCubemapActions("_rgba", GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE);
2135*35238bceSAndroid Build Coastguard Worker     addCreateTextureCubemapActions("_rgb", GL_RGB, GL_RGB, GL_UNSIGNED_BYTE);
2136*35238bceSAndroid Build Coastguard Worker     addCreateRenderbufferActions();
2137*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNativeActions();
2138*35238bceSAndroid Build Coastguard Worker     addRenderActions();
2139*35238bceSAndroid Build Coastguard Worker 
2140*35238bceSAndroid Build Coastguard Worker     for (int createNdx = 0; createNdx < m_createActions.size(); createNdx++)
2141*35238bceSAndroid Build Coastguard Worker     {
2142*35238bceSAndroid Build Coastguard Worker         const LabeledAction &createAction = m_createActions[createNdx];
2143*35238bceSAndroid Build Coastguard Worker 
2144*35238bceSAndroid Build Coastguard Worker         for (int renderNdx = 0; renderNdx < m_renderActions.size(); renderNdx++)
2145*35238bceSAndroid Build Coastguard Worker         {
2146*35238bceSAndroid Build Coastguard Worker             const LabeledAction &renderAction = m_renderActions[renderNdx];
2147*35238bceSAndroid Build Coastguard Worker             TestSpec spec;
2148*35238bceSAndroid Build Coastguard Worker 
2149*35238bceSAndroid Build Coastguard Worker             if (!isCompatibleCreateAndRenderActions(*createAction.action, *renderAction.action))
2150*35238bceSAndroid Build Coastguard Worker                 continue;
2151*35238bceSAndroid Build Coastguard Worker 
2152*35238bceSAndroid Build Coastguard Worker             if (dynamic_cast<const GLESImageApi::RenderTexture2DArray *>(renderAction.action.get()) ||
2153*35238bceSAndroid Build Coastguard Worker                 dynamic_cast<const GLESImageApi::RenderYUVTexture *>(renderAction.action.get()) ||
2154*35238bceSAndroid Build Coastguard Worker                 dynamic_cast<const GLESImageApi::RenderSampleTexture2DArray *>(renderAction.action.get()))
2155*35238bceSAndroid Build Coastguard Worker             {
2156*35238bceSAndroid Build Coastguard Worker                 // Texture array tests require GLES3.
2157*35238bceSAndroid Build Coastguard Worker                 spec.name = std::string("gles3_") + createAction.label + "_" + renderAction.label;
2158*35238bceSAndroid Build Coastguard Worker                 spec.contexts.push_back(TestSpec::API_GLES3);
2159*35238bceSAndroid Build Coastguard Worker             }
2160*35238bceSAndroid Build Coastguard Worker             else
2161*35238bceSAndroid Build Coastguard Worker             {
2162*35238bceSAndroid Build Coastguard Worker                 spec.name = std::string("gles2_") + createAction.label + "_" + renderAction.label;
2163*35238bceSAndroid Build Coastguard Worker                 spec.contexts.push_back(TestSpec::API_GLES2);
2164*35238bceSAndroid Build Coastguard Worker             }
2165*35238bceSAndroid Build Coastguard Worker 
2166*35238bceSAndroid Build Coastguard Worker             spec.desc = spec.name;
2167*35238bceSAndroid Build Coastguard Worker             spec.operations.push_back(TestSpec::Operation(0, *createAction.action));
2168*35238bceSAndroid Build Coastguard Worker             spec.operations.push_back(TestSpec::Operation(0, *renderAction.action));
2169*35238bceSAndroid Build Coastguard Worker 
2170*35238bceSAndroid Build Coastguard Worker             addChild(new ImageFormatCase(m_eglTestCtx, spec));
2171*35238bceSAndroid Build Coastguard Worker         }
2172*35238bceSAndroid Build Coastguard Worker     }
2173*35238bceSAndroid Build Coastguard Worker }
2174*35238bceSAndroid Build Coastguard Worker 
createSimpleCreationTests(EglTestContext & eglTestCtx,const string & name,const string & desc)2175*35238bceSAndroid Build Coastguard Worker TestCaseGroup *createSimpleCreationTests(EglTestContext &eglTestCtx, const string &name, const string &desc)
2176*35238bceSAndroid Build Coastguard Worker {
2177*35238bceSAndroid Build Coastguard Worker     return new SimpleCreationTests(eglTestCtx, name, desc);
2178*35238bceSAndroid Build Coastguard Worker }
2179*35238bceSAndroid Build Coastguard Worker 
isCompatibleFormats(GLenum createFormat,GLenum modifyFormat,GLenum modifyType)2180*35238bceSAndroid Build Coastguard Worker bool isCompatibleFormats(GLenum createFormat, GLenum modifyFormat, GLenum modifyType)
2181*35238bceSAndroid Build Coastguard Worker {
2182*35238bceSAndroid Build Coastguard Worker     switch (modifyFormat)
2183*35238bceSAndroid Build Coastguard Worker     {
2184*35238bceSAndroid Build Coastguard Worker     case GL_RGB:
2185*35238bceSAndroid Build Coastguard Worker         switch (modifyType)
2186*35238bceSAndroid Build Coastguard Worker         {
2187*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_BYTE:
2188*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGB || createFormat == GL_RGB8 || createFormat == GL_RGB565 ||
2189*35238bceSAndroid Build Coastguard Worker                    createFormat == GL_SRGB8;
2190*35238bceSAndroid Build Coastguard Worker 
2191*35238bceSAndroid Build Coastguard Worker         case GL_BYTE:
2192*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGB8_SNORM;
2193*35238bceSAndroid Build Coastguard Worker 
2194*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_SHORT_5_6_5:
2195*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGB || createFormat == GL_RGB565;
2196*35238bceSAndroid Build Coastguard Worker 
2197*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_INT_10F_11F_11F_REV:
2198*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_R11F_G11F_B10F;
2199*35238bceSAndroid Build Coastguard Worker 
2200*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_INT_5_9_9_9_REV:
2201*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGB9_E5;
2202*35238bceSAndroid Build Coastguard Worker 
2203*35238bceSAndroid Build Coastguard Worker         case GL_HALF_FLOAT:
2204*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGB16F || createFormat == GL_R11F_G11F_B10F || createFormat == GL_RGB9_E5;
2205*35238bceSAndroid Build Coastguard Worker 
2206*35238bceSAndroid Build Coastguard Worker         case GL_FLOAT:
2207*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGB16F || createFormat == GL_RGB32F || createFormat == GL_R11F_G11F_B10F ||
2208*35238bceSAndroid Build Coastguard Worker                    createFormat == GL_RGB9_E5;
2209*35238bceSAndroid Build Coastguard Worker 
2210*35238bceSAndroid Build Coastguard Worker         default:
2211*35238bceSAndroid Build Coastguard Worker             DE_FATAL("Unknown modify type");
2212*35238bceSAndroid Build Coastguard Worker             return false;
2213*35238bceSAndroid Build Coastguard Worker         }
2214*35238bceSAndroid Build Coastguard Worker 
2215*35238bceSAndroid Build Coastguard Worker     case GL_RGBA:
2216*35238bceSAndroid Build Coastguard Worker         switch (modifyType)
2217*35238bceSAndroid Build Coastguard Worker         {
2218*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_BYTE:
2219*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGBA8 || createFormat == GL_RGB5_A1 || createFormat == GL_RGBA4 ||
2220*35238bceSAndroid Build Coastguard Worker                    createFormat == GL_SRGB8_ALPHA8 || createFormat == GL_RGBA;
2221*35238bceSAndroid Build Coastguard Worker 
2222*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_SHORT_4_4_4_4:
2223*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGBA4 || createFormat == GL_RGBA;
2224*35238bceSAndroid Build Coastguard Worker 
2225*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_SHORT_5_5_5_1:
2226*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGB5_A1 || createFormat == GL_RGBA;
2227*35238bceSAndroid Build Coastguard Worker 
2228*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_INT_2_10_10_10_REV:
2229*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGB10_A2 || createFormat == GL_RGB5_A1;
2230*35238bceSAndroid Build Coastguard Worker 
2231*35238bceSAndroid Build Coastguard Worker         case GL_HALF_FLOAT:
2232*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGBA16F;
2233*35238bceSAndroid Build Coastguard Worker 
2234*35238bceSAndroid Build Coastguard Worker         case GL_FLOAT:
2235*35238bceSAndroid Build Coastguard Worker             return createFormat == GL_RGBA16F || createFormat == GL_RGBA32F;
2236*35238bceSAndroid Build Coastguard Worker 
2237*35238bceSAndroid Build Coastguard Worker         default:
2238*35238bceSAndroid Build Coastguard Worker             DE_FATAL("Unknown modify type");
2239*35238bceSAndroid Build Coastguard Worker             return false;
2240*35238bceSAndroid Build Coastguard Worker         }
2241*35238bceSAndroid Build Coastguard Worker 
2242*35238bceSAndroid Build Coastguard Worker     default:
2243*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unknown modify format");
2244*35238bceSAndroid Build Coastguard Worker         return false;
2245*35238bceSAndroid Build Coastguard Worker     }
2246*35238bceSAndroid Build Coastguard Worker }
2247*35238bceSAndroid Build Coastguard Worker 
isCompatibleCreateAndModifyActions(const Action & create,const Action & modify)2248*35238bceSAndroid Build Coastguard Worker bool isCompatibleCreateAndModifyActions(const Action &create, const Action &modify)
2249*35238bceSAndroid Build Coastguard Worker {
2250*35238bceSAndroid Build Coastguard Worker     if (const GLESImageApi::Create *glesCreate = dynamic_cast<const GLESImageApi::Create *>(&create))
2251*35238bceSAndroid Build Coastguard Worker     {
2252*35238bceSAndroid Build Coastguard Worker         // No modify tests for texture arrays.
2253*35238bceSAndroid Build Coastguard Worker         if (glesCreate->getNumLayers() > 1u)
2254*35238bceSAndroid Build Coastguard Worker             return false;
2255*35238bceSAndroid Build Coastguard Worker         // No modify tests for yuv format image.
2256*35238bceSAndroid Build Coastguard Worker         if (glesCreate->isYUVFormatImage())
2257*35238bceSAndroid Build Coastguard Worker             return false;
2258*35238bceSAndroid Build Coastguard Worker 
2259*35238bceSAndroid Build Coastguard Worker         const GLenum createFormat = glesCreate->getEffectiveFormat();
2260*35238bceSAndroid Build Coastguard Worker 
2261*35238bceSAndroid Build Coastguard Worker         if (const GLESImageApi::ModifyTexSubImage *glesTexSubImageModify =
2262*35238bceSAndroid Build Coastguard Worker                 dynamic_cast<const GLESImageApi::ModifyTexSubImage *>(&modify))
2263*35238bceSAndroid Build Coastguard Worker         {
2264*35238bceSAndroid Build Coastguard Worker             const GLenum modifyFormat = glesTexSubImageModify->getFormat();
2265*35238bceSAndroid Build Coastguard Worker             const GLenum modifyType   = glesTexSubImageModify->getType();
2266*35238bceSAndroid Build Coastguard Worker 
2267*35238bceSAndroid Build Coastguard Worker             return isCompatibleFormats(createFormat, modifyFormat, modifyType);
2268*35238bceSAndroid Build Coastguard Worker         }
2269*35238bceSAndroid Build Coastguard Worker 
2270*35238bceSAndroid Build Coastguard Worker         if (dynamic_cast<const GLESImageApi::ModifyRenderbufferClearColor *>(&modify))
2271*35238bceSAndroid Build Coastguard Worker         {
2272*35238bceSAndroid Build Coastguard Worker             // reintepreting color as non-color is not meaningful
2273*35238bceSAndroid Build Coastguard Worker             if (isDepthFormat(createFormat) || isStencilFormat(createFormat))
2274*35238bceSAndroid Build Coastguard Worker                 return false;
2275*35238bceSAndroid Build Coastguard Worker         }
2276*35238bceSAndroid Build Coastguard Worker 
2277*35238bceSAndroid Build Coastguard Worker         if (dynamic_cast<const GLESImageApi::ModifyRenderbufferClearDepth *>(&modify))
2278*35238bceSAndroid Build Coastguard Worker         {
2279*35238bceSAndroid Build Coastguard Worker             // reintepreting depth as non-depth is not meaningful
2280*35238bceSAndroid Build Coastguard Worker             if (!isDepthFormat(createFormat))
2281*35238bceSAndroid Build Coastguard Worker                 return false;
2282*35238bceSAndroid Build Coastguard Worker         }
2283*35238bceSAndroid Build Coastguard Worker 
2284*35238bceSAndroid Build Coastguard Worker         if (dynamic_cast<const GLESImageApi::ModifyRenderbufferClearStencil *>(&modify))
2285*35238bceSAndroid Build Coastguard Worker         {
2286*35238bceSAndroid Build Coastguard Worker             // reintepreting stencil as non-stencil is not meaningful
2287*35238bceSAndroid Build Coastguard Worker             if (!isStencilFormat(createFormat))
2288*35238bceSAndroid Build Coastguard Worker                 return false;
2289*35238bceSAndroid Build Coastguard Worker         }
2290*35238bceSAndroid Build Coastguard Worker 
2291*35238bceSAndroid Build Coastguard Worker         return true;
2292*35238bceSAndroid Build Coastguard Worker     }
2293*35238bceSAndroid Build Coastguard Worker     else
2294*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
2295*35238bceSAndroid Build Coastguard Worker 
2296*35238bceSAndroid Build Coastguard Worker     return false;
2297*35238bceSAndroid Build Coastguard Worker }
2298*35238bceSAndroid Build Coastguard Worker 
2299*35238bceSAndroid Build Coastguard Worker class MultiContextRenderTests : public RenderTests
2300*35238bceSAndroid Build Coastguard Worker {
2301*35238bceSAndroid Build Coastguard Worker public:
2302*35238bceSAndroid Build Coastguard Worker     MultiContextRenderTests(EglTestContext &eglTestCtx, const string &name, const string &desc);
2303*35238bceSAndroid Build Coastguard Worker     void init(void);
2304*35238bceSAndroid Build Coastguard Worker     void addClearActions(void);
2305*35238bceSAndroid Build Coastguard Worker 
2306*35238bceSAndroid Build Coastguard Worker private:
2307*35238bceSAndroid Build Coastguard Worker     LabeledActions m_clearActions;
2308*35238bceSAndroid Build Coastguard Worker };
2309*35238bceSAndroid Build Coastguard Worker 
MultiContextRenderTests(EglTestContext & eglTestCtx,const string & name,const string & desc)2310*35238bceSAndroid Build Coastguard Worker MultiContextRenderTests::MultiContextRenderTests(EglTestContext &eglTestCtx, const string &name, const string &desc)
2311*35238bceSAndroid Build Coastguard Worker     : RenderTests(eglTestCtx, name, desc)
2312*35238bceSAndroid Build Coastguard Worker {
2313*35238bceSAndroid Build Coastguard Worker }
2314*35238bceSAndroid Build Coastguard Worker 
addClearActions(void)2315*35238bceSAndroid Build Coastguard Worker void MultiContextRenderTests::addClearActions(void)
2316*35238bceSAndroid Build Coastguard Worker {
2317*35238bceSAndroid Build Coastguard Worker     m_clearActions.add("clear_color", MovePtr<Action>(new GLESImageApi::ModifyRenderbufferClearColor(
2318*35238bceSAndroid Build Coastguard Worker                                           tcu::Vec4(0.8f, 0.2f, 0.9f, 1.0f))));
2319*35238bceSAndroid Build Coastguard Worker     m_clearActions.add("clear_depth", MovePtr<Action>(new GLESImageApi::ModifyRenderbufferClearDepth(0.75f)));
2320*35238bceSAndroid Build Coastguard Worker     m_clearActions.add("clear_stencil", MovePtr<Action>(new GLESImageApi::ModifyRenderbufferClearStencil(97)));
2321*35238bceSAndroid Build Coastguard Worker }
2322*35238bceSAndroid Build Coastguard Worker 
init(void)2323*35238bceSAndroid Build Coastguard Worker void MultiContextRenderTests::init(void)
2324*35238bceSAndroid Build Coastguard Worker {
2325*35238bceSAndroid Build Coastguard Worker     addCreateTexture2DActions("texture_");
2326*35238bceSAndroid Build Coastguard Worker     addCreateTextureCubemapActions("_rgba8", GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE);
2327*35238bceSAndroid Build Coastguard Worker     addCreateTextureCubemapActions("_rgb8", GL_RGB, GL_RGB, GL_UNSIGNED_BYTE);
2328*35238bceSAndroid Build Coastguard Worker     addCreateRenderbufferActions();
2329*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNativeActions();
2330*35238bceSAndroid Build Coastguard Worker     addRenderActions();
2331*35238bceSAndroid Build Coastguard Worker     addClearActions();
2332*35238bceSAndroid Build Coastguard Worker 
2333*35238bceSAndroid Build Coastguard Worker     for (int createNdx = 0; createNdx < m_createActions.size(); createNdx++)
2334*35238bceSAndroid Build Coastguard Worker         for (int renderNdx = 0; renderNdx < m_renderActions.size(); renderNdx++)
2335*35238bceSAndroid Build Coastguard Worker             for (int clearNdx = 0; clearNdx < m_clearActions.size(); clearNdx++)
2336*35238bceSAndroid Build Coastguard Worker             {
2337*35238bceSAndroid Build Coastguard Worker                 const LabeledAction &createAction = m_createActions[createNdx];
2338*35238bceSAndroid Build Coastguard Worker                 const LabeledAction &renderAction = m_renderActions[renderNdx];
2339*35238bceSAndroid Build Coastguard Worker                 const LabeledAction &clearAction  = m_clearActions[clearNdx];
2340*35238bceSAndroid Build Coastguard Worker                 TestSpec spec;
2341*35238bceSAndroid Build Coastguard Worker 
2342*35238bceSAndroid Build Coastguard Worker                 if (!isCompatibleCreateAndRenderActions(*createAction.action, *renderAction.action))
2343*35238bceSAndroid Build Coastguard Worker                     continue;
2344*35238bceSAndroid Build Coastguard Worker                 if (!isCompatibleCreateAndModifyActions(*createAction.action, *clearAction.action))
2345*35238bceSAndroid Build Coastguard Worker                     continue;
2346*35238bceSAndroid Build Coastguard Worker 
2347*35238bceSAndroid Build Coastguard Worker                 spec.name = std::string("gles2_") + createAction.label + "_" + renderAction.label;
2348*35238bceSAndroid Build Coastguard Worker 
2349*35238bceSAndroid Build Coastguard Worker                 const GLESImageApi::Create *glesCreate =
2350*35238bceSAndroid Build Coastguard Worker                     dynamic_cast<const GLESImageApi::Create *>(createAction.action.get());
2351*35238bceSAndroid Build Coastguard Worker 
2352*35238bceSAndroid Build Coastguard Worker                 if (!glesCreate)
2353*35238bceSAndroid Build Coastguard Worker                     DE_FATAL("Dynamic casting to GLESImageApi::Create* failed");
2354*35238bceSAndroid Build Coastguard Worker 
2355*35238bceSAndroid Build Coastguard Worker                 const GLenum createFormat = glesCreate->getEffectiveFormat();
2356*35238bceSAndroid Build Coastguard Worker 
2357*35238bceSAndroid Build Coastguard Worker                 if (isDepthFormat(createFormat) && isStencilFormat(createFormat))
2358*35238bceSAndroid Build Coastguard Worker                 {
2359*35238bceSAndroid Build Coastguard Worker                     // Combined depth and stencil format. Add the clear action label to avoid test
2360*35238bceSAndroid Build Coastguard Worker                     // name clashes.
2361*35238bceSAndroid Build Coastguard Worker                     spec.name += std::string("_") + clearAction.label;
2362*35238bceSAndroid Build Coastguard Worker                 }
2363*35238bceSAndroid Build Coastguard Worker 
2364*35238bceSAndroid Build Coastguard Worker                 spec.desc = spec.name;
2365*35238bceSAndroid Build Coastguard Worker 
2366*35238bceSAndroid Build Coastguard Worker                 spec.contexts.push_back(TestSpec::API_GLES2);
2367*35238bceSAndroid Build Coastguard Worker                 spec.contexts.push_back(TestSpec::API_GLES2);
2368*35238bceSAndroid Build Coastguard Worker 
2369*35238bceSAndroid Build Coastguard Worker                 spec.operations.push_back(TestSpec::Operation(0, *createAction.action));
2370*35238bceSAndroid Build Coastguard Worker                 spec.operations.push_back(TestSpec::Operation(0, *renderAction.action));
2371*35238bceSAndroid Build Coastguard Worker                 spec.operations.push_back(TestSpec::Operation(0, *clearAction.action));
2372*35238bceSAndroid Build Coastguard Worker                 spec.operations.push_back(TestSpec::Operation(1, *createAction.action));
2373*35238bceSAndroid Build Coastguard Worker                 spec.operations.push_back(TestSpec::Operation(0, *renderAction.action));
2374*35238bceSAndroid Build Coastguard Worker                 spec.operations.push_back(TestSpec::Operation(1, *renderAction.action));
2375*35238bceSAndroid Build Coastguard Worker 
2376*35238bceSAndroid Build Coastguard Worker                 addChild(new ImageFormatCase(m_eglTestCtx, spec));
2377*35238bceSAndroid Build Coastguard Worker             }
2378*35238bceSAndroid Build Coastguard Worker }
2379*35238bceSAndroid Build Coastguard Worker 
createMultiContextRenderTests(EglTestContext & eglTestCtx,const string & name,const string & desc)2380*35238bceSAndroid Build Coastguard Worker TestCaseGroup *createMultiContextRenderTests(EglTestContext &eglTestCtx, const string &name, const string &desc)
2381*35238bceSAndroid Build Coastguard Worker {
2382*35238bceSAndroid Build Coastguard Worker     return new MultiContextRenderTests(eglTestCtx, name, desc);
2383*35238bceSAndroid Build Coastguard Worker }
2384*35238bceSAndroid Build Coastguard Worker 
2385*35238bceSAndroid Build Coastguard Worker class ModifyTests : public ImageTests
2386*35238bceSAndroid Build Coastguard Worker {
2387*35238bceSAndroid Build Coastguard Worker public:
ModifyTests(EglTestContext & eglTestCtx,const string & name,const string & desc)2388*35238bceSAndroid Build Coastguard Worker     ModifyTests(EglTestContext &eglTestCtx, const string &name, const string &desc) : ImageTests(eglTestCtx, name, desc)
2389*35238bceSAndroid Build Coastguard Worker     {
2390*35238bceSAndroid Build Coastguard Worker     }
2391*35238bceSAndroid Build Coastguard Worker 
2392*35238bceSAndroid Build Coastguard Worker     void init(void);
2393*35238bceSAndroid Build Coastguard Worker 
2394*35238bceSAndroid Build Coastguard Worker protected:
2395*35238bceSAndroid Build Coastguard Worker     void addModifyActions(void);
2396*35238bceSAndroid Build Coastguard Worker 
2397*35238bceSAndroid Build Coastguard Worker     LabeledActions m_modifyActions;
2398*35238bceSAndroid Build Coastguard Worker     GLESImageApi::RenderTryAll m_renderAction;
2399*35238bceSAndroid Build Coastguard Worker };
2400*35238bceSAndroid Build Coastguard Worker 
addModifyActions(void)2401*35238bceSAndroid Build Coastguard Worker void ModifyTests::addModifyActions(void)
2402*35238bceSAndroid Build Coastguard Worker {
2403*35238bceSAndroid Build Coastguard Worker     m_modifyActions.add("tex_subimage_rgb8",
2404*35238bceSAndroid Build Coastguard Worker                         MovePtr<Action>(new GLESImageApi::ModifyTexSubImage(GL_RGB, GL_UNSIGNED_BYTE)));
2405*35238bceSAndroid Build Coastguard Worker     m_modifyActions.add("tex_subimage_rgb565",
2406*35238bceSAndroid Build Coastguard Worker                         MovePtr<Action>(new GLESImageApi::ModifyTexSubImage(GL_RGB, GL_UNSIGNED_SHORT_5_6_5)));
2407*35238bceSAndroid Build Coastguard Worker     m_modifyActions.add("tex_subimage_rgba8",
2408*35238bceSAndroid Build Coastguard Worker                         MovePtr<Action>(new GLESImageApi::ModifyTexSubImage(GL_RGBA, GL_UNSIGNED_BYTE)));
2409*35238bceSAndroid Build Coastguard Worker     m_modifyActions.add("tex_subimage_rgb5_a1",
2410*35238bceSAndroid Build Coastguard Worker                         MovePtr<Action>(new GLESImageApi::ModifyTexSubImage(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1)));
2411*35238bceSAndroid Build Coastguard Worker     m_modifyActions.add("tex_subimage_rgba4",
2412*35238bceSAndroid Build Coastguard Worker                         MovePtr<Action>(new GLESImageApi::ModifyTexSubImage(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4)));
2413*35238bceSAndroid Build Coastguard Worker 
2414*35238bceSAndroid Build Coastguard Worker     m_modifyActions.add("renderbuffer_clear_color", MovePtr<Action>(new GLESImageApi::ModifyRenderbufferClearColor(
2415*35238bceSAndroid Build Coastguard Worker                                                         tcu::Vec4(0.4f, 0.5f, 0.6f, 1.0f))));
2416*35238bceSAndroid Build Coastguard Worker     m_modifyActions.add("renderbuffer_clear_depth",
2417*35238bceSAndroid Build Coastguard Worker                         MovePtr<Action>(new GLESImageApi::ModifyRenderbufferClearDepth(0.7f)));
2418*35238bceSAndroid Build Coastguard Worker     m_modifyActions.add("renderbuffer_clear_stencil",
2419*35238bceSAndroid Build Coastguard Worker                         MovePtr<Action>(new GLESImageApi::ModifyRenderbufferClearStencil(78)));
2420*35238bceSAndroid Build Coastguard Worker }
2421*35238bceSAndroid Build Coastguard Worker 
init(void)2422*35238bceSAndroid Build Coastguard Worker void ModifyTests::init(void)
2423*35238bceSAndroid Build Coastguard Worker {
2424*35238bceSAndroid Build Coastguard Worker     addCreateTexture2DActions("tex_");
2425*35238bceSAndroid Build Coastguard Worker     addCreateRenderbufferActions();
2426*35238bceSAndroid Build Coastguard Worker     addCreateAndroidNativeActions();
2427*35238bceSAndroid Build Coastguard Worker     addModifyActions();
2428*35238bceSAndroid Build Coastguard Worker 
2429*35238bceSAndroid Build Coastguard Worker     for (int createNdx = 0; createNdx < m_createActions.size(); createNdx++)
2430*35238bceSAndroid Build Coastguard Worker     {
2431*35238bceSAndroid Build Coastguard Worker         LabeledAction &createAction = m_createActions[createNdx];
2432*35238bceSAndroid Build Coastguard Worker 
2433*35238bceSAndroid Build Coastguard Worker         for (int modifyNdx = 0; modifyNdx < m_modifyActions.size(); modifyNdx++)
2434*35238bceSAndroid Build Coastguard Worker         {
2435*35238bceSAndroid Build Coastguard Worker             LabeledAction &modifyAction = m_modifyActions[modifyNdx];
2436*35238bceSAndroid Build Coastguard Worker 
2437*35238bceSAndroid Build Coastguard Worker             if (!isCompatibleCreateAndModifyActions(*createAction.action, *modifyAction.action))
2438*35238bceSAndroid Build Coastguard Worker                 continue;
2439*35238bceSAndroid Build Coastguard Worker 
2440*35238bceSAndroid Build Coastguard Worker             TestSpec spec;
2441*35238bceSAndroid Build Coastguard Worker             spec.name = createAction.label + "_" + modifyAction.label;
2442*35238bceSAndroid Build Coastguard Worker             spec.desc = "gles2_tex_sub_image";
2443*35238bceSAndroid Build Coastguard Worker 
2444*35238bceSAndroid Build Coastguard Worker             spec.contexts.push_back(TestSpec::API_GLES2);
2445*35238bceSAndroid Build Coastguard Worker 
2446*35238bceSAndroid Build Coastguard Worker             spec.operations.push_back(TestSpec::Operation(0, *createAction.action));
2447*35238bceSAndroid Build Coastguard Worker             spec.operations.push_back(TestSpec::Operation(0, m_renderAction));
2448*35238bceSAndroid Build Coastguard Worker             spec.operations.push_back(TestSpec::Operation(0, *modifyAction.action));
2449*35238bceSAndroid Build Coastguard Worker             spec.operations.push_back(TestSpec::Operation(0, m_renderAction));
2450*35238bceSAndroid Build Coastguard Worker 
2451*35238bceSAndroid Build Coastguard Worker             addChild(new ImageFormatCase(m_eglTestCtx, spec));
2452*35238bceSAndroid Build Coastguard Worker         }
2453*35238bceSAndroid Build Coastguard Worker     }
2454*35238bceSAndroid Build Coastguard Worker }
2455*35238bceSAndroid Build Coastguard Worker 
createModifyTests(EglTestContext & eglTestCtx,const string & name,const string & desc)2456*35238bceSAndroid Build Coastguard Worker TestCaseGroup *createModifyTests(EglTestContext &eglTestCtx, const string &name, const string &desc)
2457*35238bceSAndroid Build Coastguard Worker {
2458*35238bceSAndroid Build Coastguard Worker     return new ModifyTests(eglTestCtx, name, desc);
2459*35238bceSAndroid Build Coastguard Worker }
2460*35238bceSAndroid Build Coastguard Worker 
2461*35238bceSAndroid Build Coastguard Worker } // namespace Image
2462*35238bceSAndroid Build Coastguard Worker } // namespace egl
2463*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2464