xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fMultisampleShaderRenderCase.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.1 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 Multisample shader render case
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es31fMultisampleShaderRenderCase.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
36*35238bceSAndroid Build Coastguard Worker 
37*35238bceSAndroid Build Coastguard Worker namespace deqp
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker namespace gles31
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace Functional
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace MultisampleShaderRenderUtil
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker using std::map;
46*35238bceSAndroid Build Coastguard Worker using std::string;
47*35238bceSAndroid Build Coastguard Worker namespace
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker 
50*35238bceSAndroid Build Coastguard Worker static const char *const s_vertexSource = "${GLSL_VERSION_DECL}\n"
51*35238bceSAndroid Build Coastguard Worker                                           "in highp vec4 a_position;\n"
52*35238bceSAndroid Build Coastguard Worker                                           "out highp vec4 v_position;\n"
53*35238bceSAndroid Build Coastguard Worker                                           "void main (void)\n"
54*35238bceSAndroid Build Coastguard Worker                                           "{\n"
55*35238bceSAndroid Build Coastguard Worker                                           "    gl_Position = a_position;\n"
56*35238bceSAndroid Build Coastguard Worker                                           "    v_position = a_position;\n"
57*35238bceSAndroid Build Coastguard Worker                                           "}";
58*35238bceSAndroid Build Coastguard Worker 
59*35238bceSAndroid Build Coastguard Worker } // namespace
60*35238bceSAndroid Build Coastguard Worker 
QualityWarning(const std::string & message)61*35238bceSAndroid Build Coastguard Worker QualityWarning::QualityWarning(const std::string &message) : tcu::Exception(message)
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker 
MultisampleRenderCase(Context & context,const char * name,const char * desc,int numSamples,RenderTarget target,int renderSize,int flags)65*35238bceSAndroid Build Coastguard Worker MultisampleRenderCase::MultisampleRenderCase(Context &context, const char *name, const char *desc, int numSamples,
66*35238bceSAndroid Build Coastguard Worker                                              RenderTarget target, int renderSize, int flags)
67*35238bceSAndroid Build Coastguard Worker     : TestCase(context, name, desc)
68*35238bceSAndroid Build Coastguard Worker     , m_numRequestedSamples(numSamples)
69*35238bceSAndroid Build Coastguard Worker     , m_renderTarget(target)
70*35238bceSAndroid Build Coastguard Worker     , m_renderSize(renderSize)
71*35238bceSAndroid Build Coastguard Worker     , m_perIterationShader((flags & FLAG_PER_ITERATION_SHADER) != 0)
72*35238bceSAndroid Build Coastguard Worker     , m_verifyTextureSampleBuffers((flags & FLAG_VERIFY_MSAA_TEXTURE_SAMPLE_BUFFERS) != 0 && target == TARGET_TEXTURE)
73*35238bceSAndroid Build Coastguard Worker     , m_numTargetSamples(-1)
74*35238bceSAndroid Build Coastguard Worker     , m_buffer(0)
75*35238bceSAndroid Build Coastguard Worker     , m_resolveBuffer(0)
76*35238bceSAndroid Build Coastguard Worker     , m_program(DE_NULL)
77*35238bceSAndroid Build Coastguard Worker     , m_fbo(0)
78*35238bceSAndroid Build Coastguard Worker     , m_fboTexture(0)
79*35238bceSAndroid Build Coastguard Worker     , m_textureSamplerProgram(DE_NULL)
80*35238bceSAndroid Build Coastguard Worker     , m_fboRbo(0)
81*35238bceSAndroid Build Coastguard Worker     , m_resolveFbo(0)
82*35238bceSAndroid Build Coastguard Worker     , m_resolveFboTexture(0)
83*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
84*35238bceSAndroid Build Coastguard Worker     , m_numIterations(1)
85*35238bceSAndroid Build Coastguard Worker     , m_renderMode(0)
86*35238bceSAndroid Build Coastguard Worker     , m_renderCount(0)
87*35238bceSAndroid Build Coastguard Worker     , m_renderVao(0)
88*35238bceSAndroid Build Coastguard Worker     , m_resolveVao(0)
89*35238bceSAndroid Build Coastguard Worker {
90*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(target < TARGET_LAST);
91*35238bceSAndroid Build Coastguard Worker }
92*35238bceSAndroid Build Coastguard Worker 
~MultisampleRenderCase(void)93*35238bceSAndroid Build Coastguard Worker MultisampleRenderCase::~MultisampleRenderCase(void)
94*35238bceSAndroid Build Coastguard Worker {
95*35238bceSAndroid Build Coastguard Worker     MultisampleRenderCase::deinit();
96*35238bceSAndroid Build Coastguard Worker }
97*35238bceSAndroid Build Coastguard Worker 
init(void)98*35238bceSAndroid Build Coastguard Worker void MultisampleRenderCase::init(void)
99*35238bceSAndroid Build Coastguard Worker {
100*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl   = m_context.getRenderContext().getFunctions();
101*35238bceSAndroid Build Coastguard Worker     int32_t queriedSampleCount = -1;
102*35238bceSAndroid Build Coastguard Worker     const bool supportsES32    = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
103*35238bceSAndroid Build Coastguard Worker     map<string, string> args;
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker     args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
106*35238bceSAndroid Build Coastguard Worker                                                getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
107*35238bceSAndroid Build Coastguard Worker 
108*35238bceSAndroid Build Coastguard Worker     // requirements
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker     switch (m_renderTarget)
111*35238bceSAndroid Build Coastguard Worker     {
112*35238bceSAndroid Build Coastguard Worker     case TARGET_DEFAULT:
113*35238bceSAndroid Build Coastguard Worker     {
114*35238bceSAndroid Build Coastguard Worker         if (m_context.getRenderTarget().getWidth() < m_renderSize ||
115*35238bceSAndroid Build Coastguard Worker             m_context.getRenderTarget().getHeight() < m_renderSize)
116*35238bceSAndroid Build Coastguard Worker             throw tcu::NotSupportedError("Test requires render target with size " + de::toString(m_renderSize) + "x" +
117*35238bceSAndroid Build Coastguard Worker                                          de::toString(m_renderSize) + " or greater");
118*35238bceSAndroid Build Coastguard Worker         break;
119*35238bceSAndroid Build Coastguard Worker     }
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker     case TARGET_TEXTURE:
122*35238bceSAndroid Build Coastguard Worker     {
123*35238bceSAndroid Build Coastguard Worker         int32_t maxTextureSamples = getMaxConformantSampleCount(GL_TEXTURE_2D_MULTISAMPLE, GL_RGBA8);
124*35238bceSAndroid Build Coastguard Worker         if (m_numRequestedSamples > maxTextureSamples)
125*35238bceSAndroid Build Coastguard Worker             throw tcu::NotSupportedError("Sample count not supported");
126*35238bceSAndroid Build Coastguard Worker         break;
127*35238bceSAndroid Build Coastguard Worker     }
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker     case TARGET_RENDERBUFFER:
130*35238bceSAndroid Build Coastguard Worker     {
131*35238bceSAndroid Build Coastguard Worker         int32_t maxRboSamples = getMaxConformantSampleCount(GL_RENDERBUFFER, GL_RGBA8);
132*35238bceSAndroid Build Coastguard Worker         if (m_numRequestedSamples > maxRboSamples)
133*35238bceSAndroid Build Coastguard Worker             throw tcu::NotSupportedError("Sample count not supported");
134*35238bceSAndroid Build Coastguard Worker         break;
135*35238bceSAndroid Build Coastguard Worker     }
136*35238bceSAndroid Build Coastguard Worker 
137*35238bceSAndroid Build Coastguard Worker     default:
138*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
139*35238bceSAndroid Build Coastguard Worker     }
140*35238bceSAndroid Build Coastguard Worker 
141*35238bceSAndroid Build Coastguard Worker     // resources
142*35238bceSAndroid Build Coastguard Worker 
143*35238bceSAndroid Build Coastguard Worker     {
144*35238bceSAndroid Build Coastguard Worker         gl.genBuffers(1, &m_buffer);
145*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "gen buf");
146*35238bceSAndroid Build Coastguard Worker 
147*35238bceSAndroid Build Coastguard Worker         setupRenderData();
148*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "setup data");
149*35238bceSAndroid Build Coastguard Worker 
150*35238bceSAndroid Build Coastguard Worker         gl.genVertexArrays(1, &m_renderVao);
151*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "gen vao");
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker         // buffer for MSAA texture resolving
154*35238bceSAndroid Build Coastguard Worker         {
155*35238bceSAndroid Build Coastguard Worker             static const tcu::Vec4 fullscreenQuad[] = {
156*35238bceSAndroid Build Coastguard Worker                 tcu::Vec4(1.0f, -1.0f, 0.0f, 1.0f),
157*35238bceSAndroid Build Coastguard Worker                 tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f),
158*35238bceSAndroid Build Coastguard Worker                 tcu::Vec4(-1.0f, -1.0f, 0.0f, 1.0f),
159*35238bceSAndroid Build Coastguard Worker                 tcu::Vec4(-1.0f, 1.0f, 0.0f, 1.0f),
160*35238bceSAndroid Build Coastguard Worker             };
161*35238bceSAndroid Build Coastguard Worker 
162*35238bceSAndroid Build Coastguard Worker             gl.genBuffers(1, &m_resolveBuffer);
163*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, m_resolveBuffer);
164*35238bceSAndroid Build Coastguard Worker             gl.bufferData(GL_ARRAY_BUFFER, (int)sizeof(fullscreenQuad), fullscreenQuad, GL_STATIC_DRAW);
165*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "setup data");
166*35238bceSAndroid Build Coastguard Worker         }
167*35238bceSAndroid Build Coastguard Worker     }
168*35238bceSAndroid Build Coastguard Worker 
169*35238bceSAndroid Build Coastguard Worker     // msaa targets
170*35238bceSAndroid Build Coastguard Worker 
171*35238bceSAndroid Build Coastguard Worker     if (m_renderTarget == TARGET_TEXTURE)
172*35238bceSAndroid Build Coastguard Worker     {
173*35238bceSAndroid Build Coastguard Worker         const uint32_t textureTarget = (m_numRequestedSamples == 0) ? (GL_TEXTURE_2D) : (GL_TEXTURE_2D_MULTISAMPLE);
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker         gl.genVertexArrays(1, &m_resolveVao);
176*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "gen vao");
177*35238bceSAndroid Build Coastguard Worker 
178*35238bceSAndroid Build Coastguard Worker         gl.genTextures(1, &m_fboTexture);
179*35238bceSAndroid Build Coastguard Worker         gl.bindTexture(textureTarget, m_fboTexture);
180*35238bceSAndroid Build Coastguard Worker         if (m_numRequestedSamples == 0)
181*35238bceSAndroid Build Coastguard Worker         {
182*35238bceSAndroid Build Coastguard Worker             gl.texStorage2D(textureTarget, 1, GL_RGBA8, m_renderSize, m_renderSize);
183*35238bceSAndroid Build Coastguard Worker             gl.texParameteri(textureTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
184*35238bceSAndroid Build Coastguard Worker             gl.texParameteri(textureTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
185*35238bceSAndroid Build Coastguard Worker         }
186*35238bceSAndroid Build Coastguard Worker         else
187*35238bceSAndroid Build Coastguard Worker             gl.texStorage2DMultisample(textureTarget, m_numRequestedSamples, GL_RGBA8, m_renderSize, m_renderSize,
188*35238bceSAndroid Build Coastguard Worker                                        GL_FALSE);
189*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "gen tex");
190*35238bceSAndroid Build Coastguard Worker 
191*35238bceSAndroid Build Coastguard Worker         gl.genFramebuffers(1, &m_fbo);
192*35238bceSAndroid Build Coastguard Worker         gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
193*35238bceSAndroid Build Coastguard Worker         gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureTarget, m_fboTexture, 0);
194*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "gen fbo");
195*35238bceSAndroid Build Coastguard Worker 
196*35238bceSAndroid Build Coastguard Worker         if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
197*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("fbo not complete");
198*35238bceSAndroid Build Coastguard Worker 
199*35238bceSAndroid Build Coastguard Worker         if (m_numRequestedSamples != 0)
200*35238bceSAndroid Build Coastguard Worker         {
201*35238bceSAndroid Build Coastguard Worker             // for shader
202*35238bceSAndroid Build Coastguard Worker             gl.getTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_TEXTURE_SAMPLES, &queriedSampleCount);
203*35238bceSAndroid Build Coastguard Worker 
204*35238bceSAndroid Build Coastguard Worker             // logging
205*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "Asked for " << m_numRequestedSamples << " samples, got "
206*35238bceSAndroid Build Coastguard Worker                                << queriedSampleCount << " samples." << tcu::TestLog::EndMessage;
207*35238bceSAndroid Build Coastguard Worker 
208*35238bceSAndroid Build Coastguard Worker             // sanity
209*35238bceSAndroid Build Coastguard Worker             if (queriedSampleCount < m_numRequestedSamples)
210*35238bceSAndroid Build Coastguard Worker                 throw tcu::TestError("Got less texture samples than asked for");
211*35238bceSAndroid Build Coastguard Worker         }
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker         // texture sampler shader
214*35238bceSAndroid Build Coastguard Worker         m_textureSamplerProgram = new glu::ShaderProgram(
215*35238bceSAndroid Build Coastguard Worker             m_context.getRenderContext(), glu::ProgramSources()
216*35238bceSAndroid Build Coastguard Worker                                               << glu::VertexSource(tcu::StringTemplate(s_vertexSource).specialize(args))
217*35238bceSAndroid Build Coastguard Worker                                               << glu::FragmentSource(genMSSamplerSource(queriedSampleCount)));
218*35238bceSAndroid Build Coastguard Worker         if (!m_textureSamplerProgram->isOk())
219*35238bceSAndroid Build Coastguard Worker         {
220*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Section("SamplerShader", "Sampler shader") << *m_textureSamplerProgram
221*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::EndSection;
222*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("could not build program");
223*35238bceSAndroid Build Coastguard Worker         }
224*35238bceSAndroid Build Coastguard Worker     }
225*35238bceSAndroid Build Coastguard Worker     else if (m_renderTarget == TARGET_RENDERBUFFER)
226*35238bceSAndroid Build Coastguard Worker     {
227*35238bceSAndroid Build Coastguard Worker         gl.genRenderbuffers(1, &m_fboRbo);
228*35238bceSAndroid Build Coastguard Worker         gl.bindRenderbuffer(GL_RENDERBUFFER, m_fboRbo);
229*35238bceSAndroid Build Coastguard Worker         gl.renderbufferStorageMultisample(GL_RENDERBUFFER, m_numRequestedSamples, GL_RGBA8, m_renderSize, m_renderSize);
230*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "gen rbo");
231*35238bceSAndroid Build Coastguard Worker 
232*35238bceSAndroid Build Coastguard Worker         gl.genFramebuffers(1, &m_fbo);
233*35238bceSAndroid Build Coastguard Worker         gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
234*35238bceSAndroid Build Coastguard Worker         gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_fboRbo);
235*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "gen fbo");
236*35238bceSAndroid Build Coastguard Worker 
237*35238bceSAndroid Build Coastguard Worker         if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
238*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("fbo not complete");
239*35238bceSAndroid Build Coastguard Worker 
240*35238bceSAndroid Build Coastguard Worker         // logging
241*35238bceSAndroid Build Coastguard Worker         gl.getRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &queriedSampleCount);
242*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Asked for " << m_numRequestedSamples << " samples, got "
243*35238bceSAndroid Build Coastguard Worker                            << queriedSampleCount << " samples." << tcu::TestLog::EndMessage;
244*35238bceSAndroid Build Coastguard Worker 
245*35238bceSAndroid Build Coastguard Worker         // sanity
246*35238bceSAndroid Build Coastguard Worker         if (queriedSampleCount < m_numRequestedSamples)
247*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("Got less renderbuffer samples samples than asked for");
248*35238bceSAndroid Build Coastguard Worker     }
249*35238bceSAndroid Build Coastguard Worker 
250*35238bceSAndroid Build Coastguard Worker     // fbo for resolving the multisample fbo
251*35238bceSAndroid Build Coastguard Worker     if (m_renderTarget != TARGET_DEFAULT)
252*35238bceSAndroid Build Coastguard Worker     {
253*35238bceSAndroid Build Coastguard Worker         gl.genTextures(1, &m_resolveFboTexture);
254*35238bceSAndroid Build Coastguard Worker         gl.bindTexture(GL_TEXTURE_2D, m_resolveFboTexture);
255*35238bceSAndroid Build Coastguard Worker         gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, m_renderSize, m_renderSize);
256*35238bceSAndroid Build Coastguard Worker         gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
257*35238bceSAndroid Build Coastguard Worker         gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
258*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "gen tex");
259*35238bceSAndroid Build Coastguard Worker 
260*35238bceSAndroid Build Coastguard Worker         gl.genFramebuffers(1, &m_resolveFbo);
261*35238bceSAndroid Build Coastguard Worker         gl.bindFramebuffer(GL_FRAMEBUFFER, m_resolveFbo);
262*35238bceSAndroid Build Coastguard Worker         gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_resolveFboTexture, 0);
263*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "gen fbo");
264*35238bceSAndroid Build Coastguard Worker 
265*35238bceSAndroid Build Coastguard Worker         if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
266*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("resolve fbo not complete");
267*35238bceSAndroid Build Coastguard Worker     }
268*35238bceSAndroid Build Coastguard Worker 
269*35238bceSAndroid Build Coastguard Worker     // create verifier shader and set targetSampleCount
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker     {
272*35238bceSAndroid Build Coastguard Worker         int realSampleCount = -1;
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker         if (m_renderTarget == TARGET_TEXTURE)
275*35238bceSAndroid Build Coastguard Worker         {
276*35238bceSAndroid Build Coastguard Worker             if (m_numRequestedSamples == 0)
277*35238bceSAndroid Build Coastguard Worker                 realSampleCount = 1; // non msaa texture
278*35238bceSAndroid Build Coastguard Worker             else
279*35238bceSAndroid Build Coastguard Worker                 realSampleCount = de::max(1, queriedSampleCount); // msaa texture
280*35238bceSAndroid Build Coastguard Worker         }
281*35238bceSAndroid Build Coastguard Worker         else if (m_renderTarget == TARGET_RENDERBUFFER)
282*35238bceSAndroid Build Coastguard Worker         {
283*35238bceSAndroid Build Coastguard Worker             realSampleCount = de::max(1, queriedSampleCount); // msaa rbo
284*35238bceSAndroid Build Coastguard Worker         }
285*35238bceSAndroid Build Coastguard Worker         else if (m_renderTarget == TARGET_DEFAULT)
286*35238bceSAndroid Build Coastguard Worker         {
287*35238bceSAndroid Build Coastguard Worker             realSampleCount = de::max(1, m_context.getRenderTarget().getNumSamples());
288*35238bceSAndroid Build Coastguard Worker         }
289*35238bceSAndroid Build Coastguard Worker         else
290*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
291*35238bceSAndroid Build Coastguard Worker 
292*35238bceSAndroid Build Coastguard Worker         // is set and is valid
293*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(realSampleCount != -1);
294*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(realSampleCount != 0);
295*35238bceSAndroid Build Coastguard Worker         m_numTargetSamples = realSampleCount;
296*35238bceSAndroid Build Coastguard Worker     }
297*35238bceSAndroid Build Coastguard Worker 
298*35238bceSAndroid Build Coastguard Worker     if (!m_perIterationShader)
299*35238bceSAndroid Build Coastguard Worker     {
300*35238bceSAndroid Build Coastguard Worker         m_program =
301*35238bceSAndroid Build Coastguard Worker             new glu::ShaderProgram(m_context.getRenderContext(),
302*35238bceSAndroid Build Coastguard Worker                                    glu::ProgramSources() << glu::VertexSource(genVertexSource(m_numTargetSamples))
303*35238bceSAndroid Build Coastguard Worker                                                          << glu::FragmentSource(genFragmentSource(m_numTargetSamples)));
304*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Section("RenderShader", "Render shader") << *m_program
305*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndSection;
306*35238bceSAndroid Build Coastguard Worker         if (!m_program->isOk())
307*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("could not build program");
308*35238bceSAndroid Build Coastguard Worker     }
309*35238bceSAndroid Build Coastguard Worker }
310*35238bceSAndroid Build Coastguard Worker 
deinit(void)311*35238bceSAndroid Build Coastguard Worker void MultisampleRenderCase::deinit(void)
312*35238bceSAndroid Build Coastguard Worker {
313*35238bceSAndroid Build Coastguard Worker     if (m_buffer)
314*35238bceSAndroid Build Coastguard Worker     {
315*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_buffer);
316*35238bceSAndroid Build Coastguard Worker         m_buffer = 0;
317*35238bceSAndroid Build Coastguard Worker     }
318*35238bceSAndroid Build Coastguard Worker 
319*35238bceSAndroid Build Coastguard Worker     if (m_resolveBuffer)
320*35238bceSAndroid Build Coastguard Worker     {
321*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_resolveBuffer);
322*35238bceSAndroid Build Coastguard Worker         m_resolveBuffer = 0;
323*35238bceSAndroid Build Coastguard Worker     }
324*35238bceSAndroid Build Coastguard Worker 
325*35238bceSAndroid Build Coastguard Worker     delete m_program;
326*35238bceSAndroid Build Coastguard Worker     m_program = DE_NULL;
327*35238bceSAndroid Build Coastguard Worker 
328*35238bceSAndroid Build Coastguard Worker     if (m_fbo)
329*35238bceSAndroid Build Coastguard Worker     {
330*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteFramebuffers(1, &m_fbo);
331*35238bceSAndroid Build Coastguard Worker         m_fbo = 0;
332*35238bceSAndroid Build Coastguard Worker     }
333*35238bceSAndroid Build Coastguard Worker 
334*35238bceSAndroid Build Coastguard Worker     if (m_fboTexture)
335*35238bceSAndroid Build Coastguard Worker     {
336*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteTextures(1, &m_fboTexture);
337*35238bceSAndroid Build Coastguard Worker         m_fboTexture = 0;
338*35238bceSAndroid Build Coastguard Worker     }
339*35238bceSAndroid Build Coastguard Worker 
340*35238bceSAndroid Build Coastguard Worker     delete m_textureSamplerProgram;
341*35238bceSAndroid Build Coastguard Worker     m_textureSamplerProgram = DE_NULL;
342*35238bceSAndroid Build Coastguard Worker 
343*35238bceSAndroid Build Coastguard Worker     if (m_fboRbo)
344*35238bceSAndroid Build Coastguard Worker     {
345*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteRenderbuffers(1, &m_fboRbo);
346*35238bceSAndroid Build Coastguard Worker         m_fboRbo = 0;
347*35238bceSAndroid Build Coastguard Worker     }
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker     if (m_resolveFbo)
350*35238bceSAndroid Build Coastguard Worker     {
351*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteFramebuffers(1, &m_resolveFbo);
352*35238bceSAndroid Build Coastguard Worker         m_resolveFbo = 0;
353*35238bceSAndroid Build Coastguard Worker     }
354*35238bceSAndroid Build Coastguard Worker 
355*35238bceSAndroid Build Coastguard Worker     if (m_resolveFboTexture)
356*35238bceSAndroid Build Coastguard Worker     {
357*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteTextures(1, &m_resolveFboTexture);
358*35238bceSAndroid Build Coastguard Worker         m_resolveFboTexture = 0;
359*35238bceSAndroid Build Coastguard Worker     }
360*35238bceSAndroid Build Coastguard Worker 
361*35238bceSAndroid Build Coastguard Worker     if (m_renderVao)
362*35238bceSAndroid Build Coastguard Worker     {
363*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteVertexArrays(1, &m_renderVao);
364*35238bceSAndroid Build Coastguard Worker         m_renderVao = 0;
365*35238bceSAndroid Build Coastguard Worker     }
366*35238bceSAndroid Build Coastguard Worker 
367*35238bceSAndroid Build Coastguard Worker     if (m_resolveVao)
368*35238bceSAndroid Build Coastguard Worker     {
369*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteVertexArrays(1, &m_resolveVao);
370*35238bceSAndroid Build Coastguard Worker         m_resolveVao = 0;
371*35238bceSAndroid Build Coastguard Worker     }
372*35238bceSAndroid Build Coastguard Worker }
373*35238bceSAndroid Build Coastguard Worker 
iterate(void)374*35238bceSAndroid Build Coastguard Worker MultisampleRenderCase::IterateResult MultisampleRenderCase::iterate(void)
375*35238bceSAndroid Build Coastguard Worker {
376*35238bceSAndroid Build Coastguard Worker     // default value
377*35238bceSAndroid Build Coastguard Worker     if (m_iteration == 0)
378*35238bceSAndroid Build Coastguard Worker     {
379*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
380*35238bceSAndroid Build Coastguard Worker         preTest();
381*35238bceSAndroid Build Coastguard Worker     }
382*35238bceSAndroid Build Coastguard Worker 
383*35238bceSAndroid Build Coastguard Worker     drawOneIteration();
384*35238bceSAndroid Build Coastguard Worker 
385*35238bceSAndroid Build Coastguard Worker     // next iteration
386*35238bceSAndroid Build Coastguard Worker     ++m_iteration;
387*35238bceSAndroid Build Coastguard Worker     if (m_iteration < m_numIterations)
388*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
389*35238bceSAndroid Build Coastguard Worker     else
390*35238bceSAndroid Build Coastguard Worker     {
391*35238bceSAndroid Build Coastguard Worker         postTest();
392*35238bceSAndroid Build Coastguard Worker         return STOP;
393*35238bceSAndroid Build Coastguard Worker     }
394*35238bceSAndroid Build Coastguard Worker }
395*35238bceSAndroid Build Coastguard Worker 
preDraw(void)396*35238bceSAndroid Build Coastguard Worker void MultisampleRenderCase::preDraw(void)
397*35238bceSAndroid Build Coastguard Worker {
398*35238bceSAndroid Build Coastguard Worker }
399*35238bceSAndroid Build Coastguard Worker 
postDraw(void)400*35238bceSAndroid Build Coastguard Worker void MultisampleRenderCase::postDraw(void)
401*35238bceSAndroid Build Coastguard Worker {
402*35238bceSAndroid Build Coastguard Worker }
403*35238bceSAndroid Build Coastguard Worker 
preTest(void)404*35238bceSAndroid Build Coastguard Worker void MultisampleRenderCase::preTest(void)
405*35238bceSAndroid Build Coastguard Worker {
406*35238bceSAndroid Build Coastguard Worker }
407*35238bceSAndroid Build Coastguard Worker 
postTest(void)408*35238bceSAndroid Build Coastguard Worker void MultisampleRenderCase::postTest(void)
409*35238bceSAndroid Build Coastguard Worker {
410*35238bceSAndroid Build Coastguard Worker }
411*35238bceSAndroid Build Coastguard Worker 
verifyResultImageAndSetResult(const tcu::Surface & resultImage)412*35238bceSAndroid Build Coastguard Worker void MultisampleRenderCase::verifyResultImageAndSetResult(const tcu::Surface &resultImage)
413*35238bceSAndroid Build Coastguard Worker {
414*35238bceSAndroid Build Coastguard Worker     // verify using case-specific verification
415*35238bceSAndroid Build Coastguard Worker 
416*35238bceSAndroid Build Coastguard Worker     try
417*35238bceSAndroid Build Coastguard Worker     {
418*35238bceSAndroid Build Coastguard Worker         if (!verifyImage(resultImage))
419*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image verification failed");
420*35238bceSAndroid Build Coastguard Worker     }
421*35238bceSAndroid Build Coastguard Worker     catch (const QualityWarning &ex)
422*35238bceSAndroid Build Coastguard Worker     {
423*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Quality warning, error = " << ex.what()
424*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndMessage;
425*35238bceSAndroid Build Coastguard Worker 
426*35238bceSAndroid Build Coastguard Worker         // Failures are more important than warnings
427*35238bceSAndroid Build Coastguard Worker         if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
428*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_QUALITY_WARNING, ex.what());
429*35238bceSAndroid Build Coastguard Worker     }
430*35238bceSAndroid Build Coastguard Worker }
431*35238bceSAndroid Build Coastguard Worker 
verifyResultBuffersAndSetResult(const std::vector<tcu::Surface> & resultBuffers)432*35238bceSAndroid Build Coastguard Worker void MultisampleRenderCase::verifyResultBuffersAndSetResult(const std::vector<tcu::Surface> &resultBuffers)
433*35238bceSAndroid Build Coastguard Worker {
434*35238bceSAndroid Build Coastguard Worker     // verify using case-specific verification
435*35238bceSAndroid Build Coastguard Worker 
436*35238bceSAndroid Build Coastguard Worker     try
437*35238bceSAndroid Build Coastguard Worker     {
438*35238bceSAndroid Build Coastguard Worker         if (!verifySampleBuffers(resultBuffers))
439*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image verification failed");
440*35238bceSAndroid Build Coastguard Worker     }
441*35238bceSAndroid Build Coastguard Worker     catch (const QualityWarning &ex)
442*35238bceSAndroid Build Coastguard Worker     {
443*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Quality warning, error = " << ex.what()
444*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndMessage;
445*35238bceSAndroid Build Coastguard Worker 
446*35238bceSAndroid Build Coastguard Worker         // Failures are more important than warnings
447*35238bceSAndroid Build Coastguard Worker         if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
448*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_QUALITY_WARNING, ex.what());
449*35238bceSAndroid Build Coastguard Worker     }
450*35238bceSAndroid Build Coastguard Worker }
451*35238bceSAndroid Build Coastguard Worker 
getIterationDescription(int iteration) const452*35238bceSAndroid Build Coastguard Worker std::string MultisampleRenderCase::getIterationDescription(int iteration) const
453*35238bceSAndroid Build Coastguard Worker {
454*35238bceSAndroid Build Coastguard Worker     DE_UNREF(iteration);
455*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(false);
456*35238bceSAndroid Build Coastguard Worker     return "";
457*35238bceSAndroid Build Coastguard Worker }
458*35238bceSAndroid Build Coastguard Worker 
drawOneIteration(void)459*35238bceSAndroid Build Coastguard Worker void MultisampleRenderCase::drawOneIteration(void)
460*35238bceSAndroid Build Coastguard Worker {
461*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
462*35238bceSAndroid Build Coastguard Worker     const std::string sectionDescription =
463*35238bceSAndroid Build Coastguard Worker         (m_numIterations > 1) ? ("Iteration " + de::toString(m_iteration + 1) + "/" + de::toString(m_numIterations) +
464*35238bceSAndroid Build Coastguard Worker                                  ": " + getIterationDescription(m_iteration)) :
465*35238bceSAndroid Build Coastguard Worker                                 ("Test");
466*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection section(m_testCtx.getLog(), "Iteration" + de::toString(m_iteration),
467*35238bceSAndroid Build Coastguard Worker                                         sectionDescription);
468*35238bceSAndroid Build Coastguard Worker 
469*35238bceSAndroid Build Coastguard Worker     // Per iteration shader?
470*35238bceSAndroid Build Coastguard Worker     if (m_perIterationShader)
471*35238bceSAndroid Build Coastguard Worker     {
472*35238bceSAndroid Build Coastguard Worker         delete m_program;
473*35238bceSAndroid Build Coastguard Worker         m_program = DE_NULL;
474*35238bceSAndroid Build Coastguard Worker 
475*35238bceSAndroid Build Coastguard Worker         m_program =
476*35238bceSAndroid Build Coastguard Worker             new glu::ShaderProgram(m_context.getRenderContext(),
477*35238bceSAndroid Build Coastguard Worker                                    glu::ProgramSources() << glu::VertexSource(genVertexSource(m_numTargetSamples))
478*35238bceSAndroid Build Coastguard Worker                                                          << glu::FragmentSource(genFragmentSource(m_numTargetSamples)));
479*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Section("RenderShader", "Render shader") << *m_program
480*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndSection;
481*35238bceSAndroid Build Coastguard Worker         if (!m_program->isOk())
482*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("could not build program");
483*35238bceSAndroid Build Coastguard Worker     }
484*35238bceSAndroid Build Coastguard Worker 
485*35238bceSAndroid Build Coastguard Worker     // render
486*35238bceSAndroid Build Coastguard Worker     {
487*35238bceSAndroid Build Coastguard Worker         if (m_renderTarget == TARGET_TEXTURE || m_renderTarget == TARGET_RENDERBUFFER)
488*35238bceSAndroid Build Coastguard Worker         {
489*35238bceSAndroid Build Coastguard Worker             gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
490*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "bind fbo");
491*35238bceSAndroid Build Coastguard Worker 
492*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "Rendering " << m_renderSceneDescription
493*35238bceSAndroid Build Coastguard Worker                                << " with render shader to fbo." << tcu::TestLog::EndMessage;
494*35238bceSAndroid Build Coastguard Worker         }
495*35238bceSAndroid Build Coastguard Worker         else
496*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "Rendering " << m_renderSceneDescription
497*35238bceSAndroid Build Coastguard Worker                                << " with render shader to default framebuffer." << tcu::TestLog::EndMessage;
498*35238bceSAndroid Build Coastguard Worker 
499*35238bceSAndroid Build Coastguard Worker         gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
500*35238bceSAndroid Build Coastguard Worker         gl.clear(GL_COLOR_BUFFER_BIT);
501*35238bceSAndroid Build Coastguard Worker         gl.viewport(0, 0, m_renderSize, m_renderSize);
502*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "clear");
503*35238bceSAndroid Build Coastguard Worker 
504*35238bceSAndroid Build Coastguard Worker         gl.bindVertexArray(m_renderVao);
505*35238bceSAndroid Build Coastguard Worker         gl.bindBuffer(GL_ARRAY_BUFFER, m_buffer);
506*35238bceSAndroid Build Coastguard Worker 
507*35238bceSAndroid Build Coastguard Worker         // set attribs
508*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(!m_renderAttribs.empty());
509*35238bceSAndroid Build Coastguard Worker         for (std::map<std::string, Attrib>::const_iterator it = m_renderAttribs.begin(); it != m_renderAttribs.end();
510*35238bceSAndroid Build Coastguard Worker              ++it)
511*35238bceSAndroid Build Coastguard Worker         {
512*35238bceSAndroid Build Coastguard Worker             const int32_t location = gl.getAttribLocation(m_program->getProgram(), it->first.c_str());
513*35238bceSAndroid Build Coastguard Worker 
514*35238bceSAndroid Build Coastguard Worker             if (location != -1)
515*35238bceSAndroid Build Coastguard Worker             {
516*35238bceSAndroid Build Coastguard Worker                 gl.vertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE, it->second.stride,
517*35238bceSAndroid Build Coastguard Worker                                        glu::BufferOffsetAsPointer(it->second.offset));
518*35238bceSAndroid Build Coastguard Worker                 gl.enableVertexAttribArray(location);
519*35238bceSAndroid Build Coastguard Worker             }
520*35238bceSAndroid Build Coastguard Worker         }
521*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "set attrib");
522*35238bceSAndroid Build Coastguard Worker 
523*35238bceSAndroid Build Coastguard Worker         gl.useProgram(m_program->getProgram());
524*35238bceSAndroid Build Coastguard Worker         preDraw();
525*35238bceSAndroid Build Coastguard Worker         gl.drawArrays(m_renderMode, 0, m_renderCount);
526*35238bceSAndroid Build Coastguard Worker         postDraw();
527*35238bceSAndroid Build Coastguard Worker         gl.useProgram(0);
528*35238bceSAndroid Build Coastguard Worker         gl.bindVertexArray(0);
529*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "draw");
530*35238bceSAndroid Build Coastguard Worker 
531*35238bceSAndroid Build Coastguard Worker         if (m_renderTarget == TARGET_TEXTURE || m_renderTarget == TARGET_RENDERBUFFER)
532*35238bceSAndroid Build Coastguard Worker             gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
533*35238bceSAndroid Build Coastguard Worker     }
534*35238bceSAndroid Build Coastguard Worker 
535*35238bceSAndroid Build Coastguard Worker     // read
536*35238bceSAndroid Build Coastguard Worker     {
537*35238bceSAndroid Build Coastguard Worker         if (m_renderTarget == TARGET_DEFAULT)
538*35238bceSAndroid Build Coastguard Worker         {
539*35238bceSAndroid Build Coastguard Worker             tcu::Surface resultImage(m_renderSize, m_renderSize);
540*35238bceSAndroid Build Coastguard Worker 
541*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "Reading pixels from default framebuffer."
542*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::EndMessage;
543*35238bceSAndroid Build Coastguard Worker 
544*35238bceSAndroid Build Coastguard Worker             // default directly
545*35238bceSAndroid Build Coastguard Worker             glu::readPixels(m_context.getRenderContext(), 0, 0, resultImage.getAccess());
546*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "read pixels");
547*35238bceSAndroid Build Coastguard Worker 
548*35238bceSAndroid Build Coastguard Worker             // set test result
549*35238bceSAndroid Build Coastguard Worker             verifyResultImageAndSetResult(resultImage);
550*35238bceSAndroid Build Coastguard Worker         }
551*35238bceSAndroid Build Coastguard Worker         else if (m_renderTarget == TARGET_RENDERBUFFER)
552*35238bceSAndroid Build Coastguard Worker         {
553*35238bceSAndroid Build Coastguard Worker             tcu::Surface resultImage(m_renderSize, m_renderSize);
554*35238bceSAndroid Build Coastguard Worker 
555*35238bceSAndroid Build Coastguard Worker             // rbo by blitting to non-multisample fbo
556*35238bceSAndroid Build Coastguard Worker 
557*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message
558*35238bceSAndroid Build Coastguard Worker                                << "Blitting result from fbo to single sample fbo. (Resolve multisample)"
559*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::EndMessage;
560*35238bceSAndroid Build Coastguard Worker 
561*35238bceSAndroid Build Coastguard Worker             gl.bindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo);
562*35238bceSAndroid Build Coastguard Worker             gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_resolveFbo);
563*35238bceSAndroid Build Coastguard Worker             gl.blitFramebuffer(0, 0, m_renderSize, m_renderSize, 0, 0, m_renderSize, m_renderSize, GL_COLOR_BUFFER_BIT,
564*35238bceSAndroid Build Coastguard Worker                                GL_NEAREST);
565*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "blit resolve");
566*35238bceSAndroid Build Coastguard Worker 
567*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "Reading pixels from single sample framebuffer."
568*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::EndMessage;
569*35238bceSAndroid Build Coastguard Worker 
570*35238bceSAndroid Build Coastguard Worker             gl.bindFramebuffer(GL_READ_FRAMEBUFFER, m_resolveFbo);
571*35238bceSAndroid Build Coastguard Worker             glu::readPixels(m_context.getRenderContext(), 0, 0, resultImage.getAccess());
572*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "read pixels");
573*35238bceSAndroid Build Coastguard Worker 
574*35238bceSAndroid Build Coastguard Worker             gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
575*35238bceSAndroid Build Coastguard Worker 
576*35238bceSAndroid Build Coastguard Worker             // set test result
577*35238bceSAndroid Build Coastguard Worker             verifyResultImageAndSetResult(resultImage);
578*35238bceSAndroid Build Coastguard Worker         }
579*35238bceSAndroid Build Coastguard Worker         else if (m_renderTarget == TARGET_TEXTURE && !m_verifyTextureSampleBuffers)
580*35238bceSAndroid Build Coastguard Worker         {
581*35238bceSAndroid Build Coastguard Worker             const int32_t posLocation     = gl.getAttribLocation(m_textureSamplerProgram->getProgram(), "a_position");
582*35238bceSAndroid Build Coastguard Worker             const int32_t samplerLocation = gl.getUniformLocation(m_textureSamplerProgram->getProgram(), "u_sampler");
583*35238bceSAndroid Build Coastguard Worker             const uint32_t textureTarget = (m_numRequestedSamples == 0) ? (GL_TEXTURE_2D) : (GL_TEXTURE_2D_MULTISAMPLE);
584*35238bceSAndroid Build Coastguard Worker             tcu::Surface resultImage(m_renderSize, m_renderSize);
585*35238bceSAndroid Build Coastguard Worker 
586*35238bceSAndroid Build Coastguard Worker             if (m_numRequestedSamples)
587*35238bceSAndroid Build Coastguard Worker                 m_testCtx.getLog()
588*35238bceSAndroid Build Coastguard Worker                     << tcu::TestLog::Message
589*35238bceSAndroid Build Coastguard Worker                     << "Using sampler shader to sample the multisample texture to single sample framebuffer."
590*35238bceSAndroid Build Coastguard Worker                     << tcu::TestLog::EndMessage;
591*35238bceSAndroid Build Coastguard Worker             else
592*35238bceSAndroid Build Coastguard Worker                 m_testCtx.getLog() << tcu::TestLog::Message
593*35238bceSAndroid Build Coastguard Worker                                    << "Drawing texture to single sample framebuffer. Using sampler shader."
594*35238bceSAndroid Build Coastguard Worker                                    << tcu::TestLog::EndMessage;
595*35238bceSAndroid Build Coastguard Worker 
596*35238bceSAndroid Build Coastguard Worker             if (samplerLocation == -1)
597*35238bceSAndroid Build Coastguard Worker                 throw tcu::TestError("Location u_sampler was -1.");
598*35238bceSAndroid Build Coastguard Worker 
599*35238bceSAndroid Build Coastguard Worker             // resolve multisample texture by averaging
600*35238bceSAndroid Build Coastguard Worker             gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
601*35238bceSAndroid Build Coastguard Worker             gl.clear(GL_COLOR_BUFFER_BIT);
602*35238bceSAndroid Build Coastguard Worker             gl.viewport(0, 0, m_renderSize, m_renderSize);
603*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "clear");
604*35238bceSAndroid Build Coastguard Worker 
605*35238bceSAndroid Build Coastguard Worker             gl.bindVertexArray(m_resolveVao);
606*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, m_resolveBuffer);
607*35238bceSAndroid Build Coastguard Worker             gl.vertexAttribPointer(posLocation, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL);
608*35238bceSAndroid Build Coastguard Worker             gl.enableVertexAttribArray(posLocation);
609*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "set attrib");
610*35238bceSAndroid Build Coastguard Worker 
611*35238bceSAndroid Build Coastguard Worker             gl.activeTexture(GL_TEXTURE0);
612*35238bceSAndroid Build Coastguard Worker             gl.bindTexture(textureTarget, m_fboTexture);
613*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "bind tex");
614*35238bceSAndroid Build Coastguard Worker 
615*35238bceSAndroid Build Coastguard Worker             gl.useProgram(m_textureSamplerProgram->getProgram());
616*35238bceSAndroid Build Coastguard Worker             gl.uniform1i(samplerLocation, 0);
617*35238bceSAndroid Build Coastguard Worker 
618*35238bceSAndroid Build Coastguard Worker             gl.bindFramebuffer(GL_FRAMEBUFFER, m_resolveFbo);
619*35238bceSAndroid Build Coastguard Worker             gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
620*35238bceSAndroid Build Coastguard Worker 
621*35238bceSAndroid Build Coastguard Worker             gl.useProgram(0);
622*35238bceSAndroid Build Coastguard Worker             gl.bindVertexArray(0);
623*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "draw");
624*35238bceSAndroid Build Coastguard Worker 
625*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "Reading pixels from single sample framebuffer."
626*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::EndMessage;
627*35238bceSAndroid Build Coastguard Worker 
628*35238bceSAndroid Build Coastguard Worker             glu::readPixels(m_context.getRenderContext(), 0, 0, resultImage.getAccess());
629*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "read pixels");
630*35238bceSAndroid Build Coastguard Worker 
631*35238bceSAndroid Build Coastguard Worker             gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
632*35238bceSAndroid Build Coastguard Worker 
633*35238bceSAndroid Build Coastguard Worker             // set test result
634*35238bceSAndroid Build Coastguard Worker             verifyResultImageAndSetResult(resultImage);
635*35238bceSAndroid Build Coastguard Worker         }
636*35238bceSAndroid Build Coastguard Worker         else if (m_renderTarget == TARGET_TEXTURE && m_verifyTextureSampleBuffers)
637*35238bceSAndroid Build Coastguard Worker         {
638*35238bceSAndroid Build Coastguard Worker             const int32_t posLocation     = gl.getAttribLocation(m_textureSamplerProgram->getProgram(), "a_position");
639*35238bceSAndroid Build Coastguard Worker             const int32_t samplerLocation = gl.getUniformLocation(m_textureSamplerProgram->getProgram(), "u_sampler");
640*35238bceSAndroid Build Coastguard Worker             const int32_t sampleLocation  = gl.getUniformLocation(m_textureSamplerProgram->getProgram(), "u_sampleNdx");
641*35238bceSAndroid Build Coastguard Worker             const uint32_t textureTarget = (m_numRequestedSamples == 0) ? (GL_TEXTURE_2D) : (GL_TEXTURE_2D_MULTISAMPLE);
642*35238bceSAndroid Build Coastguard Worker             std::vector<tcu::Surface> resultBuffers(m_numTargetSamples);
643*35238bceSAndroid Build Coastguard Worker 
644*35238bceSAndroid Build Coastguard Worker             if (m_numRequestedSamples)
645*35238bceSAndroid Build Coastguard Worker                 m_testCtx.getLog() << tcu::TestLog::Message << "Reading multisample texture sample buffers."
646*35238bceSAndroid Build Coastguard Worker                                    << tcu::TestLog::EndMessage;
647*35238bceSAndroid Build Coastguard Worker             else
648*35238bceSAndroid Build Coastguard Worker                 m_testCtx.getLog() << tcu::TestLog::Message << "Reading texture." << tcu::TestLog::EndMessage;
649*35238bceSAndroid Build Coastguard Worker 
650*35238bceSAndroid Build Coastguard Worker             if (samplerLocation == -1)
651*35238bceSAndroid Build Coastguard Worker                 throw tcu::TestError("Location u_sampler was -1.");
652*35238bceSAndroid Build Coastguard Worker             if (sampleLocation == -1)
653*35238bceSAndroid Build Coastguard Worker                 throw tcu::TestError("Location u_sampleNdx was -1.");
654*35238bceSAndroid Build Coastguard Worker 
655*35238bceSAndroid Build Coastguard Worker             for (int sampleNdx = 0; sampleNdx < m_numTargetSamples; ++sampleNdx)
656*35238bceSAndroid Build Coastguard Worker                 resultBuffers[sampleNdx].setSize(m_renderSize, m_renderSize);
657*35238bceSAndroid Build Coastguard Worker 
658*35238bceSAndroid Build Coastguard Worker             // read sample buffers to different surfaces
659*35238bceSAndroid Build Coastguard Worker             gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
660*35238bceSAndroid Build Coastguard Worker             gl.clear(GL_COLOR_BUFFER_BIT);
661*35238bceSAndroid Build Coastguard Worker             gl.viewport(0, 0, m_renderSize, m_renderSize);
662*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "clear");
663*35238bceSAndroid Build Coastguard Worker 
664*35238bceSAndroid Build Coastguard Worker             gl.bindVertexArray(m_resolveVao);
665*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, m_resolveBuffer);
666*35238bceSAndroid Build Coastguard Worker             gl.vertexAttribPointer(posLocation, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL);
667*35238bceSAndroid Build Coastguard Worker             gl.enableVertexAttribArray(posLocation);
668*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "set attrib");
669*35238bceSAndroid Build Coastguard Worker 
670*35238bceSAndroid Build Coastguard Worker             gl.activeTexture(GL_TEXTURE0);
671*35238bceSAndroid Build Coastguard Worker             gl.bindTexture(textureTarget, m_fboTexture);
672*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "bind tex");
673*35238bceSAndroid Build Coastguard Worker 
674*35238bceSAndroid Build Coastguard Worker             gl.bindFramebuffer(GL_FRAMEBUFFER, m_resolveFbo);
675*35238bceSAndroid Build Coastguard Worker             gl.useProgram(m_textureSamplerProgram->getProgram());
676*35238bceSAndroid Build Coastguard Worker             gl.uniform1i(samplerLocation, 0);
677*35238bceSAndroid Build Coastguard Worker 
678*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "Reading sample buffers" << tcu::TestLog::EndMessage;
679*35238bceSAndroid Build Coastguard Worker 
680*35238bceSAndroid Build Coastguard Worker             for (int sampleNdx = 0; sampleNdx < m_numTargetSamples; ++sampleNdx)
681*35238bceSAndroid Build Coastguard Worker             {
682*35238bceSAndroid Build Coastguard Worker                 gl.uniform1i(sampleLocation, sampleNdx);
683*35238bceSAndroid Build Coastguard Worker                 gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
684*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "draw");
685*35238bceSAndroid Build Coastguard Worker 
686*35238bceSAndroid Build Coastguard Worker                 glu::readPixels(m_context.getRenderContext(), 0, 0, resultBuffers[sampleNdx].getAccess());
687*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "read pixels");
688*35238bceSAndroid Build Coastguard Worker             }
689*35238bceSAndroid Build Coastguard Worker 
690*35238bceSAndroid Build Coastguard Worker             gl.useProgram(0);
691*35238bceSAndroid Build Coastguard Worker             gl.bindVertexArray(0);
692*35238bceSAndroid Build Coastguard Worker             gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
693*35238bceSAndroid Build Coastguard Worker 
694*35238bceSAndroid Build Coastguard Worker             // verify sample buffers
695*35238bceSAndroid Build Coastguard Worker             verifyResultBuffersAndSetResult(resultBuffers);
696*35238bceSAndroid Build Coastguard Worker         }
697*35238bceSAndroid Build Coastguard Worker         else
698*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
699*35238bceSAndroid Build Coastguard Worker     }
700*35238bceSAndroid Build Coastguard Worker }
701*35238bceSAndroid Build Coastguard Worker 
genVertexSource(int numTargetSamples) const702*35238bceSAndroid Build Coastguard Worker std::string MultisampleRenderCase::genVertexSource(int numTargetSamples) const
703*35238bceSAndroid Build Coastguard Worker {
704*35238bceSAndroid Build Coastguard Worker     const bool supportsES32orGL45 =
705*35238bceSAndroid Build Coastguard Worker         glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
706*35238bceSAndroid Build Coastguard Worker         glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
707*35238bceSAndroid Build Coastguard Worker 
708*35238bceSAndroid Build Coastguard Worker     map<string, string> args;
709*35238bceSAndroid Build Coastguard Worker 
710*35238bceSAndroid Build Coastguard Worker     args["GLSL_VERSION_DECL"] = supportsES32orGL45 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
711*35238bceSAndroid Build Coastguard Worker                                                      getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
712*35238bceSAndroid Build Coastguard Worker 
713*35238bceSAndroid Build Coastguard Worker     DE_UNREF(numTargetSamples);
714*35238bceSAndroid Build Coastguard Worker     return std::string(tcu::StringTemplate(s_vertexSource).specialize(args));
715*35238bceSAndroid Build Coastguard Worker }
716*35238bceSAndroid Build Coastguard Worker 
genMSSamplerSource(int numTargetSamples) const717*35238bceSAndroid Build Coastguard Worker std::string MultisampleRenderCase::genMSSamplerSource(int numTargetSamples) const
718*35238bceSAndroid Build Coastguard Worker {
719*35238bceSAndroid Build Coastguard Worker     if (m_verifyTextureSampleBuffers)
720*35238bceSAndroid Build Coastguard Worker         return genMSTextureLayerFetchSource(numTargetSamples);
721*35238bceSAndroid Build Coastguard Worker     else
722*35238bceSAndroid Build Coastguard Worker         return genMSTextureResolverSource(numTargetSamples);
723*35238bceSAndroid Build Coastguard Worker }
724*35238bceSAndroid Build Coastguard Worker 
genMSTextureResolverSource(int numTargetSamples) const725*35238bceSAndroid Build Coastguard Worker std::string MultisampleRenderCase::genMSTextureResolverSource(int numTargetSamples) const
726*35238bceSAndroid Build Coastguard Worker {
727*35238bceSAndroid Build Coastguard Worker     // default behavior: average
728*35238bceSAndroid Build Coastguard Worker 
729*35238bceSAndroid Build Coastguard Worker     const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
730*35238bceSAndroid Build Coastguard Worker     map<string, string> args;
731*35238bceSAndroid Build Coastguard Worker     const bool isSingleSampleTarget = (m_numRequestedSamples == 0);
732*35238bceSAndroid Build Coastguard Worker     std::ostringstream buf;
733*35238bceSAndroid Build Coastguard Worker 
734*35238bceSAndroid Build Coastguard Worker     args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
735*35238bceSAndroid Build Coastguard Worker                                                getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
736*35238bceSAndroid Build Coastguard Worker 
737*35238bceSAndroid Build Coastguard Worker     buf << "${GLSL_VERSION_DECL}\n"
738*35238bceSAndroid Build Coastguard Worker            "in mediump vec4 v_position;\n"
739*35238bceSAndroid Build Coastguard Worker            "layout(location = 0) out mediump vec4 fragColor;\n"
740*35238bceSAndroid Build Coastguard Worker            "uniform mediump "
741*35238bceSAndroid Build Coastguard Worker         << ((isSingleSampleTarget) ? ("sampler2D") : ("sampler2DMS"))
742*35238bceSAndroid Build Coastguard Worker         << " u_sampler;\n"
743*35238bceSAndroid Build Coastguard Worker            "void main (void)\n"
744*35238bceSAndroid Build Coastguard Worker            "{\n"
745*35238bceSAndroid Build Coastguard Worker            "    mediump vec2 relPosition = (v_position.xy + vec2(1.0, 1.0)) / 2.0;\n"
746*35238bceSAndroid Build Coastguard Worker            "    mediump ivec2 fetchPos = ivec2(floor(relPosition * "
747*35238bceSAndroid Build Coastguard Worker         << m_renderSize
748*35238bceSAndroid Build Coastguard Worker         << ".0));\n"
749*35238bceSAndroid Build Coastguard Worker            "    mediump vec4 colorSum = vec4(0.0, 0.0, 0.0, 0.0);\n"
750*35238bceSAndroid Build Coastguard Worker            "\n";
751*35238bceSAndroid Build Coastguard Worker 
752*35238bceSAndroid Build Coastguard Worker     if (isSingleSampleTarget)
753*35238bceSAndroid Build Coastguard Worker         buf << "    colorSum = texelFetch(u_sampler, fetchPos, 0);\n"
754*35238bceSAndroid Build Coastguard Worker                "\n";
755*35238bceSAndroid Build Coastguard Worker     else
756*35238bceSAndroid Build Coastguard Worker         buf << "    for (int sampleNdx = 0; sampleNdx < " << numTargetSamples
757*35238bceSAndroid Build Coastguard Worker             << "; ++sampleNdx)\n"
758*35238bceSAndroid Build Coastguard Worker                "        colorSum += texelFetch(u_sampler, fetchPos, sampleNdx);\n"
759*35238bceSAndroid Build Coastguard Worker                "    colorSum /= "
760*35238bceSAndroid Build Coastguard Worker             << numTargetSamples
761*35238bceSAndroid Build Coastguard Worker             << ".0;\n"
762*35238bceSAndroid Build Coastguard Worker                "\n";
763*35238bceSAndroid Build Coastguard Worker 
764*35238bceSAndroid Build Coastguard Worker     buf << "    fragColor = vec4(colorSum.xyz, 1.0);\n"
765*35238bceSAndroid Build Coastguard Worker            "}\n";
766*35238bceSAndroid Build Coastguard Worker 
767*35238bceSAndroid Build Coastguard Worker     return tcu::StringTemplate(buf.str()).specialize(args);
768*35238bceSAndroid Build Coastguard Worker }
769*35238bceSAndroid Build Coastguard Worker 
genMSTextureLayerFetchSource(int numTargetSamples) const770*35238bceSAndroid Build Coastguard Worker std::string MultisampleRenderCase::genMSTextureLayerFetchSource(int numTargetSamples) const
771*35238bceSAndroid Build Coastguard Worker {
772*35238bceSAndroid Build Coastguard Worker     DE_UNREF(numTargetSamples);
773*35238bceSAndroid Build Coastguard Worker 
774*35238bceSAndroid Build Coastguard Worker     const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
775*35238bceSAndroid Build Coastguard Worker     map<string, string> args;
776*35238bceSAndroid Build Coastguard Worker     const bool isSingleSampleTarget = (m_numRequestedSamples == 0);
777*35238bceSAndroid Build Coastguard Worker     std::ostringstream buf;
778*35238bceSAndroid Build Coastguard Worker 
779*35238bceSAndroid Build Coastguard Worker     args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
780*35238bceSAndroid Build Coastguard Worker                                                getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
781*35238bceSAndroid Build Coastguard Worker 
782*35238bceSAndroid Build Coastguard Worker     buf << "${GLSL_VERSION_DECL}\n"
783*35238bceSAndroid Build Coastguard Worker            "in mediump vec4 v_position;\n"
784*35238bceSAndroid Build Coastguard Worker            "layout(location = 0) out mediump vec4 fragColor;\n"
785*35238bceSAndroid Build Coastguard Worker            "uniform mediump "
786*35238bceSAndroid Build Coastguard Worker         << ((isSingleSampleTarget) ? ("sampler2D") : ("sampler2DMS"))
787*35238bceSAndroid Build Coastguard Worker         << " u_sampler;\n"
788*35238bceSAndroid Build Coastguard Worker            "uniform mediump int u_sampleNdx;\n"
789*35238bceSAndroid Build Coastguard Worker            "void main (void)\n"
790*35238bceSAndroid Build Coastguard Worker            "{\n"
791*35238bceSAndroid Build Coastguard Worker            "    mediump vec2 relPosition = (v_position.xy + vec2(1.0, 1.0)) / 2.0;\n"
792*35238bceSAndroid Build Coastguard Worker            "    mediump ivec2 fetchPos = ivec2(floor(relPosition * "
793*35238bceSAndroid Build Coastguard Worker         << m_renderSize
794*35238bceSAndroid Build Coastguard Worker         << ".0));\n"
795*35238bceSAndroid Build Coastguard Worker            "\n"
796*35238bceSAndroid Build Coastguard Worker            "    mediump vec4 color = texelFetch(u_sampler, fetchPos, u_sampleNdx);\n"
797*35238bceSAndroid Build Coastguard Worker            "    fragColor = vec4(color.rgb, 1.0);\n"
798*35238bceSAndroid Build Coastguard Worker            "}\n";
799*35238bceSAndroid Build Coastguard Worker 
800*35238bceSAndroid Build Coastguard Worker     return tcu::StringTemplate(buf.str()).specialize(args);
801*35238bceSAndroid Build Coastguard Worker }
802*35238bceSAndroid Build Coastguard Worker 
verifySampleBuffers(const std::vector<tcu::Surface> & resultBuffers)803*35238bceSAndroid Build Coastguard Worker bool MultisampleRenderCase::verifySampleBuffers(const std::vector<tcu::Surface> &resultBuffers)
804*35238bceSAndroid Build Coastguard Worker {
805*35238bceSAndroid Build Coastguard Worker     DE_UNREF(resultBuffers);
806*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(false);
807*35238bceSAndroid Build Coastguard Worker     return false;
808*35238bceSAndroid Build Coastguard Worker }
809*35238bceSAndroid Build Coastguard Worker 
setupRenderData(void)810*35238bceSAndroid Build Coastguard Worker void MultisampleRenderCase::setupRenderData(void)
811*35238bceSAndroid Build Coastguard Worker {
812*35238bceSAndroid Build Coastguard Worker     static const tcu::Vec4 fullscreenQuad[] = {
813*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(1.0f, -1.0f, 0.0f, 1.0f),
814*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f),
815*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(-1.0f, -1.0f, 0.0f, 1.0f),
816*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(-1.0f, 1.0f, 0.0f, 1.0f),
817*35238bceSAndroid Build Coastguard Worker     };
818*35238bceSAndroid Build Coastguard Worker 
819*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
820*35238bceSAndroid Build Coastguard Worker 
821*35238bceSAndroid Build Coastguard Worker     m_renderMode             = GL_TRIANGLE_STRIP;
822*35238bceSAndroid Build Coastguard Worker     m_renderCount            = 4;
823*35238bceSAndroid Build Coastguard Worker     m_renderSceneDescription = "quad";
824*35238bceSAndroid Build Coastguard Worker 
825*35238bceSAndroid Build Coastguard Worker     m_renderAttribs["a_position"].offset = 0;
826*35238bceSAndroid Build Coastguard Worker     m_renderAttribs["a_position"].stride = sizeof(float[4]);
827*35238bceSAndroid Build Coastguard Worker 
828*35238bceSAndroid Build Coastguard Worker     gl.bindBuffer(GL_ARRAY_BUFFER, m_buffer);
829*35238bceSAndroid Build Coastguard Worker     gl.bufferData(GL_ARRAY_BUFFER, (int)sizeof(fullscreenQuad), fullscreenQuad, GL_STATIC_DRAW);
830*35238bceSAndroid Build Coastguard Worker }
831*35238bceSAndroid Build Coastguard Worker 
getMaxConformantSampleCount(glw::GLenum target,glw::GLenum internalFormat)832*35238bceSAndroid Build Coastguard Worker glw::GLint MultisampleRenderCase::getMaxConformantSampleCount(glw::GLenum target, glw::GLenum internalFormat)
833*35238bceSAndroid Build Coastguard Worker {
834*35238bceSAndroid Build Coastguard Worker     int32_t maxTextureSamples = 0;
835*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl  = m_context.getRenderContext().getFunctions();
836*35238bceSAndroid Build Coastguard Worker 
837*35238bceSAndroid Build Coastguard Worker     if (m_context.getContextInfo().isExtensionSupported("GL_NV_internalformat_sample_query"))
838*35238bceSAndroid Build Coastguard Worker     {
839*35238bceSAndroid Build Coastguard Worker         glw::GLint gl_sample_counts = 0;
840*35238bceSAndroid Build Coastguard Worker         gl.getInternalformativ(target, internalFormat, GL_NUM_SAMPLE_COUNTS, 1, &gl_sample_counts);
841*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetInternalformativ() failed for GL_NUM_SAMPLE_COUNTS pname");
842*35238bceSAndroid Build Coastguard Worker 
843*35238bceSAndroid Build Coastguard Worker         /* Check and return the first conformant sample count */
844*35238bceSAndroid Build Coastguard Worker         glw::GLint *gl_supported_samples = new glw::GLint[gl_sample_counts];
845*35238bceSAndroid Build Coastguard Worker         if (gl_supported_samples)
846*35238bceSAndroid Build Coastguard Worker         {
847*35238bceSAndroid Build Coastguard Worker             gl.getInternalformativ(target, internalFormat, GL_SAMPLES, gl_sample_counts, gl_supported_samples);
848*35238bceSAndroid Build Coastguard Worker 
849*35238bceSAndroid Build Coastguard Worker             for (glw::GLint i = 0; i < gl_sample_counts; i++)
850*35238bceSAndroid Build Coastguard Worker             {
851*35238bceSAndroid Build Coastguard Worker                 glw::GLint isConformant = 0;
852*35238bceSAndroid Build Coastguard Worker                 gl.getInternalformatSampleivNV(target, internalFormat, gl_supported_samples[i], GL_CONFORMANT_NV, 1,
853*35238bceSAndroid Build Coastguard Worker                                                &isConformant);
854*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetInternalformatSampleivNV() call(s) failed");
855*35238bceSAndroid Build Coastguard Worker 
856*35238bceSAndroid Build Coastguard Worker                 if (isConformant && gl_supported_samples[i] > maxTextureSamples)
857*35238bceSAndroid Build Coastguard Worker                 {
858*35238bceSAndroid Build Coastguard Worker                     maxTextureSamples = gl_supported_samples[i];
859*35238bceSAndroid Build Coastguard Worker                 }
860*35238bceSAndroid Build Coastguard Worker             }
861*35238bceSAndroid Build Coastguard Worker             delete[] gl_supported_samples;
862*35238bceSAndroid Build Coastguard Worker         }
863*35238bceSAndroid Build Coastguard Worker     }
864*35238bceSAndroid Build Coastguard Worker     else
865*35238bceSAndroid Build Coastguard Worker     {
866*35238bceSAndroid Build Coastguard Worker         gl.getInternalformativ(target, internalFormat, GL_SAMPLES, 1, &maxTextureSamples);
867*35238bceSAndroid Build Coastguard Worker     }
868*35238bceSAndroid Build Coastguard Worker 
869*35238bceSAndroid Build Coastguard Worker     return maxTextureSamples;
870*35238bceSAndroid Build Coastguard Worker }
871*35238bceSAndroid Build Coastguard Worker 
872*35238bceSAndroid Build Coastguard Worker } // namespace MultisampleShaderRenderUtil
873*35238bceSAndroid Build Coastguard Worker } // namespace Functional
874*35238bceSAndroid Build Coastguard Worker } // namespace gles31
875*35238bceSAndroid Build Coastguard Worker } // namespace deqp
876