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
/*-------------------------------------------------------------------------
 * 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 "gluProgramInterfaceQuery.hpp"
#include "glwFunctions.hpp"
#include "glwEnums.hpp"
 
#include <sstream>
 
namespace glu
{
 
deUint32 getProgramResourceUint (const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, deUint32 queryParam)
{
   deUint32 value = 0;
   gl.getProgramResourceiv(program, programInterface, index, 1, &queryParam, 1, DE_NULL, (int*)&value);
   GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramResourceiv()");
   return value;
}
 
void getProgramResourceName (const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, std::string& dst)
{
   const int length = getProgramResourceInt(gl, program, programInterface, index, GL_NAME_LENGTH);
 
   if (length > 0)
   {
       std::vector<char> buf(length+1);
       gl.getProgramResourceName(program, programInterface, index, (int)buf.size(), DE_NULL, &buf[0]);
       GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramResourceName()");
 
       dst = (const char*)&buf[0];
   }
   else
   {
       std::ostringstream msg;
       msg << "Empty name returned for " << programInterface << " at index " << index;
       throw tcu::TestError(msg.str());
   }
}
 
static void getProgramInterfaceActiveVariables (const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, std::vector<int>& activeVariables)
{
   const int numActiveVariables = getProgramResourceInt(gl, program, programInterface, index, GL_NUM_ACTIVE_VARIABLES);
 
   activeVariables.resize(numActiveVariables);
   if (numActiveVariables > 0)
   {
       const deUint32 queryParam = GL_ACTIVE_VARIABLES;
       gl.getProgramResourceiv(program, programInterface, index, 1, &queryParam, (int)activeVariables.size(), DE_NULL, &activeVariables[0]);
       GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramResourceiv(GL_PROGRAM_ACTIVE_VARIABLES)");
   }
}
 
void getProgramInterfaceBlockInfo (const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, InterfaceBlockInfo& info)
{
   info.index            = index;
   info.bufferBinding    = getProgramResourceUint(gl, program, programInterface, index, GL_BUFFER_BINDING);
   info.dataSize        = getProgramResourceUint(gl, program, programInterface, index, GL_BUFFER_DATA_SIZE);
 
   getProgramInterfaceActiveVariables(gl, program, programInterface, index, info.activeVariables);
 
   if (programInterface != GL_ATOMIC_COUNTER_BUFFER)
       getProgramResourceName(gl, program, programInterface, index, info.name);
}
 
void getProgramInterfaceVariableInfo (const glw::Functions& gl, deUint32 program, deUint32 programInterface, deUint32 index, InterfaceVariableInfo& info)
{
   // \todo [2013-08-27 pyry] Batch queries!
   info.index            = index;
   info.blockIndex        = getProgramResourceUint(gl, program, programInterface, index, GL_BLOCK_INDEX);
   info.type            = getProgramResourceUint(gl, program, programInterface, index, GL_TYPE);
   info.arraySize        = getProgramResourceUint(gl, program, programInterface, index, GL_ARRAY_SIZE);
   info.offset            = getProgramResourceUint(gl, program, programInterface, index, GL_OFFSET);
   info.arrayStride    = getProgramResourceUint(gl, program, programInterface, index, GL_ARRAY_STRIDE);
   info.matrixStride    = getProgramResourceUint(gl, program, programInterface, index, GL_MATRIX_STRIDE);
   info.isRowMajor        = getProgramResourceUint(gl, program, programInterface, index, GL_IS_ROW_MAJOR) != GL_FALSE;
 
   if (programInterface == GL_UNIFORM)
       info.atomicCounterBufferIndex = getProgramResourceUint(gl, program, programInterface, index, GL_ATOMIC_COUNTER_BUFFER_INDEX);
 
   if (programInterface == GL_BUFFER_VARIABLE)
   {
       info.topLevelArraySize        = getProgramResourceUint(gl, program, programInterface, index, GL_TOP_LEVEL_ARRAY_SIZE);
       info.topLevelArrayStride    = getProgramResourceUint(gl, program, programInterface, index, GL_TOP_LEVEL_ARRAY_STRIDE);
   }
 
   getProgramResourceName(gl, program, programInterface, index, info.name);
}
 
} // glu