#include "Common/Log.h"
#include "Core/Config.h"
#include "Core/ConfigValues.h"
#include "Core/System.h"
#include "Common/GPU/OpenGL/GLFeatures.h"

#include "libretro/LibretroGLContext.h"

bool LibretroGLContext::Init() {
	if (!LibretroHWRenderContext::Init(false))
		return false;

	g_Config.iGPUBackend = (int)GPUBackend::OPENGL;
	return true;
}

void LibretroGLContext::CreateDrawContext() {

#ifndef USING_GLES2
    // Some core profile drivers elide certain extensions from GL_EXTENSIONS/etc.
    // glewExperimental allows us to force GLEW to search for the pointers anyway.
    if (gl_extensions.IsCoreContext)
        glewExperimental = true;
    if (GLEW_OK != glewInit()) {
        printf("Failed to initialize glew!\n");
    }
    // Unfortunately, glew will generate an invalid enum error, ignore.
    if (gl_extensions.IsCoreContext)
        glGetError();
#endif

    CheckGLExtensions();
    draw_ = Draw::T3DCreateGLContext(false);
    renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER);
    renderManager_->SetInflightFrames(g_Config.iInflightFrames);
    SetGPUBackend(GPUBackend::OPENGL);
    draw_->CreatePresets();
}

void LibretroGLContext::DestroyDrawContext() {
	LibretroHWRenderContext::DestroyDrawContext();
	renderManager_ = nullptr;
}