148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*------------------------------------------------------------------------- 248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite 348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ----------------------------- 448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2014-2016 The Khronos Group Inc. 648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License. 948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at 1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software 1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and 1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License. 1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*! 2048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file 2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief 2284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/ 2348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "es31cSampleShadingTests.hpp" 2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deRandom.hpp" 2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deStringUtil.hpp" 2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluContextInfo.hpp" 2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluDrawUtil.hpp" 2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluPixelTransfer.hpp" 3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluShaderProgram.hpp" 3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glw.h" 3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwFunctions.hpp" 3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuCommandLine.hpp" 3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuStringTemplate.hpp" 3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuSurface.hpp" 3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuTestLog.hpp" 3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace tcu 3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic bool operator<(tcu::Vec4 const& k1, tcu::Vec4 const& k2) 4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (k1.y() < k2.y()) 4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (k1.y() == k2.y()) 4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return k1.x() < k2.x(); 4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace glcts 5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::TestLog; 6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing std::string; 6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing std::vector; 6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing glcts::Context; 6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic std::string specializeVersion(std::string const& source, glu::GLSLVersion version, std::string const& sampler, 6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::string const& outType) 6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos DE_ASSERT(version == glu::GLSL_VERSION_310_ES || version >= glu::GLSL_VERSION_400); 6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::map<std::string, std::string> args; 7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos args["VERSION_DECL"] = glu::getGLSLVersionDeclaration(version); 7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos args["SAMPLER"] = sampler; 7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos args["OUT_TYPE"] = outType; 7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return tcu::StringTemplate(source.c_str()).specialize(args); 7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass SampleShadingApiCaseGroup : public TestCaseGroup 7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos SampleShadingApiCaseGroup(Context& context, glu::GLSLVersion glslVersion) 8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCaseGroup(context, "api", "Basic API verification"), m_glslVersion(glslVersion) 8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos void init(void) 8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new SampleShadingApiCase(m_context, m_glslVersion)); 8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprivate: 9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos class SampleShadingApiCase : public deqp::TestCase 9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos public: 9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos SampleShadingApiCase(Context& context, glu::GLSLVersion glslVersion); 9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ~SampleShadingApiCase(); 9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IterateResult iterate(); 9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos protected: 9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::GLSLVersion m_glslVersion; 10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::glMinSampleShadingFunc m_pGLMinSampleShading; 10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::GLSLVersion m_glslVersion; 10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingApiCaseGroup::SampleShadingApiCase::SampleShadingApiCase(Context& context, glu::GLSLVersion glslVersion) 10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase(context, "verify", ""), m_glslVersion(glslVersion) 10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos DE_ASSERT(glslVersion == glu::GLSL_VERSION_310_ES || glslVersion >= glu::GLSL_VERSION_400); 11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 11248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingApiCaseGroup::SampleShadingApiCase::~SampleShadingApiCase() 11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 11648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingApiCaseGroup::SampleShadingApiCase::IterateResult SampleShadingApiCaseGroup::SampleShadingApiCase:: 11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos iterate() 11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool isOk = true; 12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_glslVersion == glu::GLSL_VERSION_310_ES && 12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading")) 12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "GL_OES_sample_shading"); 12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return STOP; 12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_pGLMinSampleShading = gl.minSampleShading; 13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos struct Test 13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat input; 13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat result; 13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } tests[] = { 13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 0.0f, 0.0f }, { 0.5f, 0.5f }, { -1.0f, 0.0f }, { 2.0f, 1.0f }, 13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int i = 0; i < DE_LENGTH_OF_ARRAY(tests); ++i) 13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_pGLMinSampleShading(tests[i].input); 14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat result = -1.0f; 14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.getFloatv(GL_MIN_SAMPLE_SHADING_VALUE_OES, &result); 14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (result != tests[i].result) 14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos isOk = false; 14648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 14748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.enable(GL_SAMPLE_SHADING_OES); 15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!gl.isEnabled(GL_SAMPLE_SHADING_OES)) 15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos isOk = false; 15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.disable(GL_SAMPLE_SHADING_OES); 15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (gl.isEnabled(GL_SAMPLE_SHADING_OES)) 15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos isOk = false; 15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_pGLMinSampleShading(0.0f); 16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, isOk ? "Pass" : "Fail"); 16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return STOP; 16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass SampleShadingRenderCase : public TestCase 16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos SampleShadingRenderCase(Context& context, const char* name, const char* description, glu::GLSLVersion glslVersion, 17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum internalFormat, tcu::TextureFormat const& texFormat, const char* m_sampler, 17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* m_outType, GLfloat min, GLfloat max, const char* m_extension, 17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat sampleShading); 17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ~SampleShadingRenderCase(); 17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 17548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IterateResult iterate(); 17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprotected: 17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::GLSLVersion m_glslVersion; 17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::glMinSampleShadingFunc m_pGLMinSampleShading; 18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum m_internalFormat; 18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TextureFormat m_texFormat; 18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::string m_sampler; 18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::string m_outType; 18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat m_min; 18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat m_max; 18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::string m_extension; 18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat m_sampleShading; 18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos enum 19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos WIDTH = 16, 19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos HEIGHT = 16, 19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos MAX_SAMPLES = 4, 19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int countUniquePixels(tcu::ConstPixelBufferAccess const& pixels); 19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int countUniquePixels(const std::vector<tcu::Vec4>& pixels); 19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 20048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderCase::SampleShadingRenderCase(Context& context, const char* name, const char* description, 20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::GLSLVersion glslVersion, GLenum internalFormat, 20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TextureFormat const& texFormat, const char* sampler, 20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* outType, GLfloat min, GLfloat max, const char* extension, 20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat sampleShading) 20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCase(context, name, description) 20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_glslVersion(glslVersion) 20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_internalFormat(internalFormat) 20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_texFormat(texFormat) 20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_sampler(sampler) 21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_outType(outType) 21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_min(min) 21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_max(max) 21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_extension(extension) 21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_sampleShading(sampleShading) 21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos DE_ASSERT(glslVersion == glu::GLSL_VERSION_310_ES || glslVersion >= glu::GLSL_VERSION_400); 21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 21948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderCase::~SampleShadingRenderCase() 22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 22348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderCase::IterateResult SampleShadingRenderCase::iterate() 22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 22548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TestLog& log = m_testCtx.getLog(); 22648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 22748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool isOk = true; 22848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 22948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_glslVersion == glu::GLSL_VERSION_310_ES && 23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading")) 23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "GL_OES_sample_shading"); 23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return STOP; 23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!m_extension.empty() && !m_context.getContextInfo().isExtensionSupported(m_extension.c_str())) 23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, m_extension.c_str()); 23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return STOP; 23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_pGLMinSampleShading = gl.minSampleShading; 24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint maxSamples = 0; 24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (((m_texFormat.type == tcu::TextureFormat::FLOAT) && (m_texFormat.order == tcu::TextureFormat::RGBA)) || 24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ((m_texFormat.type == tcu::TextureFormat::FLOAT) && (m_texFormat.order == tcu::TextureFormat::RG)) || 24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ((m_texFormat.type == tcu::TextureFormat::FLOAT) && (m_texFormat.order == tcu::TextureFormat::R)) || 24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ((m_texFormat.type == tcu::TextureFormat::HALF_FLOAT) && (m_texFormat.order == tcu::TextureFormat::RGBA))) 24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 24948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.getInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, m_internalFormat, GL_SAMPLES, 1, &maxSamples); 25048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (maxSamples == 0) 25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Multisample is not supported on this format"); 25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return STOP; 25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (m_texFormat.type == tcu::TextureFormat::SIGNED_INT8 || 25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_texFormat.type == tcu::TextureFormat::UNSIGNED_INT8) 25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.getIntegerv(GL_MAX_INTEGER_SAMPLES, &maxSamples); 26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.getIntegerv(GL_MAX_SAMPLES, &maxSamples); 26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint samples = de::min<GLint>(maxSamples, MAX_SAMPLES); 26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint tex; 26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genTextures(1, &tex); 26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex); 27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, m_internalFormat, WIDTH, HEIGHT, GL_FALSE); 27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint fboMs; 27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genFramebuffers(1, &fboMs); 27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindFramebuffer(GL_FRAMEBUFFER, fboMs); 27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex, 0); 27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.viewport(0, 0, WIDTH, HEIGHT); 27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_pGLMinSampleShading(m_sampleShading); 27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.enable(GL_SAMPLE_SHADING_OES); 28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const deUint16 quadIndices[] = { 0, 1, 2, 2, 1, 3 }; 28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static char const* vss = "${VERSION_DECL}\n" 28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "in highp vec2 a_position;\n" 28648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "in highp vec4 a_color;\n" 28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "out highp vec4 v_color;\n" 28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main (void)\n" 28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "{\n" 29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " gl_Position = vec4(a_position, 0.0, 1.0);\n" 29148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " v_color = a_color;\n" 29248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "}\n"; 29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static char const* fss = "${VERSION_DECL}\n" 29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "in highp vec4 v_color;\n" 29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 0) out highp ${OUT_TYPE} o_color;\n" 29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main (void)\n" 29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "{\n" 29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " o_color = ${OUT_TYPE}(v_color.x, v_color.y, 0.0, 0.0);\n" 30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "}\n"; 30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::ShaderProgram program( 30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getRenderContext(), 30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::makeVtxFragSources(specializeVersion(vss, m_glslVersion, m_sampler, m_outType).c_str(), 30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos specializeVersion(fss, m_glslVersion, m_sampler, m_outType).c_str())); 30648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos log << program; 30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!program.isOk()) 30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Compile failed"); 31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const float position[] = { 31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos -1.0f, -1.0f, -1.0f, +1.0f, +1.0f, -1.0f, +1.0f, +1.0f, 31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const float color[] = { 31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_min, m_min, 0.0f, 1.0f, m_min, m_max, 0.0f, 1.0f, m_max, m_min, 0.0f, 1.0f, m_max, m_max, 0.0f, 1.0f, 31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.useProgram(program.getProgram()); 32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::VertexArrayBinding vertexArrays[] = { 32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::va::Float("a_position", 2, 4, 0, &position[0]), glu::va::Float("a_color", 4, 4, 0, &color[0]), 32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::draw(m_context.getRenderContext(), program.getProgram(), DE_LENGTH_OF_ARRAY(vertexArrays), 32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos &vertexArrays[0], glu::pr::TriangleStrip(DE_LENGTH_OF_ARRAY(quadIndices), &quadIndices[0])); 32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "Draw quad"); 32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_pGLMinSampleShading(0.0f); 33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.disable(GL_SAMPLE_SHADING_OES); 33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindFramebuffer(GL_FRAMEBUFFER, m_context.getRenderContext().getDefaultFramebuffer()); 33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteFramebuffers(1, &fboMs); 33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLsizei width = WIDTH * samples; 33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 33648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint rbo; 33748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genRenderbuffers(1, &rbo); 33848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindRenderbuffer(GL_RENDERBUFFER, rbo); 33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.renderbufferStorage(GL_RENDERBUFFER, m_internalFormat, width, HEIGHT); 34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint fbo; 34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genFramebuffers(1, &fbo); 34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindFramebuffer(GL_FRAMEBUFFER, fbo); 34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo); 34548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.viewport(0, 0, width, HEIGHT); 34648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static char const* vss = "${VERSION_DECL}\n" 34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "in highp vec2 a_position;\n" 35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main(void)\n" 35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "{\n" 35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " gl_Position = vec4(a_position, 0.0, 1.0);\n" 35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "}\n"; 35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 35548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static char const* fss = "${VERSION_DECL}\n" 35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "uniform highp ${SAMPLER} u_tex;\n" 35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "uniform int u_samples;\n" 35848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 0) out highp ${OUT_TYPE} o_color;\n" 35948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main(void)\n" 36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "{\n" 36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " ivec2 coord = ivec2(int(gl_FragCoord.x) / u_samples, gl_FragCoord.y);\n" 36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " int sampleId = int(gl_FragCoord.x) % u_samples;\n" 36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " o_color = texelFetch(u_tex, coord, sampleId);\n" 36448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "}\n"; 36548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::ShaderProgram program( 36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getRenderContext(), 36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::makeVtxFragSources(specializeVersion(vss, m_glslVersion, m_sampler, m_outType).c_str(), 36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos specializeVersion(fss, m_glslVersion, m_sampler, m_outType).c_str())); 37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos log << program; 37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!program.isOk()) 37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TCU_FAIL("Compile failed"); 37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos float const position[] = { 37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos -1.0f, -1.0f, -1.0f, +1.0f, +1.0f, -1.0f, +1.0f, +1.0f, 37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.useProgram(program.getProgram()); 38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.uniform1i(gl.getUniformLocation(program.getProgram(), "u_samples"), samples); 38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.uniform1i(gl.getUniformLocation(program.getProgram(), "u_tex"), 0); 38348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 38448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::VertexArrayBinding vertexArrays[] = { 38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::va::Float("a_position", 2, 4, 0, &position[0]), 38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::draw(m_context.getRenderContext(), program.getProgram(), DE_LENGTH_OF_ARRAY(vertexArrays), 38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos &vertexArrays[0], glu::pr::TriangleStrip(DE_LENGTH_OF_ARRAY(quadIndices), &quadIndices[0])); 38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "Draw quad"); 39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TextureLevel results(m_texFormat, width, HEIGHT); 39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::PixelBufferAccess pixels = results.getAccess(); 39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<tcu::Vec4> result(pixels.getHeight() * pixels.getWidth()); 39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int uniquePixels; 39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pixels.getFormat().type == tcu::TextureFormat::SIGNED_INT8) 39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLint> data(pixels.getHeight() * pixels.getWidth() * 4); 40148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.readPixels(0, 0, pixels.getWidth(), pixels.getHeight(), GL_RGBA_INTEGER, GL_INT, &data[0]); 40248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (unsigned int i = 0; i < data.size(); i += 4) 40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result[i / 4] = 40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::Vec4((GLfloat)data[i], (GLfloat)data[i + 1], (GLfloat)data[i + 2], (GLfloat)data[i + 3]); 40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos uniquePixels = countUniquePixels(result); 40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (pixels.getFormat().type == tcu::TextureFormat::UNSIGNED_INT8) 41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLuint> data(pixels.getHeight() * pixels.getWidth() * 4); 41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.readPixels(0, 0, pixels.getWidth(), pixels.getHeight(), GL_RGBA_INTEGER, GL_UNSIGNED_INT, &data[0]); 41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (unsigned int i = 0; i < data.size(); i += 4) 41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos result[i / 4] = 41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::Vec4((GLfloat)data[i], (GLfloat)data[i + 1], (GLfloat)data[i + 2], (GLfloat)data[i + 3]); 41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos uniquePixels = countUniquePixels(result); 41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::readPixels(m_context.getRenderContext(), 0, 0, pixels); 42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos uniquePixels = countUniquePixels(pixels); 42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int expectedUnique = WIDTH * HEIGHT * (de::clamp(int(float(samples) * m_sampleShading), 1, samples)); 42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (uniquePixels < expectedUnique) 42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos isOk = false; 42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindFramebuffer(GL_FRAMEBUFFER, m_context.getRenderContext().getDefaultFramebuffer()); 43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteFramebuffers(1, &fbo); 43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindRenderbuffer(GL_RENDERBUFFER, 0); 43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteRenderbuffers(1, &rbo); 43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); 43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteTextures(1, &tex); 43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, isOk ? "Pass" : "Fail"); 44148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return STOP; 44248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosint SampleShadingRenderCase::countUniquePixels(tcu::ConstPixelBufferAccess const& pixels) 44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::set<tcu::Vec4> uniquePixels; 44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int y = 0; y < pixels.getHeight(); ++y) 44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int x = 0; x < pixels.getWidth(); ++x) 45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos uniquePixels.insert(pixels.getPixel(x, y)); 45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 45648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return (int)uniquePixels.size(); 45748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosint SampleShadingRenderCase::countUniquePixels(const std::vector<tcu::Vec4>& pixels) 46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::set<tcu::Vec4> uniquePixels; 46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (unsigned int i = 0; i < pixels.size(); ++i) 46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos uniquePixels.insert(pixels[i]); 46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return (int)uniquePixels.size(); 46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass SampleShadingRenderFormatTests : public glcts::TestCaseGroup 47248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 47348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos SampleShadingRenderFormatTests(glcts::Context& context, glu::GLSLVersion glslVersion, GLenum internalFormat, 47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* format, tcu::TextureFormat const& texFormat, const char* sampler, 47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* outType, GLfloat min, GLfloat max, const char* extension = ""); 47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ~SampleShadingRenderFormatTests(void); 47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos void init(void); 48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprivate: 48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos SampleShadingRenderFormatTests(const SampleShadingTests& other); 48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos SampleShadingRenderFormatTests& operator=(const SampleShadingTests& other); 48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::GLSLVersion m_glslVersion; 48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum m_internalFormat; 48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TextureFormat m_texFormat; 48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::string m_sampler; 48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::string m_outType; 49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat m_min; 49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat m_max; 49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::string m_extension; 49348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 49548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderFormatTests::SampleShadingRenderFormatTests(Context& context, glu::GLSLVersion glslVersion, 49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum internalFormat, const char* format, 49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TextureFormat const& texFormat, const char* sampler, 49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* outType, GLfloat min, GLfloat max, 49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* extension) 50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCaseGroup(context, format, "") 50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_glslVersion(glslVersion) 50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_internalFormat(internalFormat) 50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_texFormat(texFormat) 50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_sampler(sampler) 50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_outType(outType) 50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_min(min) 50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_max(max) 50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_extension(extension) 50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 51248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderFormatTests::~SampleShadingRenderFormatTests(void) 51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 51448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SampleShadingRenderFormatTests::init(void) 51748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 51848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // sample_shading.render.full 51948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new SampleShadingRenderCase(m_context, "full", "Sample shader functionality", m_glslVersion, 52048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_internalFormat, m_texFormat, m_sampler.c_str(), m_outType.c_str(), m_min, 52148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_max, m_extension.c_str(), 1.0)); 52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // sample_shading.render.half 52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new SampleShadingRenderCase(m_context, "half", "Sample shader functionality", m_glslVersion, 52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_internalFormat, m_texFormat, m_sampler.c_str(), m_outType.c_str(), m_min, 52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_max, m_extension.c_str(), 0.5)); 52648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // sample_shading.render.none 52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new SampleShadingRenderCase(m_context, "none", "Sample shader functionality", m_glslVersion, 52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_internalFormat, m_texFormat, m_sampler.c_str(), m_outType.c_str(), m_min, 52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_max, m_extension.c_str(), 0.0)); 53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass SampleShadingRenderTests : public glcts::TestCaseGroup 53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos SampleShadingRenderTests(glcts::Context& context, glu::GLSLVersion glslVersion); 53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ~SampleShadingRenderTests(void); 53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos void init(void); 53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprivate: 54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos SampleShadingRenderTests(const SampleShadingTests& other); 54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos SampleShadingRenderTests& operator=(const SampleShadingTests& other); 54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glu::GLSLVersion m_glslVersion; 54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 54748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderTests::SampleShadingRenderTests(Context& context, glu::GLSLVersion glslVersion) 54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCaseGroup(context, "render", "Sample Shading render tests"), m_glslVersion(glslVersion) 54948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 55248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderTests::~SampleShadingRenderTests(void) 55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SampleShadingRenderTests::init(void) 55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // sample_shading.render.rgba8 55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new SampleShadingRenderFormatTests( 56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context, m_glslVersion, GL_RGBA8, "rgba8", 56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), "sampler2DMS", "vec4", 0.0, 1.0)); 56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // sample_shading.render.rgba8i 56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new SampleShadingRenderFormatTests( 56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context, m_glslVersion, GL_RGBA8I, "rgba8i", 56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT8), "isampler2DMS", "ivec4", -128.0, 56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 127.0)); 56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // sample_shading.render.rgba8ui 56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new SampleShadingRenderFormatTests( 56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context, m_glslVersion, GL_RGBA8UI, "rgba8ui", 57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8), "usampler2DMS", "uvec4", 0.0, 57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 255.0)); 57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // sample_shading.render.rgba32f 57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* extension = 57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (glu::isContextTypeES(m_context.getRenderContext().getType())) ? "GL_EXT_color_buffer_float" : ""; 57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new SampleShadingRenderFormatTests(m_context, m_glslVersion, GL_RGBA32F, "rgba32f", 57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT), 57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "sampler2DMS", "vec4", 0.0, 1.0, extension)); 57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 58048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingTests::SampleShadingTests(Context& context, glu::GLSLVersion glslVersion) 58148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCaseGroup(context, "sample_shading", "Sample Shading tests"), m_glslVersion(glslVersion) 58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 58548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingTests::~SampleShadingTests(void) 58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SampleShadingTests::init(void) 59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // sample_shading.api 59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new SampleShadingApiCaseGroup(m_context, m_glslVersion)); 59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // sample_shading.render 59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new SampleShadingRenderTests(m_context, m_glslVersion)); 59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 59648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} // glcts 598