1*35238bceSAndroid Build Coastguard Worker #ifndef _GLUPROGRAMINTERFACEQUERY_HPP
2*35238bceSAndroid Build Coastguard Worker #define _GLUPROGRAMINTERFACEQUERY_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL Utilities
5*35238bceSAndroid Build Coastguard Worker * ---------------------------------------------
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker *
9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker *
15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker *
21*35238bceSAndroid Build Coastguard Worker *//*!
22*35238bceSAndroid Build Coastguard Worker * \file
23*35238bceSAndroid Build Coastguard Worker * \brief Program interface query utilities
24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "gluDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker
28*35238bceSAndroid Build Coastguard Worker #include <vector>
29*35238bceSAndroid Build Coastguard Worker #include <string>
30*35238bceSAndroid Build Coastguard Worker
31*35238bceSAndroid Build Coastguard Worker namespace glw
32*35238bceSAndroid Build Coastguard Worker {
33*35238bceSAndroid Build Coastguard Worker class Functions;
34*35238bceSAndroid Build Coastguard Worker }
35*35238bceSAndroid Build Coastguard Worker
36*35238bceSAndroid Build Coastguard Worker namespace glu
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker //! Interface block info.
40*35238bceSAndroid Build Coastguard Worker struct InterfaceBlockInfo
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker std::string name;
43*35238bceSAndroid Build Coastguard Worker uint32_t index;
44*35238bceSAndroid Build Coastguard Worker uint32_t bufferBinding; //!< GL_BUFFER_BINDING
45*35238bceSAndroid Build Coastguard Worker uint32_t dataSize; //!< GL_BUFFER_DATA_SIZE
46*35238bceSAndroid Build Coastguard Worker std::vector<int> activeVariables; //!< GL_ACTIVE_VARIABLES
47*35238bceSAndroid Build Coastguard Worker
InterfaceBlockInfoglu::InterfaceBlockInfo48*35238bceSAndroid Build Coastguard Worker InterfaceBlockInfo(void) : index(~0u /* GL_INVALID_INDEX */), bufferBinding(0), dataSize(0)
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker }
51*35238bceSAndroid Build Coastguard Worker };
52*35238bceSAndroid Build Coastguard Worker
53*35238bceSAndroid Build Coastguard Worker //! Interface variable (uniform in uniform block, buffer variable) info.
54*35238bceSAndroid Build Coastguard Worker struct InterfaceVariableInfo
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker std::string name;
57*35238bceSAndroid Build Coastguard Worker uint32_t index;
58*35238bceSAndroid Build Coastguard Worker uint32_t blockIndex; //!< GL_BLOCK_INDEX
59*35238bceSAndroid Build Coastguard Worker uint32_t atomicCounterBufferIndex; //!< GL_ATOMIC_COUNTER_BUFFER_INDEX
60*35238bceSAndroid Build Coastguard Worker uint32_t type; //!< GL_TYPE
61*35238bceSAndroid Build Coastguard Worker uint32_t arraySize; //!< GL_ARRAY_SIZE
62*35238bceSAndroid Build Coastguard Worker uint32_t offset; //!< GL_OFFSET
63*35238bceSAndroid Build Coastguard Worker int32_t arrayStride; //!< GL_ARRAY_STRIDE
64*35238bceSAndroid Build Coastguard Worker int32_t matrixStride; //!< GL_MATRIX_STRIDE
65*35238bceSAndroid Build Coastguard Worker uint32_t topLevelArraySize; //!< GL_TOP_LEVEL_ARRAY_SIZE - set only for GL_BUFFER_VARIABLEs
66*35238bceSAndroid Build Coastguard Worker int32_t topLevelArrayStride; //!< GL_TOP_LEVEL_ARRAY_STRIDE - set only for GL_BUFFER_VARIABLEs
67*35238bceSAndroid Build Coastguard Worker bool isRowMajor; //!< GL_IS_ROW_MAJOR
68*35238bceSAndroid Build Coastguard Worker
InterfaceVariableInfoglu::InterfaceVariableInfo69*35238bceSAndroid Build Coastguard Worker InterfaceVariableInfo(void)
70*35238bceSAndroid Build Coastguard Worker : index(~0u /* GL_INVALID_INDEX */)
71*35238bceSAndroid Build Coastguard Worker , blockIndex(~0u /* GL_INVALID_INDEX */)
72*35238bceSAndroid Build Coastguard Worker , atomicCounterBufferIndex(~0u /* GL_INVALID_INDEX */)
73*35238bceSAndroid Build Coastguard Worker , type(0)
74*35238bceSAndroid Build Coastguard Worker , arraySize(0)
75*35238bceSAndroid Build Coastguard Worker , offset(0)
76*35238bceSAndroid Build Coastguard Worker , arrayStride(0)
77*35238bceSAndroid Build Coastguard Worker , matrixStride(0)
78*35238bceSAndroid Build Coastguard Worker , topLevelArraySize(0)
79*35238bceSAndroid Build Coastguard Worker , topLevelArrayStride(0)
80*35238bceSAndroid Build Coastguard Worker , isRowMajor(0)
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker }
83*35238bceSAndroid Build Coastguard Worker };
84*35238bceSAndroid Build Coastguard Worker
85*35238bceSAndroid Build Coastguard Worker int getProgramResourceInt(const glw::Functions &gl, uint32_t program, uint32_t programInterface, uint32_t index,
86*35238bceSAndroid Build Coastguard Worker uint32_t queryParam);
87*35238bceSAndroid Build Coastguard Worker uint32_t getProgramResourceUint(const glw::Functions &gl, uint32_t program, uint32_t programInterface, uint32_t index,
88*35238bceSAndroid Build Coastguard Worker uint32_t queryParam);
89*35238bceSAndroid Build Coastguard Worker
90*35238bceSAndroid Build Coastguard Worker void getProgramResourceName(const glw::Functions &gl, uint32_t program, uint32_t programInterface, uint32_t index,
91*35238bceSAndroid Build Coastguard Worker std::string &dst);
92*35238bceSAndroid Build Coastguard Worker std::string getProgramResourceName(const glw::Functions &gl, uint32_t program, uint32_t programInterface,
93*35238bceSAndroid Build Coastguard Worker uint32_t index);
94*35238bceSAndroid Build Coastguard Worker
95*35238bceSAndroid Build Coastguard Worker void getProgramInterfaceBlockInfo(const glw::Functions &gl, uint32_t program, uint32_t programInterface, uint32_t index,
96*35238bceSAndroid Build Coastguard Worker InterfaceBlockInfo &info);
97*35238bceSAndroid Build Coastguard Worker InterfaceBlockInfo getProgramInterfaceBlockInfo(const glw::Functions &gl, uint32_t program, uint32_t programInterface,
98*35238bceSAndroid Build Coastguard Worker uint32_t index);
99*35238bceSAndroid Build Coastguard Worker
100*35238bceSAndroid Build Coastguard Worker void getProgramInterfaceVariableInfo(const glw::Functions &gl, uint32_t program, uint32_t programInterface,
101*35238bceSAndroid Build Coastguard Worker uint32_t index, InterfaceVariableInfo &info);
102*35238bceSAndroid Build Coastguard Worker InterfaceVariableInfo getProgramInterfaceVariableInfo(const glw::Functions &gl, uint32_t program,
103*35238bceSAndroid Build Coastguard Worker uint32_t programInterface, uint32_t index);
104*35238bceSAndroid Build Coastguard Worker
105*35238bceSAndroid Build Coastguard Worker // Inline implementations for optimization (RVO in most cases).
106*35238bceSAndroid Build Coastguard Worker
getProgramResourceInt(const glw::Functions & gl,uint32_t program,uint32_t programInterface,uint32_t index,uint32_t queryParam)107*35238bceSAndroid Build Coastguard Worker inline int getProgramResourceInt(const glw::Functions &gl, uint32_t program, uint32_t programInterface, uint32_t index,
108*35238bceSAndroid Build Coastguard Worker uint32_t queryParam)
109*35238bceSAndroid Build Coastguard Worker {
110*35238bceSAndroid Build Coastguard Worker return (int)getProgramResourceUint(gl, program, programInterface, index, queryParam);
111*35238bceSAndroid Build Coastguard Worker }
112*35238bceSAndroid Build Coastguard Worker
getProgramResourceName(const glw::Functions & gl,uint32_t program,uint32_t programInterface,uint32_t index)113*35238bceSAndroid Build Coastguard Worker inline std::string getProgramResourceName(const glw::Functions &gl, uint32_t program, uint32_t programInterface,
114*35238bceSAndroid Build Coastguard Worker uint32_t index)
115*35238bceSAndroid Build Coastguard Worker {
116*35238bceSAndroid Build Coastguard Worker std::string name;
117*35238bceSAndroid Build Coastguard Worker getProgramResourceName(gl, program, programInterface, index, name);
118*35238bceSAndroid Build Coastguard Worker return name;
119*35238bceSAndroid Build Coastguard Worker }
120*35238bceSAndroid Build Coastguard Worker
getProgramInterfaceBlockInfo(const glw::Functions & gl,uint32_t program,uint32_t programInterface,uint32_t index)121*35238bceSAndroid Build Coastguard Worker inline InterfaceBlockInfo getProgramInterfaceBlockInfo(const glw::Functions &gl, uint32_t program,
122*35238bceSAndroid Build Coastguard Worker uint32_t programInterface, uint32_t index)
123*35238bceSAndroid Build Coastguard Worker {
124*35238bceSAndroid Build Coastguard Worker InterfaceBlockInfo info;
125*35238bceSAndroid Build Coastguard Worker getProgramInterfaceBlockInfo(gl, program, programInterface, index, info);
126*35238bceSAndroid Build Coastguard Worker return info;
127*35238bceSAndroid Build Coastguard Worker }
128*35238bceSAndroid Build Coastguard Worker
getProgramInterfaceVariableInfo(const glw::Functions & gl,uint32_t program,uint32_t programInterface,uint32_t index)129*35238bceSAndroid Build Coastguard Worker inline InterfaceVariableInfo getProgramInterfaceVariableInfo(const glw::Functions &gl, uint32_t program,
130*35238bceSAndroid Build Coastguard Worker uint32_t programInterface, uint32_t index)
131*35238bceSAndroid Build Coastguard Worker {
132*35238bceSAndroid Build Coastguard Worker InterfaceVariableInfo info;
133*35238bceSAndroid Build Coastguard Worker getProgramInterfaceVariableInfo(gl, program, programInterface, index, info);
134*35238bceSAndroid Build Coastguard Worker return info;
135*35238bceSAndroid Build Coastguard Worker }
136*35238bceSAndroid Build Coastguard Worker
137*35238bceSAndroid Build Coastguard Worker } // namespace glu
138*35238bceSAndroid Build Coastguard Worker
139*35238bceSAndroid Build Coastguard Worker #endif // _GLUPROGRAMINTERFACEQUERY_HPP
140