16ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang//
26ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
36ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang// Use of this source code is governed by a BSD-style license that can be
46ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang// found in the LICENSE file.
56ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang//
66ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
76ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#include "gles_conformance_tests.h"
86ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
96ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#include "gtest/gtest.h"
106ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
116ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#include <EGL/egl.h>
126ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#include <EGL/eglext.h>
136ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
146ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#include <map>
156ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#include <string>
166ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#include <vector>
176ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
186ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#define CONFORMANCE_TESTS_ES2 2
196ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#define CONFORMANCE_TESTS_ES3 3
206ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
216ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Langint main(int argc, char** argv)
226ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang{
236ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    testing::InitGoogleTest(&argc, argv);
246ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
256ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    typedef std::pair<std::string, EGLNativeDisplayType> NameDisplayTypePair;
266ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    typedef std::map<std::string, EGLNativeDisplayType> DisplayTypeMap;
276ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    DisplayTypeMap allDisplays;
286ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
296ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#if CONFORMANCE_TESTS_TYPE == CONFORMANCE_TESTS_ES2
306ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    allDisplays["d3d9"] = EGL_DEFAULT_DISPLAY;
316ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    allDisplays["d3d11"] = EGL_D3D11_ONLY_DISPLAY_ANGLE;
326ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#elif CONFORMANCE_TESTS_TYPE == CONFORMANCE_TESTS_ES3
336ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    allDisplays["d3d11"] = EGL_D3D11_ONLY_DISPLAY_ANGLE;
346ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#else
356ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#   error "Unknown CONFORMANCE_TESTS_TYPE"
366ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang#endif
376ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
386ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    // Iterate through the command line arguments and check if they are config names
396ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    std::vector<NameDisplayTypePair> requestedDisplays;
406ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    for (size_t i = 1; i < static_cast<size_t>(argc); i++)
416ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    {
426ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        DisplayTypeMap::const_iterator iter = allDisplays.find(argv[i]);
436ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        if (iter != allDisplays.end())
446ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        {
456ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang            requestedDisplays.push_back(*iter);
466ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        }
476ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    }
486ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
496ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    // If no configs were requested, run them all
506ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    if (requestedDisplays.empty())
516ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    {
526ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        for (DisplayTypeMap::const_iterator i = allDisplays.begin(); i != allDisplays.end(); i++)
536ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        {
546ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang            requestedDisplays.push_back(*i);
556ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        }
566ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    }
576ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
586ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    // Run each requested config
596ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    int rt = 0;
606ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    for (size_t i = 0; i < requestedDisplays.size(); i++)
616ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    {
626ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        ConformanceConfig config = { 64, 64, requestedDisplays[i].second };
636ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        SetCurrentConfig(config);
646ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
656ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        std::cout << "Running test configuration \"" << requestedDisplays[i].first << "\".\n";
666ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
676ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang        rt |= RUN_ALL_TESTS();
686ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    }
696ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang
706ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang    return rt;
716ba49d9460a0071f1e95ba09a428addb9e3931b0Geoff Lang}
72