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
64	PROGRAMRESOURCEPROP_UNIFORM_INTERFACE_MASK			= PROGRAMRESOURCEPROP_ARRAY_SIZE					|
65														  PROGRAMRESOURCEPROP_ARRAY_STRIDE					|
66														  PROGRAMRESOURCEPROP_ATOMIC_COUNTER_BUFFER_INDEX	|
67														  PROGRAMRESOURCEPROP_BLOCK_INDEX					|
68														  PROGRAMRESOURCEPROP_LOCATION						|
69														  PROGRAMRESOURCEPROP_MATRIX_ROW_MAJOR				|
70														  PROGRAMRESOURCEPROP_MATRIX_STRIDE					|
71														  PROGRAMRESOURCEPROP_NAME_LENGTH					|
72														  PROGRAMRESOURCEPROP_OFFSET						|
73														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
74														  PROGRAMRESOURCEPROP_TYPE,
75
76	PROGRAMRESOURCEPROP_UNIFORM_BLOCK_INTERFACE_MASK	= PROGRAMRESOURCEPROP_NAME_LENGTH					|
77														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
78														  PROGRAMRESOURCEPROP_BUFFER_BINDING				|
79														  PROGRAMRESOURCEPROP_BUFFER_DATA_SIZE				|
80														  PROGRAMRESOURCEPROP_ACTIVE_VARIABLES,
81
82	PROGRAMRESOURCEPROP_SHADER_STORAGE_BLOCK_MASK		= PROGRAMRESOURCEPROP_NAME_LENGTH					|
83														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
84														  PROGRAMRESOURCEPROP_BUFFER_BINDING				|
85														  PROGRAMRESOURCEPROP_BUFFER_DATA_SIZE				|
86														  PROGRAMRESOURCEPROP_ACTIVE_VARIABLES,
87
88	PROGRAMRESOURCEPROP_PROGRAM_INPUT_MASK				= PROGRAMRESOURCEPROP_ARRAY_SIZE					|
89														  PROGRAMRESOURCEPROP_LOCATION						|
90														  PROGRAMRESOURCEPROP_NAME_LENGTH					|
91														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
92														  PROGRAMRESOURCEPROP_TYPE,
93
94	PROGRAMRESOURCEPROP_PROGRAM_OUTPUT_MASK				= PROGRAMRESOURCEPROP_ARRAY_SIZE					|
95														  PROGRAMRESOURCEPROP_LOCATION						|
96														  PROGRAMRESOURCEPROP_NAME_LENGTH					|
97														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
98														  PROGRAMRESOURCEPROP_TYPE,
99
100	PROGRAMRESOURCEPROP_BUFFER_VARIABLE_MASK			= PROGRAMRESOURCEPROP_ARRAY_SIZE					|
101														  PROGRAMRESOURCEPROP_ARRAY_STRIDE					|
102														  PROGRAMRESOURCEPROP_BLOCK_INDEX					|
103														  PROGRAMRESOURCEPROP_MATRIX_ROW_MAJOR				|
104														  PROGRAMRESOURCEPROP_MATRIX_STRIDE					|
105														  PROGRAMRESOURCEPROP_NAME_LENGTH					|
106														  PROGRAMRESOURCEPROP_OFFSET						|
107														  PROGRAMRESOURCEPROP_REFERENCED_BY_SHADER			|
108														  PROGRAMRESOURCEPROP_TOP_LEVEL_ARRAY_SIZE			|
109														  PROGRAMRESOURCEPROP_TOP_LEVEL_ARRAY_STRIDE		|
110														  PROGRAMRESOURCEPROP_TYPE,
111
112	PROGRAMRESOURCEPROP_TRANSFORM_FEEDBACK_VARYING_MASK	= PROGRAMRESOURCEPROP_ARRAY_SIZE					|
113														  PROGRAMRESOURCEPROP_NAME_LENGTH					|
114														  PROGRAMRESOURCEPROP_TYPE,
115};
116
117class ProgramInterfaceQueryTestCase : public TestCase
118{
119public:
120													ProgramInterfaceQueryTestCase	(Context& context, const char* name, const char* description, ProgramResourceQueryTestTarget queryTarget);
121													~ProgramInterfaceQueryTestCase	(void);
122
123protected:
124	ProgramInterface								getTargetInterface				(void) const;
125
126private:
127	IterateResult									iterate							(void);
128	virtual ProgramInterfaceDefinition::Program*	getProgramDefinition			(void) = 0;
129	virtual std::vector<std::string>				getQueryTargetResources			(void) = 0;
130
131	const ProgramResourceQueryTestTarget			m_queryTarget;
132};
133
134void checkProgramResourceUsage (const ProgramInterfaceDefinition::Program* program, const glw::Functions& gl, tcu::TestLog& log);
135
136} // Functional
137} // gles31
138} // deqp
139
140#endif // _ES31FPROGRAMINTERFACEQUERYTESTCASE_HPP
141