/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright 2016 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 Win32 platform port.
 *//*--------------------------------------------------------------------*/

#include "tcuWin32Platform.hpp"
#include "tcuWGLContextFactory.hpp"
#include "tcuWin32EGLNativeDisplayFactory.hpp"
#include "egluGLContextFactory.hpp"

namespace tcu
{
namespace win32
{

Platform::Platform(void) : m_instance(GetModuleHandle(NULL)), m_vulkanPlatform(m_instance)
{
    // Set process priority to lower.
    SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS);

    {
        wgl::ContextFactory *factory = DE_NULL;

        try
        {
            factory = new wgl::ContextFactory(m_instance);
        }
        catch (const std::exception &e)
        {
            print("Warning: WGL not supported: %s\n", e.what());
        }

        if (factory)
        {
            try
            {
                m_contextFactoryRegistry.registerFactory(factory);
            }
            catch (...)
            {
                delete factory;
                throw;
            }
        }
    }

    m_nativeDisplayFactoryRegistry.registerFactory(new win32::EGLNativeDisplayFactory(m_instance));
    m_contextFactoryRegistry.registerFactory(new eglu::GLContextFactory(m_nativeDisplayFactoryRegistry));
}

Platform::~Platform(void)
{
}

bool Platform::processEvents(void)
{
    MSG msg;
    while (PeekMessage(&msg, (HWND)-1, 0, 0, PM_REMOVE))
    {
        DispatchMessage(&msg);
        if (msg.message == WM_QUIT)
            return false;
    }
    return true;
}

} // namespace win32
} // namespace tcu

// Create platform
tcu::Platform *createPlatform(void)
{
    return new tcu::win32::Platform();
}
