61 LogError(
"The program handle is invalid.");
67 GLint workGroupSize[3];
69 numXThreads = workGroupSize[0];
70 numYThreads = workGroupSize[1];
71 numZThreads = workGroupSize[2];
78 ostr <<
"Description:" << std::endl;
85 ostr <<
"General:" << std::endl;
86 ostr <<
"num inputs = " <<
mInputs.size() << std::endl;
87 ostr <<
"num outputs = " <<
mOutputs.size() << std::endl;
88 ostr <<
"num uniform blocks = " <<
mUniformBlocks.size() << std::endl;
90 ostr <<
"num uniforms = " <<
mUniforms.size() << std::endl;
95 for (
unsigned i = 0; i <
mInputs.size(); ++i)
99 ostr <<
"Input[" << i <<
"]:" << std::endl;
100 ostr <<
"name = " <<
input.name << std::endl;
103 ostr <<
"location = " <<
input.location << std::endl;
104 ostr <<
"array Size = " <<
input.arraySize << std::endl;
106 ostr <<
"is per patch = " <<
input.isPerPatch << std::endl;
107 ostr <<
"location component = " <<
input.locationComponent << std::endl;
111 for (
unsigned i = 0; i <
mOutputs.size(); ++i)
115 ostr <<
"Output[" << i <<
"]:" << std::endl;
116 ostr <<
"name = " << output.name << std::endl;
117 ostr <<
"type = " <<
GetEnumName(output.type) << std::endl;
119 ostr <<
"location = " << output.location << std::endl;
120 ostr <<
"array Size = " << output.arraySize << std::endl;
122 ostr <<
"is per patch = " << output.isPerPatch << std::endl;
123 ostr <<
"location component = " << output.locationIndex << std::endl;
124 ostr <<
"location index = " << output.locationIndex << std::endl;
132 ostr <<
"UniformBlock[" << i <<
"]:" << std::endl;
133 ostr <<
"name = " << block.name << std::endl;
134 ostr <<
"buffer binding = " << block.bufferBinding << std::endl;
135 ostr <<
"buffer data size = " << block.bufferDataSize << std::endl;
137 ostr <<
"active variables = " << block.activeVariables.size() << std::endl;
141 ostr <<
"declaration = " << std::endl;
142 ostr <<
" uniform " << block.name << std::endl;
143 ostr <<
" {" << std::endl;
144 for (
unsigned v = 0;
v < block.activeVariables.size(); ++
v)
146 auto const& uniform =
mUniforms[block.activeVariables[
v]];
149 if (uniform.arraySize > 1)
151 ostr <<
"[" << uniform.arraySize <<
"]";
154 ostr <<
" offset=" << uniform.offset;
155 ostr <<
" size=" <<
GetEnumSize(uniform.type, uniform.arraySize,
156 uniform.arrayStride, uniform.matrixStride, uniform.isRowMajor);
157 if (uniform.arrayStride > 0)
159 ostr <<
" arrayStride=" << uniform.arrayStride;
161 if (uniform.matrixStride > 0)
163 ostr <<
" matrixStride=" << uniform.matrixStride;
164 ostr <<
" rowMajor=" << uniform.isRowMajor;
168 ostr <<
" };" << std::endl;
176 ostr <<
"AtomicCounterBuffer[" << i <<
"]:" << std::endl;
177 ostr <<
"buffer binding = " << acBuffer.bufferBinding << std::endl;
178 ostr <<
"buffer data size = " << acBuffer.bufferDataSize << std::endl;
180 ostr <<
"active variables = " << acBuffer.activeVariables.size() << std::endl;
184 for (
unsigned i = 0; i <
mUniforms.size(); ++i)
188 ostr <<
"Uniform[" << i <<
"]:" << std::endl;
189 ostr <<
"name = " << uniform.fullName << std::endl;
190 ostr <<
"type = " <<
GetEnumName(uniform.type) << std::endl;
195 if (uniform.blockIndex >= 0)
197 ostr <<
"array size = " << uniform.arraySize << std::endl;
198 ostr <<
"offset = " << uniform.offset << std::endl;
199 ostr <<
"uniform block index = " << uniform.blockIndex << std::endl;
200 ostr <<
"array stride = " << uniform.arrayStride << std::endl;
201 ostr <<
"matrix stride = " << uniform.matrixStride << std::endl;
202 ostr <<
"is row major = " << uniform.isRowMajor << std::endl;
203 ostr <<
"size=" <<
GetEnumSize(uniform.type, uniform.arraySize,
204 uniform.arrayStride, uniform.matrixStride, uniform.isRowMajor) << std::endl;
208 else if (uniform.atomicCounterBufferIndex >= 0)
210 ostr <<
"atomic counter buffer index = " << uniform.atomicCounterBufferIndex << std::endl;
213 ostr <<
"declaration = " << std::endl;
214 ostr <<
" layout(binding = " << acBuffer.bufferBinding <<
", offset = " << uniform.offset;
215 ostr <<
") uniform " <<
GetEnumShaderName(uniform.type) <<
" " << uniform.name <<
";" << std::endl;
221 ostr <<
"declaration = " << std::endl;
222 ostr <<
" uniform " <<
GetEnumShaderName(uniform.type) <<
" " << uniform.name <<
";" << std::endl;
232 ostr <<
"ShaderStorageBlock[" << i <<
"]:" << std::endl;
233 ostr <<
"name = " << block.name << std::endl;
234 ostr <<
"buffer binding = " << block.bufferBinding << std::endl;
235 ostr <<
"buffer data size = " << block.bufferDataSize << std::endl;
237 ostr <<
"active variables = " << block.activeVariables.size() << std::endl;
241 ostr <<
"declaration = " << std::endl;
242 ostr <<
" buffer " << block.name << std::endl;
243 ostr <<
" {" << std::endl;
244 GLint topLevelArrayStride = 0;
245 GLint topLevelArrayOffset = 0;
246 for (
unsigned v = 0;
v < block.activeVariables.size(); ++
v)
250 if (bufferVar.topLevelArrayStride != topLevelArrayStride)
252 if (topLevelArrayStride > 0)
254 ostr <<
" " <<
"} [];" << std::endl;
258 ostr <<
" struct //";
259 ostr <<
" offset=" << bufferVar.offset;
260 ostr <<
" structSize=" << bufferVar.topLevelArrayStride;
262 ostr <<
" {" << std::endl;
264 topLevelArrayStride = bufferVar.topLevelArrayStride;
265 topLevelArrayOffset = bufferVar.offset;
269 if (topLevelArrayStride > 0)
274 if (bufferVar.arrayStride > 0)
276 auto arraySize = bufferVar.arraySize;
280 GLint nextOffset = block.bufferDataSize;
281 if ((
v+1) < block.activeVariables.size())
285 arraySize = (nextOffset - bufferVar.offset) / bufferVar.arrayStride;
287 ostr <<
'[' << arraySize <<
']';
292 bufferVar.arrayStride, bufferVar.matrixStride, bufferVar.isRowMajor);
295 ostr <<
" size=" <<
size;
297 if (topLevelArrayStride > 0)
299 ostr <<
" structOffset=" << (bufferVar.offset - topLevelArrayOffset);
301 ostr <<
" bufferOffset=" << bufferVar.offset;
302 if (bufferVar.arrayStride > 0)
304 ostr <<
" arrayStride=" << bufferVar.arrayStride;
306 if (bufferVar.matrixStride > 0)
308 ostr <<
" matrixStride=" << bufferVar.matrixStride;
309 ostr <<
" rowMajor=" << bufferVar.isRowMajor;
313 if (topLevelArrayStride > 0)
315 ostr <<
" " <<
"} [];" << std::endl;
317 ostr <<
" };" << std::endl;
325 ostr <<
"BufferVariable[" << i <<
"]:" << std::endl;
326 ostr <<
"name = " << bufferVar.fullName << std::endl;
327 ostr <<
"type = " <<
GetEnumName(bufferVar.type) << std::endl;
332 if (bufferVar.blockIndex >= 0)
334 ostr <<
"array size = " << bufferVar.arraySize << std::endl;
335 ostr <<
"offset = " << bufferVar.offset << std::endl;
336 ostr <<
"buffer block index = " << bufferVar.blockIndex << std::endl;
337 ostr <<
"array stride = " << bufferVar.arrayStride << std::endl;
338 ostr <<
"matrix stride = " << bufferVar.matrixStride << std::endl;
339 ostr <<
"is row major = " << bufferVar.isRowMajor << std::endl;
340 ostr <<
"top level array size = " << bufferVar.topLevelArraySize << std::endl;
341 ostr <<
"top level array stride = " << bufferVar.topLevelArrayStride << std::endl;
343 bufferVar.arrayStride, bufferVar.matrixStride, bufferVar.isRowMajor);
346 ostr <<
"size=" <<
size << std::endl;
353 ostr <<
"declaration = " << std::endl;
354 ostr <<
" buffer " <<
GetEnumShaderName(bufferVar.type) <<
" " << bufferVar.name <<
";" << std::endl;
363 GLint numResources = 0;
366 if (numResources > 0)
384 int const numProperties =
sizeof(properties) /
sizeof(
int);
385 GLint results[numProperties] = { 0 };
386 for (
int i = 0; i < numResources; ++i)
390 numProperties, properties, numProperties,
nullptr, results);
392 GLint numBytes = results[0] + 1;
393 std::vector<GLchar>
name(numBytes);
397 GLint* current = &results[1];
398 info.
type = *current++;
415 GLint numResources = 0;
418 if (numResources > 0)
437 int const numProperties =
sizeof(properties) /
sizeof(
int);
438 GLint results[numProperties] = { 0 };
439 for (
int i = 0; i < numResources; ++i)
443 numProperties, properties, numProperties,
nullptr, results);
445 GLint numBytes = results[0] + 1;
446 std::vector<GLchar>
name(numBytes);
450 GLint* current = &results[1];
451 info.
type = *current++;
469 GLint numResources = 0;
473 if (numResources > 0)
496 int const numProperties =
sizeof(properties) /
sizeof(
int);
497 GLint results[numProperties] = { 0 };
498 for (
int i = 0; i < numResources; ++i)
502 numProperties, properties, numProperties,
nullptr, results);
504 GLint numBytes = results[0] + 1;
505 std::vector<GLchar>
name(numBytes);
509 GLint* current = &results[1];
510 info.
type = *current++;
542 if (
index != std::string::npos)
545 auto index2 = info.
name.find(
'[',
index+1);
546 if (index2 != std::string::npos)
549 LogError(
"Only single dimensional arrays supported in GLSL uniforms.");
568 std::vector<DataBlock>& blocks)
570 GLint numResources = 0;
574 if (numResources > 0)
576 blocks.resize(numResources);
591 int const numProperties =
sizeof(properties) /
sizeof(
int);
592 GLint results[numProperties] = { 0 };
593 for (
int i = 0; i < numResources; ++i)
597 numProperties, properties, numProperties,
nullptr, results);
599 GLint numBytes = results[0] + 1;
600 std::vector<GLchar>
name(numBytes);
609 GLint* current = &results[1];
622 GLint numActiveVariables = *current++;
623 if (numActiveVariables > 0)
630 &varProperty, numActiveVariables,
nullptr,
639 GLint numResources = 0;
643 if (numResources > 0)
659 int const numProperties =
sizeof(properties) /
sizeof(
int);
660 GLint results[numProperties] = { 0 };
661 for (
int i = 0; i < numResources; ++i)
665 numProperties, properties, numProperties,
nullptr, results);
667 GLint* current = &results[0];
677 GLint numActiveVariables = *current++;
678 if (numActiveVariables > 0)
685 1, &varProperty, numActiveVariables,
nullptr,
693 std::vector<std::string>& subroutines)
695 GLint numResources = 0;
698 if (numResources > 0)
700 subroutines.resize(numResources);
703 for (
int i = 0; i < numResources; ++i)
707 &nameLengthProperty, 1,
nullptr, &result);
709 GLint numBytes = result + 1;
710 std::vector<GLchar>
name(numBytes);
718 std::vector<SubroutineUniform>& subUniforms)
720 GLint numResources = 0;
724 if (numResources > 0)
726 subUniforms.resize(numResources);
735 int const numProperties =
sizeof(properties) /
sizeof(
int);
736 GLint results[numProperties] = { 0 };
737 for (
int i = 0; i < numResources; ++i)
741 numProperties, properties, numProperties,
nullptr, results);
743 GLint numBytes = results[0] + 1;
744 std::vector<GLchar>
name(numBytes);
748 GLint* current = &results[1];
752 GLint numCompatibleSubroutines = *current++;
753 if (numCompatibleSubroutines > 0)
760 &subProperty, numCompatibleSubroutines,
nullptr,
769 GLint numResources = 0;
772 if (numResources > 0)
795 int const numProperties =
sizeof(properties) /
sizeof(
int);
796 GLint results[numProperties] = { 0 };
797 for (
int i = 0; i < numResources; ++i)
801 numProperties, properties, numProperties,
nullptr, results);
803 GLint numBytes = results[0] + 1;
804 std::vector<GLchar>
name(numBytes);
808 GLint* current = &results[1];
809 info.
type = *current++;
833 if (0 == info.
name.find(bufferBlockName))
835 info.
name = info.
name.substr(bufferBlockName.length());
845 auto index = info.
name.find_last_of(
'.');
846 if (
index != std::string::npos)
856 if (
index != std::string::npos)
868 GLint numResources = 0;
871 if (numResources > 0)
882 int const numProperties =
sizeof(properties) /
sizeof(
int);
883 GLint results[numProperties] = { 0 };
884 for (
int i = 0; i < numResources; ++i)
888 numProperties, properties, numProperties,
nullptr, results);
890 GLint numBytes = results[0] + 1;
891 std::vector<GLchar>
name(numBytes);
895 GLint* current = &results[1];
896 info.
type = *current++;
906 GLint numResources = 0;
909 if (numResources > 0)
918 int const numProperties =
sizeof(properties) /
sizeof(
int);
919 GLint results[numProperties] = { 0 };
920 for (
int i = 0; i < numResources; ++i)
924 numProperties, properties, numProperties,
nullptr, results);
926 GLint* current = &results[0];
930 GLint numActiveVariables = *current++;
931 if (numActiveVariables > 0)
938 i, 1, &varProperty, numActiveVariables,
nullptr,
950 if (item.value == value)
954 return arrayStride * arraySize;
956 else if (matrixStride > 0)
960 return item.
rows * matrixStride;
964 return item.cols * matrixStride;
967 else if (item.rows > 0)
969 return item.rows * item.size;
983 if (item.value == value)
989 return std::string(
"unknown(type=") + std::to_string(value) +
")";
997 if (item.value == value)
1003 return std::string(
"unknown(type=") + std::to_string(value) +
")";
1010 if (referencedBy[
ST_VERTEX]) strList +=
"vertex ";
1011 if (referencedBy[
ST_GEOMETRY]) strList +=
"geometry ";
1012 if (referencedBy[
ST_PIXEL]) strList +=
"pixel ";
1013 if (referencedBy[
ST_COMPUTE]) strList +=
"compute ";
1033 std::vector<GLuint>
shaders(maxCount);
1036 if (count != maxCount)
1041 for (
auto shader : shaders)
1048 int index = iter->second;
1049 if (results[index] == 0)
1060 std::vector<GLchar> rawSource(length);
1065 auto beginInstance =
source.find(
"buffer " + name);
1066 if (beginInstance == std::string::npos)
1071 beginInstance =
source.find(
'}', beginInstance);
1072 if (beginInstance == std::string::npos)
1077 if (++beginInstance >=
source.length())
1082 if (
source[beginInstance] ==
';')
1092 beginInstance =
source.find_first_not_of(
" \t", beginInstance);
1093 if (beginInstance == std::string::npos)
1098 auto endInstance =
source.find_first_of(
" ;\t", beginInstance);
1099 std::string instance =
source.substr(beginInstance, endInstance - beginInstance);
1103 if (
source.find(instance, endInstance) != std::string::npos)
1112 #define ENUM(value, shadername, rows, cols, size) { value, #value, #shadername, rows, cols, size } 1227 {0,
"",
"", 0, 0, 0 }
void APIENTRY glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
void IntelWorkaround(std::string const &name, GLint results[])
#define GL_COMPATIBLE_SUBROUTINES
#define GL_INT_SAMPLER_1D_ARRAY
#define GL_INT_SAMPLER_2D_ARRAY
std::vector< GLint > activeVariables
#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER
#define ENUM(value, shadername, rows, cols, size)
#define GL_UNSIGNED_INT_VEC4
#define GL_REFERENCED_BY_VERTEX_SHADER
#define GL_TESS_CONTROL_SUBROUTINE
#define GL_SAMPLER_2D_MULTISAMPLE
#define GL_COMPUTE_SHADER
#define GL_FRAGMENT_SUBROUTINE
#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM
#define GL_TOP_LEVEL_ARRAY_SIZE
#define GL_TOP_LEVEL_ARRAY_STRIDE
#define GL_UNSIGNED_INT_VEC2
std::vector< std::string > mTessEvaluationSubroutines
#define GL_UNSIGNED_INT_SAMPLER_CUBE
GLint APIENTRY glGetUniformLocation(GLuint program, const GLchar *name)
#define GL_PROGRAM_OUTPUT
#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY
#define GL_UNSIGNED_INT_IMAGE_2D_RECT
#define GL_GEOMETRY_SUBROUTINE_UNIFORM
void APIENTRY glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
static const EnumMap msEnumMap[]
#define GL_SAMPLER_2D_RECT_SHADOW
#define GL_INT_IMAGE_1D_ARRAY
static std::string GetEnumName(GLenum value)
#define GL_TESS_EVALUATION_SHADER
#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY
std::vector< Output > mOutputs
void Print(std::ofstream &output) const
void APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
std::vector< SubroutineUniform > mTessControlSubroutineUniforms
std::vector< TransformFeedbackBuffer > mTransformFeedbackBuffers
#define GL_UNSIGNED_INT_IMAGE_2D
#define GL_BUFFER_VARIABLE
void ReflectTransformFeedbackBuffers()
#define GL_BUFFER_DATA_SIZE
#define GL_COMPUTE_SUBROUTINE
#define GL_ACTIVE_RESOURCES
#define GL_GEOMETRY_SHADER
#define GL_UNSIGNED_INT_SAMPLER_2D
std::vector< GLint > activeVariables
#define GL_UNSIGNED_INT_SAMPLER_1D
#define GL_ACTIVE_VARIABLES
#define GL_SAMPLER_CUBE_SHADOW
static unsigned GetEnumSize(GLenum value, GLint arraySize, GLint arrayStride, GLint matrixStride, GLint isRowMajor)
#define GL_UNSIGNED_INT_SAMPLER_3D
#define GL_SAMPLER_1D_ARRAY_SHADOW
#define GL_REFERENCED_BY_GEOMETRY_SHADER
#define GL_UNSIGNED_INT_SAMPLER_BUFFER
GLsizei const GLfloat * value
#define GL_INT_SAMPLER_2D_RECT
void ReflectBufferVariables()
#define GL_SAMPLER_CUBE_MAP_ARRAY
GLuint const GLchar * name
#define GL_UNSIGNED_INT_ATOMIC_COUNTER
void APIENTRY glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
#define GL_UNSIGNED_INT_IMAGE_1D
#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY
#define GL_INT_IMAGE_2D_ARRAY
#define GL_INT_SAMPLER_CUBE
#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM
#define GL_UNSIGNED_INT_SAMPLER_2D_RECT
#define GL_INT_SAMPLER_CUBE_MAP_ARRAY
GLSLReflection(GLuint handle)
#define GL_TRANSFORM_FEEDBACK_VARYING
void APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint *params)
#define GL_TESS_EVALUATION_SUBROUTINE
#define GL_INT_SAMPLER_2D_MULTISAMPLE
#define GL_IMAGE_CUBE_MAP_ARRAY
#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY
void APIENTRY glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
#define GL_REFERENCED_BY_COMPUTE_SHADER
#define GL_ATTACHED_SHADERS
#define GL_SAMPLER_2D_SHADOW
#define GL_INT_SAMPLER_1D
std::vector< SubroutineUniform > mVertexSubroutineUniforms
std::vector< TransformFeedbackVarying > mTransformFeedbackVaryings
std::vector< SubroutineUniform > mPixelSubroutineUniforms
#define GL_GEOMETRY_SUBROUTINE
#define GL_BUFFER_BINDING
std::vector< std::string > mGeometrySubroutines
#define GL_FRAGMENT_SUBROUTINE_UNIFORM
#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY
#define GL_VERTEX_SUBROUTINE
#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE
std::vector< SubroutineUniform > mComputeSubroutineUniforms
std::vector< Uniform > mUniforms
GLsizei GLsizei GLchar * source
#define GL_NUM_ACTIVE_VARIABLES
std::vector< std::string > mTessControlSubroutines
#define GL_UNSIGNED_INT_IMAGE_CUBE
GLsizei const GLchar *const * string
#define LogError(message)
#define GL_SHADER_SOURCE_LENGTH
std::vector< DataBlock > mShaderStorageBlocks
#define GL_SHADER_STORAGE_BLOCK
#define GL_INT_IMAGE_CUBE
#define GL_INT_IMAGE_CUBE_MAP_ARRAY
const GLubyte *APIENTRY glGetString(GLenum name)
#define GL_LOCATION_INDEX
#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY
#define GL_REFERENCED_BY_FRAGMENT_SHADER
#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY
#define GL_INT_SAMPLER_BUFFER
GLsizei GLsizei GLuint * shaders
#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY
#define GL_INT_IMAGE_2D_MULTISAMPLE
std::vector< DataBlock > mUniformBlocks
#define GL_SAMPLER_1D_ARRAY
#define GL_FRAGMENT_SHADER
#define GL_IMAGE_1D_ARRAY
#define GL_ATOMIC_COUNTER_BUFFER_INDEX
#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW
#define GL_TESS_CONTROL_SHADER
void ReflectSubroutines(GLenum programInterface, std::vector< std::string > &subroutines)
void ReflectDataBlocks(GLenum programInterface, std::vector< DataBlock > &blocks)
GLuint GLsizei GLsizei * length
#define GL_IMAGE_2D_MULTISAMPLE_ARRAY
GLuint APIENTRY glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
std::vector< SubroutineUniform > mGeometrySubroutineUniforms
void ReflectTransformFeedbackVaryings()
std::vector< BufferVariable > mBufferVariables
void ReflectAtomicCounterBuffers()
void ReflectProgramInputs()
#define GL_SAMPLER_2D_RECT
GLenum GLenum GLenum input
#define GL_UNSIGNED_INT_IMAGE_3D
#define GL_SAMPLER_BUFFER
std::vector< std::string > mPixelSubroutines
#define GL_REFERENCED_BY_TESS_CONTROL_SHADER
#define GL_SAMPLER_2D_ARRAY_SHADOW
void GetComputeShaderWorkGroupSize(GLint &numXThreads, GLint &numYThreads, GLint &numZThreads) const
void ReflectSubroutineUniforms(GLenum programInterface, std::vector< SubroutineUniform > &subUniforms)
std::vector< std::string > mVertexSubroutines
#define GL_INT_IMAGE_2D_RECT
#define GL_INT_IMAGE_BUFFER
#define GL_ATOMIC_COUNTER_BUFFER
#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE
#define GL_SAMPLER_1D_SHADOW
#define GL_IMAGE_2D_ARRAY
#define GL_UNSIGNED_INT_IMAGE_BUFFER
#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY
#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY
#define GL_COMPUTE_SUBROUTINE_UNIFORM
#define GL_SAMPLER_2D_ARRAY
#define GL_VERTEX_SUBROUTINE_UNIFORM
#define GL_INT_SAMPLER_2D
std::map< GLenum, int > mShaderTypeMap
#define GL_COMPUTE_WORK_GROUP_SIZE
std::vector< AtomicCounterBuffer > mAtomicCounterBuffers
std::vector< std::string > mComputeSubroutines
#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY
void ReflectProgramOutputs()
#define GL_IMAGE_2D_MULTISAMPLE
GLint GLint GLsizei GLint GLenum GLenum type
static std::string GetEnumShaderName(GLenum value)
void APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
std::vector< Input > mInputs
#define GL_TRANSFORM_FEEDBACK_BUFFER
static std::string GetReferencedByShaderList(GLint const referencedBy[6])
#define GL_UNSIGNED_INT_VEC3
GLint topLevelArrayStride
std::vector< SubroutineUniform > mTessEvaluationSubroutineUniforms
#define GL_INT_SAMPLER_3D
#define GL_SHADING_LANGUAGE_VERSION