Home | History | Annotate | Download | only in opengl
      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 
     48 	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 
     72 	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 
    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 
    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 
    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 
    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