1 #ifndef _GLUPROGRAMINTERFACEQUERY_HPP
2 #define _GLUPROGRAMINTERFACEQUERY_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program OpenGL 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 Program interface query utilities
24  *//*--------------------------------------------------------------------*/
25 
26 #include "gluDefs.hpp"
27 
28 #include <vector>
29 #include <string>
30 
31 namespace glw
32 {
33 class Functions;
34 }
35 
36 namespace glu
37 {
38 
39 //! Interface block info.
40 struct InterfaceBlockInfo
41 {
42 	std::string			name;
43 	deUint32			index;
44 	deUint32			bufferBinding;		//!< GL_BUFFER_BINDING
45 	deUint32			dataSize;			//!< GL_BUFFER_DATA_SIZE
46 	std::vector<int>	activeVariables;	//!< GL_ACTIVE_VARIABLES
47 
InterfaceBlockInfoglu::InterfaceBlockInfo48 	InterfaceBlockInfo (void)
49 		: index				(~0u /* GL_INVALID_INDEX */)
50 		, bufferBinding		(0)
51 		, dataSize			(0)
52 	{
53 	}
54 };
55 
56 //! Interface variable (uniform in uniform block, buffer variable) info.
57 struct InterfaceVariableInfo
58 {
59 	std::string			name;
60 	deUint32			index;
61 	deUint32			blockIndex;					//!< GL_BLOCK_INDEX
62 	deUint32			atomicCounterBufferIndex;	//!< GL_ATOMIC_COUNTER_BUFFER_INDEX
63 	deUint32			type;						//!< GL_TYPE
64 	deUint32			arraySize;					//!< GL_ARRAY_SIZE
65 	deUint32			offset;						//!< GL_OFFSET
66 	deInt32				arrayStride;				//!< GL_ARRAY_STRIDE
67 	deInt32				matrixStride;				//!< GL_MATRIX_STRIDE
68 	deUint32			topLevelArraySize;			//!< GL_TOP_LEVEL_ARRAY_SIZE	- set only for GL_BUFFER_VARIABLEs
69 	deInt32				topLevelArrayStride;		//!< GL_TOP_LEVEL_ARRAY_STRIDE	- set only for GL_BUFFER_VARIABLEs
70 	bool				isRowMajor;					//!< GL_IS_ROW_MAJOR
71 
InterfaceVariableInfoglu::InterfaceVariableInfo72 	InterfaceVariableInfo (void)
73 		: index						(~0u /* GL_INVALID_INDEX */)
74 		, blockIndex				(~0u /* GL_INVALID_INDEX */)
75 		, atomicCounterBufferIndex	(~0u /* GL_INVALID_INDEX */)
76 		, type						(0)
77 		, arraySize					(0)
78 		, offset					(0)
79 		, arrayStride				(0)
80 		, matrixStride				(0)
81 		, topLevelArraySize			(0)
82 		, topLevelArrayStride		(0)
83 		, isRowMajor				(0)
84 	{
85 	}
86 };
87 
88 
89 int						getProgramResourceInt			(const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, deUint32 queryParam);
90 deUint32				getProgramResourceUint			(const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, deUint32 queryParam);
91 
92 void					getProgramResourceName			(const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, std::string& dst);
93 std::string				getProgramResourceName			(const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index);
94 
95 void					getProgramInterfaceBlockInfo	(const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, InterfaceBlockInfo& info);
96 InterfaceBlockInfo		getProgramInterfaceBlockInfo	(const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index);
97 
98 void					getProgramInterfaceVariableInfo	(const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, InterfaceVariableInfo& info);
99 InterfaceVariableInfo	getProgramInterfaceVariableInfo	(const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index);
100 
101 // Inline implementations for optimization (RVO in most cases).
102 
getProgramResourceInt(const glw::Functions & gl,deUint32 program,deUint32 programInterface,deUint32 index,deUint32 queryParam)103 inline int getProgramResourceInt (const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, deUint32 queryParam)
104 {
105 	return (int)getProgramResourceUint(gl, program, programInterface, index, queryParam);
106 }
107 
getProgramResourceName(const glw::Functions & gl,deUint32 program,deUint32 programInterface,deUint32 index)108 inline std::string getProgramResourceName (const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index)
109 {
110 	std::string name;
111 	getProgramResourceName(gl, program, programInterface, index, name);
112 	return name;
113 }
114 
getProgramInterfaceBlockInfo(const glw::Functions & gl,deUint32 program,deUint32 programInterface,deUint32 index)115 inline InterfaceBlockInfo getProgramInterfaceBlockInfo (const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index)
116 {
117 	InterfaceBlockInfo info;
118 	getProgramInterfaceBlockInfo(gl, program, programInterface, index, info);
119 	return info;
120 }
121 
getProgramInterfaceVariableInfo(const glw::Functions & gl,deUint32 program,deUint32 programInterface,deUint32 index)122 inline InterfaceVariableInfo getProgramInterfaceVariableInfo (const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index)
123 {
124 	InterfaceVariableInfo info;
125 	getProgramInterfaceVariableInfo(gl, program, programInterface, index, info);
126 	return info;
127 }
128 
129 } // glu
130 
131 #endif // _GLUPROGRAMINTERFACEQUERY_HPP
132