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