1#ifndef _ESEXTCTESSELLATIONSHADERXFB_HPP
2#define _ESEXTCTESSELLATIONSHADERXFB_HPP
3/*-------------------------------------------------------------------------
4 * OpenGL Conformance Test Suite
5 * -----------------------------
6 *
7 * Copyright (c) 2014-2016 The Khronos Group Inc.
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
24 */ /*-------------------------------------------------------------------*/
25
26#include "../esextcTestCaseBase.hpp"
27#include "glwEnums.hpp"
28
29namespace glcts
30{
31/** Implementation for Test Case 10
32 *
33 *  Verify transform feed-back captures data from appropriate shader stage.
34 *  Consider the following scenarios:
35 *
36 *  * vertex shader, tessellation control + evaluation shader, geometry shaders
37 *    are defined (output should be taken from geometry shader);
38 *  * vertex shader, tessellation control + evaluation shaders are defined
39 *    (output should be taken from tessellation evaluation shader);
40 *
41 *  Verify the following shader/stage combination is invalid and neither links
42 *  nor is considered a valid combination of stages for a pipeline object:
43 *
44 *  * vertex shader, tessellation control shaders are defined;
45 *
46 *  Make sure to include separate shader objects in the test.
47 **/
48class TessellationShaderXFB : public TestCaseBase
49{
50public:
51	/* Public methods */
52	TessellationShaderXFB(Context& context, const ExtParameters& extParams);
53
54	virtual ~TessellationShaderXFB(void)
55	{
56	}
57
58	virtual void		  deinit(void);
59	void				  initTest(void);
60	virtual IterateResult iterate(void);
61
62private:
63	/* Private definitions */
64	typedef struct _test_descriptor
65	{
66		/* Allowed values:
67		 *
68		 * GL_GEOMETRY_SHADER_EXT / GL_TESS_CONTROL_SHADER_EXT / GL_TESS_EVALUATION_SHADER_EXT /
69		 * GL_VERTEX_SHADER.
70		 */
71		glw::GLenum expected_data_source;
72		int			expected_n_values;
73		bool		should_draw_call_fail;
74		bool		requires_pipeline;
75		glw::GLenum tf_mode;
76
77		bool use_gs;
78		bool use_tc;
79		bool use_te;
80
81		_test_descriptor()
82		{
83			expected_data_source  = GL_NONE;
84			expected_n_values	 = 0;
85			should_draw_call_fail = false;
86			requires_pipeline	 = false;
87			tf_mode				  = GL_POINTS;
88			use_gs				  = false;
89			use_tc				  = false;
90			use_te				  = false;
91		}
92	} _test_descriptor;
93
94	/* Private variables */
95	glw::GLuint m_bo_id;
96	glw::GLuint m_fs_id;
97	glw::GLuint m_gs_id;
98	glw::GLuint m_po_id;
99	glw::GLuint m_tc_id;
100	glw::GLuint m_te_id;
101	glw::GLuint m_vs_id;
102
103	glw::GLuint m_pipeline_id;
104	glw::GLuint m_fs_program_id;
105	glw::GLuint m_gs_program_id;
106	glw::GLuint m_tc_program_id;
107	glw::GLuint m_te_program_id;
108	glw::GLuint m_vs_program_id;
109
110	glw::GLuint m_vao_id;
111
112	/* Private methods */
113	glw::GLuint createSeparableProgram(glw::GLenum shader_type, unsigned int n_strings, const char* const* strings,
114									   unsigned int n_varyings, const char* const* varyings, bool should_succeed);
115};
116
117} // namespace glcts
118
119#endif // _ESEXTCTESSELLATIONSHADERXFB_HPP
120