#ifndef _TCUIOSPLATFORM_HPP
#define _TCUIOSPLATFORM_HPP
/*-------------------------------------------------------------------------
 * 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 iOS Platform implementation.
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "tcuPlatform.hpp"
#include "gluPlatform.hpp"
#include "gluRenderContext.hpp"
#include "gluContextFactory.hpp"
#include "gluObjectWrapper.hpp"
#include "tcuRenderTarget.hpp"
#include "glwFunctions.hpp"
#include "deMutex.hpp"

#import "tcuEAGLView.h"

#import <OpenGLES/EAGL.h>

namespace tcu
{
namespace ios
{

class ScreenManager
{
public:
									ScreenManager			(tcuEAGLView* view);
									~ScreenManager			(void);

	CAEAGLLayer*					acquireScreen			(void);
	void							releaseScreen			(CAEAGLLayer* layer);

private:
									ScreenManager			(const ScreenManager&);
	ScreenManager&					operator=				(const ScreenManager&);

	tcuEAGLView*					m_view;
	de::Mutex						m_viewLock;
};

class ContextFactory : public glu::ContextFactory
{
public:
									ContextFactory			(ScreenManager* screenManager);
									~ContextFactory			(void);

	glu::RenderContext*				createContext			(const glu::RenderConfig& config, const tcu::CommandLine& cmdLine) const;

private:
	ScreenManager* const			m_screenManager;
};

class Platform : public tcu::Platform, private glu::Platform
{
public:
									Platform				(ScreenManager* screenManager);
	virtual							~Platform				(void);

	const glu::Platform&			getGLPlatform			(void) const { return static_cast<const glu::Platform&>(*this); }
};

//! EAGLContext-backed rendering context. Doesn't have default framebuffer.
class RawContext : public glu::RenderContext
{
public:
									RawContext				(glu::ContextType type);
	virtual							~RawContext				(void);

	virtual glu::ContextType		getType					(void) const { return m_type;							}
	virtual const glw::Functions&	getFunctions			(void) const { return m_functions;						}
	virtual const RenderTarget&		getRenderTarget			(void) const { return m_emptyTarget;					}
	virtual deUint32				getDefaultFramebuffer	(void) const { DE_ASSERT(!"No framebuffer"); return 0;	}
	virtual void					postIterate				(void);

protected:
	EAGLContext*					getEAGLContext			(void) const { return m_context; }

private:
	glu::ContextType				m_type;
	EAGLContext*					m_context;
	glw::Functions					m_functions;
	tcu::RenderTarget				m_emptyTarget;
};

class ScreenContext : public RawContext
{
public:
									ScreenContext			(ScreenManager* screenManager, const glu::RenderConfig& config);
									~ScreenContext			(void);

	virtual const RenderTarget&		getRenderTarget			(void) const { return m_renderTarget;	}
	virtual deUint32				getDefaultFramebuffer	(void) const { return *m_framebuffer;	}
	virtual void					postIterate				(void);

private:
	void							createFramebuffer		(const glu::RenderConfig& config);

	ScreenManager*					m_screenManager;
	CAEAGLLayer*					m_layer;

	glu::Framebuffer				m_framebuffer;
	glu::Renderbuffer				m_colorBuffer;
	glu::Renderbuffer				m_depthStencilBuffer;
	tcu::RenderTarget				m_renderTarget;
};

} // ios
} // tcu

#endif // _TCUIOSPLATFORM_H
