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