1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 3.1 Module
3 * -------------------------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Texture buffer tests
22 *//*--------------------------------------------------------------------*/
23
24 #include "es31fTextureBufferTests.hpp"
25
26 #include "glsTextureBufferCase.hpp"
27
28 #include "glwEnums.hpp"
29
30 #include "deStringUtil.hpp"
31
32 #include <string>
33
34 using std::string;
35 using namespace deqp::gls::TextureBufferCaseUtil;
36 using deqp::gls::TextureBufferCase;
37
38 namespace deqp
39 {
40 namespace gles31
41 {
42 namespace Functional
43 {
44 namespace
45 {
46
toTestName(RenderBits renderBits)47 string toTestName (RenderBits renderBits)
48 {
49 struct
50 {
51 RenderBits bit;
52 const char* str;
53 } bitInfos[] =
54 {
55 { RENDERBITS_AS_VERTEX_ARRAY, "as_vertex_array" },
56 { RENDERBITS_AS_INDEX_ARRAY, "as_index_array" },
57 { RENDERBITS_AS_VERTEX_TEXTURE, "as_vertex_texture" },
58 { RENDERBITS_AS_FRAGMENT_TEXTURE, "as_fragment_texture" }
59 };
60
61 std::ostringstream stream;
62 bool first = true;
63
64 DE_ASSERT(renderBits != 0);
65
66 for (int infoNdx = 0; infoNdx < DE_LENGTH_OF_ARRAY(bitInfos); infoNdx++)
67 {
68 if (renderBits & bitInfos[infoNdx].bit)
69 {
70 stream << (first ? "" : "_") << bitInfos[infoNdx].str;
71 first = false;
72 }
73 }
74
75 return stream.str();
76 }
77
toTestName(ModifyBits modifyBits)78 string toTestName (ModifyBits modifyBits)
79 {
80 struct
81 {
82 ModifyBits bit;
83 const char* str;
84 } bitInfos[] =
85 {
86 { MODIFYBITS_BUFFERDATA, "bufferdata" },
87 { MODIFYBITS_BUFFERSUBDATA, "buffersubdata" },
88 { MODIFYBITS_MAPBUFFER_WRITE, "mapbuffer_write" },
89 { MODIFYBITS_MAPBUFFER_READWRITE, "mapbuffer_readwrite" }
90 };
91
92 std::ostringstream stream;
93 bool first = true;
94
95 DE_ASSERT(modifyBits != 0);
96
97 for (int infoNdx = 0; infoNdx < DE_LENGTH_OF_ARRAY(bitInfos); infoNdx++)
98 {
99 if (modifyBits & bitInfos[infoNdx].bit)
100 {
101 stream << (first ? "" : "_") << bitInfos[infoNdx].str;
102 first = false;
103 }
104 }
105
106 return stream.str();
107 }
108
operator |(RenderBits a,RenderBits b)109 RenderBits operator| (RenderBits a, RenderBits b)
110 {
111 return (RenderBits)(deUint32(a) | deUint32(b));
112 }
113
114 } // anonymous
115
createTextureBufferTests(Context & context)116 TestCaseGroup* createTextureBufferTests (Context& context)
117 {
118 TestCaseGroup* const root = new TestCaseGroup(context, "texture_buffer", "Texture buffer syncronization tests");
119
120 const size_t bufferSizes[] =
121 {
122 512,
123 513,
124 65536,
125 65537,
126 131071
127 };
128
129 const size_t rangeSizes[] =
130 {
131 512,
132 513,
133 65537,
134 98304,
135 };
136
137 const size_t offsets[] =
138 {
139 1,
140 7
141 };
142
143 const RenderBits renderTypeCombinations[] =
144 {
145 RENDERBITS_AS_VERTEX_ARRAY,
146 RENDERBITS_AS_INDEX_ARRAY,
147 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_INDEX_ARRAY,
148
149 RENDERBITS_AS_VERTEX_TEXTURE,
150 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE,
151 RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE,
152 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE,
153
154 RENDERBITS_AS_FRAGMENT_TEXTURE,
155 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_FRAGMENT_TEXTURE,
156 RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_FRAGMENT_TEXTURE,
157 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_FRAGMENT_TEXTURE,
158 RENDERBITS_AS_VERTEX_TEXTURE | RENDERBITS_AS_FRAGMENT_TEXTURE,
159 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE | RENDERBITS_AS_FRAGMENT_TEXTURE,
160 RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE | RENDERBITS_AS_FRAGMENT_TEXTURE,
161 RENDERBITS_AS_VERTEX_ARRAY | RENDERBITS_AS_INDEX_ARRAY | RENDERBITS_AS_VERTEX_TEXTURE | RENDERBITS_AS_FRAGMENT_TEXTURE
162 };
163
164 const ModifyBits modifyTypes[] =
165 {
166 MODIFYBITS_BUFFERDATA,
167 MODIFYBITS_BUFFERSUBDATA,
168 MODIFYBITS_MAPBUFFER_WRITE,
169 MODIFYBITS_MAPBUFFER_READWRITE
170 };
171
172 // Rendering test
173 {
174 TestCaseGroup* const renderGroup = new TestCaseGroup(context, "render", "Setup texture buffer with glBufferData and render data in different ways");
175 root->addChild(renderGroup);
176
177 for (int renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypeCombinations); renderTypeNdx++)
178 {
179 const RenderBits renderType = renderTypeCombinations[renderTypeNdx];
180 TestCaseGroup* const renderTypeGroup = new TestCaseGroup(context, toTestName(renderType).c_str(), toTestName(renderType).c_str());
181
182 renderGroup->addChild(renderTypeGroup);
183
184 for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(bufferSizes); sizeNdx++)
185 {
186 const size_t size = bufferSizes[sizeNdx];
187 const string name ("buffer_size_" + de::toString(size));
188
189 renderTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, size, 0, 0, RENDERBITS_NONE, MODIFYBITS_NONE, renderType, name.c_str(), name.c_str()));
190 }
191
192 for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(rangeSizes); sizeNdx++)
193 {
194 const size_t size = rangeSizes[sizeNdx];
195 const string name ("range_size_" + de::toString(size));
196 const size_t bufferSize = 131072;
197
198 renderTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, bufferSize, 0, size, RENDERBITS_NONE, MODIFYBITS_NONE, renderType, name.c_str(), name.c_str()));
199 }
200
201 for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(offsets); offsetNdx++)
202 {
203 const size_t offset = offsets[offsetNdx];
204 const size_t bufferSize = 131072;
205 const size_t size = 65537;
206 const string name ("offset_" + de::toString(offset) + "_alignments");
207
208 renderTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, bufferSize, offset, size, RENDERBITS_NONE, MODIFYBITS_NONE, renderType, name.c_str(), name.c_str()));
209 }
210 }
211 }
212
213 // Modify tests
214 {
215 TestCaseGroup* const modifyGroup = new TestCaseGroup(context, "modify", "Modify texture buffer content in multiple ways");
216 root->addChild(modifyGroup);
217
218 for (int modifyNdx = 0; modifyNdx < DE_LENGTH_OF_ARRAY(modifyTypes); modifyNdx++)
219 {
220 const ModifyBits modifyType = modifyTypes[modifyNdx];
221 TestCaseGroup* const modifyTypeGroup = new TestCaseGroup(context, toTestName(modifyType).c_str(), toTestName(modifyType).c_str());
222
223 modifyGroup->addChild(modifyTypeGroup);
224
225 for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(bufferSizes); sizeNdx++)
226 {
227 const size_t size = bufferSizes[sizeNdx];
228 const string name ("buffer_size_" + de::toString(size));
229
230 modifyTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, size, 0, 0, RENDERBITS_NONE, modifyType, RENDERBITS_AS_FRAGMENT_TEXTURE, name.c_str(), name.c_str()));
231 }
232
233 for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(rangeSizes); sizeNdx++)
234 {
235 const size_t size = rangeSizes[sizeNdx];
236 const string name ("range_size_" + de::toString(size));
237 const size_t bufferSize = 131072;
238
239 modifyTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, bufferSize, 0, size, RENDERBITS_NONE, modifyType, RENDERBITS_AS_FRAGMENT_TEXTURE, name.c_str(), name.c_str()));
240 }
241
242 for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(offsets); offsetNdx++)
243 {
244 const size_t offset = offsets[offsetNdx];
245 const size_t bufferSize = 131072;
246 const size_t size = 65537;
247 const string name ("offset_" + de::toString(offset) + "_alignments");
248
249 modifyTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, bufferSize, offset, size, RENDERBITS_NONE, modifyType, RENDERBITS_AS_FRAGMENT_TEXTURE, name.c_str(), name.c_str()));
250 }
251 }
252 }
253
254 // Modify-Render tests
255 {
256 TestCaseGroup* const modifyRenderGroup = new TestCaseGroup(context, "modify_render", "Modify texture buffer content in multiple ways and render in different ways");
257 root->addChild(modifyRenderGroup);
258
259 for (int modifyNdx = 0; modifyNdx < DE_LENGTH_OF_ARRAY(modifyTypes); modifyNdx++)
260 {
261 const ModifyBits modifyType = modifyTypes[modifyNdx];
262 TestCaseGroup* const modifyTypeGroup = new TestCaseGroup(context, toTestName(modifyType).c_str(), toTestName(modifyType).c_str());
263
264 modifyRenderGroup->addChild(modifyTypeGroup);
265
266 for (int renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypeCombinations); renderTypeNdx++)
267 {
268 const RenderBits renderType = renderTypeCombinations[renderTypeNdx];
269 const size_t size = 16*1024;
270 const string name (toTestName(renderType));
271
272 modifyTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, size, 0, 0, RENDERBITS_NONE, modifyType, renderType, name.c_str(), name.c_str()));
273 }
274 }
275 }
276
277 // Render-Modify tests
278 {
279 TestCaseGroup* const renderModifyGroup = new TestCaseGroup(context, "render_modify", "Render texture buffer and modify.");
280 root->addChild(renderModifyGroup);
281
282 for (int renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypeCombinations); renderTypeNdx++)
283 {
284 const RenderBits renderType = renderTypeCombinations[renderTypeNdx];
285 TestCaseGroup* const renderTypeGroup = new TestCaseGroup(context, toTestName(renderType).c_str(), toTestName(renderType).c_str());
286
287 renderModifyGroup->addChild(renderTypeGroup);
288
289 for (int modifyNdx = 0; modifyNdx < DE_LENGTH_OF_ARRAY(modifyTypes); modifyNdx++)
290 {
291 const ModifyBits modifyType = modifyTypes[modifyNdx];
292 const size_t size = 16*1024;
293 const string name (toTestName(modifyType));
294
295 renderTypeGroup->addChild(new TextureBufferCase(context.getTestContext(), context.getRenderContext(), GL_RGBA8, size, 0, 0, renderType, modifyType, RENDERBITS_AS_FRAGMENT_TEXTURE, name.c_str(), name.c_str()));
296 }
297 }
298 }
299
300 return root;
301 }
302
303 } // Functional
304 } // gles31
305 } // deqp
306