1#ifndef _ES2FBUFFERTESTUTIL_HPP
2#define _ES2FBUFFERTESTUTIL_HPP
3/*-------------------------------------------------------------------------
4 * drawElements Quality Program OpenGL ES 2.0 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 Buffer test utilities.
24 *//*--------------------------------------------------------------------*/
25
26#include "tcuDefs.hpp"
27#include "tcuTestLog.hpp"
28#include "gluCallLogWrapper.hpp"
29#include "tes2TestCase.hpp"
30
31#include <vector>
32#include <set>
33
34namespace glu
35{
36class ShaderProgram;
37}
38
39namespace deqp
40{
41namespace gles2
42{
43namespace Functional
44{
45namespace BufferTestUtil
46{
47
48// Helper functions.
49
50void			fillWithRandomBytes		(deUint8* ptr, int numBytes, deUint32 seed);
51bool			compareByteArrays		(tcu::TestLog& log, const deUint8* resPtr, const deUint8* refPtr, int numBytes);
52const char*		getBufferTargetName		(deUint32 target);
53const char*		getUsageHintName		(deUint32 hint);
54
55// Base class for buffer cases.
56
57class BufferCase : public TestCase, public glu::CallLogWrapper
58{
59public:
60							BufferCase							(Context& context, const char* name, const char* description);
61	virtual					~BufferCase							(void);
62
63	void					init								(void);
64	void					deinit								(void);
65
66	deUint32				genBuffer							(void);
67	void					deleteBuffer						(deUint32 buffer);
68	void					checkError							(void);
69
70private:
71	// Resource handles for cleanup in case of unexpected iterate() termination.
72	std::set<deUint32>		m_allocatedBuffers;
73};
74
75// Reference buffer.
76
77class ReferenceBuffer
78{
79public:
80							ReferenceBuffer			(void) {}
81							~ReferenceBuffer		(void) {}
82
83	void					setSize					(int numBytes);
84	void					setData					(int numBytes, const deUint8* bytes);
85	void					setSubData				(int offset, int numBytes, const deUint8* bytes);
86
87	deUint8*				getPtr					(int offset = 0)		{ return &m_data[offset]; }
88	const deUint8*			getPtr					(int offset = 0) const	{ return &m_data[offset]; }
89
90private:
91	std::vector<deUint8>	m_data;
92};
93
94// Buffer verifier system.
95
96enum VerifyType
97{
98	VERIFY_AS_VERTEX_ARRAY	= 0,
99	VERIFY_AS_INDEX_ARRAY,
100
101	VERIFY_LAST
102};
103
104class BufferVerifierBase : public glu::CallLogWrapper
105{
106public:
107							BufferVerifierBase		(Context& context);
108	virtual					~BufferVerifierBase		(void) {}
109
110	virtual int				getMinSize				(void) const = DE_NULL;
111	virtual int				getAlignment			(void) const = DE_NULL;
112	virtual bool			verify					(deUint32 buffer, const deUint8* reference, int offset, int numBytes) = DE_NULL;
113
114protected:
115	Context&				m_context;
116
117private:
118							BufferVerifierBase		(const BufferVerifierBase& other);
119	BufferVerifierBase&		operator=				(const BufferVerifierBase& other);
120};
121
122class BufferVerifier
123{
124public:
125							BufferVerifier			(Context& context, VerifyType verifyType);
126							~BufferVerifier			(void);
127
128	int						getMinSize				(void) const { return m_verifier->getMinSize();		}
129	int						getAlignment			(void) const { return m_verifier->getAlignment();	}
130
131	// \note Offset is applied to reference pointer as well.
132	bool					verify					(deUint32 buffer, const deUint8* reference, int offset, int numBytes);
133
134private:
135							BufferVerifier			(const BufferVerifier& other);
136	BufferVerifier&			operator=				(const BufferVerifier& other);
137
138	BufferVerifierBase*		m_verifier;
139};
140
141class VertexArrayVerifier : public BufferVerifierBase
142{
143public:
144						VertexArrayVerifier		(Context& context);
145						~VertexArrayVerifier	(void);
146
147	int					getMinSize				(void) const { return 3*4; }
148	int					getAlignment			(void) const { return 1; }
149	bool				verify					(deUint32 buffer, const deUint8* reference, int offset, int numBytes);
150
151private:
152	glu::ShaderProgram*	m_program;
153	deUint32			m_posLoc;
154	deUint32			m_byteVecLoc;
155};
156
157class IndexArrayVerifier : public BufferVerifierBase
158{
159public:
160						IndexArrayVerifier		(Context& context);
161						~IndexArrayVerifier		(void);
162
163	int					getMinSize				(void) const { return 2; }
164	int					getAlignment			(void) const { return 1; }
165	bool				verify					(deUint32 buffer, const deUint8* reference, int offset, int numBytes);
166
167private:
168	glu::ShaderProgram*	m_program;
169	deUint32			m_posLoc;
170	deUint32			m_colorLoc;
171};
172
173} // BufferTestUtil
174} // Functional
175} // gles2
176} // deqp
177
178#endif // _ES2FBUFFERTESTUTIL_HPP
179