//
//  Copyright 2019 The ANGLE Project Authors. All rights reserved.
//  Use of this source code is governed by a BSD-style license that can be
//  found in the LICENSE file.
//
//  tes31Context_override.cpp:
//    Issue 3687: Overrides for dEQP's OpenGL ES 3.1 test context
//

// Keep the delta compared to dEQP at a minimum
// clang-format off

#include "tes31Context.hpp"
#include "gluRenderContext.hpp"
#include "gluRenderConfig.hpp"
#include "gluFboRenderContext.hpp"
#include "gluContextInfo.hpp"
#include "gluDummyRenderContext.hpp"
#include "tcuCommandLine.hpp"

namespace deqp
{
namespace gles31
{

Context::Context (tcu::TestContext& testCtx)
    : m_testCtx        (testCtx)
    , m_renderCtx    (DE_NULL)
    , m_contextInfo    (DE_NULL)
{
    if (m_testCtx.getCommandLine().getRunMode() == tcu::RUNMODE_EXECUTE)
        createRenderContext();
    else
    {
        // \todo [2016-11-15 pyry] Many tests (erroneously) inspect context type
        //                           during test hierarchy construction. We should fix that
        //                           and revert dummy context to advertise unknown context type.
        m_renderCtx = new glu::DummyRenderContext(glu::ContextType(glu::ApiType::es(3,1)));
    }
}

Context::~Context (void)
{
    destroyRenderContext();
}

void Context::createRenderContext (void)
{
    DE_ASSERT(!m_renderCtx && !m_contextInfo);

    try
    {
// Issue 3687
// OpenGL ES 3.2 contexts are not supported yet, and the 3.2 context creation failure results in
// tests that pass with the recreated 3.1 context being marked "fail".
// Revert with Issue 3688
#if 0
        try
        {
            m_renderCtx        = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 2));
        }
        catch (...)
        {
            m_renderCtx        = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 1));
        }
#else
        // Override the original behavior (above) to only create a 3.1 context
        m_renderCtx        = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 1));
#endif
        m_contextInfo    = glu::ContextInfo::create(*m_renderCtx);
    }
    catch (...)
    {
        destroyRenderContext();
        throw;
    }
}

void Context::destroyRenderContext (void)
{
    delete m_contextInfo;
    delete m_renderCtx;

    m_contextInfo    = DE_NULL;
    m_renderCtx        = DE_NULL;
}

const tcu::RenderTarget& Context::getRenderTarget (void) const
{
    return m_renderCtx->getRenderTarget();
}

} // gles31
} // deqp

// clang-format on
