1#ifndef _ES31FPROGRAMINTERFACEQUERYTESTCASE_HPP
2#define _ES31FPROGRAMINTERFACEQUERYTESTCASE_HPP
3/*-------------------------------------------------------------------------
4 * drawElements Quality Program OpenGL ES 3.1 Module
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 test case
24 *//*--------------------------------------------------------------------*/
25
26#include "tcuDefs.hpp"
27#include "tes31TestCase.hpp"
28#include "es31fProgramInterfaceDefinition.hpp"
29
30namespace deqp
31{
32namespace gles31
33{
34namespace Functional
35{
36
37struct ProgramResourceQueryTestTarget
38{
39						ProgramResourceQueryTestTarget (ProgramInterface interface_, deUint32 propFlags_);
40
41	ProgramInterface	interface;
42	deUint32			propFlags;
43};
44
45enum ProgramResourcePropFlags
46{
47	PROGRAMRESOURCEPROP_ARRAY_SIZE						= (1 <<  1),
48	PROGRAMRESOURCEPROP_ARRAY_STRIDE					= (1 <<  2),
49	PROGRAMRESOURCEPROP_ATOMIC_COUNTER_BUFFER_INDEX		= (1 <<  3),
50	PROGRAMRESOURCEPROP_BLOCK_INDEX						= (1 <<  4),
51	PROGRAMRESOURCEPROP_LOCATION						= (1 <<  5),
52	PROGRAMRESOURCEPROP_MATRIX_ROW_MAJOR				= (1 <<  6),
53	PROGRAMRESOURCEPROP_MATRIX_STRIDE					= (1 <<  7),
54	PROGRAMRESOURCEPROP_NAME_LENGTH						= (1 <<  8),
55	PROGRAMRESOURCEPROP_OFFSET							= (1 <<  9),
56	PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			= (1 << 10),
57	PROGRAMRESOURCEPROP_TYPE							= (1 << 11),
58	PROGRAMRESOURCEPROP_BUFFER_BINDING					= (1 << 12),
59	PROGRAMRESOURCEPROP_BUFFER_DATA_SIZE				= (1 << 13),
60	PROGRAMRESOURCEPROP_ACTIVE_VARIABLES				= (1 << 14),
61	PROGRAMRESOURCEPROP_TOP_LEVEL_ARRAY_SIZE			= (1 << 15),
62	PROGRAMRESOURCEPROP_TOP_LEVEL_ARRAY_STRIDE			= (1 << 16),
63	PROGRAMRESOURCEPROP_IS_PER_PATCH					= (1 << 17),
64
65	PROGRAMRESOURCEPROP_UNIFORM_INTERFACE_MASK			= PROGRAMRESOURCEPROP_ARRAY_SIZE					|
66														  PROGRAMRESOURCEPROP_ARRAY_STRIDE					|
67														  PROGRAMRESOURCEPROP_ATOMIC_COUNTER_BUFFER_INDEX	|
68														  PROGRAMRESOURCEPROP_BLOCK_INDEX					|
69														  PROGRAMRESOURCEPROP_LOCATION						|
70														  PROGRAMRESOURCEPROP_MATRIX_ROW_MAJOR				|
71														  PROGRAMRESOURCEPROP_MATRIX_STRIDE					|
72														  PROGRAMRESOURCEPROP_NAME_LENGTH					|
73														  PROGRAMRESOURCEPROP_OFFSET						|
74														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
75														  PROGRAMRESOURCEPROP_TYPE,
76
77	PROGRAMRESOURCEPROP_UNIFORM_BLOCK_INTERFACE_MASK	= PROGRAMRESOURCEPROP_NAME_LENGTH					|
78														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
79														  PROGRAMRESOURCEPROP_BUFFER_BINDING				|
80														  PROGRAMRESOURCEPROP_BUFFER_DATA_SIZE				|
81														  PROGRAMRESOURCEPROP_ACTIVE_VARIABLES,
82
83	PROGRAMRESOURCEPROP_SHADER_STORAGE_BLOCK_MASK		= PROGRAMRESOURCEPROP_NAME_LENGTH					|
84														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
85														  PROGRAMRESOURCEPROP_BUFFER_BINDING				|
86														  PROGRAMRESOURCEPROP_BUFFER_DATA_SIZE				|
87														  PROGRAMRESOURCEPROP_ACTIVE_VARIABLES,
88
89	PROGRAMRESOURCEPROP_PROGRAM_INPUT_MASK				= PROGRAMRESOURCEPROP_ARRAY_SIZE					|
90														  PROGRAMRESOURCEPROP_LOCATION						|
91														  PROGRAMRESOURCEPROP_NAME_LENGTH					|
92														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
93														  PROGRAMRESOURCEPROP_TYPE							|
94														  PROGRAMRESOURCEPROP_IS_PER_PATCH,
95
96	PROGRAMRESOURCEPROP_PROGRAM_OUTPUT_MASK				= PROGRAMRESOURCEPROP_ARRAY_SIZE					|
97														  PROGRAMRESOURCEPROP_LOCATION						|
98														  PROGRAMRESOURCEPROP_NAME_LENGTH					|
99														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
100														  PROGRAMRESOURCEPROP_TYPE							|
101														  PROGRAMRESOURCEPROP_IS_PER_PATCH,
102
103	PROGRAMRESOURCEPROP_BUFFER_VARIABLE_MASK			= PROGRAMRESOURCEPROP_ARRAY_SIZE					|
104														  PROGRAMRESOURCEPROP_ARRAY_STRIDE					|
105														  PROGRAMRESOURCEPROP_BLOCK_INDEX					|
106														  PROGRAMRESOURCEPROP_MATRIX_ROW_MAJOR				|
107														  PROGRAMRESOURCEPROP_MATRIX_STRIDE					|
108														  PROGRAMRESOURCEPROP_NAME_LENGTH					|
109														  PROGRAMRESOURCEPROP_OFFSET						|
110														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
111														  PROGRAMRESOURCEPROP_TOP_LEVEL_ARRAY_SIZE			|
112														  PROGRAMRESOURCEPROP_TOP_LEVEL_ARRAY_STRIDE		|
113														  PROGRAMRESOURCEPROP_TYPE,
114
115	PROGRAMRESOURCEPROP_TRANSFORM_FEEDBACK_VARYING_MASK	= PROGRAMRESOURCEPROP_ARRAY_SIZE					|
116														  PROGRAMRESOURCEPROP_NAME_LENGTH					|
117														  PROGRAMRESOURCEPROP_TYPE,
118};
119
120class ProgramInterfaceQueryTestCase : public TestCase
121{
122public:
123														ProgramInterfaceQueryTestCase	(Context& context, const char* name, const char* description, ProgramResourceQueryTestTarget queryTarget);
124														~ProgramInterfaceQueryTestCase	(void);
125
126protected:
127	ProgramInterface									getTargetInterface				(void) const;
128
129private:
130	const ProgramInterfaceDefinition::Program*			getAndCheckProgramDefinition	(void);
131	int													getMaxPatchVertices				(void);
132	IterateResult										iterate							(void);
133
134	virtual const ProgramInterfaceDefinition::Program*	getProgramDefinition			(void) const = 0;
135	virtual std::vector<std::string>					getQueryTargetResources			(void) const = 0;
136
137	const ProgramResourceQueryTestTarget				m_queryTarget;
138};
139
140void checkProgramResourceUsage (const ProgramInterfaceDefinition::Program* program, const glw::Functions& gl, tcu::TestLog& log);
141
142} // Functional
143} // gles31
144} // deqp
145
146#endif // _ES31FPROGRAMINTERFACEQUERYTESTCASE_HPP
147