#ifndef _SGLRREFERENCECONTEXT_HPP
#define _SGLRREFERENCECONTEXT_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program OpenGL ES Utilities
 * ------------------------------------------------
 *
 * 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 Reference Rendering Context.
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "sglrContext.hpp"
#include "tcuPixelFormat.hpp"
#include "tcuSurface.hpp"
#include "tcuTexture.hpp"
#include "tcuVector.hpp"
#include "rrFragmentOperations.hpp"
#include "rrRenderState.hpp"
#include "rrRenderer.hpp"
#include "rrMultisamplePixelBufferAccess.hpp"
#include "gluRenderContext.hpp"
#include "gluShaderUtil.hpp"
#include "deArrayBuffer.hpp"

#include <map>
#include <vector>

namespace sglr
{
namespace rc
{

enum
{
	MAX_TEXTURE_SIZE_LOG2		= 14,
	MAX_TEXTURE_SIZE			= 1<<MAX_TEXTURE_SIZE_LOG2
};

class NamedObject
{
public:
	virtual			~NamedObject		(void) {}

	deUint32		getName				(void) const	{ return m_name;								}

	int				getRefCount			(void) const	{ return m_refCount;							}
	void			incRefCount			(void)			{ m_refCount += 1;								}
	void			decRefCount			(void)			{ DE_ASSERT(m_refCount > 0); m_refCount -= 1;	}

protected:
					NamedObject			(deUint32 name) : m_name(name), m_refCount(1) {}

private:
	deUint32		m_name;
	int				m_refCount;
};

class Texture : public NamedObject
{
public:
	enum Type
	{
		TYPE_1D,
		TYPE_2D,
		TYPE_CUBE_MAP,
		TYPE_2D_ARRAY,
		TYPE_3D,
		TYPE_CUBE_MAP_ARRAY,

		TYPE_LAST
	};

								Texture			(deUint32 name, Type type);
	virtual						~Texture		(void) {}

	Type						getType			(void) const	{ return m_type;			}

	int							getBaseLevel	(void) const	{ return m_baseLevel;		}
	int							getMaxLevel		(void) const	{ return m_maxLevel;		}
	bool						isImmutable		(void) const	{ return m_immutable;		}

	void						setBaseLevel	(int baseLevel)	{ m_baseLevel = baseLevel;	}
	void						setMaxLevel		(int maxLevel)	{ m_maxLevel = maxLevel;	}
	void						setImmutable	(void)			{ m_immutable = true;		}

	const tcu::Sampler&			getSampler		(void) const	{ return m_sampler;			}
	tcu::Sampler&				getSampler		(void)			{ return m_sampler;			}

private:
	Type						m_type;

	bool						m_immutable;

	tcu::Sampler				m_sampler;
	int							m_baseLevel;
	int							m_maxLevel;
};

//! Class for managing list of texture levels.
class TextureLevelArray
{
public:
										TextureLevelArray	(void);
										~TextureLevelArray	(void);

	bool								hasLevel			(int level) const	{ return deInBounds32(level, 0, DE_LENGTH_OF_ARRAY(m_data)) && !m_data[level].empty();	}
	const tcu::PixelBufferAccess&		getLevel			(int level)			{ DE_ASSERT(hasLevel(level)); return m_access[level];									}
	const tcu::ConstPixelBufferAccess&	getLevel			(int level) const	{ DE_ASSERT(hasLevel(level)); return m_access[level];									}

	const tcu::ConstPixelBufferAccess*	getLevels			(void) const		{ return &m_access[0];																	}
	const tcu::ConstPixelBufferAccess*	getEffectiveLevels	(void) const		{ return &m_effectiveAccess[0];															}

	void								allocLevel			(int level, const tcu::TextureFormat& format, int width, int height, int depth);
	void								clearLevel			(int level);

	void								clear				(void);

	void								updateSamplerMode	(tcu::Sampler::DepthStencilMode);

private:
	de::ArrayBuffer<deUint8>			m_data[MAX_TEXTURE_SIZE_LOG2];
	tcu::PixelBufferAccess				m_access[MAX_TEXTURE_SIZE_LOG2];
	tcu::ConstPixelBufferAccess			m_effectiveAccess[MAX_TEXTURE_SIZE_LOG2];	//!< the currently effective sampling mode. For Depth-stencil texture always either Depth or stencil.
};

class Texture1D : public Texture
{
public:
										Texture1D		(deUint32 name = 0);
	virtual								~Texture1D		(void);

	void								clearLevels		(void) { m_levels.clear(); }

	bool								hasLevel		(int level) const	{ return m_levels.hasLevel(level);	}
	const tcu::ConstPixelBufferAccess&	getLevel		(int level) const	{ return m_levels.getLevel(level);	}
	const tcu::PixelBufferAccess&		getLevel		(int level)			{ return m_levels.getLevel(level);	}

	void								allocLevel		(int level, const tcu::TextureFormat& format, int width);

	bool								isComplete		(void) const;

	void								updateView		(tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()

	tcu::Vec4							sample			(float s, float lod) const;
	void								sample4			(tcu::Vec4 output[4], const float packetTexcoords[4], float lodBias = 0.0f) const;

private:
	TextureLevelArray					m_levels;
	tcu::Texture2DView					m_view;
};

class Texture2D : public Texture
{
public:
										Texture2D		(deUint32 name = 0);
	virtual								~Texture2D		(void);

	void								clearLevels		(void) { m_levels.clear(); }

	bool								hasLevel		(int level) const	{ return m_levels.hasLevel(level);	}
	const tcu::ConstPixelBufferAccess&	getLevel		(int level) const	{ return m_levels.getLevel(level);	}
	const tcu::PixelBufferAccess&		getLevel		(int level)			{ return m_levels.getLevel(level);	}

	void								allocLevel		(int level, const tcu::TextureFormat& format, int width, int height);

	bool								isComplete		(void) const;

	void								updateView		(tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()

	tcu::Vec4							sample			(float s, float t, float lod) const;
	void								sample4			(tcu::Vec4 output[4], const tcu::Vec2 packetTexcoords[4], float lodBias = 0.0f) const;

private:
	TextureLevelArray					m_levels;
	tcu::Texture2DView					m_view;
};

class TextureCube : public Texture
{
public:
										TextureCube		(deUint32 name = 0);
	virtual								~TextureCube	(void);

	void								clearLevels		(void);

	bool								hasFace			(int level, tcu::CubeFace face) const	{ return m_levels[face].hasLevel(level);	}
	const tcu::PixelBufferAccess&		getFace			(int level, tcu::CubeFace face)			{ return m_levels[face].getLevel(level);	}
	const tcu::ConstPixelBufferAccess&	getFace			(int level, tcu::CubeFace face) const	{ return m_levels[face].getLevel(level);	}

	void								allocFace		(int level, tcu::CubeFace face, const tcu::TextureFormat& format, int width, int height);

	bool								isComplete		(void) const;
	void								updateView		(tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()

	tcu::Vec4							sample			(float s, float t, float p, float lod) const;
	void								sample4			(tcu::Vec4 output[4], const tcu::Vec3 packetTexcoords[4], float lodBias = 0.0f) const;

private:
	TextureLevelArray					m_levels[tcu::CUBEFACE_LAST];
	tcu::TextureCubeView				m_view;
};

class Texture2DArray : public Texture
{
public:
										Texture2DArray	(deUint32 name = 0);
	virtual								~Texture2DArray	(void);

	void								clearLevels		(void) { m_levels.clear(); }

	bool								hasLevel		(int level) const	{ return m_levels.hasLevel(level);	}
	const tcu::ConstPixelBufferAccess&	getLevel		(int level) const	{ return m_levels.getLevel(level);	}
	const tcu::PixelBufferAccess&		getLevel		(int level)			{ return m_levels.getLevel(level);	}

	void								allocLevel		(int level, const tcu::TextureFormat& format, int width, int height, int numLayers);

	bool								isComplete		(void) const;

	void								updateView		(tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()

	tcu::Vec4							sample			(float s, float t, float r, float lod) const;
	void								sample4			(tcu::Vec4 output[4], const tcu::Vec3 packetTexcoords[4], float lodBias = 0.0f) const;

private:
	TextureLevelArray					m_levels;
	tcu::Texture2DArrayView				m_view;
};

class Texture3D : public Texture
{
public:
										Texture3D		(deUint32 name = 0);
	virtual								~Texture3D		(void);

	void								clearLevels		(void) { m_levels.clear(); }

	bool								hasLevel		(int level) const	{ return m_levels.hasLevel(level);	}
	const tcu::ConstPixelBufferAccess&	getLevel		(int level) const	{ return m_levels.getLevel(level);	}
	const tcu::PixelBufferAccess&		getLevel		(int level)			{ return m_levels.getLevel(level);	}

	void								allocLevel		(int level, const tcu::TextureFormat& format, int width, int height, int numLayers);

	bool								isComplete		(void) const;

	void								updateView		(tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()

	tcu::Vec4							sample			(float s, float t, float r, float lod) const;
	void								sample4			(tcu::Vec4 output[4], const tcu::Vec3 packetTexcoords[4], float lodBias = 0.0f) const;

private:
	TextureLevelArray					m_levels;
	tcu::Texture3DView					m_view;
};

class TextureCubeArray : public Texture
{
public:
										TextureCubeArray	(deUint32 name = 0);
	virtual								~TextureCubeArray	(void);

	void								clearLevels			(void) { m_levels.clear(); }

	bool								hasLevel			(int level) const	{ return m_levels.hasLevel(level);	}
	const tcu::ConstPixelBufferAccess&	getLevel			(int level) const	{ return m_levels.getLevel(level);	}
	const tcu::PixelBufferAccess&		getLevel			(int level)			{ return m_levels.getLevel(level);	}

	void								allocLevel			(int level, const tcu::TextureFormat& format, int width, int height, int numLayers);

	bool								isComplete			(void) const;

	void								updateView			(tcu::Sampler::DepthStencilMode mode); // \note View must be refreshed after texture parameter/size changes, before calling sample*()

	tcu::Vec4							sample				(float s, float t, float r, float q, float lod) const;
	void								sample4				(tcu::Vec4 output[4], const tcu::Vec4 packetTexcoords[4], float lodBias = 0.0f) const;

private:
	TextureLevelArray					m_levels;
	tcu::TextureCubeArrayView			m_view;
};

class Renderbuffer : public NamedObject
{
public:
	enum Format
	{
		FORMAT_DEPTH_COMPONENT16,
		FORMAT_RGBA4,
		FORMAT_RGB5_A1,
		FORMAT_RGB565,
		FORMAT_STENCIL_INDEX8,

		FORMAT_LAST
	};

								Renderbuffer		(deUint32 name);
	virtual						~Renderbuffer		(void);

	void						setStorage			(const tcu::TextureFormat& format, int width, int height);

	int							getWidth			(void) const	{ return m_data.getWidth();		}
	int							getHeight			(void) const	{ return m_data.getHeight();	}
	tcu::TextureFormat			getFormat			(void) const	{ return m_data.getFormat();	}

	tcu::PixelBufferAccess		getAccess			(void)			{ return m_data.getAccess();	}
	tcu::ConstPixelBufferAccess	getAccess			(void) const	{ return m_data.getAccess();	}

private:
	tcu::TextureLevel			m_data;
};

class Framebuffer : public NamedObject
{
public:
	enum AttachmentPoint
	{
		ATTACHMENTPOINT_COLOR0,
		ATTACHMENTPOINT_DEPTH,
		ATTACHMENTPOINT_STENCIL,

		ATTACHMENTPOINT_LAST
	};

	enum AttachmentType
	{
		ATTACHMENTTYPE_RENDERBUFFER,
		ATTACHMENTTYPE_TEXTURE,

		ATTACHMENTTYPE_LAST
	};

	enum TexTarget
	{
		TEXTARGET_2D,
		TEXTARGET_CUBE_MAP_POSITIVE_X,
		TEXTARGET_CUBE_MAP_POSITIVE_Y,
		TEXTARGET_CUBE_MAP_POSITIVE_Z,
		TEXTARGET_CUBE_MAP_NEGATIVE_X,
		TEXTARGET_CUBE_MAP_NEGATIVE_Y,
		TEXTARGET_CUBE_MAP_NEGATIVE_Z,
		TEXTARGET_2D_ARRAY,
		TEXTARGET_3D,
		TEXTARGET_CUBE_MAP_ARRAY,

		TEXTARGET_LAST
	};

	struct Attachment
	{
		AttachmentType	type;
		deUint32		name;
		TexTarget		texTarget;
		int				level;
		int				layer;

		Attachment (void)
			: type		(ATTACHMENTTYPE_LAST)
			, name		(0)
			, texTarget	(TEXTARGET_LAST)
			, level		(0)
			, layer		(0)
		{
		}
	};

							Framebuffer		(deUint32 name);
	virtual					~Framebuffer	(void);

	Attachment&				getAttachment	(AttachmentPoint point)			{ return m_attachments[point]; }
	const Attachment&		getAttachment	(AttachmentPoint point) const	{ return m_attachments[point]; }

private:

	Attachment			m_attachments[ATTACHMENTPOINT_LAST];
};

class DataBuffer : public NamedObject
{
public:
							DataBuffer			(deUint32 name) : NamedObject(name) {}
							~DataBuffer			(void) {}

	void					setStorage			(int size) { m_data.resize(size); }

	int						getSize				(void) const	{ return (int)m_data.size();					}
	const deUint8*			getData				(void) const	{ return m_data.empty() ? DE_NULL : &m_data[0];	}
	deUint8*				getData				(void)			{ return m_data.empty() ? DE_NULL : &m_data[0];	}

private:
	std::vector<deUint8>	m_data;
};

class VertexArray : public NamedObject
{
public:
	struct VertexAttribArray
	{
		bool			enabled;
		int				size;
		int				stride;
		deUint32		type;

		bool			normalized;
		bool			integer;
		int				divisor;

		/**
		  ! These three variables define the state. bufferDeleted is needed to distinguish
		  ! drawing from user pointer and offset to a deleted buffer from each other.
		  !
		  ! Only these three combinations are possible:
		  ! 1) bufferDeleted = false, bufferBinding = NULL, pointer = user_ptr.   < render from a user ptr
		  ! 2) bufferDeleted = false, bufferBinding = ptr,  pointer = offset.     < render from a buffer with offset
		  ! 3) bufferDeleted = true,  bufferBinding = NULL, pointer = offset      < render from a deleted buffer. Don't do anything
		  !
		  ! (bufferFreed = true) implies (bufferBinding = NULL)
		 */
		bool			bufferDeleted;
		rc::DataBuffer*	bufferBinding;
		const void*		pointer;
	};

									VertexArray		(deUint32 name, int maxVertexAttribs);
									~VertexArray	(void) {}

	rc::DataBuffer*					m_elementArrayBufferBinding;
	std::vector<VertexAttribArray>	m_arrays;
};

class ShaderProgramObjectContainer : public NamedObject
{
public:
									ShaderProgramObjectContainer	(deUint32 name, ShaderProgram* program);
									~ShaderProgramObjectContainer	(void);

	ShaderProgram*					m_program;
	bool							m_deleteFlag;
};

template <typename T>
class ObjectManager
{
public:
							ObjectManager			(void);
							~ObjectManager			(void);

	deUint32				allocateName			(void);
	void					insert					(T* object);
	T*						find					(deUint32 name);

	void					acquireReference		(T* object);
	void					releaseReference		(T* object);

	int						getCount				(void) const { return (int)m_objects.size(); }
	void					getAll					(typename std::vector<T*>& objects) const;

private:
							ObjectManager			(const ObjectManager<T>& other);
	ObjectManager&			operator=				(const ObjectManager<T>& other);

	deUint32				m_lastName;
	std::map<deUint32, T*>	m_objects;
};

template <typename T>
ObjectManager<T>::ObjectManager (void)
	: m_lastName(0)
{
}

template <typename T>
ObjectManager<T>::~ObjectManager (void)
{
	DE_ASSERT(m_objects.size() == 0);
}

template <typename T>
deUint32 ObjectManager<T>::allocateName (void)
{
	TCU_CHECK(m_lastName != 0xffffffff);
	return ++m_lastName;
}

template <typename T>
void ObjectManager<T>::insert (T* object)
{
	deUint32 name = object->getName();
	DE_ASSERT(object->getName() != 0);

	if (name > m_lastName)
		m_lastName = name;

	m_objects.insert(std::pair<deUint32, T*>(name, object));
}

template <typename T>
T* ObjectManager<T>::find (deUint32 name)
{
	typename std::map<deUint32, T*>::iterator it = m_objects.find(name);
	if (it != m_objects.end())
		return it->second;
	else
		return DE_NULL;
}

template <typename T>
void ObjectManager<T>::acquireReference (T* object)
{
	DE_ASSERT(find(object->getName()) == object);
	object->incRefCount();
}

template <typename T>
void ObjectManager<T>::releaseReference (T* object)
{
	DE_ASSERT(find(object->getName()) == object);
	object->decRefCount();

	if (object->getRefCount() == 0)
	{
		m_objects.erase(object->getName());
		delete object;
	}
}

template <typename T>
void ObjectManager<T>::getAll (typename std::vector<T*>& objects) const
{
	objects.resize(m_objects.size());
	typename std::vector<T*>::iterator dst = objects.begin();

	for (typename std::map<deUint32, T*>::const_iterator i = m_objects.begin();
		 i != m_objects.end(); i++)
	{
		*dst++ = i->second;
	}
}

} // rc

struct ReferenceContextLimits
{
	ReferenceContextLimits (void)
		: contextType				(glu::ApiType::es(3,0))
		, maxTextureImageUnits		(16)
		, maxTexture2DSize			(2048)
		, maxTextureCubeSize		(2048)
		, maxTexture2DArrayLayers	(256)
		, maxTexture3DSize			(256)
		, maxRenderbufferSize		(2048)
		, maxVertexAttribs			(16)
		, subpixelBits				(rr::RenderState::DEFAULT_SUBPIXEL_BITS)
	{
	}

								ReferenceContextLimits	(const glu::RenderContext& renderCtx);

	void						addExtension			(const char* extension);

	glu::ContextType			contextType;

	int							maxTextureImageUnits;
	int							maxTexture2DSize;
	int							maxTextureCubeSize;
	int							maxTexture2DArrayLayers;
	int							maxTexture3DSize;
	int							maxRenderbufferSize;
	int							maxVertexAttribs;
	int							subpixelBits;

	// Both variants are needed since there are glGetString() and glGetStringi()
	std::vector<std::string>	extensionList;
	std::string					extensionStr;
};

class ReferenceContextBuffers
{
public:
	ReferenceContextBuffers (const tcu::PixelFormat& colorBits, int depthBits, int stencilBits, int width, int height, int samples = 1);

	rr::MultisamplePixelBufferAccess	getColorbuffer		(void) { return rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_colorbuffer.getAccess());	}
	rr::MultisamplePixelBufferAccess	getDepthbuffer		(void) { return rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_depthbuffer.getAccess());	}
	rr::MultisamplePixelBufferAccess	getStencilbuffer	(void) { return rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_stencilbuffer.getAccess());	}

private:
	tcu::TextureLevel	m_colorbuffer;
	tcu::TextureLevel	m_depthbuffer;
	tcu::TextureLevel	m_stencilbuffer;
};

class ReferenceContext : public Context
{
public:
							ReferenceContext		(const ReferenceContextLimits& limits, const rr::MultisamplePixelBufferAccess& colorbuffer, const rr::MultisamplePixelBufferAccess& depthbuffer, const rr::MultisamplePixelBufferAccess& stencilbuffer);
	virtual					~ReferenceContext		(void);

	virtual int				getWidth				(void) const	{ return m_defaultColorbuffer.raw().getHeight();	}
	virtual int				getHeight				(void) const	{ return m_defaultColorbuffer.raw().getDepth();		}

	virtual void			viewport				(int x, int y, int width, int height) { m_viewport = tcu::IVec4(x, y, width, height); }
	virtual void			activeTexture			(deUint32 texture);

	virtual void			bindTexture				(deUint32 target, deUint32 texture);
	virtual void			genTextures				(int numTextures, deUint32* textures);
	virtual void			deleteTextures			(int numTextures, const deUint32* textures);

	virtual void			bindFramebuffer			(deUint32 target, deUint32 framebuffer);
	virtual void			genFramebuffers			(int numFramebuffers, deUint32* framebuffers);
	virtual void			deleteFramebuffers		(int numFramebuffers, const deUint32* framebuffers);

	virtual void			bindRenderbuffer		(deUint32 target, deUint32 renderbuffer);
	virtual void			genRenderbuffers		(int numRenderbuffers, deUint32* renderbuffers);
	virtual void			deleteRenderbuffers		(int numRenderbuffers, const deUint32* renderbuffers);

	virtual void			pixelStorei				(deUint32 pname, int param);
	virtual void			texImage1D				(deUint32 target, int level, deUint32 internalFormat, int width, int border, deUint32 format, deUint32 type, const void* data);
	virtual void			texImage2D				(deUint32 target, int level, deUint32 internalFormat, int width, int height, int border, deUint32 format, deUint32 type, const void* data);
	virtual void			texImage3D				(deUint32 target, int level, deUint32 internalFormat, int width, int height, int depth, int border, deUint32 format, deUint32 type, const void* data);
	virtual void			texSubImage1D			(deUint32 target, int level, int xoffset, int width, deUint32 format, deUint32 type, const void* data);
	virtual void			texSubImage2D			(deUint32 target, int level, int xoffset, int yoffset, int width, int height, deUint32 format, deUint32 type, const void* data);
	virtual void			texSubImage3D			(deUint32 target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, deUint32 format, deUint32 type, const void* data);
	virtual void			copyTexImage1D			(deUint32 target, int level, deUint32 internalFormat, int x, int y, int width, int border);
	virtual void			copyTexImage2D			(deUint32 target, int level, deUint32 internalFormat, int x, int y, int width, int height, int border);
	virtual void			copyTexSubImage1D		(deUint32 target, int level, int xoffset, int x, int y, int width);
	virtual void			copyTexSubImage2D		(deUint32 target, int level, int xoffset, int yoffset, int x, int y, int width, int height);
	virtual void			copyTexSubImage3D		(deUint32 target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height);

	virtual void			texStorage2D			(deUint32 target, int levels, deUint32 internalFormat, int width, int height);
	virtual void			texStorage3D			(deUint32 target, int levels, deUint32 internalFormat, int width, int height, int depth);

	virtual void			texParameteri			(deUint32 target, deUint32 pname, int value);

	virtual void			framebufferTexture2D	(deUint32 target, deUint32 attachment, deUint32 textarget, deUint32 texture, int level);
	virtual void			framebufferTextureLayer	(deUint32 target, deUint32 attachment, deUint32 texture, int level, int layer);
	virtual void			framebufferRenderbuffer	(deUint32 target, deUint32 attachment, deUint32 renderbuffertarget, deUint32 renderbuffer);
	virtual deUint32		checkFramebufferStatus	(deUint32 target);

	virtual void			getFramebufferAttachmentParameteriv	(deUint32 target, deUint32 attachment, deUint32 pname, int* params);

	virtual void			renderbufferStorage				(deUint32 target, deUint32 internalformat, int width, int height);
	virtual void			renderbufferStorageMultisample	(deUint32 target, int samples, deUint32 internalFormat, int width, int height);

	virtual void			bindBuffer				(deUint32 target, deUint32 buffer);
	virtual void			genBuffers				(int numBuffers, deUint32* buffers);
	virtual void			deleteBuffers			(int numBuffers, const deUint32* buffers);

	virtual void			bufferData				(deUint32 target, deIntptr size, const void* data, deUint32 usage);
	virtual void			bufferSubData			(deUint32 target, deIntptr offset, deIntptr size, const void* data);

	virtual void			clearColor				(float red, float green, float blue, float alpha);
	virtual void			clearDepthf				(float depth);
	virtual void			clearStencil			(int stencil);

	virtual void			clear					(deUint32 buffers);
	virtual void			clearBufferiv			(deUint32 buffer, int drawbuffer, const int* value);
	virtual void			clearBufferfv			(deUint32 buffer, int drawbuffer, const float* value);
	virtual void			clearBufferuiv			(deUint32 buffer, int drawbuffer, const deUint32* value);
	virtual void			clearBufferfi			(deUint32 buffer, int drawbuffer, float depth, int stencil);
	virtual void			scissor					(int x, int y, int width, int height);

	virtual void			enable					(deUint32 cap);
	virtual void			disable					(deUint32 cap);

	virtual void			stencilFunc				(deUint32 func, int ref, deUint32 mask);
	virtual void			stencilOp				(deUint32 sfail, deUint32 dpfail, deUint32 dppass);
	virtual void			stencilFuncSeparate		(deUint32 face, deUint32 func, int ref, deUint32 mask);
	virtual void			stencilOpSeparate		(deUint32 face, deUint32 sfail, deUint32 dpfail, deUint32 dppass);

	virtual void			depthFunc				(deUint32 func);
	virtual void			depthRangef				(float n, float f);
	virtual void			depthRange				(double n, double f);

	virtual void			polygonOffset			(float factor, float units);
	virtual void			provokingVertex			(deUint32 convention);
	virtual void			primitiveRestartIndex	(deUint32 index);

	virtual void			blendEquation			(deUint32 mode);
	virtual void			blendEquationSeparate	(deUint32 modeRGB, deUint32 modeAlpha);
	virtual void			blendFunc				(deUint32 src, deUint32 dst);
	virtual void			blendFuncSeparate		(deUint32 srcRGB, deUint32 dstRGB, deUint32 srcAlpha, deUint32 dstAlpha);
	virtual void			blendColor				(float red, float green, float blue, float alpha);

	virtual void			colorMask				(deBool r, deBool g, deBool b, deBool a);
	virtual void			depthMask				(deBool mask);
	virtual void			stencilMask				(deUint32 mask);
	virtual void			stencilMaskSeparate		(deUint32 face, deUint32 mask);

	virtual void			blitFramebuffer			(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, deUint32 mask, deUint32 filter);

	virtual void			invalidateSubFramebuffer(deUint32 target, int numAttachments, const deUint32* attachments, int x, int y, int width, int height);
	virtual void			invalidateFramebuffer	(deUint32 target, int numAttachments, const deUint32* attachments);

	virtual void			bindVertexArray			(deUint32 array);
	virtual void			genVertexArrays			(int numArrays, deUint32* vertexArrays);
	virtual void			deleteVertexArrays		(int numArrays, const deUint32* vertexArrays);

	virtual void			vertexAttribPointer		(deUint32 index, int size, deUint32 type, deBool normalized, int stride, const void *pointer);
	virtual void			vertexAttribIPointer	(deUint32 index, int size, deUint32 type, int stride, const void *pointer);
	virtual void			enableVertexAttribArray	(deUint32 index);
	virtual void			disableVertexAttribArray(deUint32 index);
	virtual void			vertexAttribDivisor		(deUint32 index, deUint32 divisor);

	virtual void			vertexAttrib1f			(deUint32 index, float);
	virtual void			vertexAttrib2f			(deUint32 index, float, float);
	virtual void			vertexAttrib3f			(deUint32 index, float, float, float);
	virtual void			vertexAttrib4f			(deUint32 index, float, float, float, float);
	virtual void			vertexAttribI4i			(deUint32 index, deInt32, deInt32, deInt32, deInt32);
	virtual void			vertexAttribI4ui		(deUint32 index, deUint32, deUint32, deUint32, deUint32);

	virtual deInt32			getAttribLocation		(deUint32 program, const char *name);

	virtual void			uniform1f				(deInt32 location, float);
	virtual void			uniform1i				(deInt32 location, deInt32);
	virtual void			uniform1fv				(deInt32 index, deInt32 count, const float*);
	virtual void			uniform2fv				(deInt32 index, deInt32 count, const float*);
	virtual void			uniform3fv				(deInt32 index, deInt32 count, const float*);
	virtual void			uniform4fv				(deInt32 index, deInt32 count, const float*);
	virtual void			uniform1iv				(deInt32 index, deInt32 count, const deInt32*);
	virtual void			uniform2iv				(deInt32 index, deInt32 count, const deInt32*);
	virtual void			uniform3iv				(deInt32 index, deInt32 count, const deInt32*);
	virtual void			uniform4iv				(deInt32 index, deInt32 count, const deInt32*);
	virtual void			uniformMatrix3fv		(deInt32 location, deInt32 count, deBool transpose, const float *value);
	virtual void			uniformMatrix4fv		(deInt32 location, deInt32 count, deBool transpose, const float *value);
	virtual deInt32			getUniformLocation		(deUint32 program, const char *name);

	virtual void			lineWidth				(float);

	virtual void			drawArrays				(deUint32 mode, int first, int count);
	virtual void			drawArraysInstanced		(deUint32 mode, int first, int count, int instanceCount);
	virtual void			drawElements			(deUint32 mode, int count, deUint32 type, const void *indices);
	virtual void			drawElementsBaseVertex	(deUint32 mode, int count, deUint32 type, const void *indices, int baseVertex);
	virtual void			drawElementsInstanced	(deUint32 mode, int count, deUint32 type, const void *indices, int instanceCount);
	virtual void			drawElementsInstancedBaseVertex	(deUint32 mode, int count, deUint32 type, const void *indices, int instanceCount, int baseVertex);
	virtual void			drawRangeElements		(deUint32 mode, deUint32 start, deUint32 end, int count, deUint32 type, const void *indices);
	virtual void			drawRangeElementsBaseVertex (deUint32 mode, deUint32 start, deUint32 end, int count, deUint32 type, const void *indices, int baseVertex);
	virtual void			drawArraysIndirect		(deUint32 mode, const void *indirect);
	virtual void			drawElementsIndirect	(deUint32 mode, deUint32 type, const void *indirect);

	virtual void			multiDrawArrays			(deUint32 mode, const int* first, const int* count, int primCount);
	virtual void			multiDrawElements		(deUint32 mode, const int* count, deUint32 type, const void** indices, int primCount);
	virtual void			multiDrawElementsBaseVertex (deUint32 mode, const int* count, deUint32 type, const void** indices, int primCount, const int* baseVertex);

	virtual deUint32		createProgram			(ShaderProgram* program);
	virtual void			useProgram				(deUint32 program);
	virtual void			deleteProgram			(deUint32 program);

	virtual void			readPixels				(int x, int y, int width, int height, deUint32 format, deUint32 type, void* data);
	virtual deUint32		getError				(void);
	virtual void			finish					(void);

	virtual void			getIntegerv				(deUint32 pname, int* params);
	virtual const char*		getString				(deUint32 pname);

	// Expose helpers from Context.
	using Context::readPixels;
	using Context::texImage2D;
	using Context::texSubImage2D;

private:
							ReferenceContext		(const ReferenceContext& other); // Not allowed!
	ReferenceContext&		operator=				(const ReferenceContext& other); // Not allowed!

	void					deleteTexture			(rc::Texture* texture);
	void					deleteFramebuffer		(rc::Framebuffer* framebuffer);
	void					deleteRenderbuffer		(rc::Renderbuffer* renderbuffer);
	void					deleteBuffer			(rc::DataBuffer* buffer);
	void					deleteVertexArray		(rc::VertexArray* vertexArray);
	void					deleteProgramObject		(rc::ShaderProgramObjectContainer* sp);

	void					acquireFboAttachmentReference	(const rc::Framebuffer::Attachment& attachment);
	void					releaseFboAttachmentReference	(const rc::Framebuffer::Attachment& attachment);
	tcu::PixelBufferAccess	getFboAttachment		(const rc::Framebuffer& framebuffer, rc::Framebuffer::AttachmentPoint point);

	deUint32				blitResolveMultisampleFramebuffer (deUint32 mask, const tcu::IVec4& srcRect, const tcu::IVec4& dstRect, bool flipX, bool flipY);

	rr::MultisamplePixelBufferAccess	getDrawColorbuffer		(void)	{ return (m_drawFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_drawFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_COLOR0)))	:	(m_defaultColorbuffer);		}
	rr::MultisamplePixelBufferAccess	getDrawDepthbuffer		(void)	{ return (m_drawFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_drawFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_DEPTH)))	:	(m_defaultDepthbuffer);		}
	rr::MultisamplePixelBufferAccess	getDrawStencilbuffer	(void)	{ return (m_drawFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_drawFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_STENCIL)))	:	(m_defaultStencilbuffer);	}
	rr::MultisamplePixelBufferAccess	getReadColorbuffer		(void)	{ return (m_readFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_readFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_COLOR0)))	:	(m_defaultColorbuffer);		}
	rr::MultisamplePixelBufferAccess	getReadDepthbuffer		(void)	{ return (m_readFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_readFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_DEPTH)))	:	(m_defaultDepthbuffer);		}
	rr::MultisamplePixelBufferAccess	getReadStencilbuffer	(void)	{ return (m_readFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_readFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_STENCIL)))	:	(m_defaultStencilbuffer);	}

	const rc::Texture2D&	getTexture2D			(int unitNdx) const;
	const rc::TextureCube&	getTextureCube			(int unitNdx) const;
	const tcu::IVec4&		getViewport				(void) const { return m_viewport; }

	void					setError				(deUint32 error);

	void					setTex1DBinding			(int unit, rc::Texture1D*			tex1D);
	void					setTex2DBinding			(int unit, rc::Texture2D*			tex2D);
	void					setTexCubeBinding		(int unit, rc::TextureCube*			texCube);
	void					setTex2DArrayBinding	(int unit, rc::Texture2DArray*		tex2DArray);
	void					setTex3DBinding			(int unit, rc::Texture3D*			tex3D);
	void					setTexCubeArrayBinding	(int unit, rc::TextureCubeArray*	texCubeArray);

	void					setBufferBinding		(deUint32 target, rc::DataBuffer* buffer);
	rc::DataBuffer*			getBufferBinding		(deUint32 target) const;

	void*					getPixelPackPtr			(void* ptrOffset) const			{ return m_pixelPackBufferBinding ? (void*)((deUintptr)m_pixelPackBufferBinding->getData()+(deUintptr)ptrOffset) : ptrOffset;	}
	const void*				getPixelUnpackPtr		(const void* ptrOffset) const	{ return m_pixelUnpackBufferBinding ? (const void*)((deUintptr)m_pixelUnpackBufferBinding->getData()+(deUintptr)ptrOffset) : ptrOffset; }

	bool					predrawErrorChecks		(deUint32 mode);
	void					drawWithReference		(const rr::PrimitiveList& primitives, int instanceCount);

	// Helpers for getting valid access object based on current unpack state.
	tcu::ConstPixelBufferAccess		getUnpack2DAccess		(const tcu::TextureFormat& format, int width, int height, const void* data);
	tcu::ConstPixelBufferAccess		getUnpack3DAccess		(const tcu::TextureFormat& format, int width, int height, int depth, const void* data);

	void					uniformv				(deInt32 index, glu::DataType type, deInt32 count, const void*);

	struct TextureUnit
	{

		rc::Texture1D*			tex1DBinding;
		rc::Texture2D*			tex2DBinding;
		rc::TextureCube*		texCubeBinding;
		rc::Texture2DArray*		tex2DArrayBinding;
		rc::Texture3D*			tex3DBinding;
		rc::TextureCubeArray*	texCubeArrayBinding;

		rc::Texture1D			default1DTex;
		rc::Texture2D			default2DTex;
		rc::TextureCube			defaultCubeTex;
		rc::Texture2DArray		default2DArrayTex;
		rc::Texture3D			default3DTex;
		rc::TextureCubeArray	defaultCubeArrayTex;

		TextureUnit (void)
			: tex1DBinding			(DE_NULL)
			, tex2DBinding			(DE_NULL)
			, texCubeBinding		(DE_NULL)
			, tex2DArrayBinding		(DE_NULL)
			, tex3DBinding			(DE_NULL)
			, texCubeArrayBinding	(DE_NULL)
			, default1DTex			(0)
			, default2DTex			(0)
			, defaultCubeTex		(0)
			, default2DArrayTex		(0)
			, default3DTex			(0)
			, defaultCubeArrayTex	(0)
		{
		}
	};

	struct StencilState
	{
		deUint32		func;
		int				ref;
		deUint32		opMask;
		deUint32		opStencilFail;
		deUint32		opDepthFail;
		deUint32		opDepthPass;
		deUint32		writeMask;

		StencilState (void);
	};

	ReferenceContextLimits						m_limits;

	rr::MultisamplePixelBufferAccess			m_defaultColorbuffer;
	rr::MultisamplePixelBufferAccess			m_defaultDepthbuffer;
	rr::MultisamplePixelBufferAccess			m_defaultStencilbuffer;
	rc::VertexArray								m_clientVertexArray;

	tcu::IVec4									m_viewport;

	rc::ObjectManager<rc::Texture>				m_textures;
	rc::ObjectManager<rc::Framebuffer>			m_framebuffers;
	rc::ObjectManager<rc::Renderbuffer>			m_renderbuffers;
	rc::ObjectManager<rc::DataBuffer>			m_buffers;
	rc::ObjectManager<rc::VertexArray>			m_vertexArrays;
	rc::ObjectManager<rc::ShaderProgramObjectContainer>		m_programs;

	int											m_activeTexture;
	std::vector<TextureUnit>					m_textureUnits;
	rc::Texture1D								m_emptyTex1D;
	rc::Texture2D								m_emptyTex2D;
	rc::TextureCube								m_emptyTexCube;
	rc::Texture2DArray							m_emptyTex2DArray;
	rc::Texture3D								m_emptyTex3D;
	rc::TextureCubeArray						m_emptyTexCubeArray;

	int											m_pixelUnpackRowLength;
	int											m_pixelUnpackSkipRows;
	int											m_pixelUnpackSkipPixels;
	int											m_pixelUnpackImageHeight;
	int											m_pixelUnpackSkipImages;
	int											m_pixelUnpackAlignment;
	int											m_pixelPackAlignment;

	rc::Framebuffer*							m_readFramebufferBinding;
	rc::Framebuffer*							m_drawFramebufferBinding;
	rc::Renderbuffer*							m_renderbufferBinding;
	rc::VertexArray*							m_vertexArrayBinding;
	rc::ShaderProgramObjectContainer*			m_currentProgram;

	rc::DataBuffer*								m_arrayBufferBinding;
	rc::DataBuffer*								m_pixelPackBufferBinding;
	rc::DataBuffer*								m_pixelUnpackBufferBinding;
	rc::DataBuffer*								m_transformFeedbackBufferBinding;
	rc::DataBuffer*								m_uniformBufferBinding;
	rc::DataBuffer*								m_copyReadBufferBinding;
	rc::DataBuffer*								m_copyWriteBufferBinding;
	rc::DataBuffer*								m_drawIndirectBufferBinding;

	tcu::Vec4									m_clearColor;
	float										m_clearDepth;
	int											m_clearStencil;

	bool										m_scissorEnabled;
	tcu::IVec4									m_scissorBox;

	bool										m_stencilTestEnabled;
	StencilState								m_stencil[rr::FACETYPE_LAST];

	bool										m_depthTestEnabled;
	deUint32									m_depthFunc;
	float										m_depthRangeNear;
	float										m_depthRangeFar;

	float										m_polygonOffsetFactor;
	float										m_polygonOffsetUnits;
	bool										m_polygonOffsetFillEnabled;

	bool										m_provokingFirstVertexConvention;

	bool										m_blendEnabled;
	deUint32									m_blendModeRGB;
	deUint32									m_blendModeAlpha;
	deUint32									m_blendFactorSrcRGB;
	deUint32									m_blendFactorDstRGB;
	deUint32									m_blendFactorSrcAlpha;
	deUint32									m_blendFactorDstAlpha;
	tcu::Vec4									m_blendColor;

	bool										m_sRGBUpdateEnabled;

	bool										m_depthClampEnabled;

	tcu::BVec4									m_colorMask;
	bool										m_depthMask;

	std::vector<rr::GenericVec4>				m_currentAttribs;
	float										m_lineWidth;

	bool										m_primitiveRestartFixedIndex;
	bool										m_primitiveRestartSettableIndex;
	deUint32									m_primitiveRestartIndex;

	deUint32									m_lastError;

	rr::FragmentProcessor						m_fragmentProcessor;
	std::vector<rr::Fragment>					m_fragmentBuffer;
	std::vector<float>							m_fragmentDepths;
} DE_WARN_UNUSED_TYPE;

} // sglr

#endif // _SGLRREFERENCECONTEXT_HPP
