xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fLifetimeTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Object lifetime tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es3fLifetimeTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deUniquePtr.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluDrawUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluObjectWrapper.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "glsLifetimeTests.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
37*35238bceSAndroid Build Coastguard Worker 
38*35238bceSAndroid Build Coastguard Worker #include <vector>
39*35238bceSAndroid Build Coastguard Worker 
40*35238bceSAndroid Build Coastguard Worker namespace deqp
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker namespace gles3
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker namespace Functional
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker namespace
47*35238bceSAndroid Build Coastguard Worker {
48*35238bceSAndroid Build Coastguard Worker 
49*35238bceSAndroid Build Coastguard Worker using de::MovePtr;
50*35238bceSAndroid Build Coastguard Worker using de::Random;
51*35238bceSAndroid Build Coastguard Worker using glu::Buffer;
52*35238bceSAndroid Build Coastguard Worker using glu::CallLogWrapper;
53*35238bceSAndroid Build Coastguard Worker using glu::ProgramSources;
54*35238bceSAndroid Build Coastguard Worker using glu::RenderContext;
55*35238bceSAndroid Build Coastguard Worker using glu::VertexArray;
56*35238bceSAndroid Build Coastguard Worker using std::vector;
57*35238bceSAndroid Build Coastguard Worker using tcu::RenderTarget;
58*35238bceSAndroid Build Coastguard Worker using tcu::Surface;
59*35238bceSAndroid Build Coastguard Worker using tcu::TestContext;
60*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
61*35238bceSAndroid Build Coastguard Worker namespace lt = gls::LifetimeTests;
62*35238bceSAndroid Build Coastguard Worker using namespace lt;
63*35238bceSAndroid Build Coastguard Worker using namespace glw;
64*35238bceSAndroid Build Coastguard Worker typedef TestCase::IterateResult IterateResult;
65*35238bceSAndroid Build Coastguard Worker 
66*35238bceSAndroid Build Coastguard Worker enum
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker     VIEWPORT_SIZE = 128
69*35238bceSAndroid Build Coastguard Worker };
70*35238bceSAndroid Build Coastguard Worker 
71*35238bceSAndroid Build Coastguard Worker class ScaleProgram : public glu::ShaderProgram
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker public:
74*35238bceSAndroid Build Coastguard Worker     ScaleProgram(lt::Context &ctx);
75*35238bceSAndroid Build Coastguard Worker     void draw(GLuint vao, GLfloat scale, bool tf, Surface *dst);
76*35238bceSAndroid Build Coastguard Worker     void setPos(GLuint buffer, GLuint vao);
77*35238bceSAndroid Build Coastguard Worker 
78*35238bceSAndroid Build Coastguard Worker private:
79*35238bceSAndroid Build Coastguard Worker     ProgramSources getSources(void);
80*35238bceSAndroid Build Coastguard Worker 
81*35238bceSAndroid Build Coastguard Worker     const RenderContext &m_renderCtx;
82*35238bceSAndroid Build Coastguard Worker     GLint m_scaleLoc;
83*35238bceSAndroid Build Coastguard Worker     GLint m_posLoc;
84*35238bceSAndroid Build Coastguard Worker };
85*35238bceSAndroid Build Coastguard Worker 
86*35238bceSAndroid Build Coastguard Worker enum
87*35238bceSAndroid Build Coastguard Worker {
88*35238bceSAndroid Build Coastguard Worker     NUM_COMPONENTS = 4,
89*35238bceSAndroid Build Coastguard Worker     NUM_VERTICES   = 3
90*35238bceSAndroid Build Coastguard Worker };
91*35238bceSAndroid Build Coastguard Worker 
ScaleProgram(lt::Context & ctx)92*35238bceSAndroid Build Coastguard Worker ScaleProgram::ScaleProgram(lt::Context &ctx)
93*35238bceSAndroid Build Coastguard Worker     : glu::ShaderProgram(ctx.getRenderContext(), getSources())
94*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(ctx.getRenderContext())
95*35238bceSAndroid Build Coastguard Worker {
96*35238bceSAndroid Build Coastguard Worker     const Functions &gl = m_renderCtx.getFunctions();
97*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(isOk());
98*35238bceSAndroid Build Coastguard Worker     m_scaleLoc = gl.getUniformLocation(getProgram(), "scale");
99*35238bceSAndroid Build Coastguard Worker     m_posLoc   = gl.getAttribLocation(getProgram(), "pos");
100*35238bceSAndroid Build Coastguard Worker }
101*35238bceSAndroid Build Coastguard Worker 
102*35238bceSAndroid Build Coastguard Worker #define GLSL(VERSION, BODY) ("#version " #VERSION "\n" #BODY "\n")
103*35238bceSAndroid Build Coastguard Worker 
104*35238bceSAndroid Build Coastguard Worker static const char *const s_vertexShaderSrc = GLSL(
105*35238bceSAndroid Build Coastguard Worker     100, attribute vec4 pos; uniform float scale; void main() { gl_Position = vec4(scale * pos.xy, pos.zw); });
106*35238bceSAndroid Build Coastguard Worker 
107*35238bceSAndroid Build Coastguard Worker static const char *const s_fragmentShaderSrc = GLSL(
108*35238bceSAndroid Build Coastguard Worker     100, void main() { gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0); });
109*35238bceSAndroid Build Coastguard Worker 
getSources(void)110*35238bceSAndroid Build Coastguard Worker ProgramSources ScaleProgram::getSources(void)
111*35238bceSAndroid Build Coastguard Worker {
112*35238bceSAndroid Build Coastguard Worker     using namespace glu;
113*35238bceSAndroid Build Coastguard Worker     ProgramSources sources;
114*35238bceSAndroid Build Coastguard Worker     sources << VertexSource(s_vertexShaderSrc) << FragmentSource(s_fragmentShaderSrc)
115*35238bceSAndroid Build Coastguard Worker             << TransformFeedbackMode(GL_INTERLEAVED_ATTRIBS) << TransformFeedbackVarying("gl_Position");
116*35238bceSAndroid Build Coastguard Worker     return sources;
117*35238bceSAndroid Build Coastguard Worker }
118*35238bceSAndroid Build Coastguard Worker 
draw(GLuint vao,GLfloat scale,bool tf,Surface * dst)119*35238bceSAndroid Build Coastguard Worker void ScaleProgram::draw(GLuint vao, GLfloat scale, bool tf, Surface *dst)
120*35238bceSAndroid Build Coastguard Worker {
121*35238bceSAndroid Build Coastguard Worker     const Functions &gl = m_renderCtx.getFunctions();
122*35238bceSAndroid Build Coastguard Worker     de::Random rnd(vao);
123*35238bceSAndroid Build Coastguard Worker     Rectangle viewport = randomViewport(m_renderCtx, VIEWPORT_SIZE, VIEWPORT_SIZE, rnd);
124*35238bceSAndroid Build Coastguard Worker     setViewport(m_renderCtx, viewport);
125*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0, 0, 0, 1);
126*35238bceSAndroid Build Coastguard Worker     gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker     gl.bindVertexArray(vao);
129*35238bceSAndroid Build Coastguard Worker     gl.enableVertexAttribArray(m_posLoc);
130*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL_ERROR(gl.useProgram(getProgram()), gl.getError());
131*35238bceSAndroid Build Coastguard Worker 
132*35238bceSAndroid Build Coastguard Worker     gl.uniform1f(m_scaleLoc, scale);
133*35238bceSAndroid Build Coastguard Worker 
134*35238bceSAndroid Build Coastguard Worker     if (tf)
135*35238bceSAndroid Build Coastguard Worker     {
136*35238bceSAndroid Build Coastguard Worker         gl.beginTransformFeedback(GL_TRIANGLES);
137*35238bceSAndroid Build Coastguard Worker         if (gl.getError() == GL_INVALID_OPERATION)
138*35238bceSAndroid Build Coastguard Worker             return;
139*35238bceSAndroid Build Coastguard Worker     }
140*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL_ERROR(gl.drawArrays(GL_TRIANGLES, 0, 3), gl.getError());
141*35238bceSAndroid Build Coastguard Worker     if (tf)
142*35238bceSAndroid Build Coastguard Worker         gl.endTransformFeedback();
143*35238bceSAndroid Build Coastguard Worker 
144*35238bceSAndroid Build Coastguard Worker     if (dst != DE_NULL)
145*35238bceSAndroid Build Coastguard Worker         readRectangle(m_renderCtx, viewport, *dst);
146*35238bceSAndroid Build Coastguard Worker 
147*35238bceSAndroid Build Coastguard Worker     gl.bindVertexArray(0);
148*35238bceSAndroid Build Coastguard Worker }
149*35238bceSAndroid Build Coastguard Worker 
setPos(GLuint buffer,GLuint vao)150*35238bceSAndroid Build Coastguard Worker void ScaleProgram::setPos(GLuint buffer, GLuint vao)
151*35238bceSAndroid Build Coastguard Worker {
152*35238bceSAndroid Build Coastguard Worker     const Functions &gl = m_renderCtx.getFunctions();
153*35238bceSAndroid Build Coastguard Worker 
154*35238bceSAndroid Build Coastguard Worker     gl.bindBuffer(GL_ARRAY_BUFFER, buffer);
155*35238bceSAndroid Build Coastguard Worker     gl.bindVertexArray(vao);
156*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL_ERROR(gl.vertexAttribPointer(m_posLoc, NUM_COMPONENTS, GL_FLOAT, false, 0, DE_NULL), gl.getError());
157*35238bceSAndroid Build Coastguard Worker     gl.bindVertexArray(0);
158*35238bceSAndroid Build Coastguard Worker     gl.bindBuffer(GL_ARRAY_BUFFER, 0);
159*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_ERROR(gl.getError());
160*35238bceSAndroid Build Coastguard Worker }
161*35238bceSAndroid Build Coastguard Worker 
162*35238bceSAndroid Build Coastguard Worker class VertexArrayBinder : public SimpleBinder
163*35238bceSAndroid Build Coastguard Worker {
164*35238bceSAndroid Build Coastguard Worker public:
VertexArrayBinder(lt::Context & ctx)165*35238bceSAndroid Build Coastguard Worker     VertexArrayBinder(lt::Context &ctx) : SimpleBinder(ctx, 0, GL_NONE, GL_VERTEX_ARRAY_BINDING, true)
166*35238bceSAndroid Build Coastguard Worker     {
167*35238bceSAndroid Build Coastguard Worker     }
bind(GLuint name)168*35238bceSAndroid Build Coastguard Worker     void bind(GLuint name)
169*35238bceSAndroid Build Coastguard Worker     {
170*35238bceSAndroid Build Coastguard Worker         glBindVertexArray(name);
171*35238bceSAndroid Build Coastguard Worker     }
172*35238bceSAndroid Build Coastguard Worker };
173*35238bceSAndroid Build Coastguard Worker 
174*35238bceSAndroid Build Coastguard Worker class SamplerBinder : public Binder
175*35238bceSAndroid Build Coastguard Worker {
176*35238bceSAndroid Build Coastguard Worker public:
SamplerBinder(lt::Context & ctx)177*35238bceSAndroid Build Coastguard Worker     SamplerBinder(lt::Context &ctx) : Binder(ctx)
178*35238bceSAndroid Build Coastguard Worker     {
179*35238bceSAndroid Build Coastguard Worker     }
bind(GLuint name)180*35238bceSAndroid Build Coastguard Worker     void bind(GLuint name)
181*35238bceSAndroid Build Coastguard Worker     {
182*35238bceSAndroid Build Coastguard Worker         glBindSampler(0, name);
183*35238bceSAndroid Build Coastguard Worker     }
getBinding(void)184*35238bceSAndroid Build Coastguard Worker     GLuint getBinding(void)
185*35238bceSAndroid Build Coastguard Worker     {
186*35238bceSAndroid Build Coastguard Worker         GLint arr[32] = {};
187*35238bceSAndroid Build Coastguard Worker         glGetIntegerv(GL_SAMPLER_BINDING, arr);
188*35238bceSAndroid Build Coastguard Worker         log() << TestLog::Message << "// First output integer: " << arr[0] << TestLog::EndMessage;
189*35238bceSAndroid Build Coastguard Worker         return arr[0];
190*35238bceSAndroid Build Coastguard Worker     }
genRequired(void) const191*35238bceSAndroid Build Coastguard Worker     bool genRequired(void) const
192*35238bceSAndroid Build Coastguard Worker     {
193*35238bceSAndroid Build Coastguard Worker         return true;
194*35238bceSAndroid Build Coastguard Worker     }
195*35238bceSAndroid Build Coastguard Worker };
196*35238bceSAndroid Build Coastguard Worker 
197*35238bceSAndroid Build Coastguard Worker class QueryBinder : public Binder
198*35238bceSAndroid Build Coastguard Worker {
199*35238bceSAndroid Build Coastguard Worker public:
QueryBinder(lt::Context & ctx)200*35238bceSAndroid Build Coastguard Worker     QueryBinder(lt::Context &ctx) : Binder(ctx)
201*35238bceSAndroid Build Coastguard Worker     {
202*35238bceSAndroid Build Coastguard Worker     }
bind(GLuint name)203*35238bceSAndroid Build Coastguard Worker     void bind(GLuint name)
204*35238bceSAndroid Build Coastguard Worker     {
205*35238bceSAndroid Build Coastguard Worker         if (name != 0)
206*35238bceSAndroid Build Coastguard Worker             glBeginQuery(GL_ANY_SAMPLES_PASSED, name);
207*35238bceSAndroid Build Coastguard Worker         else
208*35238bceSAndroid Build Coastguard Worker             glEndQuery(GL_ANY_SAMPLES_PASSED);
209*35238bceSAndroid Build Coastguard Worker     }
getBinding(void)210*35238bceSAndroid Build Coastguard Worker     GLuint getBinding(void)
211*35238bceSAndroid Build Coastguard Worker     {
212*35238bceSAndroid Build Coastguard Worker         return 0;
213*35238bceSAndroid Build Coastguard Worker     }
214*35238bceSAndroid Build Coastguard Worker };
215*35238bceSAndroid Build Coastguard Worker 
216*35238bceSAndroid Build Coastguard Worker class BufferVAOAttacher : public Attacher
217*35238bceSAndroid Build Coastguard Worker {
218*35238bceSAndroid Build Coastguard Worker public:
BufferVAOAttacher(lt::Context & ctx,Type & elementType,Type & varrType,ScaleProgram & program)219*35238bceSAndroid Build Coastguard Worker     BufferVAOAttacher(lt::Context &ctx, Type &elementType, Type &varrType, ScaleProgram &program)
220*35238bceSAndroid Build Coastguard Worker         : Attacher(ctx, elementType, varrType)
221*35238bceSAndroid Build Coastguard Worker         , m_program(program)
222*35238bceSAndroid Build Coastguard Worker     {
223*35238bceSAndroid Build Coastguard Worker     }
224*35238bceSAndroid Build Coastguard Worker     void initAttachment(GLuint seed, GLuint element);
225*35238bceSAndroid Build Coastguard Worker     void attach(GLuint element, GLuint container);
226*35238bceSAndroid Build Coastguard Worker     void detach(GLuint element, GLuint container);
canAttachDeleted(void) const227*35238bceSAndroid Build Coastguard Worker     bool canAttachDeleted(void) const
228*35238bceSAndroid Build Coastguard Worker     {
229*35238bceSAndroid Build Coastguard Worker         return false;
230*35238bceSAndroid Build Coastguard Worker     }
getProgram(void)231*35238bceSAndroid Build Coastguard Worker     ScaleProgram &getProgram(void)
232*35238bceSAndroid Build Coastguard Worker     {
233*35238bceSAndroid Build Coastguard Worker         return m_program;
234*35238bceSAndroid Build Coastguard Worker     }
235*35238bceSAndroid Build Coastguard Worker     GLuint getAttachment(GLuint container);
236*35238bceSAndroid Build Coastguard Worker 
237*35238bceSAndroid Build Coastguard Worker private:
238*35238bceSAndroid Build Coastguard Worker     ScaleProgram &m_program;
239*35238bceSAndroid Build Coastguard Worker };
240*35238bceSAndroid Build Coastguard Worker 
241*35238bceSAndroid Build Coastguard Worker static const GLfloat s_varrData[NUM_VERTICES * NUM_COMPONENTS] = {-1.0, 0.0, 0.0, 1.0,  1.0, 1.0,
242*35238bceSAndroid Build Coastguard Worker                                                                   0.0,  1.0, 0.0, -1.0, 0.0, 1.0};
243*35238bceSAndroid Build Coastguard Worker 
initBuffer(const Functions & gl,GLuint seed,GLenum usage,GLuint buffer)244*35238bceSAndroid Build Coastguard Worker void initBuffer(const Functions &gl, GLuint seed, GLenum usage, GLuint buffer)
245*35238bceSAndroid Build Coastguard Worker {
246*35238bceSAndroid Build Coastguard Worker     gl.bindBuffer(GL_ARRAY_BUFFER, buffer);
247*35238bceSAndroid Build Coastguard Worker     if (seed == 0)
248*35238bceSAndroid Build Coastguard Worker         gl.bufferData(GL_ARRAY_BUFFER, sizeof(s_varrData), s_varrData, usage);
249*35238bceSAndroid Build Coastguard Worker     else
250*35238bceSAndroid Build Coastguard Worker     {
251*35238bceSAndroid Build Coastguard Worker         Random rnd(seed);
252*35238bceSAndroid Build Coastguard Worker         GLfloat data[DE_LENGTH_OF_ARRAY(s_varrData)];
253*35238bceSAndroid Build Coastguard Worker 
254*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < NUM_VERTICES; ndx++)
255*35238bceSAndroid Build Coastguard Worker         {
256*35238bceSAndroid Build Coastguard Worker             GLfloat *vertex = &data[ndx * NUM_COMPONENTS];
257*35238bceSAndroid Build Coastguard Worker             vertex[0]       = 2.0f * (rnd.getFloat() - 0.5f);
258*35238bceSAndroid Build Coastguard Worker             vertex[1]       = 2.0f * (rnd.getFloat() - 0.5f);
259*35238bceSAndroid Build Coastguard Worker             DE_STATIC_ASSERT(NUM_COMPONENTS == 4);
260*35238bceSAndroid Build Coastguard Worker             vertex[2] = 0.0f;
261*35238bceSAndroid Build Coastguard Worker             vertex[3] = 1.0f;
262*35238bceSAndroid Build Coastguard Worker         }
263*35238bceSAndroid Build Coastguard Worker         gl.bufferData(GL_ARRAY_BUFFER, sizeof(data), data, usage);
264*35238bceSAndroid Build Coastguard Worker     }
265*35238bceSAndroid Build Coastguard Worker     gl.bindBuffer(GL_ARRAY_BUFFER, 0);
266*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_ERROR(gl.getError());
267*35238bceSAndroid Build Coastguard Worker }
268*35238bceSAndroid Build Coastguard Worker 
initAttachment(GLuint seed,GLuint buffer)269*35238bceSAndroid Build Coastguard Worker void BufferVAOAttacher::initAttachment(GLuint seed, GLuint buffer)
270*35238bceSAndroid Build Coastguard Worker {
271*35238bceSAndroid Build Coastguard Worker     initBuffer(gl(), seed, GL_STATIC_DRAW, buffer);
272*35238bceSAndroid Build Coastguard Worker     log() << TestLog::Message << "// Initialized buffer " << buffer << " from seed " << seed << TestLog::EndMessage;
273*35238bceSAndroid Build Coastguard Worker }
274*35238bceSAndroid Build Coastguard Worker 
attach(GLuint buffer,GLuint vao)275*35238bceSAndroid Build Coastguard Worker void BufferVAOAttacher::attach(GLuint buffer, GLuint vao)
276*35238bceSAndroid Build Coastguard Worker {
277*35238bceSAndroid Build Coastguard Worker     m_program.setPos(buffer, vao);
278*35238bceSAndroid Build Coastguard Worker     log() << TestLog::Message << "// Set the `pos` attribute in VAO " << vao << " to buffer " << buffer
279*35238bceSAndroid Build Coastguard Worker           << TestLog::EndMessage;
280*35238bceSAndroid Build Coastguard Worker }
281*35238bceSAndroid Build Coastguard Worker 
detach(GLuint buffer,GLuint varr)282*35238bceSAndroid Build Coastguard Worker void BufferVAOAttacher::detach(GLuint buffer, GLuint varr)
283*35238bceSAndroid Build Coastguard Worker {
284*35238bceSAndroid Build Coastguard Worker     DE_UNREF(buffer);
285*35238bceSAndroid Build Coastguard Worker     attach(0, varr);
286*35238bceSAndroid Build Coastguard Worker }
287*35238bceSAndroid Build Coastguard Worker 
getAttachment(GLuint varr)288*35238bceSAndroid Build Coastguard Worker GLuint BufferVAOAttacher::getAttachment(GLuint varr)
289*35238bceSAndroid Build Coastguard Worker {
290*35238bceSAndroid Build Coastguard Worker     GLint name = 0;
291*35238bceSAndroid Build Coastguard Worker     gl().bindVertexArray(varr);
292*35238bceSAndroid Build Coastguard Worker     gl().getVertexAttribiv(0, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &name);
293*35238bceSAndroid Build Coastguard Worker     gl().bindVertexArray(0);
294*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_ERROR(gl().getError());
295*35238bceSAndroid Build Coastguard Worker     return GLuint(name);
296*35238bceSAndroid Build Coastguard Worker }
297*35238bceSAndroid Build Coastguard Worker 
298*35238bceSAndroid Build Coastguard Worker class BufferVAOInputAttacher : public InputAttacher
299*35238bceSAndroid Build Coastguard Worker {
300*35238bceSAndroid Build Coastguard Worker public:
BufferVAOInputAttacher(BufferVAOAttacher & attacher)301*35238bceSAndroid Build Coastguard Worker     BufferVAOInputAttacher(BufferVAOAttacher &attacher) : InputAttacher(attacher), m_program(attacher.getProgram())
302*35238bceSAndroid Build Coastguard Worker     {
303*35238bceSAndroid Build Coastguard Worker     }
304*35238bceSAndroid Build Coastguard Worker     void drawContainer(GLuint container, Surface &dst);
305*35238bceSAndroid Build Coastguard Worker 
306*35238bceSAndroid Build Coastguard Worker private:
307*35238bceSAndroid Build Coastguard Worker     ScaleProgram &m_program;
308*35238bceSAndroid Build Coastguard Worker };
309*35238bceSAndroid Build Coastguard Worker 
drawContainer(GLuint vao,Surface & dst)310*35238bceSAndroid Build Coastguard Worker void BufferVAOInputAttacher::drawContainer(GLuint vao, Surface &dst)
311*35238bceSAndroid Build Coastguard Worker {
312*35238bceSAndroid Build Coastguard Worker     m_program.draw(vao, 1.0, false, &dst);
313*35238bceSAndroid Build Coastguard Worker     log() << TestLog::Message << "// Drew an output image with VAO " << vao << TestLog::EndMessage;
314*35238bceSAndroid Build Coastguard Worker }
315*35238bceSAndroid Build Coastguard Worker 
316*35238bceSAndroid Build Coastguard Worker class BufferTfAttacher : public Attacher
317*35238bceSAndroid Build Coastguard Worker {
318*35238bceSAndroid Build Coastguard Worker public:
BufferTfAttacher(lt::Context & ctx,Type & bufferType,Type & tfType)319*35238bceSAndroid Build Coastguard Worker     BufferTfAttacher(lt::Context &ctx, Type &bufferType, Type &tfType) : Attacher(ctx, bufferType, tfType)
320*35238bceSAndroid Build Coastguard Worker     {
321*35238bceSAndroid Build Coastguard Worker     }
322*35238bceSAndroid Build Coastguard Worker     void initAttachment(GLuint seed, GLuint element);
323*35238bceSAndroid Build Coastguard Worker     void attach(GLuint buffer, GLuint tf);
324*35238bceSAndroid Build Coastguard Worker     void detach(GLuint buffer, GLuint tf);
canAttachDeleted(void) const325*35238bceSAndroid Build Coastguard Worker     bool canAttachDeleted(void) const
326*35238bceSAndroid Build Coastguard Worker     {
327*35238bceSAndroid Build Coastguard Worker         return false;
328*35238bceSAndroid Build Coastguard Worker     }
329*35238bceSAndroid Build Coastguard Worker     GLuint getAttachment(GLuint tf);
330*35238bceSAndroid Build Coastguard Worker };
331*35238bceSAndroid Build Coastguard Worker 
initAttachment(GLuint seed,GLuint buffer)332*35238bceSAndroid Build Coastguard Worker void BufferTfAttacher::initAttachment(GLuint seed, GLuint buffer)
333*35238bceSAndroid Build Coastguard Worker {
334*35238bceSAndroid Build Coastguard Worker     initBuffer(gl(), seed, GL_DYNAMIC_READ, buffer);
335*35238bceSAndroid Build Coastguard Worker     log() << TestLog::Message << "// Initialized buffer " << buffer << " from seed " << seed << TestLog::EndMessage;
336*35238bceSAndroid Build Coastguard Worker }
337*35238bceSAndroid Build Coastguard Worker 
attach(GLuint buffer,GLuint tf)338*35238bceSAndroid Build Coastguard Worker void BufferTfAttacher::attach(GLuint buffer, GLuint tf)
339*35238bceSAndroid Build Coastguard Worker {
340*35238bceSAndroid Build Coastguard Worker     glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tf);
341*35238bceSAndroid Build Coastguard Worker     glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffer);
342*35238bceSAndroid Build Coastguard Worker     glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
343*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_ERROR(gl().getError());
344*35238bceSAndroid Build Coastguard Worker }
345*35238bceSAndroid Build Coastguard Worker 
detach(GLuint buffer,GLuint tf)346*35238bceSAndroid Build Coastguard Worker void BufferTfAttacher::detach(GLuint buffer, GLuint tf)
347*35238bceSAndroid Build Coastguard Worker {
348*35238bceSAndroid Build Coastguard Worker     DE_UNREF(buffer);
349*35238bceSAndroid Build Coastguard Worker     glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tf);
350*35238bceSAndroid Build Coastguard Worker     glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
351*35238bceSAndroid Build Coastguard Worker     glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
352*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_ERROR(gl().getError());
353*35238bceSAndroid Build Coastguard Worker }
354*35238bceSAndroid Build Coastguard Worker 
getAttachment(GLuint tf)355*35238bceSAndroid Build Coastguard Worker GLuint BufferTfAttacher::getAttachment(GLuint tf)
356*35238bceSAndroid Build Coastguard Worker {
357*35238bceSAndroid Build Coastguard Worker     GLint ret = 0;
358*35238bceSAndroid Build Coastguard Worker     gl().bindTransformFeedback(GL_TRANSFORM_FEEDBACK, tf);
359*35238bceSAndroid Build Coastguard Worker     gl().getIntegeri_v(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, 0, &ret);
360*35238bceSAndroid Build Coastguard Worker     gl().bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
361*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_ERROR(gl().getError());
362*35238bceSAndroid Build Coastguard Worker     return GLuint(ret);
363*35238bceSAndroid Build Coastguard Worker }
364*35238bceSAndroid Build Coastguard Worker 
365*35238bceSAndroid Build Coastguard Worker class BufferTfOutputAttacher : public OutputAttacher
366*35238bceSAndroid Build Coastguard Worker {
367*35238bceSAndroid Build Coastguard Worker public:
BufferTfOutputAttacher(BufferTfAttacher & attacher,ScaleProgram & program)368*35238bceSAndroid Build Coastguard Worker     BufferTfOutputAttacher(BufferTfAttacher &attacher, ScaleProgram &program)
369*35238bceSAndroid Build Coastguard Worker         : OutputAttacher(attacher)
370*35238bceSAndroid Build Coastguard Worker         , m_program(program)
371*35238bceSAndroid Build Coastguard Worker     {
372*35238bceSAndroid Build Coastguard Worker     }
373*35238bceSAndroid Build Coastguard Worker     void setupContainer(GLuint seed, GLuint container);
374*35238bceSAndroid Build Coastguard Worker     void drawAttachment(GLuint attachment, Surface &dst);
375*35238bceSAndroid Build Coastguard Worker 
376*35238bceSAndroid Build Coastguard Worker private:
377*35238bceSAndroid Build Coastguard Worker     ScaleProgram &m_program;
378*35238bceSAndroid Build Coastguard Worker };
379*35238bceSAndroid Build Coastguard Worker 
drawAttachment(GLuint buffer,Surface & dst)380*35238bceSAndroid Build Coastguard Worker void BufferTfOutputAttacher::drawAttachment(GLuint buffer, Surface &dst)
381*35238bceSAndroid Build Coastguard Worker {
382*35238bceSAndroid Build Coastguard Worker     VertexArray vao(getRenderContext());
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker     m_program.setPos(buffer, *vao);
385*35238bceSAndroid Build Coastguard Worker     m_program.draw(*vao, 1.0, false, &dst);
386*35238bceSAndroid Build Coastguard Worker     log() << TestLog::Message << "// Drew output image with vertices from buffer " << buffer << TestLog::EndMessage;
387*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_ERROR(gl().getError());
388*35238bceSAndroid Build Coastguard Worker }
389*35238bceSAndroid Build Coastguard Worker 
setupContainer(GLuint seed,GLuint tf)390*35238bceSAndroid Build Coastguard Worker void BufferTfOutputAttacher::setupContainer(GLuint seed, GLuint tf)
391*35238bceSAndroid Build Coastguard Worker {
392*35238bceSAndroid Build Coastguard Worker     Buffer posBuf(getRenderContext());
393*35238bceSAndroid Build Coastguard Worker     VertexArray vao(getRenderContext());
394*35238bceSAndroid Build Coastguard Worker 
395*35238bceSAndroid Build Coastguard Worker     initBuffer(gl(), seed, GL_STATIC_DRAW, *posBuf);
396*35238bceSAndroid Build Coastguard Worker     m_program.setPos(*posBuf, *vao);
397*35238bceSAndroid Build Coastguard Worker 
398*35238bceSAndroid Build Coastguard Worker     glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tf);
399*35238bceSAndroid Build Coastguard Worker     m_program.draw(*vao, -1.0, true, DE_NULL);
400*35238bceSAndroid Build Coastguard Worker     log() << TestLog::Message << "// Drew an image with seed " << seed << " with transform feedback to " << tf
401*35238bceSAndroid Build Coastguard Worker           << TestLog::EndMessage;
402*35238bceSAndroid Build Coastguard Worker     glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
403*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_ERROR(gl().getError());
404*35238bceSAndroid Build Coastguard Worker }
405*35238bceSAndroid Build Coastguard Worker 
406*35238bceSAndroid Build Coastguard Worker class ES3Types : public ES2Types
407*35238bceSAndroid Build Coastguard Worker {
408*35238bceSAndroid Build Coastguard Worker public:
409*35238bceSAndroid Build Coastguard Worker     ES3Types(lt::Context &ctx);
410*35238bceSAndroid Build Coastguard Worker 
411*35238bceSAndroid Build Coastguard Worker private:
412*35238bceSAndroid Build Coastguard Worker     ScaleProgram m_program;
413*35238bceSAndroid Build Coastguard Worker     QueryBinder m_queryBind;
414*35238bceSAndroid Build Coastguard Worker     SimpleType m_queryType;
415*35238bceSAndroid Build Coastguard Worker     SimpleBinder m_tfBind;
416*35238bceSAndroid Build Coastguard Worker     SimpleType m_tfType;
417*35238bceSAndroid Build Coastguard Worker     VertexArrayBinder m_varrBind;
418*35238bceSAndroid Build Coastguard Worker     SimpleType m_varrType;
419*35238bceSAndroid Build Coastguard Worker     SamplerBinder m_samplerBind;
420*35238bceSAndroid Build Coastguard Worker     SimpleType m_samplerType;
421*35238bceSAndroid Build Coastguard Worker     BufferVAOAttacher m_bufVarrAtt;
422*35238bceSAndroid Build Coastguard Worker     BufferVAOInputAttacher m_bufVarrInAtt;
423*35238bceSAndroid Build Coastguard Worker     BufferTfAttacher m_bufTfAtt;
424*35238bceSAndroid Build Coastguard Worker     BufferTfOutputAttacher m_bufTfOutAtt;
425*35238bceSAndroid Build Coastguard Worker };
426*35238bceSAndroid Build Coastguard Worker 
ES3Types(lt::Context & ctx)427*35238bceSAndroid Build Coastguard Worker ES3Types::ES3Types(lt::Context &ctx)
428*35238bceSAndroid Build Coastguard Worker     : ES2Types(ctx)
429*35238bceSAndroid Build Coastguard Worker     , m_program(ctx)
430*35238bceSAndroid Build Coastguard Worker     , m_queryBind(ctx)
431*35238bceSAndroid Build Coastguard Worker     , m_queryType(ctx, "query", &CallLogWrapper::glGenQueries, &CallLogWrapper::glDeleteQueries,
432*35238bceSAndroid Build Coastguard Worker                   &CallLogWrapper::glIsQuery, &m_queryBind)
433*35238bceSAndroid Build Coastguard Worker     , m_tfBind(ctx, &CallLogWrapper::glBindTransformFeedback, GL_TRANSFORM_FEEDBACK, GL_TRANSFORM_FEEDBACK_BINDING,
434*35238bceSAndroid Build Coastguard Worker                true)
435*35238bceSAndroid Build Coastguard Worker     , m_tfType(ctx, "transform_feedback", &CallLogWrapper::glGenTransformFeedbacks,
436*35238bceSAndroid Build Coastguard Worker                &CallLogWrapper::glDeleteTransformFeedbacks, &CallLogWrapper::glIsTransformFeedback, &m_tfBind)
437*35238bceSAndroid Build Coastguard Worker     , m_varrBind(ctx)
438*35238bceSAndroid Build Coastguard Worker     , m_varrType(ctx, "vertex_array", &CallLogWrapper::glGenVertexArrays, &CallLogWrapper::glDeleteVertexArrays,
439*35238bceSAndroid Build Coastguard Worker                  &CallLogWrapper::glIsVertexArray, &m_varrBind)
440*35238bceSAndroid Build Coastguard Worker     , m_samplerBind(ctx)
441*35238bceSAndroid Build Coastguard Worker     , m_samplerType(ctx, "sampler", &CallLogWrapper::glGenSamplers, &CallLogWrapper::glDeleteSamplers,
442*35238bceSAndroid Build Coastguard Worker                     &CallLogWrapper::glIsSampler, &m_samplerBind, true)
443*35238bceSAndroid Build Coastguard Worker     , m_bufVarrAtt(ctx, m_bufferType, m_varrType, m_program)
444*35238bceSAndroid Build Coastguard Worker     , m_bufVarrInAtt(m_bufVarrAtt)
445*35238bceSAndroid Build Coastguard Worker     , m_bufTfAtt(ctx, m_bufferType, m_tfType)
446*35238bceSAndroid Build Coastguard Worker     , m_bufTfOutAtt(m_bufTfAtt, m_program)
447*35238bceSAndroid Build Coastguard Worker {
448*35238bceSAndroid Build Coastguard Worker     Type *types[] = {&m_queryType, &m_tfType, &m_varrType, &m_samplerType};
449*35238bceSAndroid Build Coastguard Worker     m_types.insert(m_types.end(), DE_ARRAY_BEGIN(types), DE_ARRAY_END(types));
450*35238bceSAndroid Build Coastguard Worker 
451*35238bceSAndroid Build Coastguard Worker     m_attachers.push_back(&m_bufVarrAtt);
452*35238bceSAndroid Build Coastguard Worker     m_attachers.push_back(&m_bufTfAtt);
453*35238bceSAndroid Build Coastguard Worker 
454*35238bceSAndroid Build Coastguard Worker     m_inAttachers.push_back(&m_bufVarrInAtt);
455*35238bceSAndroid Build Coastguard Worker     m_outAttachers.push_back(&m_bufTfOutAtt);
456*35238bceSAndroid Build Coastguard Worker }
457*35238bceSAndroid Build Coastguard Worker 
458*35238bceSAndroid Build Coastguard Worker class TfDeleteActiveTest : public TestCase, private CallLogWrapper
459*35238bceSAndroid Build Coastguard Worker {
460*35238bceSAndroid Build Coastguard Worker public:
461*35238bceSAndroid Build Coastguard Worker     TfDeleteActiveTest(gles3::Context &context, const char *name, const char *description);
462*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
463*35238bceSAndroid Build Coastguard Worker };
464*35238bceSAndroid Build Coastguard Worker 
TfDeleteActiveTest(gles3::Context & context,const char * name,const char * description)465*35238bceSAndroid Build Coastguard Worker TfDeleteActiveTest::TfDeleteActiveTest(gles3::Context &context, const char *name, const char *description)
466*35238bceSAndroid Build Coastguard Worker     : TestCase(context, name, description)
467*35238bceSAndroid Build Coastguard Worker     , CallLogWrapper(context.getRenderContext().getFunctions(), context.getTestContext().getLog())
468*35238bceSAndroid Build Coastguard Worker {
469*35238bceSAndroid Build Coastguard Worker     enableLogging(true);
470*35238bceSAndroid Build Coastguard Worker }
471*35238bceSAndroid Build Coastguard Worker 
472*35238bceSAndroid Build Coastguard Worker class ScopedTransformFeedbackFeedback
473*35238bceSAndroid Build Coastguard Worker {
474*35238bceSAndroid Build Coastguard Worker public:
475*35238bceSAndroid Build Coastguard Worker     ScopedTransformFeedbackFeedback(glu::CallLogWrapper &gl, GLenum type);
476*35238bceSAndroid Build Coastguard Worker     ~ScopedTransformFeedbackFeedback(void);
477*35238bceSAndroid Build Coastguard Worker 
478*35238bceSAndroid Build Coastguard Worker private:
479*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper &m_gl;
480*35238bceSAndroid Build Coastguard Worker };
481*35238bceSAndroid Build Coastguard Worker 
ScopedTransformFeedbackFeedback(glu::CallLogWrapper & gl,GLenum type)482*35238bceSAndroid Build Coastguard Worker ScopedTransformFeedbackFeedback::ScopedTransformFeedbackFeedback(glu::CallLogWrapper &gl, GLenum type) : m_gl(gl)
483*35238bceSAndroid Build Coastguard Worker {
484*35238bceSAndroid Build Coastguard Worker     m_gl.glBeginTransformFeedback(type);
485*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(m_gl.glGetError(), "glBeginTransformFeedback");
486*35238bceSAndroid Build Coastguard Worker }
487*35238bceSAndroid Build Coastguard Worker 
~ScopedTransformFeedbackFeedback(void)488*35238bceSAndroid Build Coastguard Worker ScopedTransformFeedbackFeedback::~ScopedTransformFeedbackFeedback(void)
489*35238bceSAndroid Build Coastguard Worker {
490*35238bceSAndroid Build Coastguard Worker     m_gl.glEndTransformFeedback();
491*35238bceSAndroid Build Coastguard Worker }
492*35238bceSAndroid Build Coastguard Worker 
iterate(void)493*35238bceSAndroid Build Coastguard Worker IterateResult TfDeleteActiveTest::iterate(void)
494*35238bceSAndroid Build Coastguard Worker {
495*35238bceSAndroid Build Coastguard Worker     static const char *const s_xfbVertexSource =
496*35238bceSAndroid Build Coastguard Worker         "#version 300 es\n"
497*35238bceSAndroid Build Coastguard Worker         "void main ()\n"
498*35238bceSAndroid Build Coastguard Worker         "{\n"
499*35238bceSAndroid Build Coastguard Worker         "    gl_Position = vec4(float(gl_VertexID) / 2.0, float(gl_VertexID % 2) / 2.0, 0.0, 1.0);\n"
500*35238bceSAndroid Build Coastguard Worker         "}\n";
501*35238bceSAndroid Build Coastguard Worker     static const char *const s_xfbFragmentSource = "#version 300 es\n"
502*35238bceSAndroid Build Coastguard Worker                                                    "layout(location=0) out mediump vec4 dEQP_FragColor;\n"
503*35238bceSAndroid Build Coastguard Worker                                                    "void main ()\n"
504*35238bceSAndroid Build Coastguard Worker                                                    "{\n"
505*35238bceSAndroid Build Coastguard Worker                                                    "    dEQP_FragColor = vec4(1.0, 1.0, 0.0, 1.0);\n"
506*35238bceSAndroid Build Coastguard Worker                                                    "}\n";
507*35238bceSAndroid Build Coastguard Worker 
508*35238bceSAndroid Build Coastguard Worker     glu::Buffer buf(m_context.getRenderContext());
509*35238bceSAndroid Build Coastguard Worker     GLuint tf = 0;
510*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(m_context.getRenderContext(), glu::ProgramSources()
511*35238bceSAndroid Build Coastguard Worker                                                                  << glu::VertexSource(s_xfbVertexSource)
512*35238bceSAndroid Build Coastguard Worker                                                                  << glu::FragmentSource(s_xfbFragmentSource)
513*35238bceSAndroid Build Coastguard Worker                                                                  << glu::TransformFeedbackMode(GL_INTERLEAVED_ATTRIBS)
514*35238bceSAndroid Build Coastguard Worker                                                                  << glu::TransformFeedbackVarying("gl_Position"));
515*35238bceSAndroid Build Coastguard Worker 
516*35238bceSAndroid Build Coastguard Worker     if (!program.isOk())
517*35238bceSAndroid Build Coastguard Worker     {
518*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << program;
519*35238bceSAndroid Build Coastguard Worker         throw tcu::TestError("failed to build program");
520*35238bceSAndroid Build Coastguard Worker     }
521*35238bceSAndroid Build Coastguard Worker 
522*35238bceSAndroid Build Coastguard Worker     try
523*35238bceSAndroid Build Coastguard Worker     {
524*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glUseProgram(program.getProgram()));
525*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glGenTransformFeedbacks(1, &tf));
526*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tf));
527*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, *buf));
528*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(
529*35238bceSAndroid Build Coastguard Worker             glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 3 * sizeof(glw::GLfloat[4]), DE_NULL, GL_DYNAMIC_COPY));
530*35238bceSAndroid Build Coastguard Worker 
531*35238bceSAndroid Build Coastguard Worker         {
532*35238bceSAndroid Build Coastguard Worker             ScopedTransformFeedbackFeedback xfb(static_cast<glu::CallLogWrapper &>(*this), GL_TRIANGLES);
533*35238bceSAndroid Build Coastguard Worker 
534*35238bceSAndroid Build Coastguard Worker             glDeleteTransformFeedbacks(1, &tf);
535*35238bceSAndroid Build Coastguard Worker             {
536*35238bceSAndroid Build Coastguard Worker                 GLenum err = glGetError();
537*35238bceSAndroid Build Coastguard Worker                 if (err != GL_INVALID_OPERATION)
538*35238bceSAndroid Build Coastguard Worker                     getTestContext().setTestResult(
539*35238bceSAndroid Build Coastguard Worker                         QP_TEST_RESULT_FAIL, "Deleting active transform feedback did not produce GL_INVALID_OPERATION");
540*35238bceSAndroid Build Coastguard Worker                 else
541*35238bceSAndroid Build Coastguard Worker                     getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
542*35238bceSAndroid Build Coastguard Worker             }
543*35238bceSAndroid Build Coastguard Worker         }
544*35238bceSAndroid Build Coastguard Worker         GLU_CHECK(); // ScopedTransformFeedbackFeedback::dtor might modify error state
545*35238bceSAndroid Build Coastguard Worker 
546*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glDeleteTransformFeedbacks(1, &tf));
547*35238bceSAndroid Build Coastguard Worker     }
548*35238bceSAndroid Build Coastguard Worker     catch (const glu::Error &)
549*35238bceSAndroid Build Coastguard Worker     {
550*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(1, &tf);
551*35238bceSAndroid Build Coastguard Worker         throw;
552*35238bceSAndroid Build Coastguard Worker     }
553*35238bceSAndroid Build Coastguard Worker 
554*35238bceSAndroid Build Coastguard Worker     return STOP;
555*35238bceSAndroid Build Coastguard Worker }
556*35238bceSAndroid Build Coastguard Worker 
557*35238bceSAndroid Build Coastguard Worker class TestGroup : public TestCaseGroup
558*35238bceSAndroid Build Coastguard Worker {
559*35238bceSAndroid Build Coastguard Worker public:
TestGroup(gles3::Context & context)560*35238bceSAndroid Build Coastguard Worker     TestGroup(gles3::Context &context) : TestCaseGroup(context, "lifetime", "Object lifetime tests")
561*35238bceSAndroid Build Coastguard Worker     {
562*35238bceSAndroid Build Coastguard Worker     }
563*35238bceSAndroid Build Coastguard Worker     void init(void);
564*35238bceSAndroid Build Coastguard Worker 
565*35238bceSAndroid Build Coastguard Worker private:
566*35238bceSAndroid Build Coastguard Worker     MovePtr<Types> m_types;
567*35238bceSAndroid Build Coastguard Worker };
568*35238bceSAndroid Build Coastguard Worker 
init(void)569*35238bceSAndroid Build Coastguard Worker void TestGroup::init(void)
570*35238bceSAndroid Build Coastguard Worker {
571*35238bceSAndroid Build Coastguard Worker     gles3::Context &ctx = getContext();
572*35238bceSAndroid Build Coastguard Worker     lt::Context ltCtx(ctx.getRenderContext(), ctx.getTestContext());
573*35238bceSAndroid Build Coastguard Worker 
574*35238bceSAndroid Build Coastguard Worker     m_types = MovePtr<Types>(new ES3Types(ltCtx));
575*35238bceSAndroid Build Coastguard Worker 
576*35238bceSAndroid Build Coastguard Worker     addTestCases(*this, *m_types);
577*35238bceSAndroid Build Coastguard Worker 
578*35238bceSAndroid Build Coastguard Worker     TestCaseGroup *deleteActiveGroup = new TestCaseGroup(ctx, "delete_active", "Delete active object");
579*35238bceSAndroid Build Coastguard Worker     addChild(deleteActiveGroup);
580*35238bceSAndroid Build Coastguard Worker     deleteActiveGroup->addChild(new TfDeleteActiveTest(ctx, "transform_feedback", "Transform Feedback"));
581*35238bceSAndroid Build Coastguard Worker }
582*35238bceSAndroid Build Coastguard Worker 
583*35238bceSAndroid Build Coastguard Worker } // namespace
584*35238bceSAndroid Build Coastguard Worker 
createLifetimeTests(Context & context)585*35238bceSAndroid Build Coastguard Worker TestCaseGroup *createLifetimeTests(Context &context)
586*35238bceSAndroid Build Coastguard Worker {
587*35238bceSAndroid Build Coastguard Worker     return new TestGroup(context);
588*35238bceSAndroid Build Coastguard Worker }
589*35238bceSAndroid Build Coastguard Worker 
590*35238bceSAndroid Build Coastguard Worker } // namespace Functional
591*35238bceSAndroid Build Coastguard Worker } // namespace gles3
592*35238bceSAndroid Build Coastguard Worker } // namespace deqp
593