/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Platform (OS) specific services.
 *//*--------------------------------------------------------------------*/

#include "tcuPlatform.hpp"

namespace tcu
{

Platform::Platform(void)
{
}

Platform::~Platform(void)
{
}

bool Platform::processEvents(void)
{
    return true;
}

const glu::Platform &Platform::getGLPlatform(void) const
{
    TCU_THROW(NotSupportedError, "OpenGL (ES) is not supported");
}

const eglu::Platform &Platform::getEGLPlatform(void) const
{
    TCU_THROW(NotSupportedError, "EGL is not supported");
}

const vk::Platform &Platform::getVulkanPlatform(void) const
{
    TCU_THROW(NotSupportedError, "Vulkan is not supported");
}

} // namespace tcu
