xref: /aosp_15_r20/external/deqp/modules/egl/teglRobustnessTests.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 2017 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 Robustness tests for KHR_robustness.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "teglRobustnessTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "egluConfigFilter.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "egluStrUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "egluUtil.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "eglwLibrary.hpp"
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "gluDrawUtil.hpp"
37*35238bceSAndroid Build Coastguard Worker 
38*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker #include "deSTLUtil.hpp"
42*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
43*35238bceSAndroid Build Coastguard Worker #include "deThread.hpp"
44*35238bceSAndroid Build Coastguard Worker #include "deSharedPtr.hpp"
45*35238bceSAndroid Build Coastguard Worker 
46*35238bceSAndroid Build Coastguard Worker #include <set>
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker using std::set;
49*35238bceSAndroid Build Coastguard Worker using std::string;
50*35238bceSAndroid Build Coastguard Worker using std::vector;
51*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
52*35238bceSAndroid Build Coastguard Worker 
53*35238bceSAndroid Build Coastguard Worker using namespace eglw;
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(GL_RESET_NOTIFICATION_STRATEGY == 0x8256);
56*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(GL_LOSE_CONTEXT_ON_RESET == 0x8252);
57*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(GL_NO_RESET_NOTIFICATION == 0x8261);
58*35238bceSAndroid Build Coastguard Worker 
59*35238bceSAndroid Build Coastguard Worker namespace deqp
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker namespace egl
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker namespace
64*35238bceSAndroid Build Coastguard Worker {
65*35238bceSAndroid Build Coastguard Worker 
66*35238bceSAndroid Build Coastguard Worker enum ContextResetType
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker     CONTEXTRESETTYPE_SHADER_OOB,
69*35238bceSAndroid Build Coastguard Worker     CONTEXTRESETTYPE_FIXED_FUNC_OOB,
70*35238bceSAndroid Build Coastguard Worker };
71*35238bceSAndroid Build Coastguard Worker 
72*35238bceSAndroid Build Coastguard Worker enum ShaderType
73*35238bceSAndroid Build Coastguard Worker {
74*35238bceSAndroid Build Coastguard Worker     SHADERTYPE_VERT,
75*35238bceSAndroid Build Coastguard Worker     SHADERTYPE_FRAG,
76*35238bceSAndroid Build Coastguard Worker     SHADERTYPE_COMPUTE,
77*35238bceSAndroid Build Coastguard Worker     SHADERTYPE_VERT_AND_FRAG,
78*35238bceSAndroid Build Coastguard Worker };
79*35238bceSAndroid Build Coastguard Worker 
80*35238bceSAndroid Build Coastguard Worker enum ReadWriteType
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker     READWRITETYPE_READ,
83*35238bceSAndroid Build Coastguard Worker     READWRITETYPE_WRITE,
84*35238bceSAndroid Build Coastguard Worker };
85*35238bceSAndroid Build Coastguard Worker 
86*35238bceSAndroid Build Coastguard Worker enum ResourceType
87*35238bceSAndroid Build Coastguard Worker {
88*35238bceSAndroid Build Coastguard Worker     RESOURCETYPE_UBO,
89*35238bceSAndroid Build Coastguard Worker     RESOURCETYPE_SSBO,
90*35238bceSAndroid Build Coastguard Worker     RESOURCETYPE_LOCAL_ARRAY,
91*35238bceSAndroid Build Coastguard Worker };
92*35238bceSAndroid Build Coastguard Worker 
93*35238bceSAndroid Build Coastguard Worker enum FixedFunctionType
94*35238bceSAndroid Build Coastguard Worker {
95*35238bceSAndroid Build Coastguard Worker     FIXEDFUNCTIONTYPE_INDICES,
96*35238bceSAndroid Build Coastguard Worker     FIXEDFUNCTIONTYPE_VERTICES,
97*35238bceSAndroid Build Coastguard Worker };
98*35238bceSAndroid Build Coastguard Worker 
99*35238bceSAndroid Build Coastguard Worker enum RobustAccessType
100*35238bceSAndroid Build Coastguard Worker {
101*35238bceSAndroid Build Coastguard Worker     ROBUSTACCESS_TRUE,
102*35238bceSAndroid Build Coastguard Worker     ROBUSTACCESS_FALSE,
103*35238bceSAndroid Build Coastguard Worker };
104*35238bceSAndroid Build Coastguard Worker 
requireEGLExtension(const Library & egl,EGLDisplay eglDisplay,const char * requiredExtension)105*35238bceSAndroid Build Coastguard Worker void requireEGLExtension(const Library &egl, EGLDisplay eglDisplay, const char *requiredExtension)
106*35238bceSAndroid Build Coastguard Worker {
107*35238bceSAndroid Build Coastguard Worker     if (!eglu::hasExtension(egl, eglDisplay, requiredExtension))
108*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, (string(requiredExtension) + " not supported").c_str());
109*35238bceSAndroid Build Coastguard Worker }
110*35238bceSAndroid Build Coastguard Worker 
isWindow(const eglu::CandidateConfig & c)111*35238bceSAndroid Build Coastguard Worker bool isWindow(const eglu::CandidateConfig &c)
112*35238bceSAndroid Build Coastguard Worker {
113*35238bceSAndroid Build Coastguard Worker     return (c.surfaceType() & EGL_WINDOW_BIT) == EGL_WINDOW_BIT;
114*35238bceSAndroid Build Coastguard Worker }
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker template <uint32_t Type>
renderable(const eglu::CandidateConfig & c)117*35238bceSAndroid Build Coastguard Worker bool renderable(const eglu::CandidateConfig &c)
118*35238bceSAndroid Build Coastguard Worker {
119*35238bceSAndroid Build Coastguard Worker     return (c.renderableType() & Type) == Type;
120*35238bceSAndroid Build Coastguard Worker }
121*35238bceSAndroid Build Coastguard Worker 
getRenderableFilter(uint32_t bits)122*35238bceSAndroid Build Coastguard Worker eglu::ConfigFilter getRenderableFilter(uint32_t bits)
123*35238bceSAndroid Build Coastguard Worker {
124*35238bceSAndroid Build Coastguard Worker     switch (bits)
125*35238bceSAndroid Build Coastguard Worker     {
126*35238bceSAndroid Build Coastguard Worker     case EGL_OPENGL_ES2_BIT:
127*35238bceSAndroid Build Coastguard Worker         return renderable<EGL_OPENGL_ES2_BIT>;
128*35238bceSAndroid Build Coastguard Worker     case EGL_OPENGL_ES3_BIT:
129*35238bceSAndroid Build Coastguard Worker         return renderable<EGL_OPENGL_ES3_BIT>;
130*35238bceSAndroid Build Coastguard Worker     case EGL_OPENGL_BIT:
131*35238bceSAndroid Build Coastguard Worker         return renderable<EGL_OPENGL_BIT>;
132*35238bceSAndroid Build Coastguard Worker     default:
133*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unknown EGL bitfied value");
134*35238bceSAndroid Build Coastguard Worker         return renderable<0>;
135*35238bceSAndroid Build Coastguard Worker     }
136*35238bceSAndroid Build Coastguard Worker }
137*35238bceSAndroid Build Coastguard Worker 
eglResetNotificationStrategyToString(EGLint strategy)138*35238bceSAndroid Build Coastguard Worker const char *eglResetNotificationStrategyToString(EGLint strategy)
139*35238bceSAndroid Build Coastguard Worker {
140*35238bceSAndroid Build Coastguard Worker     switch (strategy)
141*35238bceSAndroid Build Coastguard Worker     {
142*35238bceSAndroid Build Coastguard Worker     case EGL_NO_RESET_NOTIFICATION_KHR:
143*35238bceSAndroid Build Coastguard Worker         return "EGL_NO_RESET_NOTIFICATION_KHR";
144*35238bceSAndroid Build Coastguard Worker     case EGL_LOSE_CONTEXT_ON_RESET_KHR:
145*35238bceSAndroid Build Coastguard Worker         return "EGL_LOSE_CONTEXT_ON_RESET_KHR";
146*35238bceSAndroid Build Coastguard Worker     default:
147*35238bceSAndroid Build Coastguard Worker         return "<Unknown>";
148*35238bceSAndroid Build Coastguard Worker     }
149*35238bceSAndroid Build Coastguard Worker }
150*35238bceSAndroid Build Coastguard Worker 
logAttribList(const EglTestContext & eglTestCtx,const EGLint * attribList)151*35238bceSAndroid Build Coastguard Worker void logAttribList(const EglTestContext &eglTestCtx, const EGLint *attribList)
152*35238bceSAndroid Build Coastguard Worker {
153*35238bceSAndroid Build Coastguard Worker     const EGLint *iter = &(attribList[0]);
154*35238bceSAndroid Build Coastguard Worker     std::ostringstream attribListString;
155*35238bceSAndroid Build Coastguard Worker 
156*35238bceSAndroid Build Coastguard Worker     while ((*iter) != EGL_NONE)
157*35238bceSAndroid Build Coastguard Worker     {
158*35238bceSAndroid Build Coastguard Worker         switch (*iter)
159*35238bceSAndroid Build Coastguard Worker         {
160*35238bceSAndroid Build Coastguard Worker             //    case EGL_CONTEXT_CLIENT_VERSION:
161*35238bceSAndroid Build Coastguard Worker         case EGL_CONTEXT_MAJOR_VERSION_KHR:
162*35238bceSAndroid Build Coastguard Worker             iter++;
163*35238bceSAndroid Build Coastguard Worker             attribListString << "EGL_CONTEXT_CLIENT_VERSION, " << (*iter) << ", ";
164*35238bceSAndroid Build Coastguard Worker             iter++;
165*35238bceSAndroid Build Coastguard Worker             break;
166*35238bceSAndroid Build Coastguard Worker 
167*35238bceSAndroid Build Coastguard Worker         case EGL_CONTEXT_MINOR_VERSION_KHR:
168*35238bceSAndroid Build Coastguard Worker             iter++;
169*35238bceSAndroid Build Coastguard Worker             attribListString << "EGL_CONTEXT_MINOR_VERSION_KHR, " << (*iter) << ", ";
170*35238bceSAndroid Build Coastguard Worker             iter++;
171*35238bceSAndroid Build Coastguard Worker             break;
172*35238bceSAndroid Build Coastguard Worker 
173*35238bceSAndroid Build Coastguard Worker         case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
174*35238bceSAndroid Build Coastguard Worker             iter++;
175*35238bceSAndroid Build Coastguard Worker             attribListString << "EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, "
176*35238bceSAndroid Build Coastguard Worker                              << eglResetNotificationStrategyToString(*iter) << ", ";
177*35238bceSAndroid Build Coastguard Worker             iter++;
178*35238bceSAndroid Build Coastguard Worker             break;
179*35238bceSAndroid Build Coastguard Worker 
180*35238bceSAndroid Build Coastguard Worker         case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
181*35238bceSAndroid Build Coastguard Worker             iter++;
182*35238bceSAndroid Build Coastguard Worker             attribListString << "EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR, "
183*35238bceSAndroid Build Coastguard Worker                              << eglResetNotificationStrategyToString(*iter) << ", ";
184*35238bceSAndroid Build Coastguard Worker             iter++;
185*35238bceSAndroid Build Coastguard Worker             break;
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker         case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
188*35238bceSAndroid Build Coastguard Worker             iter++;
189*35238bceSAndroid Build Coastguard Worker             attribListString << "EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, ";
190*35238bceSAndroid Build Coastguard Worker 
191*35238bceSAndroid Build Coastguard Worker             if (*iter == EGL_FALSE || *iter == EGL_TRUE)
192*35238bceSAndroid Build Coastguard Worker                 attribListString << (*iter ? "EGL_TRUE" : "EGL_FALSE") << ", ";
193*35238bceSAndroid Build Coastguard Worker             else
194*35238bceSAndroid Build Coastguard Worker                 attribListString << (*iter) << ", ";
195*35238bceSAndroid Build Coastguard Worker             iter++;
196*35238bceSAndroid Build Coastguard Worker             break;
197*35238bceSAndroid Build Coastguard Worker 
198*35238bceSAndroid Build Coastguard Worker         default:
199*35238bceSAndroid Build Coastguard Worker             DE_FATAL("Unsupported attribute");
200*35238bceSAndroid Build Coastguard Worker         }
201*35238bceSAndroid Build Coastguard Worker     }
202*35238bceSAndroid Build Coastguard Worker 
203*35238bceSAndroid Build Coastguard Worker     attribListString << "EGL_NONE";
204*35238bceSAndroid Build Coastguard Worker     eglTestCtx.getTestContext().getLog() << TestLog::Message << "EGL attrib list: { " << attribListString.str()
205*35238bceSAndroid Build Coastguard Worker                                          << " }\n\n"
206*35238bceSAndroid Build Coastguard Worker                                          << TestLog::EndMessage;
207*35238bceSAndroid Build Coastguard Worker }
208*35238bceSAndroid Build Coastguard Worker 
209*35238bceSAndroid Build Coastguard Worker class RobustnessTestCase : public TestCase
210*35238bceSAndroid Build Coastguard Worker {
211*35238bceSAndroid Build Coastguard Worker public:
212*35238bceSAndroid Build Coastguard Worker     class Params
213*35238bceSAndroid Build Coastguard Worker     {
214*35238bceSAndroid Build Coastguard Worker     public:
Params(void)215*35238bceSAndroid Build Coastguard Worker         Params(void)
216*35238bceSAndroid Build Coastguard Worker         {
217*35238bceSAndroid Build Coastguard Worker         }
218*35238bceSAndroid Build Coastguard Worker 
219*35238bceSAndroid Build Coastguard Worker         Params(const string &name, const string &description, const RobustAccessType &robustAccessType,
220*35238bceSAndroid Build Coastguard Worker                const ContextResetType &contextResetType, const FixedFunctionType &fixedFunctionType);
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker         Params(const string &name, const string &description, const RobustAccessType &robustAccessType,
223*35238bceSAndroid Build Coastguard Worker                const ContextResetType &contextResetType, const ShaderType &shaderType, const ResourceType &resourceType,
224*35238bceSAndroid Build Coastguard Worker                const ReadWriteType &readWriteType);
225*35238bceSAndroid Build Coastguard Worker 
getName(void) const226*35238bceSAndroid Build Coastguard Worker         const string &getName(void) const
227*35238bceSAndroid Build Coastguard Worker         {
228*35238bceSAndroid Build Coastguard Worker             return m_name;
229*35238bceSAndroid Build Coastguard Worker         }
getDescription(void) const230*35238bceSAndroid Build Coastguard Worker         const string &getDescription(void) const
231*35238bceSAndroid Build Coastguard Worker         {
232*35238bceSAndroid Build Coastguard Worker             return m_description;
233*35238bceSAndroid Build Coastguard Worker         }
getContextResetType(void) const234*35238bceSAndroid Build Coastguard Worker         const ContextResetType &getContextResetType(void) const
235*35238bceSAndroid Build Coastguard Worker         {
236*35238bceSAndroid Build Coastguard Worker             return m_contextResetType;
237*35238bceSAndroid Build Coastguard Worker         }
getShaderType(void) const238*35238bceSAndroid Build Coastguard Worker         const ShaderType &getShaderType(void) const
239*35238bceSAndroid Build Coastguard Worker         {
240*35238bceSAndroid Build Coastguard Worker             return m_shaderType;
241*35238bceSAndroid Build Coastguard Worker         }
getResourceType(void) const242*35238bceSAndroid Build Coastguard Worker         const ResourceType &getResourceType(void) const
243*35238bceSAndroid Build Coastguard Worker         {
244*35238bceSAndroid Build Coastguard Worker             return m_resourceType;
245*35238bceSAndroid Build Coastguard Worker         }
getReadWriteType(void) const246*35238bceSAndroid Build Coastguard Worker         const ReadWriteType &getReadWriteType(void) const
247*35238bceSAndroid Build Coastguard Worker         {
248*35238bceSAndroid Build Coastguard Worker             return m_readWriteType;
249*35238bceSAndroid Build Coastguard Worker         }
getFixedFunctionType(void) const250*35238bceSAndroid Build Coastguard Worker         const FixedFunctionType &getFixedFunctionType(void) const
251*35238bceSAndroid Build Coastguard Worker         {
252*35238bceSAndroid Build Coastguard Worker             return m_fixedFunctionType;
253*35238bceSAndroid Build Coastguard Worker         }
getRobustAccessType(void) const254*35238bceSAndroid Build Coastguard Worker         const RobustAccessType &getRobustAccessType(void) const
255*35238bceSAndroid Build Coastguard Worker         {
256*35238bceSAndroid Build Coastguard Worker             return m_robustAccessType;
257*35238bceSAndroid Build Coastguard Worker         }
258*35238bceSAndroid Build Coastguard Worker 
259*35238bceSAndroid Build Coastguard Worker     private:
260*35238bceSAndroid Build Coastguard Worker         string m_name;
261*35238bceSAndroid Build Coastguard Worker         string m_description;
262*35238bceSAndroid Build Coastguard Worker         RobustAccessType m_robustAccessType;
263*35238bceSAndroid Build Coastguard Worker         ContextResetType m_contextResetType;
264*35238bceSAndroid Build Coastguard Worker         ShaderType m_shaderType;
265*35238bceSAndroid Build Coastguard Worker         ResourceType m_resourceType;
266*35238bceSAndroid Build Coastguard Worker         ReadWriteType m_readWriteType;
267*35238bceSAndroid Build Coastguard Worker         FixedFunctionType m_fixedFunctionType;
268*35238bceSAndroid Build Coastguard Worker     };
269*35238bceSAndroid Build Coastguard Worker 
270*35238bceSAndroid Build Coastguard Worker     RobustnessTestCase(EglTestContext &eglTestCtx, const char *name, const char *description);
271*35238bceSAndroid Build Coastguard Worker     RobustnessTestCase(EglTestContext &eglTestCtx, const char *name, const char *description, Params params);
272*35238bceSAndroid Build Coastguard Worker     ~RobustnessTestCase(void);
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker     void checkRequiredEGLExtensions(const EGLint *attribList);
275*35238bceSAndroid Build Coastguard Worker 
276*35238bceSAndroid Build Coastguard Worker protected:
277*35238bceSAndroid Build Coastguard Worker     Params m_params;
278*35238bceSAndroid Build Coastguard Worker     EGLDisplay m_eglDisplay;
279*35238bceSAndroid Build Coastguard Worker     EGLConfig m_eglConfig;
280*35238bceSAndroid Build Coastguard Worker     EGLSurface m_eglSurface;
281*35238bceSAndroid Build Coastguard Worker 
282*35238bceSAndroid Build Coastguard Worker private:
283*35238bceSAndroid Build Coastguard Worker     void init(void);
284*35238bceSAndroid Build Coastguard Worker     void deinit(void);
285*35238bceSAndroid Build Coastguard Worker     void initEGLSurface(void);
286*35238bceSAndroid Build Coastguard Worker     EGLConfig getEGLConfig(void);
287*35238bceSAndroid Build Coastguard Worker 
288*35238bceSAndroid Build Coastguard Worker     eglu::NativeWindow *m_window;
289*35238bceSAndroid Build Coastguard Worker };
290*35238bceSAndroid Build Coastguard Worker 
Params(const string & name,const string & description,const RobustAccessType & robustAccessType,const ContextResetType & contextResetType,const FixedFunctionType & fixedFunctionType)291*35238bceSAndroid Build Coastguard Worker RobustnessTestCase::Params::Params(const string &name, const string &description,
292*35238bceSAndroid Build Coastguard Worker                                    const RobustAccessType &robustAccessType, const ContextResetType &contextResetType,
293*35238bceSAndroid Build Coastguard Worker                                    const FixedFunctionType &fixedFunctionType)
294*35238bceSAndroid Build Coastguard Worker     : m_name(name)
295*35238bceSAndroid Build Coastguard Worker     , m_description(description)
296*35238bceSAndroid Build Coastguard Worker     , m_robustAccessType(robustAccessType)
297*35238bceSAndroid Build Coastguard Worker     , m_contextResetType(contextResetType)
298*35238bceSAndroid Build Coastguard Worker     , m_fixedFunctionType(fixedFunctionType)
299*35238bceSAndroid Build Coastguard Worker {
300*35238bceSAndroid Build Coastguard Worker }
301*35238bceSAndroid Build Coastguard Worker 
Params(const string & name,const string & description,const RobustAccessType & robustAccessType,const ContextResetType & contextResetType,const ShaderType & shaderType,const ResourceType & resourceType,const ReadWriteType & readWriteType)302*35238bceSAndroid Build Coastguard Worker RobustnessTestCase::Params::Params(const string &name, const string &description,
303*35238bceSAndroid Build Coastguard Worker                                    const RobustAccessType &robustAccessType, const ContextResetType &contextResetType,
304*35238bceSAndroid Build Coastguard Worker                                    const ShaderType &shaderType, const ResourceType &resourceType,
305*35238bceSAndroid Build Coastguard Worker                                    const ReadWriteType &readWriteType)
306*35238bceSAndroid Build Coastguard Worker     : m_name(name)
307*35238bceSAndroid Build Coastguard Worker     , m_description(description)
308*35238bceSAndroid Build Coastguard Worker     , m_robustAccessType(robustAccessType)
309*35238bceSAndroid Build Coastguard Worker     , m_contextResetType(contextResetType)
310*35238bceSAndroid Build Coastguard Worker     , m_shaderType(shaderType)
311*35238bceSAndroid Build Coastguard Worker     , m_resourceType(resourceType)
312*35238bceSAndroid Build Coastguard Worker     , m_readWriteType(readWriteType)
313*35238bceSAndroid Build Coastguard Worker {
314*35238bceSAndroid Build Coastguard Worker }
315*35238bceSAndroid Build Coastguard Worker 
RobustnessTestCase(EglTestContext & eglTestCtx,const char * name,const char * description)316*35238bceSAndroid Build Coastguard Worker RobustnessTestCase::RobustnessTestCase(EglTestContext &eglTestCtx, const char *name, const char *description)
317*35238bceSAndroid Build Coastguard Worker     : TestCase(eglTestCtx, name, description)
318*35238bceSAndroid Build Coastguard Worker     , m_eglDisplay(EGL_NO_DISPLAY)
319*35238bceSAndroid Build Coastguard Worker     , m_eglConfig(0)
320*35238bceSAndroid Build Coastguard Worker     , m_eglSurface(EGL_NO_SURFACE)
321*35238bceSAndroid Build Coastguard Worker     , m_window(DE_NULL)
322*35238bceSAndroid Build Coastguard Worker {
323*35238bceSAndroid Build Coastguard Worker }
324*35238bceSAndroid Build Coastguard Worker 
RobustnessTestCase(EglTestContext & eglTestCtx,const char * name,const char * description,Params params)325*35238bceSAndroid Build Coastguard Worker RobustnessTestCase::RobustnessTestCase(EglTestContext &eglTestCtx, const char *name, const char *description,
326*35238bceSAndroid Build Coastguard Worker                                        Params params)
327*35238bceSAndroid Build Coastguard Worker     : TestCase(eglTestCtx, name, description)
328*35238bceSAndroid Build Coastguard Worker     , m_params(params)
329*35238bceSAndroid Build Coastguard Worker     , m_eglDisplay(EGL_NO_DISPLAY)
330*35238bceSAndroid Build Coastguard Worker     , m_eglConfig(0)
331*35238bceSAndroid Build Coastguard Worker     , m_eglSurface(EGL_NO_SURFACE)
332*35238bceSAndroid Build Coastguard Worker     , m_window(DE_NULL)
333*35238bceSAndroid Build Coastguard Worker {
334*35238bceSAndroid Build Coastguard Worker }
335*35238bceSAndroid Build Coastguard Worker 
~RobustnessTestCase(void)336*35238bceSAndroid Build Coastguard Worker RobustnessTestCase::~RobustnessTestCase(void)
337*35238bceSAndroid Build Coastguard Worker {
338*35238bceSAndroid Build Coastguard Worker     deinit();
339*35238bceSAndroid Build Coastguard Worker }
340*35238bceSAndroid Build Coastguard Worker 
init(void)341*35238bceSAndroid Build Coastguard Worker void RobustnessTestCase::init(void)
342*35238bceSAndroid Build Coastguard Worker {
343*35238bceSAndroid Build Coastguard Worker     m_eglDisplay = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
344*35238bceSAndroid Build Coastguard Worker     m_eglConfig  = getEGLConfig();
345*35238bceSAndroid Build Coastguard Worker 
346*35238bceSAndroid Build Coastguard Worker     initEGLSurface();
347*35238bceSAndroid Build Coastguard Worker }
348*35238bceSAndroid Build Coastguard Worker 
deinit(void)349*35238bceSAndroid Build Coastguard Worker void RobustnessTestCase::deinit(void)
350*35238bceSAndroid Build Coastguard Worker {
351*35238bceSAndroid Build Coastguard Worker     const Library &egl = m_eglTestCtx.getLibrary();
352*35238bceSAndroid Build Coastguard Worker 
353*35238bceSAndroid Build Coastguard Worker     if (m_eglSurface != EGL_NO_SURFACE)
354*35238bceSAndroid Build Coastguard Worker     {
355*35238bceSAndroid Build Coastguard Worker         egl.destroySurface(m_eglDisplay, m_eglSurface);
356*35238bceSAndroid Build Coastguard Worker         m_eglSurface = EGL_NO_SURFACE;
357*35238bceSAndroid Build Coastguard Worker     }
358*35238bceSAndroid Build Coastguard Worker     if (m_eglDisplay != EGL_NO_DISPLAY)
359*35238bceSAndroid Build Coastguard Worker     {
360*35238bceSAndroid Build Coastguard Worker         egl.terminate(m_eglDisplay);
361*35238bceSAndroid Build Coastguard Worker         m_eglDisplay = EGL_NO_DISPLAY;
362*35238bceSAndroid Build Coastguard Worker     }
363*35238bceSAndroid Build Coastguard Worker 
364*35238bceSAndroid Build Coastguard Worker     delete m_window;
365*35238bceSAndroid Build Coastguard Worker     m_window = DE_NULL;
366*35238bceSAndroid Build Coastguard Worker }
367*35238bceSAndroid Build Coastguard Worker 
getEGLConfig(void)368*35238bceSAndroid Build Coastguard Worker EGLConfig RobustnessTestCase::getEGLConfig(void)
369*35238bceSAndroid Build Coastguard Worker {
370*35238bceSAndroid Build Coastguard Worker     eglu::FilterList filters;
371*35238bceSAndroid Build Coastguard Worker     filters << isWindow << getRenderableFilter(EGL_OPENGL_ES3_BIT);
372*35238bceSAndroid Build Coastguard Worker     return eglu::chooseSingleConfig(m_eglTestCtx.getLibrary(), m_eglDisplay, filters);
373*35238bceSAndroid Build Coastguard Worker }
374*35238bceSAndroid Build Coastguard Worker 
initEGLSurface(void)375*35238bceSAndroid Build Coastguard Worker void RobustnessTestCase::initEGLSurface(void)
376*35238bceSAndroid Build Coastguard Worker {
377*35238bceSAndroid Build Coastguard Worker     EGLU_CHECK_CALL(m_eglTestCtx.getLibrary(), bindAPI(EGL_OPENGL_ES_API));
378*35238bceSAndroid Build Coastguard Worker 
379*35238bceSAndroid Build Coastguard Worker     const eglu::NativeWindowFactory &factory =
380*35238bceSAndroid Build Coastguard Worker         eglu::selectNativeWindowFactory(m_eglTestCtx.getNativeDisplayFactory(), m_testCtx.getCommandLine());
381*35238bceSAndroid Build Coastguard Worker 
382*35238bceSAndroid Build Coastguard Worker     const eglu::WindowParams windowParams =
383*35238bceSAndroid Build Coastguard Worker         eglu::WindowParams(256, 256, eglu::parseWindowVisibility(m_testCtx.getCommandLine()));
384*35238bceSAndroid Build Coastguard Worker     m_window = factory.createWindow(&m_eglTestCtx.getNativeDisplay(), m_eglDisplay, m_eglConfig, DE_NULL, windowParams);
385*35238bceSAndroid Build Coastguard Worker     m_eglSurface =
386*35238bceSAndroid Build Coastguard Worker         eglu::createWindowSurface(m_eglTestCtx.getNativeDisplay(), *m_window, m_eglDisplay, m_eglConfig, DE_NULL);
387*35238bceSAndroid Build Coastguard Worker }
388*35238bceSAndroid Build Coastguard Worker 
paramsToApiType(const RobustnessTestCase::Params & params)389*35238bceSAndroid Build Coastguard Worker glu::ApiType paramsToApiType(const RobustnessTestCase::Params &params)
390*35238bceSAndroid Build Coastguard Worker {
391*35238bceSAndroid Build Coastguard Worker     EGLint minorVersion = 0;
392*35238bceSAndroid Build Coastguard Worker     if (params.getShaderType() == SHADERTYPE_COMPUTE || params.getResourceType() == RESOURCETYPE_SSBO ||
393*35238bceSAndroid Build Coastguard Worker         params.getContextResetType() == CONTEXTRESETTYPE_SHADER_OOB)
394*35238bceSAndroid Build Coastguard Worker     {
395*35238bceSAndroid Build Coastguard Worker         minorVersion = 1;
396*35238bceSAndroid Build Coastguard Worker     }
397*35238bceSAndroid Build Coastguard Worker 
398*35238bceSAndroid Build Coastguard Worker     return glu::ApiType::es(3, minorVersion);
399*35238bceSAndroid Build Coastguard Worker }
400*35238bceSAndroid Build Coastguard Worker 
checkRequiredEGLExtensions(const EGLint * attribList)401*35238bceSAndroid Build Coastguard Worker void RobustnessTestCase::checkRequiredEGLExtensions(const EGLint *attribList)
402*35238bceSAndroid Build Coastguard Worker {
403*35238bceSAndroid Build Coastguard Worker     set<string> requiredExtensions;
404*35238bceSAndroid Build Coastguard Worker     vector<string> extensions = eglu::getDisplayExtensions(m_eglTestCtx.getLibrary(), m_eglDisplay);
405*35238bceSAndroid Build Coastguard Worker 
406*35238bceSAndroid Build Coastguard Worker     {
407*35238bceSAndroid Build Coastguard Worker         const EGLint *iter = attribList;
408*35238bceSAndroid Build Coastguard Worker 
409*35238bceSAndroid Build Coastguard Worker         while ((*iter) != EGL_NONE)
410*35238bceSAndroid Build Coastguard Worker         {
411*35238bceSAndroid Build Coastguard Worker             switch (*iter)
412*35238bceSAndroid Build Coastguard Worker             {
413*35238bceSAndroid Build Coastguard Worker             case EGL_CONTEXT_MAJOR_VERSION_KHR:
414*35238bceSAndroid Build Coastguard Worker                 iter++;
415*35238bceSAndroid Build Coastguard Worker                 iter++;
416*35238bceSAndroid Build Coastguard Worker                 break;
417*35238bceSAndroid Build Coastguard Worker 
418*35238bceSAndroid Build Coastguard Worker             case EGL_CONTEXT_MINOR_VERSION_KHR:
419*35238bceSAndroid Build Coastguard Worker                 iter++;
420*35238bceSAndroid Build Coastguard Worker                 requiredExtensions.insert("EGL_KHR_create_context");
421*35238bceSAndroid Build Coastguard Worker                 iter++;
422*35238bceSAndroid Build Coastguard Worker                 break;
423*35238bceSAndroid Build Coastguard Worker 
424*35238bceSAndroid Build Coastguard Worker             case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
425*35238bceSAndroid Build Coastguard Worker             case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
426*35238bceSAndroid Build Coastguard Worker                 iter++;
427*35238bceSAndroid Build Coastguard Worker                 requiredExtensions.insert("EGL_EXT_create_context_robustness");
428*35238bceSAndroid Build Coastguard Worker                 iter++;
429*35238bceSAndroid Build Coastguard Worker                 break;
430*35238bceSAndroid Build Coastguard Worker 
431*35238bceSAndroid Build Coastguard Worker             default:
432*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
433*35238bceSAndroid Build Coastguard Worker             }
434*35238bceSAndroid Build Coastguard Worker         }
435*35238bceSAndroid Build Coastguard Worker     }
436*35238bceSAndroid Build Coastguard Worker 
437*35238bceSAndroid Build Coastguard Worker     for (std::set<string>::const_iterator reqExt = requiredExtensions.begin(); reqExt != requiredExtensions.end();
438*35238bceSAndroid Build Coastguard Worker          ++reqExt)
439*35238bceSAndroid Build Coastguard Worker     {
440*35238bceSAndroid Build Coastguard Worker         if (!de::contains(extensions.begin(), extensions.end(), *reqExt))
441*35238bceSAndroid Build Coastguard Worker         {
442*35238bceSAndroid Build Coastguard Worker             const char *const extension = reqExt->c_str();
443*35238bceSAndroid Build Coastguard Worker             requireEGLExtension(m_eglTestCtx.getLibrary(), m_eglDisplay, extension);
444*35238bceSAndroid Build Coastguard Worker         }
445*35238bceSAndroid Build Coastguard Worker     }
446*35238bceSAndroid Build Coastguard Worker }
447*35238bceSAndroid Build Coastguard Worker 
checkRequiredGLSupport(const glw::Functions & gl,glu::ApiType requiredApi)448*35238bceSAndroid Build Coastguard Worker void checkRequiredGLSupport(const glw::Functions &gl, glu::ApiType requiredApi)
449*35238bceSAndroid Build Coastguard Worker {
450*35238bceSAndroid Build Coastguard Worker     if (!glu::hasExtension(gl, requiredApi, "GL_KHR_robustness") &&
451*35238bceSAndroid Build Coastguard Worker         !glu::hasExtension(gl, requiredApi, "GL_EXT_robustness"))
452*35238bceSAndroid Build Coastguard Worker     {
453*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, (string("GL_KHR_robustness and GL_EXT_robustness") + " not supported").c_str());
454*35238bceSAndroid Build Coastguard Worker     }
455*35238bceSAndroid Build Coastguard Worker     else
456*35238bceSAndroid Build Coastguard Worker     {
457*35238bceSAndroid Build Coastguard Worker         int realMinorVersion = 0;
458*35238bceSAndroid Build Coastguard Worker         gl.getIntegerv(GL_MINOR_VERSION, &realMinorVersion);
459*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "Get minor version failed");
460*35238bceSAndroid Build Coastguard Worker 
461*35238bceSAndroid Build Coastguard Worker         if (realMinorVersion < requiredApi.getMinorVersion())
462*35238bceSAndroid Build Coastguard Worker             TCU_THROW(NotSupportedError, "Test case requires GLES 3.1");
463*35238bceSAndroid Build Coastguard Worker     }
464*35238bceSAndroid Build Coastguard Worker }
465*35238bceSAndroid Build Coastguard Worker 
checkGLSupportForParams(const glw::Functions & gl,const RobustnessTestCase::Params & params)466*35238bceSAndroid Build Coastguard Worker void checkGLSupportForParams(const glw::Functions &gl, const RobustnessTestCase::Params &params)
467*35238bceSAndroid Build Coastguard Worker {
468*35238bceSAndroid Build Coastguard Worker     int minorVersion = 0;
469*35238bceSAndroid Build Coastguard Worker     if (params.getShaderType() == SHADERTYPE_COMPUTE || params.getResourceType() == RESOURCETYPE_SSBO ||
470*35238bceSAndroid Build Coastguard Worker         params.getContextResetType() == CONTEXTRESETTYPE_SHADER_OOB)
471*35238bceSAndroid Build Coastguard Worker     {
472*35238bceSAndroid Build Coastguard Worker         minorVersion = 1;
473*35238bceSAndroid Build Coastguard Worker     }
474*35238bceSAndroid Build Coastguard Worker     checkRequiredGLSupport(gl, glu::ApiType::es(3, minorVersion));
475*35238bceSAndroid Build Coastguard Worker }
476*35238bceSAndroid Build Coastguard Worker 
477*35238bceSAndroid Build Coastguard Worker class RenderingContext
478*35238bceSAndroid Build Coastguard Worker {
479*35238bceSAndroid Build Coastguard Worker public:
480*35238bceSAndroid Build Coastguard Worker     RenderingContext(const EglTestContext &eglTestCtx, const EGLint *attribList, const EGLConfig &config,
481*35238bceSAndroid Build Coastguard Worker                      const EGLDisplay &display, const EGLContext &sharedContext);
482*35238bceSAndroid Build Coastguard Worker     ~RenderingContext(void);
483*35238bceSAndroid Build Coastguard Worker 
484*35238bceSAndroid Build Coastguard Worker     void initGLFunctions(glw::Functions *gl, const glu::ApiType apiType);
485*35238bceSAndroid Build Coastguard Worker     void makeCurrent(const EGLSurface &surface);
486*35238bceSAndroid Build Coastguard Worker     EGLContext getContext(void);
487*35238bceSAndroid Build Coastguard Worker 
488*35238bceSAndroid Build Coastguard Worker private:
489*35238bceSAndroid Build Coastguard Worker     const EglTestContext &m_eglTestCtx;
490*35238bceSAndroid Build Coastguard Worker     const EGLint *m_attribList;
491*35238bceSAndroid Build Coastguard Worker     const EGLConfig &m_config;
492*35238bceSAndroid Build Coastguard Worker     const EGLDisplay &m_display;
493*35238bceSAndroid Build Coastguard Worker     const Library &m_egl;
494*35238bceSAndroid Build Coastguard Worker 
495*35238bceSAndroid Build Coastguard Worker     EGLContext m_context;
496*35238bceSAndroid Build Coastguard Worker 
497*35238bceSAndroid Build Coastguard Worker     void createContext(const EGLConfig &sharedConfig);
498*35238bceSAndroid Build Coastguard Worker     void destroyContext(void);
499*35238bceSAndroid Build Coastguard Worker 
500*35238bceSAndroid Build Coastguard Worker     RenderingContext(const RenderingContext &);
501*35238bceSAndroid Build Coastguard Worker     RenderingContext &operator=(const RenderingContext &);
502*35238bceSAndroid Build Coastguard Worker };
503*35238bceSAndroid Build Coastguard Worker 
RenderingContext(const EglTestContext & eglTestCtx,const EGLint * attribList,const EGLConfig & config,const EGLDisplay & display,const EGLContext & sharedContext)504*35238bceSAndroid Build Coastguard Worker RenderingContext::RenderingContext(const EglTestContext &eglTestCtx, const EGLint *attribList, const EGLConfig &config,
505*35238bceSAndroid Build Coastguard Worker                                    const EGLDisplay &display, const EGLContext &sharedContext)
506*35238bceSAndroid Build Coastguard Worker     : m_eglTestCtx(eglTestCtx)
507*35238bceSAndroid Build Coastguard Worker     , m_attribList(attribList)
508*35238bceSAndroid Build Coastguard Worker     , m_config(config)
509*35238bceSAndroid Build Coastguard Worker     , m_display(display)
510*35238bceSAndroid Build Coastguard Worker     , m_egl(eglTestCtx.getLibrary())
511*35238bceSAndroid Build Coastguard Worker     , m_context(EGL_NO_CONTEXT)
512*35238bceSAndroid Build Coastguard Worker {
513*35238bceSAndroid Build Coastguard Worker     logAttribList(eglTestCtx, m_attribList);
514*35238bceSAndroid Build Coastguard Worker     createContext(sharedContext);
515*35238bceSAndroid Build Coastguard Worker }
516*35238bceSAndroid Build Coastguard Worker 
~RenderingContext(void)517*35238bceSAndroid Build Coastguard Worker RenderingContext::~RenderingContext(void)
518*35238bceSAndroid Build Coastguard Worker {
519*35238bceSAndroid Build Coastguard Worker     destroyContext();
520*35238bceSAndroid Build Coastguard Worker }
521*35238bceSAndroid Build Coastguard Worker 
createContext(const EGLConfig & sharedContext)522*35238bceSAndroid Build Coastguard Worker void RenderingContext::createContext(const EGLConfig &sharedContext)
523*35238bceSAndroid Build Coastguard Worker {
524*35238bceSAndroid Build Coastguard Worker     m_context = m_egl.createContext(m_display, m_config, sharedContext, m_attribList);
525*35238bceSAndroid Build Coastguard Worker     EGLU_CHECK_MSG(m_egl, "eglCreateContext()");
526*35238bceSAndroid Build Coastguard Worker }
527*35238bceSAndroid Build Coastguard Worker 
destroyContext(void)528*35238bceSAndroid Build Coastguard Worker void RenderingContext::destroyContext(void)
529*35238bceSAndroid Build Coastguard Worker {
530*35238bceSAndroid Build Coastguard Worker     EGLU_CHECK_CALL(m_eglTestCtx.getLibrary(), makeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
531*35238bceSAndroid Build Coastguard Worker 
532*35238bceSAndroid Build Coastguard Worker     if (m_context != EGL_NO_CONTEXT)
533*35238bceSAndroid Build Coastguard Worker         m_egl.destroyContext(m_display, m_context);
534*35238bceSAndroid Build Coastguard Worker }
535*35238bceSAndroid Build Coastguard Worker 
makeCurrent(const EGLSurface & surface)536*35238bceSAndroid Build Coastguard Worker void RenderingContext::makeCurrent(const EGLSurface &surface)
537*35238bceSAndroid Build Coastguard Worker {
538*35238bceSAndroid Build Coastguard Worker     EGLU_CHECK_CALL(m_egl, makeCurrent(m_display, surface, surface, m_context));
539*35238bceSAndroid Build Coastguard Worker }
540*35238bceSAndroid Build Coastguard Worker 
initGLFunctions(glw::Functions * gl,const glu::ApiType apiType)541*35238bceSAndroid Build Coastguard Worker void RenderingContext::initGLFunctions(glw::Functions *gl, const glu::ApiType apiType)
542*35238bceSAndroid Build Coastguard Worker {
543*35238bceSAndroid Build Coastguard Worker     // \todo [2017-03-23 pyry] Current version has 2 somewhat ugly hacks:
544*35238bceSAndroid Build Coastguard Worker     //
545*35238bceSAndroid Build Coastguard Worker     // 1) Core functions are loaded twice. We need glGetString(i) to query supported
546*35238bceSAndroid Build Coastguard Worker     //    extensions to determine if we need to load EXT or KHR-suffixed robustness
547*35238bceSAndroid Build Coastguard Worker     //    functions. This could be fixed by exposing glw::FunctionLoader in EglTestContext
548*35238bceSAndroid Build Coastguard Worker     //    for example.
549*35238bceSAndroid Build Coastguard Worker     //
550*35238bceSAndroid Build Coastguard Worker     // 2) We assume that calling code will check for KHR_robustness or EXT_robustness
551*35238bceSAndroid Build Coastguard Worker     //    support after calling initGLFunctions(). We could move the check here.
552*35238bceSAndroid Build Coastguard Worker 
553*35238bceSAndroid Build Coastguard Worker     m_eglTestCtx.initGLFunctions(gl, apiType);
554*35238bceSAndroid Build Coastguard Worker 
555*35238bceSAndroid Build Coastguard Worker     {
556*35238bceSAndroid Build Coastguard Worker         const char *const robustnessExt =
557*35238bceSAndroid Build Coastguard Worker             glu::hasExtension(*gl, apiType, "GL_KHR_robustness") ? "GL_KHR_robustness" : "GL_EXT_robustness";
558*35238bceSAndroid Build Coastguard Worker         const char *const extensions[] = {robustnessExt};
559*35238bceSAndroid Build Coastguard Worker 
560*35238bceSAndroid Build Coastguard Worker         m_eglTestCtx.initGLFunctions(gl, apiType, DE_LENGTH_OF_ARRAY(extensions), &extensions[0]);
561*35238bceSAndroid Build Coastguard Worker     }
562*35238bceSAndroid Build Coastguard Worker }
563*35238bceSAndroid Build Coastguard Worker 
getContext(void)564*35238bceSAndroid Build Coastguard Worker EGLContext RenderingContext::getContext(void)
565*35238bceSAndroid Build Coastguard Worker {
566*35238bceSAndroid Build Coastguard Worker     return m_context;
567*35238bceSAndroid Build Coastguard Worker }
568*35238bceSAndroid Build Coastguard Worker 
569*35238bceSAndroid Build Coastguard Worker class ContextReset
570*35238bceSAndroid Build Coastguard Worker {
571*35238bceSAndroid Build Coastguard Worker public:
572*35238bceSAndroid Build Coastguard Worker     ContextReset(glw::Functions &gl, tcu::TestLog &log, FixedFunctionType fixedFunctionType);
573*35238bceSAndroid Build Coastguard Worker     ContextReset(glw::Functions &gl, tcu::TestLog &log, ShaderType shaderType, ResourceType resourceType,
574*35238bceSAndroid Build Coastguard Worker                  ReadWriteType readWriteType);
575*35238bceSAndroid Build Coastguard Worker 
~ContextReset(void)576*35238bceSAndroid Build Coastguard Worker     virtual ~ContextReset(void)
577*35238bceSAndroid Build Coastguard Worker     {
578*35238bceSAndroid Build Coastguard Worker     }
579*35238bceSAndroid Build Coastguard Worker 
580*35238bceSAndroid Build Coastguard Worker     virtual void setup(void)    = 0;
581*35238bceSAndroid Build Coastguard Worker     virtual void draw(void)     = 0;
582*35238bceSAndroid Build Coastguard Worker     virtual void teardown(void) = 0;
583*35238bceSAndroid Build Coastguard Worker 
584*35238bceSAndroid Build Coastguard Worker     void finish(void);
585*35238bceSAndroid Build Coastguard Worker 
586*35238bceSAndroid Build Coastguard Worker     glw::GLint getError(void);
587*35238bceSAndroid Build Coastguard Worker     glw::GLint getGraphicsResetStatus(void);
588*35238bceSAndroid Build Coastguard Worker 
getSyncObject(void) const589*35238bceSAndroid Build Coastguard Worker     glw::GLsync getSyncObject(void) const
590*35238bceSAndroid Build Coastguard Worker     {
591*35238bceSAndroid Build Coastguard Worker         return m_sync;
592*35238bceSAndroid Build Coastguard Worker     }
getQueryID(void) const593*35238bceSAndroid Build Coastguard Worker     glw::GLuint getQueryID(void) const
594*35238bceSAndroid Build Coastguard Worker     {
595*35238bceSAndroid Build Coastguard Worker         return m_queryID;
596*35238bceSAndroid Build Coastguard Worker     }
597*35238bceSAndroid Build Coastguard Worker 
598*35238bceSAndroid Build Coastguard Worker     glw::Functions &m_gl;
599*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &m_log;
600*35238bceSAndroid Build Coastguard Worker     ShaderType m_shaderType;
601*35238bceSAndroid Build Coastguard Worker     ResourceType m_resourceType;
602*35238bceSAndroid Build Coastguard Worker     ReadWriteType m_readWriteType;
603*35238bceSAndroid Build Coastguard Worker     FixedFunctionType m_fixedFunctionType;
604*35238bceSAndroid Build Coastguard Worker 
605*35238bceSAndroid Build Coastguard Worker private:
606*35238bceSAndroid Build Coastguard Worker     ContextReset(const ContextReset &);
607*35238bceSAndroid Build Coastguard Worker     ContextReset &operator=(const ContextReset &);
608*35238bceSAndroid Build Coastguard Worker 
609*35238bceSAndroid Build Coastguard Worker     glw::GLuint m_queryID;
610*35238bceSAndroid Build Coastguard Worker     glw::GLsync m_sync;
611*35238bceSAndroid Build Coastguard Worker };
612*35238bceSAndroid Build Coastguard Worker 
ContextReset(glw::Functions & gl,tcu::TestLog & log,FixedFunctionType fixedFunctionType)613*35238bceSAndroid Build Coastguard Worker ContextReset::ContextReset(glw::Functions &gl, tcu::TestLog &log, FixedFunctionType fixedFunctionType)
614*35238bceSAndroid Build Coastguard Worker     : m_gl(gl)
615*35238bceSAndroid Build Coastguard Worker     , m_log(log)
616*35238bceSAndroid Build Coastguard Worker     , m_fixedFunctionType(fixedFunctionType)
617*35238bceSAndroid Build Coastguard Worker {
618*35238bceSAndroid Build Coastguard Worker }
619*35238bceSAndroid Build Coastguard Worker 
ContextReset(glw::Functions & gl,tcu::TestLog & log,ShaderType shaderType,ResourceType resourceType,ReadWriteType readWriteType)620*35238bceSAndroid Build Coastguard Worker ContextReset::ContextReset(glw::Functions &gl, tcu::TestLog &log, ShaderType shaderType, ResourceType resourceType,
621*35238bceSAndroid Build Coastguard Worker                            ReadWriteType readWriteType)
622*35238bceSAndroid Build Coastguard Worker     : m_gl(gl)
623*35238bceSAndroid Build Coastguard Worker     , m_log(log)
624*35238bceSAndroid Build Coastguard Worker     , m_shaderType(shaderType)
625*35238bceSAndroid Build Coastguard Worker     , m_resourceType(resourceType)
626*35238bceSAndroid Build Coastguard Worker     , m_readWriteType(readWriteType)
627*35238bceSAndroid Build Coastguard Worker {
628*35238bceSAndroid Build Coastguard Worker }
629*35238bceSAndroid Build Coastguard Worker 
finish(void)630*35238bceSAndroid Build Coastguard Worker void ContextReset::finish(void)
631*35238bceSAndroid Build Coastguard Worker {
632*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, finish());
633*35238bceSAndroid Build Coastguard Worker }
634*35238bceSAndroid Build Coastguard Worker 
getError(void)635*35238bceSAndroid Build Coastguard Worker glw::GLint ContextReset::getError(void)
636*35238bceSAndroid Build Coastguard Worker {
637*35238bceSAndroid Build Coastguard Worker     glw::GLint error;
638*35238bceSAndroid Build Coastguard Worker     error = m_gl.getError();
639*35238bceSAndroid Build Coastguard Worker 
640*35238bceSAndroid Build Coastguard Worker     return error;
641*35238bceSAndroid Build Coastguard Worker }
642*35238bceSAndroid Build Coastguard Worker 
getGraphicsResetStatus(void)643*35238bceSAndroid Build Coastguard Worker glw::GLint ContextReset::getGraphicsResetStatus(void)
644*35238bceSAndroid Build Coastguard Worker {
645*35238bceSAndroid Build Coastguard Worker     glw::GLint resetStatus;
646*35238bceSAndroid Build Coastguard Worker     resetStatus = m_gl.getGraphicsResetStatus();
647*35238bceSAndroid Build Coastguard Worker 
648*35238bceSAndroid Build Coastguard Worker     return resetStatus;
649*35238bceSAndroid Build Coastguard Worker }
650*35238bceSAndroid Build Coastguard Worker 
651*35238bceSAndroid Build Coastguard Worker class FixedFunctionOOB : public ContextReset
652*35238bceSAndroid Build Coastguard Worker {
653*35238bceSAndroid Build Coastguard Worker public:
654*35238bceSAndroid Build Coastguard Worker     FixedFunctionOOB(glw::Functions &gl, tcu::TestLog &log, FixedFunctionType fixedFunctionType);
655*35238bceSAndroid Build Coastguard Worker     ~FixedFunctionOOB(void);
656*35238bceSAndroid Build Coastguard Worker 
657*35238bceSAndroid Build Coastguard Worker     struct TestConfig
658*35238bceSAndroid Build Coastguard Worker     {
659*35238bceSAndroid Build Coastguard Worker         int textureWidth;
660*35238bceSAndroid Build Coastguard Worker         int textureHeight;
661*35238bceSAndroid Build Coastguard Worker     };
662*35238bceSAndroid Build Coastguard Worker 
663*35238bceSAndroid Build Coastguard Worker     virtual void setup(void);
664*35238bceSAndroid Build Coastguard Worker     virtual void draw(void);
665*35238bceSAndroid Build Coastguard Worker     virtual void teardown(void);
666*35238bceSAndroid Build Coastguard Worker 
667*35238bceSAndroid Build Coastguard Worker private:
668*35238bceSAndroid Build Coastguard Worker     glu::ProgramSources genSources(void);
669*35238bceSAndroid Build Coastguard Worker     glw::GLuint m_coordinatesBuffer;
670*35238bceSAndroid Build Coastguard Worker     glw::GLint m_coordLocation;
671*35238bceSAndroid Build Coastguard Worker };
672*35238bceSAndroid Build Coastguard Worker 
FixedFunctionOOB(glw::Functions & gl,tcu::TestLog & log,FixedFunctionType fixedFunctionType)673*35238bceSAndroid Build Coastguard Worker FixedFunctionOOB::FixedFunctionOOB(glw::Functions &gl, tcu::TestLog &log, FixedFunctionType fixedFunctionType)
674*35238bceSAndroid Build Coastguard Worker     : ContextReset(gl, log, fixedFunctionType)
675*35238bceSAndroid Build Coastguard Worker     , m_coordinatesBuffer(0)
676*35238bceSAndroid Build Coastguard Worker     , m_coordLocation(0)
677*35238bceSAndroid Build Coastguard Worker {
678*35238bceSAndroid Build Coastguard Worker }
679*35238bceSAndroid Build Coastguard Worker 
~FixedFunctionOOB(void)680*35238bceSAndroid Build Coastguard Worker FixedFunctionOOB::~FixedFunctionOOB(void)
681*35238bceSAndroid Build Coastguard Worker {
682*35238bceSAndroid Build Coastguard Worker     try
683*35238bceSAndroid Build Coastguard Worker     {
684*35238bceSAndroid Build Coastguard Worker         // Reset GL_CONTEXT_LOST error before destroying resources
685*35238bceSAndroid Build Coastguard Worker         m_gl.getGraphicsResetStatus();
686*35238bceSAndroid Build Coastguard Worker         teardown();
687*35238bceSAndroid Build Coastguard Worker     }
688*35238bceSAndroid Build Coastguard Worker     catch (...)
689*35238bceSAndroid Build Coastguard Worker     {
690*35238bceSAndroid Build Coastguard Worker         // Ignore GL errors from teardown()
691*35238bceSAndroid Build Coastguard Worker     }
692*35238bceSAndroid Build Coastguard Worker }
693*35238bceSAndroid Build Coastguard Worker 
genSources(void)694*35238bceSAndroid Build Coastguard Worker glu::ProgramSources FixedFunctionOOB::genSources(void)
695*35238bceSAndroid Build Coastguard Worker {
696*35238bceSAndroid Build Coastguard Worker     const char *const vert = "#version 300 es\n"
697*35238bceSAndroid Build Coastguard Worker                              "in highp vec4 a_position;\n"
698*35238bceSAndroid Build Coastguard Worker                              "void main (void)\n"
699*35238bceSAndroid Build Coastguard Worker                              "{\n"
700*35238bceSAndroid Build Coastguard Worker                              "    gl_Position = a_position;\n"
701*35238bceSAndroid Build Coastguard Worker                              "}\n";
702*35238bceSAndroid Build Coastguard Worker 
703*35238bceSAndroid Build Coastguard Worker     const char *const frag = "#version 300 es\n"
704*35238bceSAndroid Build Coastguard Worker                              "layout(location = 0) out highp vec4 fragColor;\n"
705*35238bceSAndroid Build Coastguard Worker                              "void main (void)\n"
706*35238bceSAndroid Build Coastguard Worker                              "{\n"
707*35238bceSAndroid Build Coastguard Worker                              "    fragColor = vec4(1.0f);\n"
708*35238bceSAndroid Build Coastguard Worker                              "}\n";
709*35238bceSAndroid Build Coastguard Worker 
710*35238bceSAndroid Build Coastguard Worker     return glu::ProgramSources() << glu::VertexSource(vert) << glu::FragmentSource(frag);
711*35238bceSAndroid Build Coastguard Worker }
712*35238bceSAndroid Build Coastguard Worker 
setup(void)713*35238bceSAndroid Build Coastguard Worker void FixedFunctionOOB::setup(void)
714*35238bceSAndroid Build Coastguard Worker {
715*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(m_gl, genSources());
716*35238bceSAndroid Build Coastguard Worker 
717*35238bceSAndroid Build Coastguard Worker     m_log << program;
718*35238bceSAndroid Build Coastguard Worker 
719*35238bceSAndroid Build Coastguard Worker     if (!program.isOk())
720*35238bceSAndroid Build Coastguard Worker         TCU_FAIL("Failed to compile shader program");
721*35238bceSAndroid Build Coastguard Worker 
722*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, useProgram(program.getProgram()));
723*35238bceSAndroid Build Coastguard Worker 
724*35238bceSAndroid Build Coastguard Worker     const glw::GLfloat coords[] = {-1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f};
725*35238bceSAndroid Build Coastguard Worker 
726*35238bceSAndroid Build Coastguard Worker     m_coordLocation = m_gl.getAttribLocation(program.getProgram(), "a_position");
727*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_MSG(m_gl, "glGetAttribLocation()");
728*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(m_coordLocation != (glw::GLint)-1);
729*35238bceSAndroid Build Coastguard Worker 
730*35238bceSAndroid Build Coastguard Worker     // Load the vertex data
731*35238bceSAndroid Build Coastguard Worker     m_coordinatesBuffer = 0;
732*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, genBuffers(1, &m_coordinatesBuffer));
733*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, bindBuffer(GL_ARRAY_BUFFER, m_coordinatesBuffer));
734*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)sizeof(coords), coords, GL_STATIC_DRAW));
735*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, enableVertexAttribArray(m_coordLocation));
736*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, vertexAttribPointer(m_coordLocation, 2, GL_FLOAT, GL_FALSE, 0, DE_NULL));
737*35238bceSAndroid Build Coastguard Worker }
738*35238bceSAndroid Build Coastguard Worker 
draw(void)739*35238bceSAndroid Build Coastguard Worker void FixedFunctionOOB::draw(void)
740*35238bceSAndroid Build Coastguard Worker {
741*35238bceSAndroid Build Coastguard Worker     const glw::GLint bad_indices[] = {0, 10, 100, 1000, 10000, 100000};
742*35238bceSAndroid Build Coastguard Worker 
743*35238bceSAndroid Build Coastguard Worker     if (m_fixedFunctionType == FIXEDFUNCTIONTYPE_INDICES)
744*35238bceSAndroid Build Coastguard Worker         m_gl.drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, bad_indices);
745*35238bceSAndroid Build Coastguard Worker     else if (m_fixedFunctionType == FIXEDFUNCTIONTYPE_VERTICES)
746*35238bceSAndroid Build Coastguard Worker         m_gl.drawArrays(GL_TRIANGLES, 0, 1000);
747*35238bceSAndroid Build Coastguard Worker     else
748*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unknown fixed function type");
749*35238bceSAndroid Build Coastguard Worker }
750*35238bceSAndroid Build Coastguard Worker 
teardown(void)751*35238bceSAndroid Build Coastguard Worker void FixedFunctionOOB::teardown(void)
752*35238bceSAndroid Build Coastguard Worker {
753*35238bceSAndroid Build Coastguard Worker     if (m_coordLocation)
754*35238bceSAndroid Build Coastguard Worker     {
755*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, disableVertexAttribArray(m_coordLocation));
756*35238bceSAndroid Build Coastguard Worker         m_coordLocation = 0;
757*35238bceSAndroid Build Coastguard Worker     }
758*35238bceSAndroid Build Coastguard Worker 
759*35238bceSAndroid Build Coastguard Worker     if (m_coordinatesBuffer)
760*35238bceSAndroid Build Coastguard Worker     {
761*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, deleteBuffers(1, &m_coordinatesBuffer));
762*35238bceSAndroid Build Coastguard Worker         m_coordinatesBuffer = 0;
763*35238bceSAndroid Build Coastguard Worker     }
764*35238bceSAndroid Build Coastguard Worker 
765*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, useProgram(0));
766*35238bceSAndroid Build Coastguard Worker }
767*35238bceSAndroid Build Coastguard Worker 
768*35238bceSAndroid Build Coastguard Worker class ShadersOOB : public ContextReset
769*35238bceSAndroid Build Coastguard Worker {
770*35238bceSAndroid Build Coastguard Worker public:
771*35238bceSAndroid Build Coastguard Worker     ShadersOOB(glw::Functions &gl, tcu::TestLog &log, ShaderType shaderType, ResourceType resourceType,
772*35238bceSAndroid Build Coastguard Worker                ReadWriteType readWriteType);
773*35238bceSAndroid Build Coastguard Worker     ~ShadersOOB(void);
774*35238bceSAndroid Build Coastguard Worker 
775*35238bceSAndroid Build Coastguard Worker     virtual void setup(void);
776*35238bceSAndroid Build Coastguard Worker     virtual void draw(void);
777*35238bceSAndroid Build Coastguard Worker     virtual void teardown(void);
778*35238bceSAndroid Build Coastguard Worker 
779*35238bceSAndroid Build Coastguard Worker private:
780*35238bceSAndroid Build Coastguard Worker     static const int s_numBindings = 3;
781*35238bceSAndroid Build Coastguard Worker 
782*35238bceSAndroid Build Coastguard Worker     glw::GLuint m_coordinatesBuffer;
783*35238bceSAndroid Build Coastguard Worker     glw::GLint m_coordLocation;
784*35238bceSAndroid Build Coastguard Worker 
785*35238bceSAndroid Build Coastguard Worker     bool m_isUBO;
786*35238bceSAndroid Build Coastguard Worker     bool m_isRead;
787*35238bceSAndroid Build Coastguard Worker     bool m_isLocalArray;
788*35238bceSAndroid Build Coastguard Worker     std::vector<glw::GLuint> m_buffers;
789*35238bceSAndroid Build Coastguard Worker 
790*35238bceSAndroid Build Coastguard Worker     std::string genVertexShader(const std::string &shaderDecl, const std::string &shaderBody);
791*35238bceSAndroid Build Coastguard Worker     std::string genFragmentShader(const std::string &shaderDecl, const std::string &shaderBody);
792*35238bceSAndroid Build Coastguard Worker     std::string genComputeShader(const std::string &shaderDecl, const std::string &shaderBody);
793*35238bceSAndroid Build Coastguard Worker 
794*35238bceSAndroid Build Coastguard Worker     glu::ProgramSources genNonComputeSource(void);
795*35238bceSAndroid Build Coastguard Worker     glu::ProgramSources genComputeSource(void);
796*35238bceSAndroid Build Coastguard Worker     glu::ProgramSources genSources(void);
797*35238bceSAndroid Build Coastguard Worker };
798*35238bceSAndroid Build Coastguard Worker 
ShadersOOB(glw::Functions & gl,tcu::TestLog & log,ShaderType shaderType,ResourceType resourceType,ReadWriteType readWriteType)799*35238bceSAndroid Build Coastguard Worker ShadersOOB::ShadersOOB(glw::Functions &gl, tcu::TestLog &log, ShaderType shaderType, ResourceType resourceType,
800*35238bceSAndroid Build Coastguard Worker                        ReadWriteType readWriteType)
801*35238bceSAndroid Build Coastguard Worker     : ContextReset(gl, log, shaderType, resourceType, readWriteType)
802*35238bceSAndroid Build Coastguard Worker     , m_coordinatesBuffer(0)
803*35238bceSAndroid Build Coastguard Worker     , m_coordLocation(0)
804*35238bceSAndroid Build Coastguard Worker     , m_buffers(s_numBindings, 0)
805*35238bceSAndroid Build Coastguard Worker {
806*35238bceSAndroid Build Coastguard Worker     m_isUBO        = (m_resourceType == RESOURCETYPE_UBO);
807*35238bceSAndroid Build Coastguard Worker     m_isLocalArray = (m_resourceType == RESOURCETYPE_LOCAL_ARRAY);
808*35238bceSAndroid Build Coastguard Worker     m_isRead       = (m_readWriteType == READWRITETYPE_READ);
809*35238bceSAndroid Build Coastguard Worker }
810*35238bceSAndroid Build Coastguard Worker 
~ShadersOOB(void)811*35238bceSAndroid Build Coastguard Worker ShadersOOB::~ShadersOOB(void)
812*35238bceSAndroid Build Coastguard Worker {
813*35238bceSAndroid Build Coastguard Worker     try
814*35238bceSAndroid Build Coastguard Worker     {
815*35238bceSAndroid Build Coastguard Worker         // Reset GL_CONTEXT_LOST error before destroying resources
816*35238bceSAndroid Build Coastguard Worker         m_gl.getGraphicsResetStatus();
817*35238bceSAndroid Build Coastguard Worker         teardown();
818*35238bceSAndroid Build Coastguard Worker     }
819*35238bceSAndroid Build Coastguard Worker     catch (...)
820*35238bceSAndroid Build Coastguard Worker     {
821*35238bceSAndroid Build Coastguard Worker         // Ignore GL errors from teardown()
822*35238bceSAndroid Build Coastguard Worker     }
823*35238bceSAndroid Build Coastguard Worker }
824*35238bceSAndroid Build Coastguard Worker 
genVertexShader(const std::string & shaderDecl,const std::string & shaderBody)825*35238bceSAndroid Build Coastguard Worker std::string ShadersOOB::genVertexShader(const std::string &shaderDecl, const std::string &shaderBody)
826*35238bceSAndroid Build Coastguard Worker {
827*35238bceSAndroid Build Coastguard Worker     static const char *const s_simpleVertexShaderSource = "#version 310 es\n"
828*35238bceSAndroid Build Coastguard Worker                                                           "in highp vec4 a_position;\n"
829*35238bceSAndroid Build Coastguard Worker                                                           "void main (void)\n"
830*35238bceSAndroid Build Coastguard Worker                                                           "{\n"
831*35238bceSAndroid Build Coastguard Worker                                                           "    gl_Position = a_position;\n"
832*35238bceSAndroid Build Coastguard Worker                                                           "}\n";
833*35238bceSAndroid Build Coastguard Worker 
834*35238bceSAndroid Build Coastguard Worker     switch (m_shaderType)
835*35238bceSAndroid Build Coastguard Worker     {
836*35238bceSAndroid Build Coastguard Worker     case SHADERTYPE_VERT:
837*35238bceSAndroid Build Coastguard Worker     case SHADERTYPE_VERT_AND_FRAG:
838*35238bceSAndroid Build Coastguard Worker     {
839*35238bceSAndroid Build Coastguard Worker         std::ostringstream vertexShaderSource;
840*35238bceSAndroid Build Coastguard Worker         vertexShaderSource << "#version 310 es\n"
841*35238bceSAndroid Build Coastguard Worker                            << "in highp vec4 a_position;\n"
842*35238bceSAndroid Build Coastguard Worker                            << "out highp vec4 v_color;\n"
843*35238bceSAndroid Build Coastguard Worker                            << shaderDecl << "\n"
844*35238bceSAndroid Build Coastguard Worker                            << "void main (void)\n"
845*35238bceSAndroid Build Coastguard Worker                            << "{\n"
846*35238bceSAndroid Build Coastguard Worker                            << "    highp vec4 color = vec4(0.0f);\n"
847*35238bceSAndroid Build Coastguard Worker                            << shaderBody << "\n"
848*35238bceSAndroid Build Coastguard Worker                            << "    v_color = color;\n"
849*35238bceSAndroid Build Coastguard Worker                            << "    gl_Position = a_position;\n"
850*35238bceSAndroid Build Coastguard Worker                            << "}\n";
851*35238bceSAndroid Build Coastguard Worker 
852*35238bceSAndroid Build Coastguard Worker         return vertexShaderSource.str();
853*35238bceSAndroid Build Coastguard Worker     }
854*35238bceSAndroid Build Coastguard Worker 
855*35238bceSAndroid Build Coastguard Worker     case SHADERTYPE_FRAG:
856*35238bceSAndroid Build Coastguard Worker         return s_simpleVertexShaderSource;
857*35238bceSAndroid Build Coastguard Worker 
858*35238bceSAndroid Build Coastguard Worker     default:
859*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unknown shader type");
860*35238bceSAndroid Build Coastguard Worker         return "";
861*35238bceSAndroid Build Coastguard Worker     }
862*35238bceSAndroid Build Coastguard Worker }
863*35238bceSAndroid Build Coastguard Worker 
genFragmentShader(const std::string & shaderDecl,const std::string & shaderBody)864*35238bceSAndroid Build Coastguard Worker std::string ShadersOOB::genFragmentShader(const std::string &shaderDecl, const std::string &shaderBody)
865*35238bceSAndroid Build Coastguard Worker {
866*35238bceSAndroid Build Coastguard Worker     static const char *const s_simpleFragmentShaderSource = "#version 310 es\n"
867*35238bceSAndroid Build Coastguard Worker                                                             "in highp vec4 v_color;\n"
868*35238bceSAndroid Build Coastguard Worker                                                             "layout(location = 0) out highp vec4 fragColor;\n"
869*35238bceSAndroid Build Coastguard Worker                                                             "void main (void)\n"
870*35238bceSAndroid Build Coastguard Worker                                                             "{\n"
871*35238bceSAndroid Build Coastguard Worker                                                             "    fragColor = v_color;\n"
872*35238bceSAndroid Build Coastguard Worker                                                             "}\n";
873*35238bceSAndroid Build Coastguard Worker 
874*35238bceSAndroid Build Coastguard Worker     switch (m_shaderType)
875*35238bceSAndroid Build Coastguard Worker     {
876*35238bceSAndroid Build Coastguard Worker     case SHADERTYPE_VERT:
877*35238bceSAndroid Build Coastguard Worker         return s_simpleFragmentShaderSource;
878*35238bceSAndroid Build Coastguard Worker 
879*35238bceSAndroid Build Coastguard Worker     case SHADERTYPE_FRAG:
880*35238bceSAndroid Build Coastguard Worker     {
881*35238bceSAndroid Build Coastguard Worker         std::ostringstream fragmentShaderSource;
882*35238bceSAndroid Build Coastguard Worker         fragmentShaderSource << "#version 310 es\n"
883*35238bceSAndroid Build Coastguard Worker                              << "layout(location = 0) out highp vec4 fragColor;\n"
884*35238bceSAndroid Build Coastguard Worker                              << shaderDecl << "\n"
885*35238bceSAndroid Build Coastguard Worker                              << "void main (void)\n"
886*35238bceSAndroid Build Coastguard Worker                              << "{\n"
887*35238bceSAndroid Build Coastguard Worker                              << "    highp vec4 color = vec4(0.0f);\n"
888*35238bceSAndroid Build Coastguard Worker                              << shaderBody << "\n"
889*35238bceSAndroid Build Coastguard Worker                              << "    fragColor = color;\n"
890*35238bceSAndroid Build Coastguard Worker                              << "}\n";
891*35238bceSAndroid Build Coastguard Worker 
892*35238bceSAndroid Build Coastguard Worker         return fragmentShaderSource.str();
893*35238bceSAndroid Build Coastguard Worker     }
894*35238bceSAndroid Build Coastguard Worker     case SHADERTYPE_VERT_AND_FRAG:
895*35238bceSAndroid Build Coastguard Worker     {
896*35238bceSAndroid Build Coastguard Worker         std::ostringstream fragmentShaderSource;
897*35238bceSAndroid Build Coastguard Worker         fragmentShaderSource << "#version 310 es\n"
898*35238bceSAndroid Build Coastguard Worker                              << "in highp vec4 v_color;\n"
899*35238bceSAndroid Build Coastguard Worker                              << "layout(location = 0) out highp vec4 fragColor;\n"
900*35238bceSAndroid Build Coastguard Worker                              << shaderDecl << "\n"
901*35238bceSAndroid Build Coastguard Worker                              << "void main (void)\n"
902*35238bceSAndroid Build Coastguard Worker                              << "{\n"
903*35238bceSAndroid Build Coastguard Worker                              << "    highp vec4 color = vec4(0.0f);\n"
904*35238bceSAndroid Build Coastguard Worker                              << shaderBody << "\n"
905*35238bceSAndroid Build Coastguard Worker                              << "    fragColor = color;\n"
906*35238bceSAndroid Build Coastguard Worker                              << "}\n";
907*35238bceSAndroid Build Coastguard Worker 
908*35238bceSAndroid Build Coastguard Worker         return fragmentShaderSource.str();
909*35238bceSAndroid Build Coastguard Worker     }
910*35238bceSAndroid Build Coastguard Worker 
911*35238bceSAndroid Build Coastguard Worker     default:
912*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unknown shader type");
913*35238bceSAndroid Build Coastguard Worker         return "";
914*35238bceSAndroid Build Coastguard Worker     }
915*35238bceSAndroid Build Coastguard Worker }
916*35238bceSAndroid Build Coastguard Worker 
genComputeShader(const std::string & shaderDecl,const std::string & shaderBody)917*35238bceSAndroid Build Coastguard Worker std::string ShadersOOB::genComputeShader(const std::string &shaderDecl, const std::string &shaderBody)
918*35238bceSAndroid Build Coastguard Worker {
919*35238bceSAndroid Build Coastguard Worker     std::ostringstream computeShaderSource;
920*35238bceSAndroid Build Coastguard Worker 
921*35238bceSAndroid Build Coastguard Worker     computeShaderSource << "#version 310 es\n"
922*35238bceSAndroid Build Coastguard Worker                         << "layout(local_size_x = 1, local_size_y = 1) in;\n"
923*35238bceSAndroid Build Coastguard Worker                         << "\n"
924*35238bceSAndroid Build Coastguard Worker                         << "layout(binding = 0) buffer Output {\n"
925*35238bceSAndroid Build Coastguard Worker                         << "    highp vec4 values;\n"
926*35238bceSAndroid Build Coastguard Worker                         << "} sb_out;\n"
927*35238bceSAndroid Build Coastguard Worker                         << "\n"
928*35238bceSAndroid Build Coastguard Worker                         << shaderDecl << "void main ()\n"
929*35238bceSAndroid Build Coastguard Worker                         << "{\n"
930*35238bceSAndroid Build Coastguard Worker                         << shaderBody << "}\n";
931*35238bceSAndroid Build Coastguard Worker 
932*35238bceSAndroid Build Coastguard Worker     return computeShaderSource.str();
933*35238bceSAndroid Build Coastguard Worker }
934*35238bceSAndroid Build Coastguard Worker 
genNonComputeSource(void)935*35238bceSAndroid Build Coastguard Worker glu::ProgramSources ShadersOOB::genNonComputeSource(void)
936*35238bceSAndroid Build Coastguard Worker {
937*35238bceSAndroid Build Coastguard Worker     std::ostringstream shaderDecl;
938*35238bceSAndroid Build Coastguard Worker     std::ostringstream shaderBody;
939*35238bceSAndroid Build Coastguard Worker 
940*35238bceSAndroid Build Coastguard Worker     shaderDecl << "uniform highp int u_index;\n";
941*35238bceSAndroid Build Coastguard Worker 
942*35238bceSAndroid Build Coastguard Worker     if (m_isLocalArray)
943*35238bceSAndroid Build Coastguard Worker     {
944*35238bceSAndroid Build Coastguard Worker         const char *const readWriteStatement =
945*35238bceSAndroid Build Coastguard Worker             (m_isRead) ? "    color.x = color_out[u_index];\n" : "    color[u_index] = color_out[0];\n";
946*35238bceSAndroid Build Coastguard Worker 
947*35238bceSAndroid Build Coastguard Worker         shaderBody << "    highp float color_out[4] = float[4](0.25f, 0.5f, 0.75f, 1.0f);\n" << readWriteStatement;
948*35238bceSAndroid Build Coastguard Worker     }
949*35238bceSAndroid Build Coastguard Worker     else
950*35238bceSAndroid Build Coastguard Worker     {
951*35238bceSAndroid Build Coastguard Worker         const std::string resName = (m_isUBO) ? "ub_in" : "sb_in";
952*35238bceSAndroid Build Coastguard Worker 
953*35238bceSAndroid Build Coastguard Worker         shaderDecl << "layout(std140, binding = 0) " << ((m_isUBO) ? "uniform" : "buffer") << " Block\n"
954*35238bceSAndroid Build Coastguard Worker                    << "{\n"
955*35238bceSAndroid Build Coastguard Worker                    << "    highp float color_out[4];\n"
956*35238bceSAndroid Build Coastguard Worker                    << "} " << resName << "[" << s_numBindings << "];\n";
957*35238bceSAndroid Build Coastguard Worker 
958*35238bceSAndroid Build Coastguard Worker         const std::string readWriteStatement = (m_isRead) ? "    color.x = " + resName + "[0].color_out[u_index];\n" :
959*35238bceSAndroid Build Coastguard Worker                                                             "    color[u_index] = " + resName + "[0].color_out[0];\n";
960*35238bceSAndroid Build Coastguard Worker 
961*35238bceSAndroid Build Coastguard Worker         shaderBody << readWriteStatement;
962*35238bceSAndroid Build Coastguard Worker     }
963*35238bceSAndroid Build Coastguard Worker 
964*35238bceSAndroid Build Coastguard Worker     return glu::ProgramSources() << glu::VertexSource(genVertexShader(shaderDecl.str(), shaderBody.str()))
965*35238bceSAndroid Build Coastguard Worker                                  << glu::FragmentSource(genFragmentShader(shaderDecl.str(), shaderBody.str()));
966*35238bceSAndroid Build Coastguard Worker }
967*35238bceSAndroid Build Coastguard Worker 
genComputeSource(void)968*35238bceSAndroid Build Coastguard Worker glu::ProgramSources ShadersOOB::genComputeSource(void)
969*35238bceSAndroid Build Coastguard Worker {
970*35238bceSAndroid Build Coastguard Worker     std::ostringstream shaderDecl;
971*35238bceSAndroid Build Coastguard Worker     std::ostringstream shaderBody;
972*35238bceSAndroid Build Coastguard Worker 
973*35238bceSAndroid Build Coastguard Worker     shaderDecl << "uniform highp int u_index;\n";
974*35238bceSAndroid Build Coastguard Worker 
975*35238bceSAndroid Build Coastguard Worker     shaderBody << "    uvec3 size = gl_NumWorkGroups * gl_WorkGroupSize;\n"
976*35238bceSAndroid Build Coastguard Worker                << "    uint groupNdx = size.x*gl_GlobalInvocationID.y + gl_GlobalInvocationID.x;\n";
977*35238bceSAndroid Build Coastguard Worker 
978*35238bceSAndroid Build Coastguard Worker     if (m_isLocalArray)
979*35238bceSAndroid Build Coastguard Worker     {
980*35238bceSAndroid Build Coastguard Worker         const char *const readWriteStatement =
981*35238bceSAndroid Build Coastguard Worker             (m_isRead) ? "    sb_out.values.x = values[u_index];\n" : "    sb_out.values[u_index] = values.x;\n";
982*35238bceSAndroid Build Coastguard Worker 
983*35238bceSAndroid Build Coastguard Worker         shaderBody << "    highp vec4 values = vec4(1.0f, 0.0f, 3.0f, 2.0f) * float(groupNdx);\n" << readWriteStatement;
984*35238bceSAndroid Build Coastguard Worker     }
985*35238bceSAndroid Build Coastguard Worker     else
986*35238bceSAndroid Build Coastguard Worker     {
987*35238bceSAndroid Build Coastguard Worker         const std::string resName = (m_isUBO) ? "ub_in" : "sb_in";
988*35238bceSAndroid Build Coastguard Worker 
989*35238bceSAndroid Build Coastguard Worker         shaderDecl << "layout(std140, binding = 1) " << ((m_isUBO) ? "uniform" : "buffer") << " Input\n"
990*35238bceSAndroid Build Coastguard Worker                    << "{\n"
991*35238bceSAndroid Build Coastguard Worker                    << "    highp vec4 values;\n"
992*35238bceSAndroid Build Coastguard Worker                    << "} " << resName << "[" << s_numBindings << "];\n";
993*35238bceSAndroid Build Coastguard Worker 
994*35238bceSAndroid Build Coastguard Worker         std::string readWriteStatement =
995*35238bceSAndroid Build Coastguard Worker             (m_isRead) ? "    sb_out.values.x = " + resName + "[0].values[u_index] * float(groupNdx);\n" :
996*35238bceSAndroid Build Coastguard Worker                          "    sb_out.values[u_index] = " + resName + "[0].values.x * float(groupNdx);\n";
997*35238bceSAndroid Build Coastguard Worker 
998*35238bceSAndroid Build Coastguard Worker         shaderBody << readWriteStatement;
999*35238bceSAndroid Build Coastguard Worker     }
1000*35238bceSAndroid Build Coastguard Worker 
1001*35238bceSAndroid Build Coastguard Worker     return glu::ProgramSources() << glu::ComputeSource(genComputeShader(shaderDecl.str(), shaderBody.str()));
1002*35238bceSAndroid Build Coastguard Worker }
1003*35238bceSAndroid Build Coastguard Worker 
genSources(void)1004*35238bceSAndroid Build Coastguard Worker glu::ProgramSources ShadersOOB::genSources(void)
1005*35238bceSAndroid Build Coastguard Worker {
1006*35238bceSAndroid Build Coastguard Worker     if (m_shaderType == SHADERTYPE_COMPUTE)
1007*35238bceSAndroid Build Coastguard Worker         return genComputeSource();
1008*35238bceSAndroid Build Coastguard Worker     else
1009*35238bceSAndroid Build Coastguard Worker         return genNonComputeSource();
1010*35238bceSAndroid Build Coastguard Worker }
1011*35238bceSAndroid Build Coastguard Worker 
setup(void)1012*35238bceSAndroid Build Coastguard Worker void ShadersOOB::setup(void)
1013*35238bceSAndroid Build Coastguard Worker {
1014*35238bceSAndroid Build Coastguard Worker     if (!m_isUBO && !m_isLocalArray && (m_shaderType != SHADERTYPE_COMPUTE))
1015*35238bceSAndroid Build Coastguard Worker     {
1016*35238bceSAndroid Build Coastguard Worker         // Check implementation limits for shader SSBO
1017*35238bceSAndroid Build Coastguard Worker         int shaderStorageBlockSupported = -1;
1018*35238bceSAndroid Build Coastguard Worker         const bool isVertex =
1019*35238bceSAndroid Build Coastguard Worker             (m_shaderType == SHADERTYPE_VERT || m_shaderType == SHADERTYPE_VERT_AND_FRAG) ? true : false;
1020*35238bceSAndroid Build Coastguard Worker         string shaderTypeStr =
1021*35238bceSAndroid Build Coastguard Worker             isVertex ? "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" : "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS";
1022*35238bceSAndroid Build Coastguard Worker 
1023*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(
1024*35238bceSAndroid Build Coastguard Worker             m_gl, getIntegerv(isVertex ? GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS : GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS,
1025*35238bceSAndroid Build Coastguard Worker                               &shaderStorageBlockSupported));
1026*35238bceSAndroid Build Coastguard Worker 
1027*35238bceSAndroid Build Coastguard Worker         if (shaderStorageBlockSupported < (int)m_buffers.size())
1028*35238bceSAndroid Build Coastguard Worker             TCU_THROW(NotSupportedError,
1029*35238bceSAndroid Build Coastguard Worker                       ("Test requires " + shaderTypeStr + " >= " + de::toString((int)m_buffers.size()) + ", got " +
1030*35238bceSAndroid Build Coastguard Worker                        de::toString(shaderStorageBlockSupported))
1031*35238bceSAndroid Build Coastguard Worker                           .c_str());
1032*35238bceSAndroid Build Coastguard Worker     }
1033*35238bceSAndroid Build Coastguard Worker 
1034*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(m_gl, genSources());
1035*35238bceSAndroid Build Coastguard Worker 
1036*35238bceSAndroid Build Coastguard Worker     m_log << program;
1037*35238bceSAndroid Build Coastguard Worker 
1038*35238bceSAndroid Build Coastguard Worker     if (!program.isOk())
1039*35238bceSAndroid Build Coastguard Worker         TCU_FAIL("Failed to compile shader program");
1040*35238bceSAndroid Build Coastguard Worker 
1041*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, useProgram(program.getProgram()));
1042*35238bceSAndroid Build Coastguard Worker 
1043*35238bceSAndroid Build Coastguard Worker     const glw::GLint indexLocation = m_gl.getUniformLocation(program.getProgram(), "u_index");
1044*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_MSG(m_gl, "glGetUniformLocation()");
1045*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(indexLocation != (glw::GLint)-1);
1046*35238bceSAndroid Build Coastguard Worker 
1047*35238bceSAndroid Build Coastguard Worker     const glw::GLint index = -1;
1048*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, uniform1i(indexLocation, index));
1049*35238bceSAndroid Build Coastguard Worker 
1050*35238bceSAndroid Build Coastguard Worker     if (m_shaderType != SHADERTYPE_COMPUTE)
1051*35238bceSAndroid Build Coastguard Worker     {
1052*35238bceSAndroid Build Coastguard Worker         const glw::GLfloat coords[] = {-1.0f, -1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f, +1.0f};
1053*35238bceSAndroid Build Coastguard Worker 
1054*35238bceSAndroid Build Coastguard Worker         // Setup vertices position
1055*35238bceSAndroid Build Coastguard Worker         m_coordLocation = m_gl.getAttribLocation(program.getProgram(), "a_position");
1056*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_MSG(m_gl, "glGetAttribLocation()");
1057*35238bceSAndroid Build Coastguard Worker         TCU_CHECK(m_coordLocation != (glw::GLint)-1);
1058*35238bceSAndroid Build Coastguard Worker 
1059*35238bceSAndroid Build Coastguard Worker         // Load the vertex data
1060*35238bceSAndroid Build Coastguard Worker         m_coordinatesBuffer = 0;
1061*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, genBuffers(1, &m_coordinatesBuffer));
1062*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, bindBuffer(GL_ARRAY_BUFFER, m_coordinatesBuffer));
1063*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)sizeof(coords), coords, GL_STATIC_DRAW));
1064*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, enableVertexAttribArray(m_coordLocation));
1065*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, vertexAttribPointer(m_coordLocation, 2, GL_FLOAT, GL_FALSE, 0, DE_NULL));
1066*35238bceSAndroid Build Coastguard Worker     }
1067*35238bceSAndroid Build Coastguard Worker 
1068*35238bceSAndroid Build Coastguard Worker     // Create unused data for filling buffer objects
1069*35238bceSAndroid Build Coastguard Worker     const std::vector<tcu::Vec4> refValues(s_numBindings, tcu::Vec4(0.0f, 1.0f, 1.0f, 1.0f));
1070*35238bceSAndroid Build Coastguard Worker 
1071*35238bceSAndroid Build Coastguard Worker     if (m_isLocalArray && m_shaderType == SHADERTYPE_COMPUTE)
1072*35238bceSAndroid Build Coastguard Worker     {
1073*35238bceSAndroid Build Coastguard Worker         // Setup output buffer
1074*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, genBuffers((glw::GLsizei)1u, &m_buffers[0]));
1075*35238bceSAndroid Build Coastguard Worker 
1076*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, bindBuffer(GL_SHADER_STORAGE_BUFFER, m_buffers[0]));
1077*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl,
1078*35238bceSAndroid Build Coastguard Worker                            bufferData(GL_SHADER_STORAGE_BUFFER, sizeof(tcu::Vec4), &(refValues[0]), GL_STATIC_DRAW));
1079*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, bindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_buffers[0]));
1080*35238bceSAndroid Build Coastguard Worker     }
1081*35238bceSAndroid Build Coastguard Worker     else if (!m_isLocalArray)
1082*35238bceSAndroid Build Coastguard Worker     {
1083*35238bceSAndroid Build Coastguard Worker         // Set up interface block of buffer bindings
1084*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, genBuffers((glw::GLsizei)m_buffers.size(), &m_buffers[0]));
1085*35238bceSAndroid Build Coastguard Worker 
1086*35238bceSAndroid Build Coastguard Worker         for (int bufNdx = 0; bufNdx < (int)m_buffers.size(); ++bufNdx)
1087*35238bceSAndroid Build Coastguard Worker         {
1088*35238bceSAndroid Build Coastguard Worker             const glw::GLenum resType = m_isUBO && (m_shaderType != SHADERTYPE_COMPUTE || bufNdx != 0) ?
1089*35238bceSAndroid Build Coastguard Worker                                             GL_UNIFORM_BUFFER :
1090*35238bceSAndroid Build Coastguard Worker                                             GL_SHADER_STORAGE_BUFFER;
1091*35238bceSAndroid Build Coastguard Worker 
1092*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_GLW_CALL(m_gl, bindBuffer(resType, m_buffers[bufNdx]));
1093*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_GLW_CALL(m_gl, bufferData(resType, sizeof(tcu::Vec4), &(refValues[bufNdx]), GL_STATIC_DRAW));
1094*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_GLW_CALL(m_gl, bindBufferBase(resType, bufNdx, m_buffers[bufNdx]));
1095*35238bceSAndroid Build Coastguard Worker         }
1096*35238bceSAndroid Build Coastguard Worker     }
1097*35238bceSAndroid Build Coastguard Worker }
1098*35238bceSAndroid Build Coastguard Worker 
draw(void)1099*35238bceSAndroid Build Coastguard Worker void ShadersOOB::draw(void)
1100*35238bceSAndroid Build Coastguard Worker {
1101*35238bceSAndroid Build Coastguard Worker     if (m_shaderType == SHADERTYPE_COMPUTE)
1102*35238bceSAndroid Build Coastguard Worker         m_gl.dispatchCompute(1, 1, 1);
1103*35238bceSAndroid Build Coastguard Worker     else
1104*35238bceSAndroid Build Coastguard Worker     {
1105*35238bceSAndroid Build Coastguard Worker         const glw::GLuint indices[] = {0, 1, 2, 2, 3, 0};
1106*35238bceSAndroid Build Coastguard Worker         m_gl.drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices);
1107*35238bceSAndroid Build Coastguard Worker     }
1108*35238bceSAndroid Build Coastguard Worker }
1109*35238bceSAndroid Build Coastguard Worker 
teardown(void)1110*35238bceSAndroid Build Coastguard Worker void ShadersOOB::teardown(void)
1111*35238bceSAndroid Build Coastguard Worker {
1112*35238bceSAndroid Build Coastguard Worker     if (m_shaderType != SHADERTYPE_COMPUTE)
1113*35238bceSAndroid Build Coastguard Worker     {
1114*35238bceSAndroid Build Coastguard Worker         if (m_coordLocation)
1115*35238bceSAndroid Build Coastguard Worker         {
1116*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_GLW_CALL(m_gl, disableVertexAttribArray(m_coordLocation));
1117*35238bceSAndroid Build Coastguard Worker             m_coordLocation = 0;
1118*35238bceSAndroid Build Coastguard Worker         }
1119*35238bceSAndroid Build Coastguard Worker     }
1120*35238bceSAndroid Build Coastguard Worker 
1121*35238bceSAndroid Build Coastguard Worker     if (m_coordinatesBuffer)
1122*35238bceSAndroid Build Coastguard Worker     {
1123*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(m_gl, deleteBuffers(1, &m_coordinatesBuffer));
1124*35238bceSAndroid Build Coastguard Worker         m_coordinatesBuffer = 0;
1125*35238bceSAndroid Build Coastguard Worker     }
1126*35238bceSAndroid Build Coastguard Worker 
1127*35238bceSAndroid Build Coastguard Worker     if (!m_isLocalArray)
1128*35238bceSAndroid Build Coastguard Worker     {
1129*35238bceSAndroid Build Coastguard Worker         if (!m_buffers.empty())
1130*35238bceSAndroid Build Coastguard Worker         {
1131*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_GLW_CALL(m_gl, deleteBuffers((glw::GLsizei)m_buffers.size(), &m_buffers[0]));
1132*35238bceSAndroid Build Coastguard Worker             m_buffers.clear();
1133*35238bceSAndroid Build Coastguard Worker         }
1134*35238bceSAndroid Build Coastguard Worker     }
1135*35238bceSAndroid Build Coastguard Worker 
1136*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(m_gl, useProgram(0));
1137*35238bceSAndroid Build Coastguard Worker }
1138*35238bceSAndroid Build Coastguard Worker 
1139*35238bceSAndroid Build Coastguard Worker class QueryRobustAccessCase : public RobustnessTestCase
1140*35238bceSAndroid Build Coastguard Worker {
1141*35238bceSAndroid Build Coastguard Worker public:
QueryRobustAccessCase(EglTestContext & eglTestCtx,const char * name,const char * description)1142*35238bceSAndroid Build Coastguard Worker     QueryRobustAccessCase(EglTestContext &eglTestCtx, const char *name, const char *description)
1143*35238bceSAndroid Build Coastguard Worker         : RobustnessTestCase(eglTestCtx, name, description)
1144*35238bceSAndroid Build Coastguard Worker     {
1145*35238bceSAndroid Build Coastguard Worker     }
1146*35238bceSAndroid Build Coastguard Worker 
iterate(void)1147*35238bceSAndroid Build Coastguard Worker     TestCase::IterateResult iterate(void)
1148*35238bceSAndroid Build Coastguard Worker     {
1149*35238bceSAndroid Build Coastguard Worker         TestLog &log = m_testCtx.getLog();
1150*35238bceSAndroid Build Coastguard Worker 
1151*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message
1152*35238bceSAndroid Build Coastguard Worker             << "Check that after successfully creating a robust context the robust access query returned by "
1153*35238bceSAndroid Build Coastguard Worker                "glBooleanv() equals GL_TRUE\n\n"
1154*35238bceSAndroid Build Coastguard Worker             << tcu::TestLog::EndMessage;
1155*35238bceSAndroid Build Coastguard Worker 
1156*35238bceSAndroid Build Coastguard Worker         const EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION,
1157*35238bceSAndroid Build Coastguard Worker                                      3,
1158*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_MINOR_VERSION_KHR,
1159*35238bceSAndroid Build Coastguard Worker                                      0,
1160*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT,
1161*35238bceSAndroid Build Coastguard Worker                                      EGL_TRUE,
1162*35238bceSAndroid Build Coastguard Worker                                      EGL_NONE};
1163*35238bceSAndroid Build Coastguard Worker 
1164*35238bceSAndroid Build Coastguard Worker         checkRequiredEGLExtensions(attribList);
1165*35238bceSAndroid Build Coastguard Worker 
1166*35238bceSAndroid Build Coastguard Worker         RenderingContext context(m_eglTestCtx, attribList, m_eglConfig, m_eglDisplay, EGL_NO_CONTEXT);
1167*35238bceSAndroid Build Coastguard Worker         context.makeCurrent(m_eglSurface);
1168*35238bceSAndroid Build Coastguard Worker 
1169*35238bceSAndroid Build Coastguard Worker         glw::Functions gl;
1170*35238bceSAndroid Build Coastguard Worker         {
1171*35238bceSAndroid Build Coastguard Worker             const glu::ApiType apiType(3, 0, glu::PROFILE_ES);
1172*35238bceSAndroid Build Coastguard Worker             context.initGLFunctions(&gl, apiType);
1173*35238bceSAndroid Build Coastguard Worker             checkRequiredGLSupport(gl, apiType);
1174*35238bceSAndroid Build Coastguard Worker         }
1175*35238bceSAndroid Build Coastguard Worker 
1176*35238bceSAndroid Build Coastguard Worker         uint8_t robustAccessGL;
1177*35238bceSAndroid Build Coastguard Worker         gl.getBooleanv(GL_CONTEXT_ROBUST_ACCESS_EXT, &robustAccessGL);
1178*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetBooleanv()");
1179*35238bceSAndroid Build Coastguard Worker 
1180*35238bceSAndroid Build Coastguard Worker         if (robustAccessGL != GL_TRUE)
1181*35238bceSAndroid Build Coastguard Worker         {
1182*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Invalid GL_CONTEXT_ROBUST_ACCESS returned by glGetBooleanv(). Got '"
1183*35238bceSAndroid Build Coastguard Worker                 << robustAccessGL << "' expected GL_TRUE." << TestLog::EndMessage;
1184*35238bceSAndroid Build Coastguard Worker 
1185*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1186*35238bceSAndroid Build Coastguard Worker             return STOP;
1187*35238bceSAndroid Build Coastguard Worker         }
1188*35238bceSAndroid Build Coastguard Worker 
1189*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1190*35238bceSAndroid Build Coastguard Worker         return STOP;
1191*35238bceSAndroid Build Coastguard Worker     }
1192*35238bceSAndroid Build Coastguard Worker };
1193*35238bceSAndroid Build Coastguard Worker 
1194*35238bceSAndroid Build Coastguard Worker class NoResetNotificationCase : public RobustnessTestCase
1195*35238bceSAndroid Build Coastguard Worker {
1196*35238bceSAndroid Build Coastguard Worker public:
NoResetNotificationCase(EglTestContext & eglTestCtx,const char * name,const char * description)1197*35238bceSAndroid Build Coastguard Worker     NoResetNotificationCase(EglTestContext &eglTestCtx, const char *name, const char *description)
1198*35238bceSAndroid Build Coastguard Worker         : RobustnessTestCase(eglTestCtx, name, description)
1199*35238bceSAndroid Build Coastguard Worker     {
1200*35238bceSAndroid Build Coastguard Worker     }
1201*35238bceSAndroid Build Coastguard Worker 
iterate(void)1202*35238bceSAndroid Build Coastguard Worker     TestCase::IterateResult iterate(void)
1203*35238bceSAndroid Build Coastguard Worker     {
1204*35238bceSAndroid Build Coastguard Worker         TestLog &log = m_testCtx.getLog();
1205*35238bceSAndroid Build Coastguard Worker 
1206*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message
1207*35238bceSAndroid Build Coastguard Worker             << "Check the reset notification strategy returned by glGetIntegerv() equals GL_NO_RESET_NOTIFICATION\n\n"
1208*35238bceSAndroid Build Coastguard Worker             << tcu::TestLog::EndMessage;
1209*35238bceSAndroid Build Coastguard Worker 
1210*35238bceSAndroid Build Coastguard Worker         const EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION,
1211*35238bceSAndroid Build Coastguard Worker                                      3,
1212*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_MINOR_VERSION_KHR,
1213*35238bceSAndroid Build Coastguard Worker                                      0,
1214*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT,
1215*35238bceSAndroid Build Coastguard Worker                                      EGL_TRUE,
1216*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
1217*35238bceSAndroid Build Coastguard Worker                                      EGL_NO_RESET_NOTIFICATION,
1218*35238bceSAndroid Build Coastguard Worker                                      EGL_NONE};
1219*35238bceSAndroid Build Coastguard Worker 
1220*35238bceSAndroid Build Coastguard Worker         checkRequiredEGLExtensions(attribList);
1221*35238bceSAndroid Build Coastguard Worker 
1222*35238bceSAndroid Build Coastguard Worker         RenderingContext context(m_eglTestCtx, attribList, m_eglConfig, m_eglDisplay, EGL_NO_CONTEXT);
1223*35238bceSAndroid Build Coastguard Worker         context.makeCurrent(m_eglSurface);
1224*35238bceSAndroid Build Coastguard Worker 
1225*35238bceSAndroid Build Coastguard Worker         glw::Functions gl;
1226*35238bceSAndroid Build Coastguard Worker         {
1227*35238bceSAndroid Build Coastguard Worker             const glu::ApiType apiType(3, 0, glu::PROFILE_ES);
1228*35238bceSAndroid Build Coastguard Worker             context.initGLFunctions(&gl, apiType);
1229*35238bceSAndroid Build Coastguard Worker             checkRequiredGLSupport(gl, apiType);
1230*35238bceSAndroid Build Coastguard Worker         }
1231*35238bceSAndroid Build Coastguard Worker 
1232*35238bceSAndroid Build Coastguard Worker         uint8_t robustAccessGL;
1233*35238bceSAndroid Build Coastguard Worker         gl.getBooleanv(GL_CONTEXT_ROBUST_ACCESS_EXT, &robustAccessGL);
1234*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetBooleanv()");
1235*35238bceSAndroid Build Coastguard Worker 
1236*35238bceSAndroid Build Coastguard Worker         glw::GLint reset = 0;
1237*35238bceSAndroid Build Coastguard Worker         gl.getIntegerv(GL_RESET_NOTIFICATION_STRATEGY, &reset);
1238*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv()");
1239*35238bceSAndroid Build Coastguard Worker 
1240*35238bceSAndroid Build Coastguard Worker         if (reset != GL_NO_RESET_NOTIFICATION)
1241*35238bceSAndroid Build Coastguard Worker         {
1242*35238bceSAndroid Build Coastguard Worker             log << tcu::TestLog::Message << "Test failed! glGetIntegerv() returned wrong value. ["
1243*35238bceSAndroid Build Coastguard Worker                 << glu::getErrorStr(reset) << ", expected " << glu::getErrorStr(GL_NO_RESET_NOTIFICATION) << "]"
1244*35238bceSAndroid Build Coastguard Worker                 << tcu::TestLog::EndMessage;
1245*35238bceSAndroid Build Coastguard Worker 
1246*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1247*35238bceSAndroid Build Coastguard Worker             return STOP;
1248*35238bceSAndroid Build Coastguard Worker         }
1249*35238bceSAndroid Build Coastguard Worker 
1250*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, getGraphicsResetStatus());
1251*35238bceSAndroid Build Coastguard Worker 
1252*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1253*35238bceSAndroid Build Coastguard Worker         return STOP;
1254*35238bceSAndroid Build Coastguard Worker     }
1255*35238bceSAndroid Build Coastguard Worker };
1256*35238bceSAndroid Build Coastguard Worker 
1257*35238bceSAndroid Build Coastguard Worker class LoseContextOnResetCase : public RobustnessTestCase
1258*35238bceSAndroid Build Coastguard Worker {
1259*35238bceSAndroid Build Coastguard Worker public:
LoseContextOnResetCase(EglTestContext & eglTestCtx,const char * name,const char * description)1260*35238bceSAndroid Build Coastguard Worker     LoseContextOnResetCase(EglTestContext &eglTestCtx, const char *name, const char *description)
1261*35238bceSAndroid Build Coastguard Worker         : RobustnessTestCase(eglTestCtx, name, description)
1262*35238bceSAndroid Build Coastguard Worker     {
1263*35238bceSAndroid Build Coastguard Worker     }
1264*35238bceSAndroid Build Coastguard Worker 
iterate(void)1265*35238bceSAndroid Build Coastguard Worker     TestCase::IterateResult iterate(void)
1266*35238bceSAndroid Build Coastguard Worker     {
1267*35238bceSAndroid Build Coastguard Worker         TestLog &log = m_testCtx.getLog();
1268*35238bceSAndroid Build Coastguard Worker 
1269*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message
1270*35238bceSAndroid Build Coastguard Worker             << "Check the reset notification strategy returned by glGetIntegerv() equals GL_LOSE_CONTEXT_ON_RESET\n\n"
1271*35238bceSAndroid Build Coastguard Worker             << tcu::TestLog::EndMessage;
1272*35238bceSAndroid Build Coastguard Worker 
1273*35238bceSAndroid Build Coastguard Worker         const EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION,
1274*35238bceSAndroid Build Coastguard Worker                                      3,
1275*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_MINOR_VERSION_KHR,
1276*35238bceSAndroid Build Coastguard Worker                                      0,
1277*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT,
1278*35238bceSAndroid Build Coastguard Worker                                      EGL_TRUE,
1279*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
1280*35238bceSAndroid Build Coastguard Worker                                      EGL_LOSE_CONTEXT_ON_RESET,
1281*35238bceSAndroid Build Coastguard Worker                                      EGL_NONE};
1282*35238bceSAndroid Build Coastguard Worker 
1283*35238bceSAndroid Build Coastguard Worker         checkRequiredEGLExtensions(attribList);
1284*35238bceSAndroid Build Coastguard Worker 
1285*35238bceSAndroid Build Coastguard Worker         RenderingContext context(m_eglTestCtx, attribList, m_eglConfig, m_eglDisplay, EGL_NO_CONTEXT);
1286*35238bceSAndroid Build Coastguard Worker         context.makeCurrent(m_eglSurface);
1287*35238bceSAndroid Build Coastguard Worker 
1288*35238bceSAndroid Build Coastguard Worker         glw::Functions gl;
1289*35238bceSAndroid Build Coastguard Worker         {
1290*35238bceSAndroid Build Coastguard Worker             const glu::ApiType apiType(3, 0, glu::PROFILE_ES);
1291*35238bceSAndroid Build Coastguard Worker             context.initGLFunctions(&gl, apiType);
1292*35238bceSAndroid Build Coastguard Worker             checkRequiredGLSupport(gl, apiType);
1293*35238bceSAndroid Build Coastguard Worker         }
1294*35238bceSAndroid Build Coastguard Worker         glw::GLint reset = 0;
1295*35238bceSAndroid Build Coastguard Worker         gl.getIntegerv(GL_RESET_NOTIFICATION_STRATEGY, &reset);
1296*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv()");
1297*35238bceSAndroid Build Coastguard Worker 
1298*35238bceSAndroid Build Coastguard Worker         if (reset != GL_LOSE_CONTEXT_ON_RESET)
1299*35238bceSAndroid Build Coastguard Worker         {
1300*35238bceSAndroid Build Coastguard Worker             log << tcu::TestLog::Message << "Test failed! glGetIntegerv() returned wrong value. [" << reset
1301*35238bceSAndroid Build Coastguard Worker                 << ", expected " << glu::getErrorStr(GL_LOSE_CONTEXT_ON_RESET) << "]" << tcu::TestLog::EndMessage;
1302*35238bceSAndroid Build Coastguard Worker 
1303*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1304*35238bceSAndroid Build Coastguard Worker             return STOP;
1305*35238bceSAndroid Build Coastguard Worker         }
1306*35238bceSAndroid Build Coastguard Worker 
1307*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << "Check the graphics reset status returned by glGetGraphicsResetStatus() "
1308*35238bceSAndroid Build Coastguard Worker             << "equals GL_NO_ERROR\n"
1309*35238bceSAndroid Build Coastguard Worker             << tcu::TestLog::EndMessage;
1310*35238bceSAndroid Build Coastguard Worker 
1311*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, getGraphicsResetStatus());
1312*35238bceSAndroid Build Coastguard Worker 
1313*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1314*35238bceSAndroid Build Coastguard Worker         return STOP;
1315*35238bceSAndroid Build Coastguard Worker     }
1316*35238bceSAndroid Build Coastguard Worker };
1317*35238bceSAndroid Build Coastguard Worker 
contextResetFactory(const RobustnessTestCase::Params params,glw::Functions & gl,tcu::TestLog & log)1318*35238bceSAndroid Build Coastguard Worker de::SharedPtr<ContextReset> contextResetFactory(const RobustnessTestCase::Params params, glw::Functions &gl,
1319*35238bceSAndroid Build Coastguard Worker                                                 tcu::TestLog &log)
1320*35238bceSAndroid Build Coastguard Worker {
1321*35238bceSAndroid Build Coastguard Worker     if (params.getContextResetType() == CONTEXTRESETTYPE_FIXED_FUNC_OOB)
1322*35238bceSAndroid Build Coastguard Worker         return de::SharedPtr<ContextReset>(new FixedFunctionOOB(gl, log, params.getFixedFunctionType()));
1323*35238bceSAndroid Build Coastguard Worker 
1324*35238bceSAndroid Build Coastguard Worker     if (params.getContextResetType() == CONTEXTRESETTYPE_SHADER_OOB)
1325*35238bceSAndroid Build Coastguard Worker         return de::SharedPtr<ContextReset>(
1326*35238bceSAndroid Build Coastguard Worker             new ShadersOOB(gl, log, params.getShaderType(), params.getResourceType(), params.getReadWriteType()));
1327*35238bceSAndroid Build Coastguard Worker     else
1328*35238bceSAndroid Build Coastguard Worker     {
1329*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unknown context reset type");
1330*35238bceSAndroid Build Coastguard Worker         return de::SharedPtr<ContextReset>(DE_NULL);
1331*35238bceSAndroid Build Coastguard Worker     }
1332*35238bceSAndroid Build Coastguard Worker }
1333*35238bceSAndroid Build Coastguard Worker 
1334*35238bceSAndroid Build Coastguard Worker class ContextResetCase : public RobustnessTestCase
1335*35238bceSAndroid Build Coastguard Worker {
1336*35238bceSAndroid Build Coastguard Worker 
1337*35238bceSAndroid Build Coastguard Worker public:
1338*35238bceSAndroid Build Coastguard Worker     ContextResetCase(EglTestContext &eglTestCtx, const char *name, const char *description, Params params);
~ContextResetCase(void)1339*35238bceSAndroid Build Coastguard Worker     virtual ~ContextResetCase(void)
1340*35238bceSAndroid Build Coastguard Worker     {
1341*35238bceSAndroid Build Coastguard Worker     }
1342*35238bceSAndroid Build Coastguard Worker 
1343*35238bceSAndroid Build Coastguard Worker     virtual void provokeReset(de::SharedPtr<ContextReset> &contextReset) = 0;
1344*35238bceSAndroid Build Coastguard Worker     virtual void waitForReset(de::SharedPtr<ContextReset> &contextReset) = 0;
1345*35238bceSAndroid Build Coastguard Worker     virtual void passAndLog(de::SharedPtr<ContextReset> &contextReset)   = 0;
1346*35238bceSAndroid Build Coastguard Worker 
1347*35238bceSAndroid Build Coastguard Worker     TestCase::IterateResult iterate(void);
1348*35238bceSAndroid Build Coastguard Worker     void execute(glw::Functions &gl);
1349*35238bceSAndroid Build Coastguard Worker 
1350*35238bceSAndroid Build Coastguard Worker private:
1351*35238bceSAndroid Build Coastguard Worker     ContextResetCase(const ContextResetCase &);
1352*35238bceSAndroid Build Coastguard Worker     ContextResetCase &operator=(const ContextResetCase &);
1353*35238bceSAndroid Build Coastguard Worker };
1354*35238bceSAndroid Build Coastguard Worker 
ContextResetCase(EglTestContext & eglTestCtx,const char * name,const char * description,Params params)1355*35238bceSAndroid Build Coastguard Worker ContextResetCase::ContextResetCase(EglTestContext &eglTestCtx, const char *name, const char *description, Params params)
1356*35238bceSAndroid Build Coastguard Worker     : RobustnessTestCase(eglTestCtx, name, description, params)
1357*35238bceSAndroid Build Coastguard Worker {
1358*35238bceSAndroid Build Coastguard Worker }
1359*35238bceSAndroid Build Coastguard Worker 
iterate(void)1360*35238bceSAndroid Build Coastguard Worker TestCase::IterateResult ContextResetCase::iterate(void)
1361*35238bceSAndroid Build Coastguard Worker {
1362*35238bceSAndroid Build Coastguard Worker     glw::Functions gl;
1363*35238bceSAndroid Build Coastguard Worker 
1364*35238bceSAndroid Build Coastguard Worker     const EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION,
1365*35238bceSAndroid Build Coastguard Worker                                  3,
1366*35238bceSAndroid Build Coastguard Worker                                  EGL_CONTEXT_MINOR_VERSION_KHR,
1367*35238bceSAndroid Build Coastguard Worker                                  0,
1368*35238bceSAndroid Build Coastguard Worker                                  EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT,
1369*35238bceSAndroid Build Coastguard Worker                                  (m_params.getRobustAccessType() == ROBUSTACCESS_TRUE) ? EGL_TRUE : EGL_FALSE,
1370*35238bceSAndroid Build Coastguard Worker                                  EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
1371*35238bceSAndroid Build Coastguard Worker                                  EGL_LOSE_CONTEXT_ON_RESET,
1372*35238bceSAndroid Build Coastguard Worker                                  EGL_NONE};
1373*35238bceSAndroid Build Coastguard Worker 
1374*35238bceSAndroid Build Coastguard Worker     checkRequiredEGLExtensions(attribList);
1375*35238bceSAndroid Build Coastguard Worker 
1376*35238bceSAndroid Build Coastguard Worker     RenderingContext context(m_eglTestCtx, attribList, m_eglConfig, m_eglDisplay, EGL_NO_CONTEXT);
1377*35238bceSAndroid Build Coastguard Worker     context.makeCurrent(m_eglSurface);
1378*35238bceSAndroid Build Coastguard Worker 
1379*35238bceSAndroid Build Coastguard Worker     {
1380*35238bceSAndroid Build Coastguard Worker         const glu::ApiType apiType = paramsToApiType(m_params);
1381*35238bceSAndroid Build Coastguard Worker         context.initGLFunctions(&gl, apiType);
1382*35238bceSAndroid Build Coastguard Worker         checkGLSupportForParams(gl, m_params);
1383*35238bceSAndroid Build Coastguard Worker     }
1384*35238bceSAndroid Build Coastguard Worker 
1385*35238bceSAndroid Build Coastguard Worker     execute(gl);
1386*35238bceSAndroid Build Coastguard Worker 
1387*35238bceSAndroid Build Coastguard Worker     return STOP;
1388*35238bceSAndroid Build Coastguard Worker }
1389*35238bceSAndroid Build Coastguard Worker 
execute(glw::Functions & gl)1390*35238bceSAndroid Build Coastguard Worker void ContextResetCase::execute(glw::Functions &gl)
1391*35238bceSAndroid Build Coastguard Worker {
1392*35238bceSAndroid Build Coastguard Worker     de::SharedPtr<ContextReset> contextReset = contextResetFactory(m_params, gl, m_testCtx.getLog());
1393*35238bceSAndroid Build Coastguard Worker     glw::GLboolean isContextRobust           = GL_FALSE;
1394*35238bceSAndroid Build Coastguard Worker 
1395*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, getBooleanv(GL_CONTEXT_ROBUST_ACCESS_EXT, &isContextRobust));
1396*35238bceSAndroid Build Coastguard Worker     provokeReset(contextReset);
1397*35238bceSAndroid Build Coastguard Worker 
1398*35238bceSAndroid Build Coastguard Worker     if (m_params.getContextResetType() == CONTEXTRESETTYPE_SHADER_OOB ||
1399*35238bceSAndroid Build Coastguard Worker         m_params.getContextResetType() == CONTEXTRESETTYPE_FIXED_FUNC_OOB)
1400*35238bceSAndroid Build Coastguard Worker     {
1401*35238bceSAndroid Build Coastguard Worker         try
1402*35238bceSAndroid Build Coastguard Worker         {
1403*35238bceSAndroid Build Coastguard Worker             waitForReset(contextReset);
1404*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Context was NOT lost. Test skipped");
1405*35238bceSAndroid Build Coastguard Worker         }
1406*35238bceSAndroid Build Coastguard Worker         catch (const glu::Error &error)
1407*35238bceSAndroid Build Coastguard Worker         {
1408*35238bceSAndroid Build Coastguard Worker             if (error.getError() == GL_CONTEXT_LOST)
1409*35238bceSAndroid Build Coastguard Worker             {
1410*35238bceSAndroid Build Coastguard Worker                 if (isContextRobust)
1411*35238bceSAndroid Build Coastguard Worker                     m_testCtx.setTestResult(QP_TEST_RESULT_FAIL,
1412*35238bceSAndroid Build Coastguard Worker                                             "No context reset should of occurred GL_CONTEXT_ROBUST_ACCESS == TRUE");
1413*35238bceSAndroid Build Coastguard Worker                 else
1414*35238bceSAndroid Build Coastguard Worker                     passAndLog(contextReset);
1415*35238bceSAndroid Build Coastguard Worker             }
1416*35238bceSAndroid Build Coastguard Worker             else if (isContextRobust)
1417*35238bceSAndroid Build Coastguard Worker                 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got unknown error.");
1418*35238bceSAndroid Build Coastguard Worker             else
1419*35238bceSAndroid Build Coastguard Worker             {
1420*35238bceSAndroid Build Coastguard Worker                 m_testCtx.setTestResult(QP_TEST_RESULT_QUALITY_WARNING,
1421*35238bceSAndroid Build Coastguard Worker                                         "Warning: glGetError() returned wrong value. Expected GL_CONTEXT_LOST");
1422*35238bceSAndroid Build Coastguard Worker 
1423*35238bceSAndroid Build Coastguard Worker                 m_testCtx.getLog() << tcu::TestLog::Message << "Warning: glGetError() returned wrong value ["
1424*35238bceSAndroid Build Coastguard Worker                                    << error.what() << ", expected " << glu::getErrorStr(GL_CONTEXT_LOST) << "]"
1425*35238bceSAndroid Build Coastguard Worker                                    << tcu::TestLog::EndMessage;
1426*35238bceSAndroid Build Coastguard Worker             }
1427*35238bceSAndroid Build Coastguard Worker         }
1428*35238bceSAndroid Build Coastguard Worker     }
1429*35238bceSAndroid Build Coastguard Worker     else
1430*35238bceSAndroid Build Coastguard Worker         DE_FATAL("Unknown context reset type");
1431*35238bceSAndroid Build Coastguard Worker }
1432*35238bceSAndroid Build Coastguard Worker 
1433*35238bceSAndroid Build Coastguard Worker class BasicResetCase : public ContextResetCase
1434*35238bceSAndroid Build Coastguard Worker {
1435*35238bceSAndroid Build Coastguard Worker public:
BasicResetCase(EglTestContext & eglTestCtx,const char * name,const char * description,Params params)1436*35238bceSAndroid Build Coastguard Worker     BasicResetCase(EglTestContext &eglTestCtx, const char *name, const char *description, Params params)
1437*35238bceSAndroid Build Coastguard Worker         : ContextResetCase(eglTestCtx, name, description, params)
1438*35238bceSAndroid Build Coastguard Worker     {
1439*35238bceSAndroid Build Coastguard Worker     }
1440*35238bceSAndroid Build Coastguard Worker 
provokeReset(de::SharedPtr<ContextReset> & contextReset)1441*35238bceSAndroid Build Coastguard Worker     virtual void provokeReset(de::SharedPtr<ContextReset> &contextReset)
1442*35238bceSAndroid Build Coastguard Worker     {
1443*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message
1444*35238bceSAndroid Build Coastguard Worker                            << "Check the graphics reset status returned by glGetGraphicsResetStatus() equals "
1445*35238bceSAndroid Build Coastguard Worker                            << "GL_GUILTY_CONTEXT_RESET after a context reset\n\n"
1446*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndMessage;
1447*35238bceSAndroid Build Coastguard Worker 
1448*35238bceSAndroid Build Coastguard Worker         contextReset->setup();
1449*35238bceSAndroid Build Coastguard Worker         contextReset->draw();
1450*35238bceSAndroid Build Coastguard Worker     }
1451*35238bceSAndroid Build Coastguard Worker 
waitForReset(de::SharedPtr<ContextReset> & contextReset)1452*35238bceSAndroid Build Coastguard Worker     virtual void waitForReset(de::SharedPtr<ContextReset> &contextReset)
1453*35238bceSAndroid Build Coastguard Worker     {
1454*35238bceSAndroid Build Coastguard Worker         contextReset->teardown();
1455*35238bceSAndroid Build Coastguard Worker         contextReset->finish();
1456*35238bceSAndroid Build Coastguard Worker     }
1457*35238bceSAndroid Build Coastguard Worker 
passAndLog(de::SharedPtr<ContextReset> & contextReset)1458*35238bceSAndroid Build Coastguard Worker     virtual void passAndLog(de::SharedPtr<ContextReset> &contextReset)
1459*35238bceSAndroid Build Coastguard Worker     {
1460*35238bceSAndroid Build Coastguard Worker         const glw::GLint status = contextReset->getGraphicsResetStatus();
1461*35238bceSAndroid Build Coastguard Worker 
1462*35238bceSAndroid Build Coastguard Worker         if (status == GL_NO_ERROR)
1463*35238bceSAndroid Build Coastguard Worker         {
1464*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message
1465*35238bceSAndroid Build Coastguard Worker                                << "Test failed! glGetGraphicsResetStatus() returned wrong value ["
1466*35238bceSAndroid Build Coastguard Worker                                << glu::getGraphicsResetStatusStr(status) << ", expected "
1467*35238bceSAndroid Build Coastguard Worker                                << glu::getGraphicsResetStatusStr(GL_GUILTY_CONTEXT_RESET) << "]"
1468*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::EndMessage;
1469*35238bceSAndroid Build Coastguard Worker 
1470*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1471*35238bceSAndroid Build Coastguard Worker         }
1472*35238bceSAndroid Build Coastguard Worker         else
1473*35238bceSAndroid Build Coastguard Worker         {
1474*35238bceSAndroid Build Coastguard Worker             if (contextReset->getError() != GL_NO_ERROR)
1475*35238bceSAndroid Build Coastguard Worker                 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL,
1476*35238bceSAndroid Build Coastguard Worker                                         "Error flag not reset after calling getGraphicsResetStatus()");
1477*35238bceSAndroid Build Coastguard Worker             else
1478*35238bceSAndroid Build Coastguard Worker                 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1479*35238bceSAndroid Build Coastguard Worker         }
1480*35238bceSAndroid Build Coastguard Worker     }
1481*35238bceSAndroid Build Coastguard Worker };
1482*35238bceSAndroid Build Coastguard Worker 
1483*35238bceSAndroid Build Coastguard Worker class InvalidShareContextCase : public RobustnessTestCase
1484*35238bceSAndroid Build Coastguard Worker {
1485*35238bceSAndroid Build Coastguard Worker public:
InvalidShareContextCase(EglTestContext & eglTestCtx,const char * name,const char * description)1486*35238bceSAndroid Build Coastguard Worker     InvalidShareContextCase(EglTestContext &eglTestCtx, const char *name, const char *description)
1487*35238bceSAndroid Build Coastguard Worker         : RobustnessTestCase(eglTestCtx, name, description)
1488*35238bceSAndroid Build Coastguard Worker     {
1489*35238bceSAndroid Build Coastguard Worker     }
1490*35238bceSAndroid Build Coastguard Worker 
iterate(void)1491*35238bceSAndroid Build Coastguard Worker     TestCase::IterateResult iterate(void)
1492*35238bceSAndroid Build Coastguard Worker     {
1493*35238bceSAndroid Build Coastguard Worker         TestLog &log       = m_testCtx.getLog();
1494*35238bceSAndroid Build Coastguard Worker         const Library &egl = m_eglTestCtx.getLibrary();
1495*35238bceSAndroid Build Coastguard Worker         bool isOk          = true;
1496*35238bceSAndroid Build Coastguard Worker 
1497*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message
1498*35238bceSAndroid Build Coastguard Worker             << "EGL_BAD_MATCH is generated if reset notification strategies do not match when creating shared "
1499*35238bceSAndroid Build Coastguard Worker                "contexts\n\n"
1500*35238bceSAndroid Build Coastguard Worker             << tcu::TestLog::EndMessage;
1501*35238bceSAndroid Build Coastguard Worker 
1502*35238bceSAndroid Build Coastguard Worker         const EGLint attribListA[] = {EGL_CONTEXT_CLIENT_VERSION,
1503*35238bceSAndroid Build Coastguard Worker                                       3,
1504*35238bceSAndroid Build Coastguard Worker                                       EGL_CONTEXT_MINOR_VERSION_KHR,
1505*35238bceSAndroid Build Coastguard Worker                                       0,
1506*35238bceSAndroid Build Coastguard Worker                                       EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT,
1507*35238bceSAndroid Build Coastguard Worker                                       EGL_TRUE,
1508*35238bceSAndroid Build Coastguard Worker                                       EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
1509*35238bceSAndroid Build Coastguard Worker                                       EGL_NO_RESET_NOTIFICATION,
1510*35238bceSAndroid Build Coastguard Worker                                       EGL_NONE};
1511*35238bceSAndroid Build Coastguard Worker 
1512*35238bceSAndroid Build Coastguard Worker         const EGLint attribListB[] = {EGL_CONTEXT_CLIENT_VERSION,
1513*35238bceSAndroid Build Coastguard Worker                                       3,
1514*35238bceSAndroid Build Coastguard Worker                                       EGL_CONTEXT_MINOR_VERSION_KHR,
1515*35238bceSAndroid Build Coastguard Worker                                       0,
1516*35238bceSAndroid Build Coastguard Worker                                       EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT,
1517*35238bceSAndroid Build Coastguard Worker                                       EGL_TRUE,
1518*35238bceSAndroid Build Coastguard Worker                                       EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
1519*35238bceSAndroid Build Coastguard Worker                                       EGL_LOSE_CONTEXT_ON_RESET,
1520*35238bceSAndroid Build Coastguard Worker                                       EGL_NONE};
1521*35238bceSAndroid Build Coastguard Worker 
1522*35238bceSAndroid Build Coastguard Worker         checkRequiredEGLExtensions(attribListA);
1523*35238bceSAndroid Build Coastguard Worker 
1524*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << "Create context A (share_context = EGL_NO_CONTEXT)" << tcu::TestLog::EndMessage;
1525*35238bceSAndroid Build Coastguard Worker         RenderingContext contextA(m_eglTestCtx, attribListA, m_eglConfig, m_eglDisplay, EGL_NO_CONTEXT);
1526*35238bceSAndroid Build Coastguard Worker 
1527*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << "Create context B (share_context = context A)" << tcu::TestLog::EndMessage;
1528*35238bceSAndroid Build Coastguard Worker         logAttribList(m_eglTestCtx, attribListB);
1529*35238bceSAndroid Build Coastguard Worker 
1530*35238bceSAndroid Build Coastguard Worker         EGLContext contextB = egl.createContext(m_eglDisplay, m_eglConfig, contextA.getContext(), attribListB);
1531*35238bceSAndroid Build Coastguard Worker 
1532*35238bceSAndroid Build Coastguard Worker         const EGLenum error = egl.getError();
1533*35238bceSAndroid Build Coastguard Worker         if (error != EGL_BAD_MATCH)
1534*35238bceSAndroid Build Coastguard Worker         {
1535*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Test failed! eglCreateContext() returned with error ["
1536*35238bceSAndroid Build Coastguard Worker                 << eglu::getErrorStr(error) << ", expected " << eglu::getErrorStr(EGL_BAD_MATCH) << "]"
1537*35238bceSAndroid Build Coastguard Worker                 << TestLog::EndMessage;
1538*35238bceSAndroid Build Coastguard Worker 
1539*35238bceSAndroid Build Coastguard Worker             isOk = false;
1540*35238bceSAndroid Build Coastguard Worker         }
1541*35238bceSAndroid Build Coastguard Worker 
1542*35238bceSAndroid Build Coastguard Worker         if (contextB != EGL_NO_CONTEXT)
1543*35238bceSAndroid Build Coastguard Worker             egl.destroyContext(m_eglDisplay, contextB);
1544*35238bceSAndroid Build Coastguard Worker 
1545*35238bceSAndroid Build Coastguard Worker         if (isOk)
1546*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1547*35238bceSAndroid Build Coastguard Worker         else
1548*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1549*35238bceSAndroid Build Coastguard Worker 
1550*35238bceSAndroid Build Coastguard Worker         return STOP;
1551*35238bceSAndroid Build Coastguard Worker     }
1552*35238bceSAndroid Build Coastguard Worker };
1553*35238bceSAndroid Build Coastguard Worker 
1554*35238bceSAndroid Build Coastguard Worker class InvalidNotificationEnumCase : public RobustnessTestCase
1555*35238bceSAndroid Build Coastguard Worker {
1556*35238bceSAndroid Build Coastguard Worker public:
InvalidNotificationEnumCase(EglTestContext & eglTestCtx,const char * name,const char * description)1557*35238bceSAndroid Build Coastguard Worker     InvalidNotificationEnumCase(EglTestContext &eglTestCtx, const char *name, const char *description)
1558*35238bceSAndroid Build Coastguard Worker         : RobustnessTestCase(eglTestCtx, name, description)
1559*35238bceSAndroid Build Coastguard Worker     {
1560*35238bceSAndroid Build Coastguard Worker     }
1561*35238bceSAndroid Build Coastguard Worker 
iterate(void)1562*35238bceSAndroid Build Coastguard Worker     TestCase::IterateResult iterate(void)
1563*35238bceSAndroid Build Coastguard Worker     {
1564*35238bceSAndroid Build Coastguard Worker         TestLog &log       = m_testCtx.getLog();
1565*35238bceSAndroid Build Coastguard Worker         const Library &egl = m_eglTestCtx.getLibrary();
1566*35238bceSAndroid Build Coastguard Worker         bool isOk          = true;
1567*35238bceSAndroid Build Coastguard Worker 
1568*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message
1569*35238bceSAndroid Build Coastguard Worker             << "EGL_BAD_ATTRIBUTE is generated if EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR is used with EGL "
1570*35238bceSAndroid Build Coastguard Worker                "versions <= 1.4\n\n"
1571*35238bceSAndroid Build Coastguard Worker             << tcu::TestLog::EndMessage;
1572*35238bceSAndroid Build Coastguard Worker 
1573*35238bceSAndroid Build Coastguard Worker         const EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION,
1574*35238bceSAndroid Build Coastguard Worker                                      3,
1575*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_MINOR_VERSION_KHR,
1576*35238bceSAndroid Build Coastguard Worker                                      1,
1577*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR,
1578*35238bceSAndroid Build Coastguard Worker                                      EGL_NO_RESET_NOTIFICATION,
1579*35238bceSAndroid Build Coastguard Worker                                      EGL_NONE};
1580*35238bceSAndroid Build Coastguard Worker 
1581*35238bceSAndroid Build Coastguard Worker         if (eglu::getVersion(egl, m_eglDisplay) >= eglu::Version(1, 5))
1582*35238bceSAndroid Build Coastguard Worker         {
1583*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Test requires EGL version to be under 1.5");
1584*35238bceSAndroid Build Coastguard Worker             return STOP;
1585*35238bceSAndroid Build Coastguard Worker         }
1586*35238bceSAndroid Build Coastguard Worker 
1587*35238bceSAndroid Build Coastguard Worker         logAttribList(m_eglTestCtx, attribList);
1588*35238bceSAndroid Build Coastguard Worker         EGLContext context = egl.createContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, attribList);
1589*35238bceSAndroid Build Coastguard Worker 
1590*35238bceSAndroid Build Coastguard Worker         const EGLenum error = egl.getError();
1591*35238bceSAndroid Build Coastguard Worker         if (error != EGL_BAD_ATTRIBUTE)
1592*35238bceSAndroid Build Coastguard Worker         {
1593*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Test failed! eglCreateContext() returned with error ["
1594*35238bceSAndroid Build Coastguard Worker                 << eglu::getErrorStr(error) << ", expected " << eglu::getErrorStr(EGL_BAD_ATTRIBUTE) << "]"
1595*35238bceSAndroid Build Coastguard Worker                 << TestLog::EndMessage;
1596*35238bceSAndroid Build Coastguard Worker 
1597*35238bceSAndroid Build Coastguard Worker             isOk = false;
1598*35238bceSAndroid Build Coastguard Worker         }
1599*35238bceSAndroid Build Coastguard Worker 
1600*35238bceSAndroid Build Coastguard Worker         if (context != EGL_NO_CONTEXT)
1601*35238bceSAndroid Build Coastguard Worker             egl.destroyContext(m_eglDisplay, context);
1602*35238bceSAndroid Build Coastguard Worker 
1603*35238bceSAndroid Build Coastguard Worker         if (isOk)
1604*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1605*35238bceSAndroid Build Coastguard Worker         else
1606*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1607*35238bceSAndroid Build Coastguard Worker 
1608*35238bceSAndroid Build Coastguard Worker         return STOP;
1609*35238bceSAndroid Build Coastguard Worker     }
1610*35238bceSAndroid Build Coastguard Worker };
1611*35238bceSAndroid Build Coastguard Worker 
1612*35238bceSAndroid Build Coastguard Worker class InvalidContextCase : public RobustnessTestCase
1613*35238bceSAndroid Build Coastguard Worker {
1614*35238bceSAndroid Build Coastguard Worker public:
InvalidContextCase(EglTestContext & eglTestCtx,const char * name,const char * description)1615*35238bceSAndroid Build Coastguard Worker     InvalidContextCase(EglTestContext &eglTestCtx, const char *name, const char *description)
1616*35238bceSAndroid Build Coastguard Worker         : RobustnessTestCase(eglTestCtx, name, description)
1617*35238bceSAndroid Build Coastguard Worker     {
1618*35238bceSAndroid Build Coastguard Worker     }
1619*35238bceSAndroid Build Coastguard Worker 
iterate(void)1620*35238bceSAndroid Build Coastguard Worker     TestCase::IterateResult iterate(void)
1621*35238bceSAndroid Build Coastguard Worker     {
1622*35238bceSAndroid Build Coastguard Worker         const Library &egl = m_eglTestCtx.getLibrary();
1623*35238bceSAndroid Build Coastguard Worker         TestLog &log       = m_testCtx.getLog();
1624*35238bceSAndroid Build Coastguard Worker         bool isOk          = true;
1625*35238bceSAndroid Build Coastguard Worker 
1626*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message
1627*35238bceSAndroid Build Coastguard Worker             << "EGL_BAD_ATTRIBUTE is generated if EXT_create_context_robustness is NOT supported but "
1628*35238bceSAndroid Build Coastguard Worker                "EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT is specified\n\n"
1629*35238bceSAndroid Build Coastguard Worker             << tcu::TestLog::EndMessage;
1630*35238bceSAndroid Build Coastguard Worker 
1631*35238bceSAndroid Build Coastguard Worker         const EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION,
1632*35238bceSAndroid Build Coastguard Worker                                      3,
1633*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_MINOR_VERSION_KHR,
1634*35238bceSAndroid Build Coastguard Worker                                      0,
1635*35238bceSAndroid Build Coastguard Worker                                      EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
1636*35238bceSAndroid Build Coastguard Worker                                      EGL_LOSE_CONTEXT_ON_RESET,
1637*35238bceSAndroid Build Coastguard Worker                                      EGL_NONE};
1638*35238bceSAndroid Build Coastguard Worker 
1639*35238bceSAndroid Build Coastguard Worker         if (eglu::hasExtension(egl, m_eglDisplay, "EGL_EXT_create_context_robustness"))
1640*35238bceSAndroid Build Coastguard Worker         {
1641*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED,
1642*35238bceSAndroid Build Coastguard Worker                                     "Test requires EGL_EXT_create_context_robustness to be unsupported");
1643*35238bceSAndroid Build Coastguard Worker             return STOP;
1644*35238bceSAndroid Build Coastguard Worker         }
1645*35238bceSAndroid Build Coastguard Worker 
1646*35238bceSAndroid Build Coastguard Worker         logAttribList(m_eglTestCtx, attribList);
1647*35238bceSAndroid Build Coastguard Worker         EGLContext context = egl.createContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, attribList);
1648*35238bceSAndroid Build Coastguard Worker 
1649*35238bceSAndroid Build Coastguard Worker         const EGLenum error = egl.getError();
1650*35238bceSAndroid Build Coastguard Worker         if (error != EGL_BAD_ATTRIBUTE)
1651*35238bceSAndroid Build Coastguard Worker         {
1652*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Test failed! eglCreateContext() returned with error ["
1653*35238bceSAndroid Build Coastguard Worker                 << eglu::getErrorStr(error) << ", expected " << eglu::getErrorStr(EGL_BAD_ATTRIBUTE) << "]"
1654*35238bceSAndroid Build Coastguard Worker                 << TestLog::EndMessage;
1655*35238bceSAndroid Build Coastguard Worker 
1656*35238bceSAndroid Build Coastguard Worker             isOk = false;
1657*35238bceSAndroid Build Coastguard Worker         }
1658*35238bceSAndroid Build Coastguard Worker 
1659*35238bceSAndroid Build Coastguard Worker         if (context != EGL_NO_CONTEXT)
1660*35238bceSAndroid Build Coastguard Worker             egl.destroyContext(m_eglDisplay, context);
1661*35238bceSAndroid Build Coastguard Worker 
1662*35238bceSAndroid Build Coastguard Worker         if (isOk)
1663*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1664*35238bceSAndroid Build Coastguard Worker         else
1665*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1666*35238bceSAndroid Build Coastguard Worker 
1667*35238bceSAndroid Build Coastguard Worker         return STOP;
1668*35238bceSAndroid Build Coastguard Worker     }
1669*35238bceSAndroid Build Coastguard Worker };
1670*35238bceSAndroid Build Coastguard Worker 
1671*35238bceSAndroid Build Coastguard Worker } // namespace
1672*35238bceSAndroid Build Coastguard Worker 
1673*35238bceSAndroid Build Coastguard Worker // Note: Tests limited to openGLES 3.1 contexts only
createRobustnessTests(EglTestContext & eglTestCtx)1674*35238bceSAndroid Build Coastguard Worker TestCaseGroup *createRobustnessTests(EglTestContext &eglTestCtx)
1675*35238bceSAndroid Build Coastguard Worker {
1676*35238bceSAndroid Build Coastguard Worker     de::MovePtr<TestCaseGroup> group(new TestCaseGroup(eglTestCtx, "robustness", "KHR_robustness tests"));
1677*35238bceSAndroid Build Coastguard Worker 
1678*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *const contextCreationTestGroup =
1679*35238bceSAndroid Build Coastguard Worker         new TestCaseGroup(eglTestCtx, "create_context", "Test valid context_creation attributes");
1680*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *const contextResetTestGroup =
1681*35238bceSAndroid Build Coastguard Worker         new TestCaseGroup(eglTestCtx, "reset_context", "Test context resets scenarios");
1682*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *const negativeContextTestGroup =
1683*35238bceSAndroid Build Coastguard Worker         new TestCaseGroup(eglTestCtx, "negative_context", "Test invalid context creation attributes");
1684*35238bceSAndroid Build Coastguard Worker 
1685*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *const shadersTestGroup =
1686*35238bceSAndroid Build Coastguard Worker         new TestCaseGroup(eglTestCtx, "shaders", "Shader specific context reset tests");
1687*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *const fixedFunctionTestGroup = new TestCaseGroup(
1688*35238bceSAndroid Build Coastguard Worker         eglTestCtx, "fixed_function_pipeline", "Fixed function pipeline context reset tests with robust context");
1689*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *const fixedFunctionNonRobustTestGroup =
1690*35238bceSAndroid Build Coastguard Worker         new TestCaseGroup(eglTestCtx, "fixed_function_pipeline_non_robust",
1691*35238bceSAndroid Build Coastguard Worker                           "Fixed function pipeline context reset tests with non-robust context");
1692*35238bceSAndroid Build Coastguard Worker 
1693*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *const outOfBoundsTestGroup =
1694*35238bceSAndroid Build Coastguard Worker         new TestCaseGroup(eglTestCtx, "out_of_bounds", "Out of bounds access scenarios with robust context");
1695*35238bceSAndroid Build Coastguard Worker 
1696*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *const outOfBoundsNonRobustTestGroup = new TestCaseGroup(
1697*35238bceSAndroid Build Coastguard Worker         eglTestCtx, "out_of_bounds_non_robust", "Out of bounds access scenarios with non-robust context");
1698*35238bceSAndroid Build Coastguard Worker 
1699*35238bceSAndroid Build Coastguard Worker     const string resetScenarioDescription = "query error states and reset notifications";
1700*35238bceSAndroid Build Coastguard Worker 
1701*35238bceSAndroid Build Coastguard Worker     // out-of-bounds test cases
1702*35238bceSAndroid Build Coastguard Worker     {
1703*35238bceSAndroid Build Coastguard Worker         // robust context
1704*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const uboReadArrayResetTestGroup =
1705*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "uniform_block", "Uniform Block Accesses");
1706*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const uboWriteArrayResetTestGroup =
1707*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "uniform_block", "Uniform Block Accesses");
1708*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const ssboWriteArrayResetTestGroup =
1709*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "shader_storage_block", "Shader Storage Block accesses");
1710*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const ssboReadArrayResetTestGroup =
1711*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "shader_storage_block", "Shader Storage Block accesses");
1712*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const localWriteArrayResetTestGroup =
1713*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "local_array", "Local array accesses");
1714*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const localReadArrayResetTestGroup =
1715*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "local_array", "Local array accesses");
1716*35238bceSAndroid Build Coastguard Worker 
1717*35238bceSAndroid Build Coastguard Worker         // non-robust context (internal use only)
1718*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const uboReadArrayResetNonRobustTestGroup =
1719*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "uniform_block", "Uniform Block Accesses");
1720*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const uboWriteArrayResetNonRobustTestGroup =
1721*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "uniform_block", "Uniform Block Accesses");
1722*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const ssboWriteArrayResetNonRobustTestGroup =
1723*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "shader_storage_block", "Shader Storage Block accesses");
1724*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const ssboReadArrayResetNonRobustTestGroup =
1725*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "shader_storage_block", "Shader Storage Block accesses");
1726*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const localWriteArrayResetNonRobustTestGroup =
1727*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "local_array", "Local array accesses");
1728*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const localReadArrayResetNonRobustTestGroup =
1729*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "local_array", "Local array accesses");
1730*35238bceSAndroid Build Coastguard Worker 
1731*35238bceSAndroid Build Coastguard Worker         static const RobustnessTestCase::Params s_outOfBoundReadCases[] = {
1732*35238bceSAndroid Build Coastguard Worker             // ubo read only
1733*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_TRUE,
1734*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_UBO,
1735*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1736*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ", ROBUSTACCESS_TRUE,
1737*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG, RESOURCETYPE_UBO,
1738*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1739*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1740*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_TRUE,
1741*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_UBO, READWRITETYPE_READ),
1742*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_TRUE,
1743*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_UBO,
1744*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1745*35238bceSAndroid Build Coastguard Worker 
1746*35238bceSAndroid Build Coastguard Worker             // ssbo read only
1747*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_TRUE,
1748*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_SSBO,
1749*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1750*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ", ROBUSTACCESS_TRUE,
1751*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG, RESOURCETYPE_SSBO,
1752*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1753*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1754*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_TRUE,
1755*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_SSBO, READWRITETYPE_READ),
1756*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_TRUE,
1757*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_SSBO,
1758*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1759*35238bceSAndroid Build Coastguard Worker 
1760*35238bceSAndroid Build Coastguard Worker             // local array read only
1761*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_TRUE,
1762*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_LOCAL_ARRAY,
1763*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1764*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ", ROBUSTACCESS_TRUE,
1765*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG, RESOURCETYPE_LOCAL_ARRAY,
1766*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1767*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1768*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_TRUE,
1769*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_LOCAL_ARRAY, READWRITETYPE_READ),
1770*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_TRUE,
1771*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_LOCAL_ARRAY,
1772*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1773*35238bceSAndroid Build Coastguard Worker 
1774*35238bceSAndroid Build Coastguard Worker             // ubo read only (non-robust)
1775*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_FALSE,
1776*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_UBO,
1777*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1778*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ",
1779*35238bceSAndroid Build Coastguard Worker                                        ROBUSTACCESS_FALSE, CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG,
1780*35238bceSAndroid Build Coastguard Worker                                        RESOURCETYPE_UBO, READWRITETYPE_READ),
1781*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1782*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_FALSE,
1783*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_UBO, READWRITETYPE_READ),
1784*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_FALSE,
1785*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_UBO,
1786*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1787*35238bceSAndroid Build Coastguard Worker 
1788*35238bceSAndroid Build Coastguard Worker             // ssbo read only (non-robust)
1789*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_FALSE,
1790*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_SSBO,
1791*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1792*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ",
1793*35238bceSAndroid Build Coastguard Worker                                        ROBUSTACCESS_FALSE, CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG,
1794*35238bceSAndroid Build Coastguard Worker                                        RESOURCETYPE_SSBO, READWRITETYPE_READ),
1795*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1796*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_FALSE,
1797*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_SSBO, READWRITETYPE_READ),
1798*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_FALSE,
1799*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_SSBO,
1800*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1801*35238bceSAndroid Build Coastguard Worker 
1802*35238bceSAndroid Build Coastguard Worker             // local array read only (non-robust)
1803*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_FALSE,
1804*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_LOCAL_ARRAY,
1805*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1806*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ",
1807*35238bceSAndroid Build Coastguard Worker                                        ROBUSTACCESS_FALSE, CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG,
1808*35238bceSAndroid Build Coastguard Worker                                        RESOURCETYPE_LOCAL_ARRAY, READWRITETYPE_READ),
1809*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1810*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_FALSE,
1811*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_LOCAL_ARRAY, READWRITETYPE_READ),
1812*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_FALSE,
1813*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_LOCAL_ARRAY,
1814*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_READ),
1815*35238bceSAndroid Build Coastguard Worker         };
1816*35238bceSAndroid Build Coastguard Worker 
1817*35238bceSAndroid Build Coastguard Worker         for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(s_outOfBoundReadCases); ++testNdx)
1818*35238bceSAndroid Build Coastguard Worker         {
1819*35238bceSAndroid Build Coastguard Worker             const RobustnessTestCase::Params &test = s_outOfBoundReadCases[testNdx];
1820*35238bceSAndroid Build Coastguard Worker 
1821*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_UBO && test.getRobustAccessType() == ROBUSTACCESS_TRUE)
1822*35238bceSAndroid Build Coastguard Worker                 uboReadArrayResetTestGroup->addChild(
1823*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1824*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1825*35238bceSAndroid Build Coastguard Worker 
1826*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_UBO && test.getRobustAccessType() == ROBUSTACCESS_FALSE)
1827*35238bceSAndroid Build Coastguard Worker                 uboReadArrayResetNonRobustTestGroup->addChild(
1828*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1829*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1830*35238bceSAndroid Build Coastguard Worker 
1831*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_SSBO && test.getRobustAccessType() == ROBUSTACCESS_TRUE)
1832*35238bceSAndroid Build Coastguard Worker                 ssboReadArrayResetTestGroup->addChild(
1833*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1834*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1835*35238bceSAndroid Build Coastguard Worker 
1836*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_SSBO && test.getRobustAccessType() == ROBUSTACCESS_FALSE)
1837*35238bceSAndroid Build Coastguard Worker                 ssboReadArrayResetNonRobustTestGroup->addChild(
1838*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1839*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1840*35238bceSAndroid Build Coastguard Worker 
1841*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_LOCAL_ARRAY && test.getRobustAccessType() == ROBUSTACCESS_TRUE)
1842*35238bceSAndroid Build Coastguard Worker                 localReadArrayResetTestGroup->addChild(
1843*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1844*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1845*35238bceSAndroid Build Coastguard Worker 
1846*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_LOCAL_ARRAY && test.getRobustAccessType() == ROBUSTACCESS_FALSE)
1847*35238bceSAndroid Build Coastguard Worker                 localReadArrayResetNonRobustTestGroup->addChild(
1848*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1849*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1850*35238bceSAndroid Build Coastguard Worker         }
1851*35238bceSAndroid Build Coastguard Worker 
1852*35238bceSAndroid Build Coastguard Worker         static const RobustnessTestCase::Params s_outOfBoundWriteCases[] = {
1853*35238bceSAndroid Build Coastguard Worker             // ubo write only
1854*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_TRUE,
1855*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_UBO,
1856*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1857*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ", ROBUSTACCESS_TRUE,
1858*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG, RESOURCETYPE_UBO,
1859*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1860*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1861*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_TRUE,
1862*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_UBO, READWRITETYPE_WRITE),
1863*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_TRUE,
1864*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_UBO,
1865*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1866*35238bceSAndroid Build Coastguard Worker 
1867*35238bceSAndroid Build Coastguard Worker             // ssbo write only
1868*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_TRUE,
1869*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_SSBO,
1870*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1871*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ", ROBUSTACCESS_TRUE,
1872*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG, RESOURCETYPE_SSBO,
1873*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1874*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1875*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_TRUE,
1876*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_SSBO, READWRITETYPE_WRITE),
1877*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_TRUE,
1878*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_SSBO,
1879*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1880*35238bceSAndroid Build Coastguard Worker 
1881*35238bceSAndroid Build Coastguard Worker             // local array write only
1882*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_TRUE,
1883*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_LOCAL_ARRAY,
1884*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1885*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ", ROBUSTACCESS_TRUE,
1886*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG, RESOURCETYPE_LOCAL_ARRAY,
1887*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1888*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1889*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_TRUE,
1890*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_LOCAL_ARRAY, READWRITETYPE_WRITE),
1891*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_TRUE,
1892*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_LOCAL_ARRAY,
1893*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1894*35238bceSAndroid Build Coastguard Worker 
1895*35238bceSAndroid Build Coastguard Worker             // ubo write only (non-robust)
1896*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_FALSE,
1897*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_UBO,
1898*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1899*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ",
1900*35238bceSAndroid Build Coastguard Worker                                        ROBUSTACCESS_FALSE, CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG,
1901*35238bceSAndroid Build Coastguard Worker                                        RESOURCETYPE_UBO, READWRITETYPE_WRITE),
1902*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1903*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_FALSE,
1904*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_UBO, READWRITETYPE_WRITE),
1905*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_FALSE,
1906*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_UBO,
1907*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1908*35238bceSAndroid Build Coastguard Worker 
1909*35238bceSAndroid Build Coastguard Worker             // ssbo write only (non-robust)
1910*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_FALSE,
1911*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_SSBO,
1912*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1913*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ",
1914*35238bceSAndroid Build Coastguard Worker                                        ROBUSTACCESS_FALSE, CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG,
1915*35238bceSAndroid Build Coastguard Worker                                        RESOURCETYPE_SSBO, READWRITETYPE_WRITE),
1916*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1917*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_FALSE,
1918*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_SSBO, READWRITETYPE_WRITE),
1919*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_FALSE,
1920*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_SSBO,
1921*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1922*35238bceSAndroid Build Coastguard Worker 
1923*35238bceSAndroid Build Coastguard Worker             // local array write only (non-robust)
1924*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex", "Provoke a context reset in vertex shader and ", ROBUSTACCESS_FALSE,
1925*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT, RESOURCETYPE_LOCAL_ARRAY,
1926*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1927*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("fragment", "Provoke a context reset in fragment shader and ",
1928*35238bceSAndroid Build Coastguard Worker                                        ROBUSTACCESS_FALSE, CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_FRAG,
1929*35238bceSAndroid Build Coastguard Worker                                        RESOURCETYPE_LOCAL_ARRAY, READWRITETYPE_WRITE),
1930*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params(
1931*35238bceSAndroid Build Coastguard Worker                 "vertex_and_fragment", "Provoke a context reset in vertex and fragment shader and ", ROBUSTACCESS_FALSE,
1932*35238bceSAndroid Build Coastguard Worker                 CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_VERT_AND_FRAG, RESOURCETYPE_LOCAL_ARRAY, READWRITETYPE_WRITE),
1933*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("compute", "Provoke a context reset in compute shader and ", ROBUSTACCESS_FALSE,
1934*35238bceSAndroid Build Coastguard Worker                                        CONTEXTRESETTYPE_SHADER_OOB, SHADERTYPE_COMPUTE, RESOURCETYPE_LOCAL_ARRAY,
1935*35238bceSAndroid Build Coastguard Worker                                        READWRITETYPE_WRITE),
1936*35238bceSAndroid Build Coastguard Worker         };
1937*35238bceSAndroid Build Coastguard Worker 
1938*35238bceSAndroid Build Coastguard Worker         for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(s_outOfBoundWriteCases); ++testNdx)
1939*35238bceSAndroid Build Coastguard Worker         {
1940*35238bceSAndroid Build Coastguard Worker             const RobustnessTestCase::Params &test = s_outOfBoundWriteCases[testNdx];
1941*35238bceSAndroid Build Coastguard Worker 
1942*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_UBO && test.getRobustAccessType() == ROBUSTACCESS_TRUE)
1943*35238bceSAndroid Build Coastguard Worker                 uboWriteArrayResetTestGroup->addChild(
1944*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1945*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1946*35238bceSAndroid Build Coastguard Worker 
1947*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_UBO && test.getRobustAccessType() == ROBUSTACCESS_FALSE)
1948*35238bceSAndroid Build Coastguard Worker                 uboWriteArrayResetNonRobustTestGroup->addChild(
1949*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1950*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1951*35238bceSAndroid Build Coastguard Worker 
1952*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_SSBO && test.getRobustAccessType() == ROBUSTACCESS_TRUE)
1953*35238bceSAndroid Build Coastguard Worker                 ssboWriteArrayResetTestGroup->addChild(
1954*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1955*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1956*35238bceSAndroid Build Coastguard Worker 
1957*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_SSBO && test.getRobustAccessType() == ROBUSTACCESS_FALSE)
1958*35238bceSAndroid Build Coastguard Worker                 ssboWriteArrayResetNonRobustTestGroup->addChild(
1959*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1960*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1961*35238bceSAndroid Build Coastguard Worker 
1962*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_LOCAL_ARRAY && test.getRobustAccessType() == ROBUSTACCESS_TRUE)
1963*35238bceSAndroid Build Coastguard Worker                 localWriteArrayResetTestGroup->addChild(
1964*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1965*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1966*35238bceSAndroid Build Coastguard Worker 
1967*35238bceSAndroid Build Coastguard Worker             if (test.getResourceType() == RESOURCETYPE_LOCAL_ARRAY && test.getRobustAccessType() == ROBUSTACCESS_FALSE)
1968*35238bceSAndroid Build Coastguard Worker                 localWriteArrayResetNonRobustTestGroup->addChild(
1969*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(),
1970*35238bceSAndroid Build Coastguard Worker                                        (test.getDescription() + resetScenarioDescription).c_str(), test));
1971*35238bceSAndroid Build Coastguard Worker         }
1972*35238bceSAndroid Build Coastguard Worker 
1973*35238bceSAndroid Build Coastguard Worker         // robust Context
1974*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const outOfBoundsResetReadAccessTestGroup =
1975*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "reads", "Out of bounds read accesses");
1976*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const outOfBoundsResetWriteAccessTestGroup =
1977*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "writes", "Out of bounds write accesses");
1978*35238bceSAndroid Build Coastguard Worker 
1979*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetReadAccessTestGroup->addChild(uboReadArrayResetTestGroup);
1980*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetReadAccessTestGroup->addChild(ssboReadArrayResetTestGroup);
1981*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetReadAccessTestGroup->addChild(localReadArrayResetTestGroup);
1982*35238bceSAndroid Build Coastguard Worker 
1983*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetWriteAccessTestGroup->addChild(uboWriteArrayResetTestGroup);
1984*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetWriteAccessTestGroup->addChild(ssboWriteArrayResetTestGroup);
1985*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetWriteAccessTestGroup->addChild(localWriteArrayResetTestGroup);
1986*35238bceSAndroid Build Coastguard Worker 
1987*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const outOfBoundsResetTestGroup = new TestCaseGroup(
1988*35238bceSAndroid Build Coastguard Worker             eglTestCtx, "reset_status", "Tests that query the reset status after a context reset has occurred");
1989*35238bceSAndroid Build Coastguard Worker 
1990*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetTestGroup->addChild(outOfBoundsResetReadAccessTestGroup);
1991*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetTestGroup->addChild(outOfBoundsResetWriteAccessTestGroup);
1992*35238bceSAndroid Build Coastguard Worker 
1993*35238bceSAndroid Build Coastguard Worker         outOfBoundsTestGroup->addChild(outOfBoundsResetTestGroup);
1994*35238bceSAndroid Build Coastguard Worker 
1995*35238bceSAndroid Build Coastguard Worker         // non-robust Context (internal use only)
1996*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const outOfBoundsResetReadAccessNonRobustTestGroup =
1997*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "reads", "Out of bounds read accesses");
1998*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const outOfBoundsResetWriteAccessNonRobustTestGroup =
1999*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(eglTestCtx, "writes", "Out of bounds write accesses");
2000*35238bceSAndroid Build Coastguard Worker 
2001*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetReadAccessNonRobustTestGroup->addChild(uboReadArrayResetNonRobustTestGroup);
2002*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetReadAccessNonRobustTestGroup->addChild(ssboReadArrayResetNonRobustTestGroup);
2003*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetReadAccessNonRobustTestGroup->addChild(localReadArrayResetNonRobustTestGroup);
2004*35238bceSAndroid Build Coastguard Worker 
2005*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetWriteAccessNonRobustTestGroup->addChild(uboWriteArrayResetNonRobustTestGroup);
2006*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetWriteAccessNonRobustTestGroup->addChild(ssboWriteArrayResetNonRobustTestGroup);
2007*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetWriteAccessNonRobustTestGroup->addChild(localWriteArrayResetNonRobustTestGroup);
2008*35238bceSAndroid Build Coastguard Worker 
2009*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const outOfBoundsResetNonRobustTestGroup = new TestCaseGroup(
2010*35238bceSAndroid Build Coastguard Worker             eglTestCtx, "reset_status", "Tests that query the reset status after a context reset has occurred");
2011*35238bceSAndroid Build Coastguard Worker 
2012*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetNonRobustTestGroup->addChild(outOfBoundsResetReadAccessNonRobustTestGroup);
2013*35238bceSAndroid Build Coastguard Worker         outOfBoundsResetNonRobustTestGroup->addChild(outOfBoundsResetWriteAccessNonRobustTestGroup);
2014*35238bceSAndroid Build Coastguard Worker 
2015*35238bceSAndroid Build Coastguard Worker         outOfBoundsNonRobustTestGroup->addChild(outOfBoundsResetNonRobustTestGroup);
2016*35238bceSAndroid Build Coastguard Worker     }
2017*35238bceSAndroid Build Coastguard Worker 
2018*35238bceSAndroid Build Coastguard Worker     // fixed function test cases
2019*35238bceSAndroid Build Coastguard Worker     {
2020*35238bceSAndroid Build Coastguard Worker         // robust context
2021*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const fixedFunctionResetStatusTestGroup = new TestCaseGroup(
2022*35238bceSAndroid Build Coastguard Worker             eglTestCtx, "reset_status", "Tests that query the reset status after a context reset has occurred");
2023*35238bceSAndroid Build Coastguard Worker 
2024*35238bceSAndroid Build Coastguard Worker         // non-robust context (internal use only)
2025*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const fixedFunctionResetStatusNonRobustTestGroup = new TestCaseGroup(
2026*35238bceSAndroid Build Coastguard Worker             eglTestCtx, "reset_status", "Tests that query the reset status after a context reset has occurred");
2027*35238bceSAndroid Build Coastguard Worker 
2028*35238bceSAndroid Build Coastguard Worker         static const RobustnessTestCase::Params s_fixedFunctionPipelineCases[] = {
2029*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("index_buffer_out_of_bounds",
2030*35238bceSAndroid Build Coastguard Worker                                        "Provoke context reset and query error states and reset notifications",
2031*35238bceSAndroid Build Coastguard Worker                                        ROBUSTACCESS_TRUE, CONTEXTRESETTYPE_FIXED_FUNC_OOB, FIXEDFUNCTIONTYPE_INDICES),
2032*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex_buffer_out_of_bounds",
2033*35238bceSAndroid Build Coastguard Worker                                        "Provoke context reset and query error states and reset notifications",
2034*35238bceSAndroid Build Coastguard Worker                                        ROBUSTACCESS_TRUE, CONTEXTRESETTYPE_FIXED_FUNC_OOB, FIXEDFUNCTIONTYPE_VERTICES),
2035*35238bceSAndroid Build Coastguard Worker 
2036*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("index_buffer_out_of_bounds",
2037*35238bceSAndroid Build Coastguard Worker                                        "Provoke context reset and query error states and reset notifications",
2038*35238bceSAndroid Build Coastguard Worker                                        ROBUSTACCESS_FALSE, CONTEXTRESETTYPE_FIXED_FUNC_OOB, FIXEDFUNCTIONTYPE_INDICES),
2039*35238bceSAndroid Build Coastguard Worker             RobustnessTestCase::Params("vertex_buffer_out_of_bounds",
2040*35238bceSAndroid Build Coastguard Worker                                        "Provoke context reset and query error states and reset notifications",
2041*35238bceSAndroid Build Coastguard Worker                                        ROBUSTACCESS_FALSE, CONTEXTRESETTYPE_FIXED_FUNC_OOB, FIXEDFUNCTIONTYPE_VERTICES),
2042*35238bceSAndroid Build Coastguard Worker         };
2043*35238bceSAndroid Build Coastguard Worker 
2044*35238bceSAndroid Build Coastguard Worker         for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(s_fixedFunctionPipelineCases); ++testNdx)
2045*35238bceSAndroid Build Coastguard Worker         {
2046*35238bceSAndroid Build Coastguard Worker             const RobustnessTestCase::Params &test = s_fixedFunctionPipelineCases[testNdx];
2047*35238bceSAndroid Build Coastguard Worker             if (test.getRobustAccessType() == ROBUSTACCESS_TRUE)
2048*35238bceSAndroid Build Coastguard Worker                 fixedFunctionResetStatusTestGroup->addChild(
2049*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(), test.getDescription().c_str(), test));
2050*35238bceSAndroid Build Coastguard Worker             else
2051*35238bceSAndroid Build Coastguard Worker                 fixedFunctionResetStatusNonRobustTestGroup->addChild(
2052*35238bceSAndroid Build Coastguard Worker                     new BasicResetCase(eglTestCtx, test.getName().c_str(), test.getDescription().c_str(), test));
2053*35238bceSAndroid Build Coastguard Worker         }
2054*35238bceSAndroid Build Coastguard Worker 
2055*35238bceSAndroid Build Coastguard Worker         fixedFunctionTestGroup->addChild(fixedFunctionResetStatusTestGroup);
2056*35238bceSAndroid Build Coastguard Worker         fixedFunctionNonRobustTestGroup->addChild(fixedFunctionResetStatusNonRobustTestGroup);
2057*35238bceSAndroid Build Coastguard Worker     }
2058*35238bceSAndroid Build Coastguard Worker 
2059*35238bceSAndroid Build Coastguard Worker     // context creation query cases
2060*35238bceSAndroid Build Coastguard Worker     {
2061*35238bceSAndroid Build Coastguard Worker         contextCreationTestGroup->addChild(new QueryRobustAccessCase(
2062*35238bceSAndroid Build Coastguard Worker             eglTestCtx, "query_robust_access", "Query robust access after successfully creating a robust context"));
2063*35238bceSAndroid Build Coastguard Worker         contextCreationTestGroup->addChild(
2064*35238bceSAndroid Build Coastguard Worker             new NoResetNotificationCase(eglTestCtx, "no_reset_notification",
2065*35238bceSAndroid Build Coastguard Worker                                         "Query reset notification strategy after specifying GL_NO_RESET_NOTIFICATION"));
2066*35238bceSAndroid Build Coastguard Worker         contextCreationTestGroup->addChild(
2067*35238bceSAndroid Build Coastguard Worker             new LoseContextOnResetCase(eglTestCtx, "lose_context_on_reset",
2068*35238bceSAndroid Build Coastguard Worker                                        "Query reset notification strategy after specifying GL_LOSE_CONTEXT_ON_RESET"));
2069*35238bceSAndroid Build Coastguard Worker     }
2070*35238bceSAndroid Build Coastguard Worker 
2071*35238bceSAndroid Build Coastguard Worker     // invalid context creation cases
2072*35238bceSAndroid Build Coastguard Worker     {
2073*35238bceSAndroid Build Coastguard Worker         negativeContextTestGroup->addChild(
2074*35238bceSAndroid Build Coastguard Worker             new InvalidContextCase(eglTestCtx, "invalid_robust_context_creation",
2075*35238bceSAndroid Build Coastguard Worker                                    "Create a non-robust context but specify a reset notification strategy"));
2076*35238bceSAndroid Build Coastguard Worker         negativeContextTestGroup->addChild(
2077*35238bceSAndroid Build Coastguard Worker             new InvalidShareContextCase(eglTestCtx, "invalid_robust_shared_context_creation",
2078*35238bceSAndroid Build Coastguard Worker                                         "Create a context share group with conflicting reset notification strategies"));
2079*35238bceSAndroid Build Coastguard Worker         negativeContextTestGroup->addChild(new InvalidNotificationEnumCase(
2080*35238bceSAndroid Build Coastguard Worker             eglTestCtx, "invalid_notification_strategy_enum",
2081*35238bceSAndroid Build Coastguard Worker             "Create a robust context using EGL 1.5 only enum with EGL versions <= 1.4"));
2082*35238bceSAndroid Build Coastguard Worker     }
2083*35238bceSAndroid Build Coastguard Worker 
2084*35238bceSAndroid Build Coastguard Worker     shadersTestGroup->addChild(outOfBoundsTestGroup);
2085*35238bceSAndroid Build Coastguard Worker     shadersTestGroup->addChild(outOfBoundsNonRobustTestGroup);
2086*35238bceSAndroid Build Coastguard Worker 
2087*35238bceSAndroid Build Coastguard Worker     contextResetTestGroup->addChild(shadersTestGroup);
2088*35238bceSAndroid Build Coastguard Worker     contextResetTestGroup->addChild(fixedFunctionTestGroup);
2089*35238bceSAndroid Build Coastguard Worker     contextResetTestGroup->addChild(fixedFunctionNonRobustTestGroup);
2090*35238bceSAndroid Build Coastguard Worker 
2091*35238bceSAndroid Build Coastguard Worker     group->addChild(contextCreationTestGroup);
2092*35238bceSAndroid Build Coastguard Worker     group->addChild(contextResetTestGroup);
2093*35238bceSAndroid Build Coastguard Worker     group->addChild(negativeContextTestGroup);
2094*35238bceSAndroid Build Coastguard Worker 
2095*35238bceSAndroid Build Coastguard Worker     return group.release();
2096*35238bceSAndroid Build Coastguard Worker }
2097*35238bceSAndroid Build Coastguard Worker 
2098*35238bceSAndroid Build Coastguard Worker } // namespace egl
2099*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2100