1#ifndef _GLUCONTEXTINFO_HPP
2#define _GLUCONTEXTINFO_HPP
3/*-------------------------------------------------------------------------
4 * drawElements Quality Program OpenGL ES Utilities
5 * ------------------------------------------------
6 *
7 * Copyright 2014 The Android Open Source Project
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 *//*!
22 * \file
23 * \brief Context Info Class.
24 *//*--------------------------------------------------------------------*/
25
26#include "gluDefs.hpp"
27
28#include <vector>
29#include <string>
30#include <set>
31
32namespace glu
33{
34
35class RenderContext;
36
37template <typename T, class ComputeValue>
38class CachedValue
39{
40public:
41	CachedValue (ComputeValue compute = ComputeValue(), const T& defaultValue = T())
42		: m_compute		(compute)
43		, m_value		(defaultValue)
44		, m_isComputed	(false)
45	{
46	}
47
48	const T& getValue (const RenderContext& context) const
49	{
50		if (!m_isComputed)
51		{
52			m_value			= m_compute(context);
53			m_isComputed	= true;
54		}
55		return m_value;
56	}
57
58private:
59	ComputeValue	m_compute;
60	mutable T		m_value;
61	mutable bool	m_isComputed;
62};
63
64class GetExtensions
65{
66public:
67	std::vector<std::string> operator() (const RenderContext& context) const;
68};
69
70class GetCompressedTextureFormats
71{
72public:
73	std::set<int> operator() (const RenderContext& context) const;
74};
75
76typedef CachedValue<std::vector<std::string>, GetExtensions>	ExtensionList;
77typedef CachedValue<std::set<int>, GetCompressedTextureFormats>	CompressedTextureFormats;
78
79/*--------------------------------------------------------------------*//*!
80 * \brief Context information & limit query.
81 *//*--------------------------------------------------------------------*/
82class ContextInfo
83{
84public:
85	virtual										~ContextInfo						(void);
86
87	virtual int									getInt								(int param) const;
88	virtual bool								getBool								(int param) const;
89	virtual const char*							getString							(int param) const;
90
91	virtual bool								isVertexUniformLoopSupported		(void) const { return true; }
92	virtual bool								isVertexDynamicLoopSupported		(void) const { return true; }
93	virtual bool								isFragmentHighPrecisionSupported	(void) const { return true; }
94	virtual bool								isFragmentUniformLoopSupported		(void) const { return true; }
95	virtual bool								isFragmentDynamicLoopSupported		(void) const { return true; }
96
97	virtual bool								isCompressedTextureFormatSupported	(int format) const;
98
99	const std::vector<std::string>&				getExtensions						(void) const { return m_extensions.getValue(m_context); }
100	bool										isExtensionSupported				(const char* extName) const;
101
102	static ContextInfo*							create								(const RenderContext& context);
103
104protected:
105												ContextInfo							(const RenderContext& context);
106
107	const RenderContext&						m_context;
108
109private:
110												ContextInfo							(const ContextInfo& other);
111	ContextInfo&								operator=							(const ContextInfo& other);
112
113	ExtensionList								m_extensions;
114	CompressedTextureFormats					m_compressedTextureFormats;
115};
116
117} // glu
118
119#endif // _GLUCONTEXTINFO_HPP
120