xref: /aosp_15_r20/external/deqp/modules/egl/teglMakeCurrentPerfTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program EGL Module
3*35238bceSAndroid Build Coastguard Worker  * ---------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief eglMakeCurrent performance tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "teglMakeCurrentPerfTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "egluNativeWindow.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "egluNativePixmap.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "egluUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker 
30*35238bceSAndroid Build Coastguard Worker #include "eglwLibrary.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "eglwEnums.hpp"
32*35238bceSAndroid Build Coastguard Worker 
33*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
37*35238bceSAndroid Build Coastguard Worker 
38*35238bceSAndroid Build Coastguard Worker #include "deClock.h"
39*35238bceSAndroid Build Coastguard Worker #include "deString.h"
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker #include <algorithm>
42*35238bceSAndroid Build Coastguard Worker #include <cmath>
43*35238bceSAndroid Build Coastguard Worker #include <limits>
44*35238bceSAndroid Build Coastguard Worker #include <sstream>
45*35238bceSAndroid Build Coastguard Worker #include <string>
46*35238bceSAndroid Build Coastguard Worker #include <vector>
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker using std::ostringstream;
49*35238bceSAndroid Build Coastguard Worker using std::string;
50*35238bceSAndroid Build Coastguard Worker using std::vector;
51*35238bceSAndroid Build Coastguard Worker 
52*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
53*35238bceSAndroid Build Coastguard Worker 
54*35238bceSAndroid Build Coastguard Worker using namespace eglw;
55*35238bceSAndroid Build Coastguard Worker 
56*35238bceSAndroid Build Coastguard Worker namespace deqp
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker namespace egl
59*35238bceSAndroid Build Coastguard Worker {
60*35238bceSAndroid Build Coastguard Worker 
61*35238bceSAndroid Build Coastguard Worker class MakeCurrentPerfCase : public TestCase
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker public:
64*35238bceSAndroid Build Coastguard Worker     enum SurfaceType
65*35238bceSAndroid Build Coastguard Worker     {
66*35238bceSAndroid Build Coastguard Worker         SURFACETYPE_PBUFFER = (1 << 0),
67*35238bceSAndroid Build Coastguard Worker         SURFACETYPE_WINDOW  = (1 << 1),
68*35238bceSAndroid Build Coastguard Worker         SURFACETYPE_PIXMAP  = (1 << 2)
69*35238bceSAndroid Build Coastguard Worker     };
70*35238bceSAndroid Build Coastguard Worker 
71*35238bceSAndroid Build Coastguard Worker     struct Spec
72*35238bceSAndroid Build Coastguard Worker     {
73*35238bceSAndroid Build Coastguard Worker         SurfaceType surfaceTypes;
74*35238bceSAndroid Build Coastguard Worker         int contextCount;
75*35238bceSAndroid Build Coastguard Worker         int surfaceCount;
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker         bool release;
78*35238bceSAndroid Build Coastguard Worker 
79*35238bceSAndroid Build Coastguard Worker         int iterationCount;
80*35238bceSAndroid Build Coastguard Worker         int sampleCount;
81*35238bceSAndroid Build Coastguard Worker 
82*35238bceSAndroid Build Coastguard Worker         string toName(void) const;
83*35238bceSAndroid Build Coastguard Worker         string toDescription(void) const;
84*35238bceSAndroid Build Coastguard Worker     };
85*35238bceSAndroid Build Coastguard Worker     MakeCurrentPerfCase(EglTestContext &eglTestCtx, const Spec &spec, const char *name, const char *description);
86*35238bceSAndroid Build Coastguard Worker     ~MakeCurrentPerfCase(void);
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker     void init(void);
89*35238bceSAndroid Build Coastguard Worker     void deinit(void);
90*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
91*35238bceSAndroid Build Coastguard Worker 
92*35238bceSAndroid Build Coastguard Worker private:
93*35238bceSAndroid Build Coastguard Worker     Spec m_spec;
94*35238bceSAndroid Build Coastguard Worker     de::Random m_rnd;
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker     EGLDisplay m_display;
97*35238bceSAndroid Build Coastguard Worker     EGLConfig m_config;
98*35238bceSAndroid Build Coastguard Worker     vector<EGLContext> m_contexts;
99*35238bceSAndroid Build Coastguard Worker     vector<EGLSurface> m_surfaces;
100*35238bceSAndroid Build Coastguard Worker 
101*35238bceSAndroid Build Coastguard Worker     vector<eglu::NativeWindow *> m_windows;
102*35238bceSAndroid Build Coastguard Worker     vector<eglu::NativePixmap *> m_pixmaps;
103*35238bceSAndroid Build Coastguard Worker 
104*35238bceSAndroid Build Coastguard Worker     vector<uint64_t> m_samples;
105*35238bceSAndroid Build Coastguard Worker 
106*35238bceSAndroid Build Coastguard Worker     void chooseConfig(void);
107*35238bceSAndroid Build Coastguard Worker     void createSurfaces(void);
108*35238bceSAndroid Build Coastguard Worker     void createContexts(void);
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker     void destroySurfaces(void);
111*35238bceSAndroid Build Coastguard Worker     void destroyContexts(void);
112*35238bceSAndroid Build Coastguard Worker 
113*35238bceSAndroid Build Coastguard Worker     void createPBuffer(void);
114*35238bceSAndroid Build Coastguard Worker     void createWindow(void);
115*35238bceSAndroid Build Coastguard Worker     void createPixmap(void);
116*35238bceSAndroid Build Coastguard Worker 
117*35238bceSAndroid Build Coastguard Worker     void logTestInfo(void);
118*35238bceSAndroid Build Coastguard Worker     void logResults(void);
119*35238bceSAndroid Build Coastguard Worker     // Disabled
120*35238bceSAndroid Build Coastguard Worker     MakeCurrentPerfCase(const MakeCurrentPerfCase &);
121*35238bceSAndroid Build Coastguard Worker     MakeCurrentPerfCase &operator=(const MakeCurrentPerfCase &);
122*35238bceSAndroid Build Coastguard Worker };
123*35238bceSAndroid Build Coastguard Worker 
toName(void) const124*35238bceSAndroid Build Coastguard Worker string MakeCurrentPerfCase::Spec::toName(void) const
125*35238bceSAndroid Build Coastguard Worker {
126*35238bceSAndroid Build Coastguard Worker     ostringstream name;
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker     name << "context";
129*35238bceSAndroid Build Coastguard Worker 
130*35238bceSAndroid Build Coastguard Worker     if (contextCount > 1)
131*35238bceSAndroid Build Coastguard Worker         name << "s_" << contextCount;
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker     if ((surfaceTypes & SURFACETYPE_WINDOW) != 0)
134*35238bceSAndroid Build Coastguard Worker         name << "_window" << (surfaceCount > 1 ? "s" : "");
135*35238bceSAndroid Build Coastguard Worker 
136*35238bceSAndroid Build Coastguard Worker     if ((surfaceTypes & SURFACETYPE_PIXMAP) != 0)
137*35238bceSAndroid Build Coastguard Worker         name << "_pixmap" << (surfaceCount > 1 ? "s" : "");
138*35238bceSAndroid Build Coastguard Worker 
139*35238bceSAndroid Build Coastguard Worker     if ((surfaceTypes & SURFACETYPE_PBUFFER) != 0)
140*35238bceSAndroid Build Coastguard Worker         name << "_pbuffer" << (surfaceCount > 1 ? "s" : "");
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker     if (surfaceCount > 1)
143*35238bceSAndroid Build Coastguard Worker         name << "_" << surfaceCount;
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker     if (release)
146*35238bceSAndroid Build Coastguard Worker         name << "_release";
147*35238bceSAndroid Build Coastguard Worker 
148*35238bceSAndroid Build Coastguard Worker     return name.str();
149*35238bceSAndroid Build Coastguard Worker }
150*35238bceSAndroid Build Coastguard Worker 
toDescription(void) const151*35238bceSAndroid Build Coastguard Worker string MakeCurrentPerfCase::Spec::toDescription(void) const
152*35238bceSAndroid Build Coastguard Worker {
153*35238bceSAndroid Build Coastguard Worker     // \todo [mika] Generate descrpition
154*35238bceSAndroid Build Coastguard Worker     return toName();
155*35238bceSAndroid Build Coastguard Worker }
156*35238bceSAndroid Build Coastguard Worker 
MakeCurrentPerfCase(EglTestContext & eglTestCtx,const Spec & spec,const char * name,const char * description)157*35238bceSAndroid Build Coastguard Worker MakeCurrentPerfCase::MakeCurrentPerfCase(EglTestContext &eglTestCtx, const Spec &spec, const char *name,
158*35238bceSAndroid Build Coastguard Worker                                          const char *description)
159*35238bceSAndroid Build Coastguard Worker     : TestCase(eglTestCtx, tcu::NODETYPE_PERFORMANCE, name, description)
160*35238bceSAndroid Build Coastguard Worker     , m_spec(spec)
161*35238bceSAndroid Build Coastguard Worker     , m_rnd(deStringHash(name))
162*35238bceSAndroid Build Coastguard Worker     , m_display(EGL_NO_DISPLAY)
163*35238bceSAndroid Build Coastguard Worker     , m_config(DE_NULL)
164*35238bceSAndroid Build Coastguard Worker {
165*35238bceSAndroid Build Coastguard Worker }
166*35238bceSAndroid Build Coastguard Worker 
~MakeCurrentPerfCase(void)167*35238bceSAndroid Build Coastguard Worker MakeCurrentPerfCase::~MakeCurrentPerfCase(void)
168*35238bceSAndroid Build Coastguard Worker {
169*35238bceSAndroid Build Coastguard Worker     deinit();
170*35238bceSAndroid Build Coastguard Worker }
171*35238bceSAndroid Build Coastguard Worker 
init(void)172*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::init(void)
173*35238bceSAndroid Build Coastguard Worker {
174*35238bceSAndroid Build Coastguard Worker     m_display = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
175*35238bceSAndroid Build Coastguard Worker 
176*35238bceSAndroid Build Coastguard Worker     chooseConfig();
177*35238bceSAndroid Build Coastguard Worker     createContexts();
178*35238bceSAndroid Build Coastguard Worker     createSurfaces();
179*35238bceSAndroid Build Coastguard Worker }
180*35238bceSAndroid Build Coastguard Worker 
deinit(void)181*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::deinit(void)
182*35238bceSAndroid Build Coastguard Worker {
183*35238bceSAndroid Build Coastguard Worker     destroyContexts();
184*35238bceSAndroid Build Coastguard Worker     destroySurfaces();
185*35238bceSAndroid Build Coastguard Worker 
186*35238bceSAndroid Build Coastguard Worker     if (m_display != EGL_NO_DISPLAY)
187*35238bceSAndroid Build Coastguard Worker     {
188*35238bceSAndroid Build Coastguard Worker         m_eglTestCtx.getLibrary().terminate(m_display);
189*35238bceSAndroid Build Coastguard Worker         m_display = EGL_NO_DISPLAY;
190*35238bceSAndroid Build Coastguard Worker     }
191*35238bceSAndroid Build Coastguard Worker }
192*35238bceSAndroid Build Coastguard Worker 
chooseConfig(void)193*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::chooseConfig(void)
194*35238bceSAndroid Build Coastguard Worker {
195*35238bceSAndroid Build Coastguard Worker     const EGLint surfaceBits = ((m_spec.surfaceTypes & SURFACETYPE_WINDOW) != 0 ? EGL_WINDOW_BIT : 0) |
196*35238bceSAndroid Build Coastguard Worker                                ((m_spec.surfaceTypes & SURFACETYPE_PIXMAP) != 0 ? EGL_PIXMAP_BIT : 0) |
197*35238bceSAndroid Build Coastguard Worker                                ((m_spec.surfaceTypes & SURFACETYPE_PBUFFER) != 0 ? EGL_PBUFFER_BIT : 0);
198*35238bceSAndroid Build Coastguard Worker 
199*35238bceSAndroid Build Coastguard Worker     const EGLint attribList[] = {EGL_SURFACE_TYPE, surfaceBits, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE};
200*35238bceSAndroid Build Coastguard Worker 
201*35238bceSAndroid Build Coastguard Worker     const Library &egl = m_eglTestCtx.getLibrary();
202*35238bceSAndroid Build Coastguard Worker     EGLint configCount = 0;
203*35238bceSAndroid Build Coastguard Worker 
204*35238bceSAndroid Build Coastguard Worker     EGLU_CHECK_CALL(egl, chooseConfig(m_display, attribList, &m_config, 1, &configCount));
205*35238bceSAndroid Build Coastguard Worker 
206*35238bceSAndroid Build Coastguard Worker     if (configCount <= 0)
207*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("No compatible configs found");
208*35238bceSAndroid Build Coastguard Worker }
209*35238bceSAndroid Build Coastguard Worker 
createSurfaces(void)210*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::createSurfaces(void)
211*35238bceSAndroid Build Coastguard Worker {
212*35238bceSAndroid Build Coastguard Worker     vector<SurfaceType> types;
213*35238bceSAndroid Build Coastguard Worker 
214*35238bceSAndroid Build Coastguard Worker     if ((m_spec.surfaceTypes & SURFACETYPE_WINDOW) != 0)
215*35238bceSAndroid Build Coastguard Worker         types.push_back(SURFACETYPE_WINDOW);
216*35238bceSAndroid Build Coastguard Worker 
217*35238bceSAndroid Build Coastguard Worker     if ((m_spec.surfaceTypes & SURFACETYPE_PIXMAP) != 0)
218*35238bceSAndroid Build Coastguard Worker         types.push_back(SURFACETYPE_PIXMAP);
219*35238bceSAndroid Build Coastguard Worker 
220*35238bceSAndroid Build Coastguard Worker     if ((m_spec.surfaceTypes & SURFACETYPE_PBUFFER) != 0)
221*35238bceSAndroid Build Coastguard Worker         types.push_back(SURFACETYPE_PBUFFER);
222*35238bceSAndroid Build Coastguard Worker 
223*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((int)types.size() <= m_spec.surfaceCount);
224*35238bceSAndroid Build Coastguard Worker 
225*35238bceSAndroid Build Coastguard Worker     // Create surfaces
226*35238bceSAndroid Build Coastguard Worker     for (int surfaceNdx = 0; surfaceNdx < m_spec.surfaceCount; surfaceNdx++)
227*35238bceSAndroid Build Coastguard Worker     {
228*35238bceSAndroid Build Coastguard Worker         SurfaceType type = types[surfaceNdx % types.size()];
229*35238bceSAndroid Build Coastguard Worker 
230*35238bceSAndroid Build Coastguard Worker         switch (type)
231*35238bceSAndroid Build Coastguard Worker         {
232*35238bceSAndroid Build Coastguard Worker         case SURFACETYPE_PBUFFER:
233*35238bceSAndroid Build Coastguard Worker             createPBuffer();
234*35238bceSAndroid Build Coastguard Worker             break;
235*35238bceSAndroid Build Coastguard Worker 
236*35238bceSAndroid Build Coastguard Worker         case SURFACETYPE_WINDOW:
237*35238bceSAndroid Build Coastguard Worker             createWindow();
238*35238bceSAndroid Build Coastguard Worker             break;
239*35238bceSAndroid Build Coastguard Worker 
240*35238bceSAndroid Build Coastguard Worker         case SURFACETYPE_PIXMAP:
241*35238bceSAndroid Build Coastguard Worker             createPixmap();
242*35238bceSAndroid Build Coastguard Worker             break;
243*35238bceSAndroid Build Coastguard Worker 
244*35238bceSAndroid Build Coastguard Worker         default:
245*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
246*35238bceSAndroid Build Coastguard Worker         }
247*35238bceSAndroid Build Coastguard Worker     }
248*35238bceSAndroid Build Coastguard Worker }
249*35238bceSAndroid Build Coastguard Worker 
createPBuffer(void)250*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::createPBuffer(void)
251*35238bceSAndroid Build Coastguard Worker {
252*35238bceSAndroid Build Coastguard Worker     const Library &egl  = m_eglTestCtx.getLibrary();
253*35238bceSAndroid Build Coastguard Worker     const EGLint width  = 256;
254*35238bceSAndroid Build Coastguard Worker     const EGLint height = 256;
255*35238bceSAndroid Build Coastguard Worker 
256*35238bceSAndroid Build Coastguard Worker     const EGLint attribList[] = {EGL_WIDTH, width, EGL_HEIGHT, height, EGL_NONE};
257*35238bceSAndroid Build Coastguard Worker 
258*35238bceSAndroid Build Coastguard Worker     EGLSurface surface = egl.createPbufferSurface(m_display, m_config, attribList);
259*35238bceSAndroid Build Coastguard Worker 
260*35238bceSAndroid Build Coastguard Worker     EGLU_CHECK_MSG(egl, "eglCreatePbufferSurface()");
261*35238bceSAndroid Build Coastguard Worker 
262*35238bceSAndroid Build Coastguard Worker     m_surfaces.push_back(surface);
263*35238bceSAndroid Build Coastguard Worker }
264*35238bceSAndroid Build Coastguard Worker 
createWindow(void)265*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::createWindow(void)
266*35238bceSAndroid Build Coastguard Worker {
267*35238bceSAndroid Build Coastguard Worker     const Library &egl  = m_eglTestCtx.getLibrary();
268*35238bceSAndroid Build Coastguard Worker     const EGLint width  = 256;
269*35238bceSAndroid Build Coastguard Worker     const EGLint height = 256;
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker     const eglu::NativeWindowFactory &windowFactory =
272*35238bceSAndroid Build Coastguard Worker         eglu::selectNativeWindowFactory(m_eglTestCtx.getNativeDisplayFactory(), m_testCtx.getCommandLine());
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker     eglu::NativeWindow *window = DE_NULL;
275*35238bceSAndroid Build Coastguard Worker     EGLSurface surface         = EGL_NO_SURFACE;
276*35238bceSAndroid Build Coastguard Worker 
277*35238bceSAndroid Build Coastguard Worker     try
278*35238bceSAndroid Build Coastguard Worker     {
279*35238bceSAndroid Build Coastguard Worker         window = windowFactory.createWindow(
280*35238bceSAndroid Build Coastguard Worker             &m_eglTestCtx.getNativeDisplay(), m_display, m_config, DE_NULL,
281*35238bceSAndroid Build Coastguard Worker             eglu::WindowParams(width, height,
282*35238bceSAndroid Build Coastguard Worker                                eglu::parseWindowVisibility(m_eglTestCtx.getTestContext().getCommandLine())));
283*35238bceSAndroid Build Coastguard Worker         surface = eglu::createWindowSurface(m_eglTestCtx.getNativeDisplay(), *window, m_display, m_config, DE_NULL);
284*35238bceSAndroid Build Coastguard Worker     }
285*35238bceSAndroid Build Coastguard Worker     catch (...)
286*35238bceSAndroid Build Coastguard Worker     {
287*35238bceSAndroid Build Coastguard Worker         if (surface != EGL_NO_SURFACE)
288*35238bceSAndroid Build Coastguard Worker             egl.destroySurface(m_display, surface);
289*35238bceSAndroid Build Coastguard Worker 
290*35238bceSAndroid Build Coastguard Worker         delete window;
291*35238bceSAndroid Build Coastguard Worker         throw;
292*35238bceSAndroid Build Coastguard Worker     }
293*35238bceSAndroid Build Coastguard Worker 
294*35238bceSAndroid Build Coastguard Worker     m_windows.push_back(window);
295*35238bceSAndroid Build Coastguard Worker     m_surfaces.push_back(surface);
296*35238bceSAndroid Build Coastguard Worker }
297*35238bceSAndroid Build Coastguard Worker 
createPixmap(void)298*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::createPixmap(void)
299*35238bceSAndroid Build Coastguard Worker {
300*35238bceSAndroid Build Coastguard Worker     const Library &egl  = m_eglTestCtx.getLibrary();
301*35238bceSAndroid Build Coastguard Worker     const EGLint width  = 256;
302*35238bceSAndroid Build Coastguard Worker     const EGLint height = 256;
303*35238bceSAndroid Build Coastguard Worker 
304*35238bceSAndroid Build Coastguard Worker     const eglu::NativePixmapFactory &pixmapFactory =
305*35238bceSAndroid Build Coastguard Worker         eglu::selectNativePixmapFactory(m_eglTestCtx.getNativeDisplayFactory(), m_testCtx.getCommandLine());
306*35238bceSAndroid Build Coastguard Worker 
307*35238bceSAndroid Build Coastguard Worker     eglu::NativePixmap *pixmap = DE_NULL;
308*35238bceSAndroid Build Coastguard Worker     EGLSurface surface         = EGL_NO_SURFACE;
309*35238bceSAndroid Build Coastguard Worker 
310*35238bceSAndroid Build Coastguard Worker     try
311*35238bceSAndroid Build Coastguard Worker     {
312*35238bceSAndroid Build Coastguard Worker         pixmap =
313*35238bceSAndroid Build Coastguard Worker             pixmapFactory.createPixmap(&m_eglTestCtx.getNativeDisplay(), m_display, m_config, DE_NULL, width, height);
314*35238bceSAndroid Build Coastguard Worker         surface = eglu::createPixmapSurface(m_eglTestCtx.getNativeDisplay(), *pixmap, m_display, m_config, DE_NULL);
315*35238bceSAndroid Build Coastguard Worker     }
316*35238bceSAndroid Build Coastguard Worker     catch (...)
317*35238bceSAndroid Build Coastguard Worker     {
318*35238bceSAndroid Build Coastguard Worker         if (surface != EGL_NO_SURFACE)
319*35238bceSAndroid Build Coastguard Worker             egl.destroySurface(m_display, surface);
320*35238bceSAndroid Build Coastguard Worker 
321*35238bceSAndroid Build Coastguard Worker         delete pixmap;
322*35238bceSAndroid Build Coastguard Worker         throw;
323*35238bceSAndroid Build Coastguard Worker     }
324*35238bceSAndroid Build Coastguard Worker 
325*35238bceSAndroid Build Coastguard Worker     m_pixmaps.push_back(pixmap);
326*35238bceSAndroid Build Coastguard Worker     m_surfaces.push_back(surface);
327*35238bceSAndroid Build Coastguard Worker }
328*35238bceSAndroid Build Coastguard Worker 
destroySurfaces(void)329*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::destroySurfaces(void)
330*35238bceSAndroid Build Coastguard Worker {
331*35238bceSAndroid Build Coastguard Worker     const Library &egl = m_eglTestCtx.getLibrary();
332*35238bceSAndroid Build Coastguard Worker 
333*35238bceSAndroid Build Coastguard Worker     if (m_surfaces.size() > 0)
334*35238bceSAndroid Build Coastguard Worker     {
335*35238bceSAndroid Build Coastguard Worker         EGLDisplay display = m_display;
336*35238bceSAndroid Build Coastguard Worker 
337*35238bceSAndroid Build Coastguard Worker         // Destroy surfaces
338*35238bceSAndroid Build Coastguard Worker         for (vector<EGLSurface>::iterator iter = m_surfaces.begin(); iter != m_surfaces.end(); ++iter)
339*35238bceSAndroid Build Coastguard Worker         {
340*35238bceSAndroid Build Coastguard Worker             if (*iter != EGL_NO_SURFACE)
341*35238bceSAndroid Build Coastguard Worker                 EGLU_CHECK_CALL(egl, destroySurface(display, *iter));
342*35238bceSAndroid Build Coastguard Worker             *iter = EGL_NO_SURFACE;
343*35238bceSAndroid Build Coastguard Worker         }
344*35238bceSAndroid Build Coastguard Worker 
345*35238bceSAndroid Build Coastguard Worker         m_surfaces.clear();
346*35238bceSAndroid Build Coastguard Worker 
347*35238bceSAndroid Build Coastguard Worker         // Destroy pixmaps
348*35238bceSAndroid Build Coastguard Worker         for (vector<eglu::NativePixmap *>::iterator iter = m_pixmaps.begin(); iter != m_pixmaps.end(); ++iter)
349*35238bceSAndroid Build Coastguard Worker         {
350*35238bceSAndroid Build Coastguard Worker             delete *iter;
351*35238bceSAndroid Build Coastguard Worker             *iter = NULL;
352*35238bceSAndroid Build Coastguard Worker         }
353*35238bceSAndroid Build Coastguard Worker 
354*35238bceSAndroid Build Coastguard Worker         m_pixmaps.clear();
355*35238bceSAndroid Build Coastguard Worker 
356*35238bceSAndroid Build Coastguard Worker         // Destroy windows
357*35238bceSAndroid Build Coastguard Worker         for (vector<eglu::NativeWindow *>::iterator iter = m_windows.begin(); iter != m_windows.end(); ++iter)
358*35238bceSAndroid Build Coastguard Worker         {
359*35238bceSAndroid Build Coastguard Worker             delete *iter;
360*35238bceSAndroid Build Coastguard Worker             *iter = NULL;
361*35238bceSAndroid Build Coastguard Worker         }
362*35238bceSAndroid Build Coastguard Worker 
363*35238bceSAndroid Build Coastguard Worker         m_windows.clear();
364*35238bceSAndroid Build Coastguard Worker 
365*35238bceSAndroid Build Coastguard Worker         // Clear all surface handles
366*35238bceSAndroid Build Coastguard Worker         m_surfaces.clear();
367*35238bceSAndroid Build Coastguard Worker     }
368*35238bceSAndroid Build Coastguard Worker }
369*35238bceSAndroid Build Coastguard Worker 
createContexts(void)370*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::createContexts(void)
371*35238bceSAndroid Build Coastguard Worker {
372*35238bceSAndroid Build Coastguard Worker     const Library &egl = m_eglTestCtx.getLibrary();
373*35238bceSAndroid Build Coastguard Worker 
374*35238bceSAndroid Build Coastguard Worker     for (int contextNdx = 0; contextNdx < m_spec.contextCount; contextNdx++)
375*35238bceSAndroid Build Coastguard Worker     {
376*35238bceSAndroid Build Coastguard Worker         const EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
377*35238bceSAndroid Build Coastguard Worker 
378*35238bceSAndroid Build Coastguard Worker         EGLU_CHECK_CALL(egl, bindAPI(EGL_OPENGL_ES_API));
379*35238bceSAndroid Build Coastguard Worker         EGLContext context = egl.createContext(m_display, m_config, EGL_NO_CONTEXT, attribList);
380*35238bceSAndroid Build Coastguard Worker         EGLU_CHECK_MSG(egl, "eglCreateContext()");
381*35238bceSAndroid Build Coastguard Worker 
382*35238bceSAndroid Build Coastguard Worker         m_contexts.push_back(context);
383*35238bceSAndroid Build Coastguard Worker     }
384*35238bceSAndroid Build Coastguard Worker }
385*35238bceSAndroid Build Coastguard Worker 
destroyContexts(void)386*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::destroyContexts(void)
387*35238bceSAndroid Build Coastguard Worker {
388*35238bceSAndroid Build Coastguard Worker     const Library &egl = m_eglTestCtx.getLibrary();
389*35238bceSAndroid Build Coastguard Worker     if (m_contexts.size() > 0)
390*35238bceSAndroid Build Coastguard Worker     {
391*35238bceSAndroid Build Coastguard Worker         EGLDisplay display = m_display;
392*35238bceSAndroid Build Coastguard Worker 
393*35238bceSAndroid Build Coastguard Worker         for (vector<EGLContext>::iterator iter = m_contexts.begin(); iter != m_contexts.end(); ++iter)
394*35238bceSAndroid Build Coastguard Worker         {
395*35238bceSAndroid Build Coastguard Worker             if (*iter != EGL_NO_CONTEXT)
396*35238bceSAndroid Build Coastguard Worker                 EGLU_CHECK_CALL(egl, destroyContext(display, *iter));
397*35238bceSAndroid Build Coastguard Worker             *iter = EGL_NO_CONTEXT;
398*35238bceSAndroid Build Coastguard Worker         }
399*35238bceSAndroid Build Coastguard Worker 
400*35238bceSAndroid Build Coastguard Worker         m_contexts.clear();
401*35238bceSAndroid Build Coastguard Worker     }
402*35238bceSAndroid Build Coastguard Worker }
403*35238bceSAndroid Build Coastguard Worker 
logTestInfo(void)404*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::logTestInfo(void)
405*35238bceSAndroid Build Coastguard Worker {
406*35238bceSAndroid Build Coastguard Worker     TestLog &log = m_testCtx.getLog();
407*35238bceSAndroid Build Coastguard Worker 
408*35238bceSAndroid Build Coastguard Worker     {
409*35238bceSAndroid Build Coastguard Worker         tcu::ScopedLogSection section(log, "Test Info", "Test case information.");
410*35238bceSAndroid Build Coastguard Worker 
411*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Context count: " << m_contexts.size() << TestLog::EndMessage;
412*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Surfaces count: " << m_surfaces.size() << TestLog::EndMessage;
413*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Sample count: " << m_spec.sampleCount << TestLog::EndMessage;
414*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Iteration count: " << m_spec.iterationCount << TestLog::EndMessage;
415*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Window count: " << m_windows.size() << TestLog::EndMessage;
416*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Pixmap count: " << m_pixmaps.size() << TestLog::EndMessage;
417*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "PBuffer count: " << (m_surfaces.size() - m_windows.size() - m_pixmaps.size())
418*35238bceSAndroid Build Coastguard Worker             << TestLog::EndMessage;
419*35238bceSAndroid Build Coastguard Worker 
420*35238bceSAndroid Build Coastguard Worker         if (m_spec.release)
421*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message
422*35238bceSAndroid Build Coastguard Worker                 << "Context is released after each use. Both binding and releasing context are included in result time."
423*35238bceSAndroid Build Coastguard Worker                 << TestLog::EndMessage;
424*35238bceSAndroid Build Coastguard Worker     }
425*35238bceSAndroid Build Coastguard Worker }
426*35238bceSAndroid Build Coastguard Worker 
logResults(void)427*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfCase::logResults(void)
428*35238bceSAndroid Build Coastguard Worker {
429*35238bceSAndroid Build Coastguard Worker     TestLog &log = m_testCtx.getLog();
430*35238bceSAndroid Build Coastguard Worker 
431*35238bceSAndroid Build Coastguard Worker     log << TestLog::SampleList("Result", "Result") << TestLog::SampleInfo
432*35238bceSAndroid Build Coastguard Worker         << TestLog::ValueInfo("Time", "Time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE) << TestLog::EndSampleInfo;
433*35238bceSAndroid Build Coastguard Worker 
434*35238bceSAndroid Build Coastguard Worker     for (int sampleNdx = 0; sampleNdx < (int)m_samples.size(); sampleNdx++)
435*35238bceSAndroid Build Coastguard Worker         log << TestLog::Sample << int64_t(m_samples[sampleNdx]) << TestLog::EndSample;
436*35238bceSAndroid Build Coastguard Worker 
437*35238bceSAndroid Build Coastguard Worker     log << TestLog::EndSampleList;
438*35238bceSAndroid Build Coastguard Worker 
439*35238bceSAndroid Build Coastguard Worker     // Log stats
440*35238bceSAndroid Build Coastguard Worker     {
441*35238bceSAndroid Build Coastguard Worker         uint64_t totalTimeUs         = 0;
442*35238bceSAndroid Build Coastguard Worker         uint64_t totalIterationCount = 0;
443*35238bceSAndroid Build Coastguard Worker 
444*35238bceSAndroid Build Coastguard Worker         float iterationTimeMeanUs     = 0.0f;
445*35238bceSAndroid Build Coastguard Worker         float iterationTimeMedianUs   = 0.0f;
446*35238bceSAndroid Build Coastguard Worker         float iterationTimeVarianceUs = 0.0f;
447*35238bceSAndroid Build Coastguard Worker         float iterationTimeSkewnessUs = 0.0f;
448*35238bceSAndroid Build Coastguard Worker         float iterationTimeMinUs      = std::numeric_limits<float>::max();
449*35238bceSAndroid Build Coastguard Worker         float iterationTimeMaxUs      = 0.0f;
450*35238bceSAndroid Build Coastguard Worker 
451*35238bceSAndroid Build Coastguard Worker         std::sort(m_samples.begin(), m_samples.end());
452*35238bceSAndroid Build Coastguard Worker 
453*35238bceSAndroid Build Coastguard Worker         // Calculate totals
454*35238bceSAndroid Build Coastguard Worker         for (int sampleNdx = 0; sampleNdx < (int)m_samples.size(); sampleNdx++)
455*35238bceSAndroid Build Coastguard Worker         {
456*35238bceSAndroid Build Coastguard Worker             totalTimeUs += m_samples[sampleNdx];
457*35238bceSAndroid Build Coastguard Worker             totalIterationCount += m_spec.iterationCount;
458*35238bceSAndroid Build Coastguard Worker         }
459*35238bceSAndroid Build Coastguard Worker 
460*35238bceSAndroid Build Coastguard Worker         // Calculate mean and median
461*35238bceSAndroid Build Coastguard Worker         iterationTimeMeanUs   = ((float)(((double)totalTimeUs) / (double)totalIterationCount));
462*35238bceSAndroid Build Coastguard Worker         iterationTimeMedianUs = ((float)(((double)m_samples[m_samples.size() / 2]) / (double)m_spec.iterationCount));
463*35238bceSAndroid Build Coastguard Worker 
464*35238bceSAndroid Build Coastguard Worker         // Calculate variance
465*35238bceSAndroid Build Coastguard Worker         for (int sampleNdx = 0; sampleNdx < (int)m_samples.size(); sampleNdx++)
466*35238bceSAndroid Build Coastguard Worker         {
467*35238bceSAndroid Build Coastguard Worker             float iterationTimeUs = (float)(((double)m_samples[sampleNdx]) / m_spec.iterationCount);
468*35238bceSAndroid Build Coastguard Worker             iterationTimeVarianceUs += std::pow(iterationTimeUs - iterationTimeMedianUs, 2.0f);
469*35238bceSAndroid Build Coastguard Worker         }
470*35238bceSAndroid Build Coastguard Worker 
471*35238bceSAndroid Build Coastguard Worker         // Calculate min and max
472*35238bceSAndroid Build Coastguard Worker         for (int sampleNdx = 0; sampleNdx < (int)m_samples.size(); sampleNdx++)
473*35238bceSAndroid Build Coastguard Worker         {
474*35238bceSAndroid Build Coastguard Worker             float iterationTimeUs = (float)(((double)m_samples[sampleNdx]) / m_spec.iterationCount);
475*35238bceSAndroid Build Coastguard Worker             iterationTimeMinUs    = std::min<float>(iterationTimeMinUs, iterationTimeUs);
476*35238bceSAndroid Build Coastguard Worker             iterationTimeMaxUs    = std::max<float>(iterationTimeMaxUs, iterationTimeUs);
477*35238bceSAndroid Build Coastguard Worker         }
478*35238bceSAndroid Build Coastguard Worker 
479*35238bceSAndroid Build Coastguard Worker         iterationTimeVarianceUs /= (float)m_samples.size();
480*35238bceSAndroid Build Coastguard Worker 
481*35238bceSAndroid Build Coastguard Worker         // Calculate skewness
482*35238bceSAndroid Build Coastguard Worker         for (int sampleNdx = 0; sampleNdx < (int)m_samples.size(); sampleNdx++)
483*35238bceSAndroid Build Coastguard Worker         {
484*35238bceSAndroid Build Coastguard Worker             float iterationTimeUs = (float)(((double)m_samples[sampleNdx]) / m_spec.iterationCount);
485*35238bceSAndroid Build Coastguard Worker             iterationTimeSkewnessUs =
486*35238bceSAndroid Build Coastguard Worker                 std::pow((iterationTimeUs - iterationTimeMedianUs) / iterationTimeVarianceUs, 2.0f);
487*35238bceSAndroid Build Coastguard Worker         }
488*35238bceSAndroid Build Coastguard Worker 
489*35238bceSAndroid Build Coastguard Worker         iterationTimeSkewnessUs /= (float)m_samples.size();
490*35238bceSAndroid Build Coastguard Worker 
491*35238bceSAndroid Build Coastguard Worker         {
492*35238bceSAndroid Build Coastguard Worker             tcu::ScopedLogSection section(log, "Result", "Statistics from results.");
493*35238bceSAndroid Build Coastguard Worker 
494*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Total time: " << totalTimeUs << "us" << TestLog::EndMessage;
495*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Mean: " << iterationTimeMeanUs << "us" << TestLog::EndMessage;
496*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Median: " << iterationTimeMedianUs << "us" << TestLog::EndMessage;
497*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Variance: " << iterationTimeVarianceUs << "us" << TestLog::EndMessage;
498*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Skewness: " << iterationTimeSkewnessUs << "us" << TestLog::EndMessage;
499*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Min: " << iterationTimeMinUs << "us" << TestLog::EndMessage;
500*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Max: " << iterationTimeMaxUs << "us" << TestLog::EndMessage;
501*35238bceSAndroid Build Coastguard Worker         }
502*35238bceSAndroid Build Coastguard Worker 
503*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(
504*35238bceSAndroid Build Coastguard Worker             QP_TEST_RESULT_PASS,
505*35238bceSAndroid Build Coastguard Worker             de::floatToString((float)(((double)totalTimeUs) / (double)totalIterationCount), 2).c_str());
506*35238bceSAndroid Build Coastguard Worker     }
507*35238bceSAndroid Build Coastguard Worker }
508*35238bceSAndroid Build Coastguard Worker 
iterate(void)509*35238bceSAndroid Build Coastguard Worker TestCase::IterateResult MakeCurrentPerfCase::iterate(void)
510*35238bceSAndroid Build Coastguard Worker {
511*35238bceSAndroid Build Coastguard Worker     const Library &egl = m_eglTestCtx.getLibrary();
512*35238bceSAndroid Build Coastguard Worker     if (m_samples.size() == 0)
513*35238bceSAndroid Build Coastguard Worker         logTestInfo();
514*35238bceSAndroid Build Coastguard Worker 
515*35238bceSAndroid Build Coastguard Worker     {
516*35238bceSAndroid Build Coastguard Worker         EGLDisplay display   = m_display;
517*35238bceSAndroid Build Coastguard Worker         uint64_t beginTimeUs = deGetMicroseconds();
518*35238bceSAndroid Build Coastguard Worker 
519*35238bceSAndroid Build Coastguard Worker         for (int iteration = 0; iteration < m_spec.iterationCount; iteration++)
520*35238bceSAndroid Build Coastguard Worker         {
521*35238bceSAndroid Build Coastguard Worker             EGLContext context = m_contexts[m_rnd.getUint32() % m_contexts.size()];
522*35238bceSAndroid Build Coastguard Worker             EGLSurface surface = m_surfaces[m_rnd.getUint32() % m_surfaces.size()];
523*35238bceSAndroid Build Coastguard Worker 
524*35238bceSAndroid Build Coastguard Worker             egl.makeCurrent(display, surface, surface, context);
525*35238bceSAndroid Build Coastguard Worker 
526*35238bceSAndroid Build Coastguard Worker             if (m_spec.release)
527*35238bceSAndroid Build Coastguard Worker                 egl.makeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
528*35238bceSAndroid Build Coastguard Worker         }
529*35238bceSAndroid Build Coastguard Worker 
530*35238bceSAndroid Build Coastguard Worker         m_samples.push_back(deGetMicroseconds() - beginTimeUs);
531*35238bceSAndroid Build Coastguard Worker 
532*35238bceSAndroid Build Coastguard Worker         egl.makeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
533*35238bceSAndroid Build Coastguard Worker         EGLU_CHECK_MSG(egl, "eglMakeCurrent()");
534*35238bceSAndroid Build Coastguard Worker     }
535*35238bceSAndroid Build Coastguard Worker 
536*35238bceSAndroid Build Coastguard Worker     if ((int)m_samples.size() == m_spec.sampleCount)
537*35238bceSAndroid Build Coastguard Worker     {
538*35238bceSAndroid Build Coastguard Worker         logResults();
539*35238bceSAndroid Build Coastguard Worker         return STOP;
540*35238bceSAndroid Build Coastguard Worker     }
541*35238bceSAndroid Build Coastguard Worker     else
542*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
543*35238bceSAndroid Build Coastguard Worker }
544*35238bceSAndroid Build Coastguard Worker 
MakeCurrentPerfTests(EglTestContext & eglTestCtx)545*35238bceSAndroid Build Coastguard Worker MakeCurrentPerfTests::MakeCurrentPerfTests(EglTestContext &eglTestCtx)
546*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(eglTestCtx, "make_current", "eglMakeCurrent performance tests")
547*35238bceSAndroid Build Coastguard Worker {
548*35238bceSAndroid Build Coastguard Worker }
549*35238bceSAndroid Build Coastguard Worker 
init(void)550*35238bceSAndroid Build Coastguard Worker void MakeCurrentPerfTests::init(void)
551*35238bceSAndroid Build Coastguard Worker {
552*35238bceSAndroid Build Coastguard Worker     const int iterationCount = 100;
553*35238bceSAndroid Build Coastguard Worker     const int sampleCount    = 100;
554*35238bceSAndroid Build Coastguard Worker 
555*35238bceSAndroid Build Coastguard Worker     // Add simple test group
556*35238bceSAndroid Build Coastguard Worker     {
557*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *simple = new TestCaseGroup(
558*35238bceSAndroid Build Coastguard Worker             m_eglTestCtx, "simple", "Simple eglMakeCurrent performance tests using single context and surface");
559*35238bceSAndroid Build Coastguard Worker 
560*35238bceSAndroid Build Coastguard Worker         const MakeCurrentPerfCase::SurfaceType types[] = {MakeCurrentPerfCase::SURFACETYPE_PBUFFER,
561*35238bceSAndroid Build Coastguard Worker                                                           MakeCurrentPerfCase::SURFACETYPE_PIXMAP,
562*35238bceSAndroid Build Coastguard Worker                                                           MakeCurrentPerfCase::SURFACETYPE_WINDOW};
563*35238bceSAndroid Build Coastguard Worker 
564*35238bceSAndroid Build Coastguard Worker         for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
565*35238bceSAndroid Build Coastguard Worker         {
566*35238bceSAndroid Build Coastguard Worker             for (int releaseNdx = 0; releaseNdx < 2; releaseNdx++)
567*35238bceSAndroid Build Coastguard Worker             {
568*35238bceSAndroid Build Coastguard Worker                 MakeCurrentPerfCase::Spec spec;
569*35238bceSAndroid Build Coastguard Worker 
570*35238bceSAndroid Build Coastguard Worker                 spec.surfaceTypes   = types[typeNdx];
571*35238bceSAndroid Build Coastguard Worker                 spec.contextCount   = 1;
572*35238bceSAndroid Build Coastguard Worker                 spec.surfaceCount   = 1;
573*35238bceSAndroid Build Coastguard Worker                 spec.release        = (releaseNdx == 1);
574*35238bceSAndroid Build Coastguard Worker                 spec.iterationCount = iterationCount;
575*35238bceSAndroid Build Coastguard Worker                 spec.sampleCount    = sampleCount;
576*35238bceSAndroid Build Coastguard Worker 
577*35238bceSAndroid Build Coastguard Worker                 simple->addChild(
578*35238bceSAndroid Build Coastguard Worker                     new MakeCurrentPerfCase(m_eglTestCtx, spec, spec.toName().c_str(), spec.toDescription().c_str()));
579*35238bceSAndroid Build Coastguard Worker             }
580*35238bceSAndroid Build Coastguard Worker         }
581*35238bceSAndroid Build Coastguard Worker 
582*35238bceSAndroid Build Coastguard Worker         addChild(simple);
583*35238bceSAndroid Build Coastguard Worker     }
584*35238bceSAndroid Build Coastguard Worker 
585*35238bceSAndroid Build Coastguard Worker     // Add multi context test group
586*35238bceSAndroid Build Coastguard Worker     {
587*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *multiContext =
588*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(m_eglTestCtx, "multi_context",
589*35238bceSAndroid Build Coastguard Worker                               "eglMakeCurrent performance tests using multiple contexts and single surface");
590*35238bceSAndroid Build Coastguard Worker 
591*35238bceSAndroid Build Coastguard Worker         const MakeCurrentPerfCase::SurfaceType types[] = {MakeCurrentPerfCase::SURFACETYPE_PBUFFER,
592*35238bceSAndroid Build Coastguard Worker                                                           MakeCurrentPerfCase::SURFACETYPE_PIXMAP,
593*35238bceSAndroid Build Coastguard Worker                                                           MakeCurrentPerfCase::SURFACETYPE_WINDOW};
594*35238bceSAndroid Build Coastguard Worker 
595*35238bceSAndroid Build Coastguard Worker         const int contextCounts[] = {10, 100};
596*35238bceSAndroid Build Coastguard Worker 
597*35238bceSAndroid Build Coastguard Worker         for (int contextCountNdx = 0; contextCountNdx < DE_LENGTH_OF_ARRAY(contextCounts); contextCountNdx++)
598*35238bceSAndroid Build Coastguard Worker         {
599*35238bceSAndroid Build Coastguard Worker             for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
600*35238bceSAndroid Build Coastguard Worker             {
601*35238bceSAndroid Build Coastguard Worker                 for (int releaseNdx = 0; releaseNdx < 2; releaseNdx++)
602*35238bceSAndroid Build Coastguard Worker                 {
603*35238bceSAndroid Build Coastguard Worker                     MakeCurrentPerfCase::Spec spec;
604*35238bceSAndroid Build Coastguard Worker 
605*35238bceSAndroid Build Coastguard Worker                     spec.surfaceTypes   = types[typeNdx];
606*35238bceSAndroid Build Coastguard Worker                     spec.contextCount   = contextCounts[contextCountNdx];
607*35238bceSAndroid Build Coastguard Worker                     spec.surfaceCount   = 1;
608*35238bceSAndroid Build Coastguard Worker                     spec.release        = (releaseNdx == 1);
609*35238bceSAndroid Build Coastguard Worker                     spec.iterationCount = iterationCount;
610*35238bceSAndroid Build Coastguard Worker                     spec.sampleCount    = sampleCount;
611*35238bceSAndroid Build Coastguard Worker 
612*35238bceSAndroid Build Coastguard Worker                     multiContext->addChild(new MakeCurrentPerfCase(m_eglTestCtx, spec, spec.toName().c_str(),
613*35238bceSAndroid Build Coastguard Worker                                                                    spec.toDescription().c_str()));
614*35238bceSAndroid Build Coastguard Worker                 }
615*35238bceSAndroid Build Coastguard Worker             }
616*35238bceSAndroid Build Coastguard Worker         }
617*35238bceSAndroid Build Coastguard Worker 
618*35238bceSAndroid Build Coastguard Worker         addChild(multiContext);
619*35238bceSAndroid Build Coastguard Worker     }
620*35238bceSAndroid Build Coastguard Worker 
621*35238bceSAndroid Build Coastguard Worker     // Add multi surface test group
622*35238bceSAndroid Build Coastguard Worker     {
623*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *multiSurface =
624*35238bceSAndroid Build Coastguard Worker             new TestCaseGroup(m_eglTestCtx, "multi_surface",
625*35238bceSAndroid Build Coastguard Worker                               "eglMakeCurrent performance tests using single context and multiple surfaces");
626*35238bceSAndroid Build Coastguard Worker 
627*35238bceSAndroid Build Coastguard Worker         const MakeCurrentPerfCase::SurfaceType types[] = {
628*35238bceSAndroid Build Coastguard Worker             MakeCurrentPerfCase::SURFACETYPE_PBUFFER,
629*35238bceSAndroid Build Coastguard Worker             MakeCurrentPerfCase::SURFACETYPE_PIXMAP,
630*35238bceSAndroid Build Coastguard Worker             MakeCurrentPerfCase::SURFACETYPE_WINDOW,
631*35238bceSAndroid Build Coastguard Worker 
632*35238bceSAndroid Build Coastguard Worker             (MakeCurrentPerfCase::SurfaceType)(MakeCurrentPerfCase::SURFACETYPE_PBUFFER |
633*35238bceSAndroid Build Coastguard Worker                                                MakeCurrentPerfCase::SURFACETYPE_PIXMAP),
634*35238bceSAndroid Build Coastguard Worker             (MakeCurrentPerfCase::SurfaceType)(MakeCurrentPerfCase::SURFACETYPE_PBUFFER |
635*35238bceSAndroid Build Coastguard Worker                                                MakeCurrentPerfCase::SURFACETYPE_WINDOW),
636*35238bceSAndroid Build Coastguard Worker             (MakeCurrentPerfCase::SurfaceType)(MakeCurrentPerfCase::SURFACETYPE_PIXMAP |
637*35238bceSAndroid Build Coastguard Worker                                                MakeCurrentPerfCase::SURFACETYPE_WINDOW),
638*35238bceSAndroid Build Coastguard Worker 
639*35238bceSAndroid Build Coastguard Worker             (MakeCurrentPerfCase::SurfaceType)(MakeCurrentPerfCase::SURFACETYPE_PBUFFER |
640*35238bceSAndroid Build Coastguard Worker                                                MakeCurrentPerfCase::SURFACETYPE_PIXMAP |
641*35238bceSAndroid Build Coastguard Worker                                                MakeCurrentPerfCase::SURFACETYPE_WINDOW)};
642*35238bceSAndroid Build Coastguard Worker 
643*35238bceSAndroid Build Coastguard Worker         const int surfaceCounts[] = {10, 100};
644*35238bceSAndroid Build Coastguard Worker 
645*35238bceSAndroid Build Coastguard Worker         for (int surfaceCountNdx = 0; surfaceCountNdx < DE_LENGTH_OF_ARRAY(surfaceCounts); surfaceCountNdx++)
646*35238bceSAndroid Build Coastguard Worker         {
647*35238bceSAndroid Build Coastguard Worker             for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
648*35238bceSAndroid Build Coastguard Worker             {
649*35238bceSAndroid Build Coastguard Worker                 for (int releaseNdx = 0; releaseNdx < 2; releaseNdx++)
650*35238bceSAndroid Build Coastguard Worker                 {
651*35238bceSAndroid Build Coastguard Worker                     MakeCurrentPerfCase::Spec spec;
652*35238bceSAndroid Build Coastguard Worker 
653*35238bceSAndroid Build Coastguard Worker                     spec.surfaceTypes   = types[typeNdx];
654*35238bceSAndroid Build Coastguard Worker                     spec.surfaceCount   = surfaceCounts[surfaceCountNdx];
655*35238bceSAndroid Build Coastguard Worker                     spec.contextCount   = 1;
656*35238bceSAndroid Build Coastguard Worker                     spec.release        = (releaseNdx == 1);
657*35238bceSAndroid Build Coastguard Worker                     spec.iterationCount = iterationCount;
658*35238bceSAndroid Build Coastguard Worker                     spec.sampleCount    = sampleCount;
659*35238bceSAndroid Build Coastguard Worker 
660*35238bceSAndroid Build Coastguard Worker                     multiSurface->addChild(new MakeCurrentPerfCase(m_eglTestCtx, spec, spec.toName().c_str(),
661*35238bceSAndroid Build Coastguard Worker                                                                    spec.toDescription().c_str()));
662*35238bceSAndroid Build Coastguard Worker                 }
663*35238bceSAndroid Build Coastguard Worker             }
664*35238bceSAndroid Build Coastguard Worker         }
665*35238bceSAndroid Build Coastguard Worker 
666*35238bceSAndroid Build Coastguard Worker         addChild(multiSurface);
667*35238bceSAndroid Build Coastguard Worker     }
668*35238bceSAndroid Build Coastguard Worker 
669*35238bceSAndroid Build Coastguard Worker     // Add Complex? test group
670*35238bceSAndroid Build Coastguard Worker     {
671*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *multi = new TestCaseGroup(
672*35238bceSAndroid Build Coastguard Worker             m_eglTestCtx, "complex", "eglMakeCurrent performance tests using multiple contexts and multiple surfaces");
673*35238bceSAndroid Build Coastguard Worker 
674*35238bceSAndroid Build Coastguard Worker         const MakeCurrentPerfCase::SurfaceType types[] = {
675*35238bceSAndroid Build Coastguard Worker             MakeCurrentPerfCase::SURFACETYPE_PBUFFER,
676*35238bceSAndroid Build Coastguard Worker             MakeCurrentPerfCase::SURFACETYPE_PIXMAP,
677*35238bceSAndroid Build Coastguard Worker             MakeCurrentPerfCase::SURFACETYPE_WINDOW,
678*35238bceSAndroid Build Coastguard Worker 
679*35238bceSAndroid Build Coastguard Worker             (MakeCurrentPerfCase::SurfaceType)(MakeCurrentPerfCase::SURFACETYPE_PBUFFER |
680*35238bceSAndroid Build Coastguard Worker                                                MakeCurrentPerfCase::SURFACETYPE_PIXMAP),
681*35238bceSAndroid Build Coastguard Worker             (MakeCurrentPerfCase::SurfaceType)(MakeCurrentPerfCase::SURFACETYPE_PBUFFER |
682*35238bceSAndroid Build Coastguard Worker                                                MakeCurrentPerfCase::SURFACETYPE_WINDOW),
683*35238bceSAndroid Build Coastguard Worker             (MakeCurrentPerfCase::SurfaceType)(MakeCurrentPerfCase::SURFACETYPE_PIXMAP |
684*35238bceSAndroid Build Coastguard Worker                                                MakeCurrentPerfCase::SURFACETYPE_WINDOW),
685*35238bceSAndroid Build Coastguard Worker 
686*35238bceSAndroid Build Coastguard Worker             (MakeCurrentPerfCase::SurfaceType)(MakeCurrentPerfCase::SURFACETYPE_PBUFFER |
687*35238bceSAndroid Build Coastguard Worker                                                MakeCurrentPerfCase::SURFACETYPE_PIXMAP |
688*35238bceSAndroid Build Coastguard Worker                                                MakeCurrentPerfCase::SURFACETYPE_WINDOW)};
689*35238bceSAndroid Build Coastguard Worker 
690*35238bceSAndroid Build Coastguard Worker         const int surfaceCounts[] = {10, 100};
691*35238bceSAndroid Build Coastguard Worker 
692*35238bceSAndroid Build Coastguard Worker         const int contextCounts[] = {10, 100};
693*35238bceSAndroid Build Coastguard Worker 
694*35238bceSAndroid Build Coastguard Worker         for (int surfaceCountNdx = 0; surfaceCountNdx < DE_LENGTH_OF_ARRAY(surfaceCounts); surfaceCountNdx++)
695*35238bceSAndroid Build Coastguard Worker         {
696*35238bceSAndroid Build Coastguard Worker             for (int contextCountNdx = 0; contextCountNdx < DE_LENGTH_OF_ARRAY(contextCounts); contextCountNdx++)
697*35238bceSAndroid Build Coastguard Worker             {
698*35238bceSAndroid Build Coastguard Worker                 for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(types); typeNdx++)
699*35238bceSAndroid Build Coastguard Worker                 {
700*35238bceSAndroid Build Coastguard Worker                     for (int releaseNdx = 0; releaseNdx < 2; releaseNdx++)
701*35238bceSAndroid Build Coastguard Worker                     {
702*35238bceSAndroid Build Coastguard Worker                         MakeCurrentPerfCase::Spec spec;
703*35238bceSAndroid Build Coastguard Worker 
704*35238bceSAndroid Build Coastguard Worker                         spec.surfaceTypes   = types[typeNdx];
705*35238bceSAndroid Build Coastguard Worker                         spec.contextCount   = contextCounts[contextCountNdx];
706*35238bceSAndroid Build Coastguard Worker                         spec.surfaceCount   = surfaceCounts[surfaceCountNdx];
707*35238bceSAndroid Build Coastguard Worker                         spec.release        = (releaseNdx == 1);
708*35238bceSAndroid Build Coastguard Worker                         spec.iterationCount = iterationCount;
709*35238bceSAndroid Build Coastguard Worker                         spec.sampleCount    = sampleCount;
710*35238bceSAndroid Build Coastguard Worker 
711*35238bceSAndroid Build Coastguard Worker                         multi->addChild(new MakeCurrentPerfCase(m_eglTestCtx, spec, spec.toName().c_str(),
712*35238bceSAndroid Build Coastguard Worker                                                                 spec.toDescription().c_str()));
713*35238bceSAndroid Build Coastguard Worker                     }
714*35238bceSAndroid Build Coastguard Worker                 }
715*35238bceSAndroid Build Coastguard Worker             }
716*35238bceSAndroid Build Coastguard Worker         }
717*35238bceSAndroid Build Coastguard Worker 
718*35238bceSAndroid Build Coastguard Worker         addChild(multi);
719*35238bceSAndroid Build Coastguard Worker     }
720*35238bceSAndroid Build Coastguard Worker }
721*35238bceSAndroid Build Coastguard Worker 
722*35238bceSAndroid Build Coastguard Worker } // namespace egl
723*35238bceSAndroid Build Coastguard Worker } // namespace deqp
724