1833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/*-------------------------------------------------------------------------
2833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* OpenGL Conformance Test Suite
3833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* -----------------------------
4833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
5833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* Copyright (c) 2017 The Khronos Group Inc.
6833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
7833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* Licensed under the Apache License, Version 2.0 (the "License");
8833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* you may not use this file except in compliance with the License.
9833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* You may obtain a copy of the License at
10833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
11833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*      http://www.apache.org/licenses/LICENSE-2.0
12833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
13833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* Unless required by applicable law or agreed to in writing, software
14833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* distributed under the License is distributed on an "AS IS" BASIS,
15833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* See the License for the specific language governing permissions and
17833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* limitations under the License.
18833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
19833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*/ /*!
20833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* \file  glcPolygonOffsetClampTests.cpp
21833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski* \brief Conformance tests for the EXT_polygon_offset_clamp functionality.
22833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*/ /*-------------------------------------------------------------------*/
23833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
24833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski#include "glcPolygonOffsetClampTests.hpp"
25833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski#include "gluContextInfo.hpp"
26833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski#include "gluShaderProgram.hpp"
27833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski#include "glwEnums.hpp"
28833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski#include "tcuRenderTarget.hpp"
29833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski#include "tcuTestLog.hpp"
30833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
31833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski#include <stdio.h>
32833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
33833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskiusing namespace glw;
34833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskiusing namespace glu;
35833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
36833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskinamespace glcts
37833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
38833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
39833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskiconst char* poc_shader_version_450core = "#version 450 core\n\n";
40833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskiconst char* poc_shader_version_310es   = "#version 310 es\n\n";
41833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
42833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskiconst char* poc_vertexColor = "in highp vec3 vertex;\n"
43833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							  "\n"
44833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							  "void main()\n"
45833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							  "{\n"
46833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							  "    gl_Position = vec4(vertex, 1);\n"
47833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							  "}\n";
48833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
49833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskiconst char* poc_fragmentColor = "out highp vec4 fragColor;\n"
50833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"\n"
51833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"void main()\n"
52833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"{\n"
53833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"    fragColor = vec4(1, 1, 1, 1);\n"
54833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"}\n";
55833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
56833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskiconst char* poc_vertexTexture = "in highp vec3 vertex;\n"
57833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"in highp vec2 texCoord;\n"
58833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"out highp vec2 varyingtexCoord;\n"
59833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"\n"
60833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"void main()\n"
61833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"{\n"
62833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"    gl_Position = vec4(vertex, 1);\n"
63833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"    varyingtexCoord = texCoord;\n"
64833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								"}\n";
65833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
66833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskiconst char* poc_fragmentTexture = "in highp vec2 varyingtexCoord;\n"
67833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "out highp vec4 fragColor;\n"
68833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "\n"
69833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "layout (location = 0) uniform highp sampler2D tex;\n"
70833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "\n"
71833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "void main()\n"
72833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "{\n"
73833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "    highp vec4 v = texture(tex, varyingtexCoord);\n"
74833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "    int r = int(v.r * 65536.0) % 256;\n"
75833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "    int g = int(v.r * 65536.0) / 256;\n"
76833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "    fragColor = vec4(float(r) / 255.0, float(g) / 255.0, 0.0, 1.0);\n"
77833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski								  "}\n";
78833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
79833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Constructor.
80833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
81833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*  @param context Rendering context
82833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*  @param name Test name
83833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*  @param description Test description
84833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*/
85833a9d392044464e0271ae9c4bc4a262193f24b4Filip DemczewskiPolygonOffsetClampTestCaseBase::PolygonOffsetClampTestCaseBase(deqp::Context& context, const char* name,
86833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski															   const char* description)
87833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	: TestCase(context, name, description)
88833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
895e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	glu::ContextType contextType = m_context.getRenderContext().getType();
905e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	m_extensionSupported		 = glu::contextSupports(contextType, glu::ApiType::core(4, 6));
915e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	m_extensionSupported |= context.getContextInfo().isExtensionSupported("GL_EXT_polygon_offset_clamp");
925e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	m_extensionSupported |= context.getContextInfo().isExtensionSupported("GL_ARB_polygon_offset_clamp");
93833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
94833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
95833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskitcu::TestNode::IterateResult PolygonOffsetClampTestCaseBase::iterate()
96833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
97833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (!m_extensionSupported)
98833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
99833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not supported");
100833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		return STOP;
101833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
102833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
103833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	test(m_context.getRenderContext().getFunctions());
104833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
105833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	return STOP;
106833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
107833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
108833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Constructor.
109833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
110833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*  @param context Rendering context
111833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*/
112833a9d392044464e0271ae9c4bc4a262193f24b4Filip DemczewskiPolygonOffsetClampAvailabilityTestCase::PolygonOffsetClampAvailabilityTestCase(deqp::Context& context)
113833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	: PolygonOffsetClampTestCaseBase(context, "PolygonOffsetClampAvailability",
114833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski									 "Verifies if queries for GL_EXT_polygon_offset_clamp extension works properly")
115833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
116833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
117833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
118833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskivoid PolygonOffsetClampAvailabilityTestCase::test(const glw::Functions& gl)
119833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
120833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
121833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		glw::GLboolean data;
122833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.getBooleanv(GL_POLYGON_OFFSET_CLAMP_EXT, &data);
123833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "getBooleanv error occurred");
124833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
125833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
126833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		glw::GLint data;
127833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.getIntegerv(GL_POLYGON_OFFSET_CLAMP_EXT, &data);
128833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "getBooleanv error occurred");
129833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
130833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
131833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		glw::GLint64 data;
132833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.getInteger64v(GL_POLYGON_OFFSET_CLAMP_EXT, &data);
133833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "getBooleanv error occurred");
134833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
135833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
136833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		glw::GLfloat data;
137833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.getFloatv(GL_POLYGON_OFFSET_CLAMP_EXT, &data);
138833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "getBooleanv error occurred");
139833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
140833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
141833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// OpenGL ES does not support getDoublev query
142833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (glu::isContextTypeGLCore(m_context.getRenderContext().getType()))
143833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
144833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		glw::GLdouble data;
145833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.getDoublev(GL_POLYGON_OFFSET_CLAMP_EXT, &data);
146833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "getBooleanv error occurred");
147833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
148833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
149c1748560576961295f54e25197f72e625bf3b239Alexander Galazin	gl.polygonOffsetClamp(1.0f, 1.0f, 0.5f);
150c1748560576961295f54e25197f72e625bf3b239Alexander Galazin	GLU_EXPECT_NO_ERROR(gl.getError(), "polygonOffsetClamp error occurred");
151833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
152833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
153833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
154833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
155833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Constructor.
156833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
157833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*  @param context Rendering context
158833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*/
159833a9d392044464e0271ae9c4bc4a262193f24b4Filip DemczewskiPolygonOffsetClampValueTestCaseBase::PolygonOffsetClampValueTestCaseBase(deqp::Context& context, const char* name,
160833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski																		 const char* description)
161833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	: PolygonOffsetClampTestCaseBase(context, name, description)
162833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	, m_fbo(0)
163833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	, m_depthBuf(0)
164833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	, m_colorBuf(0)
165833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	, m_fboReadback(0)
166833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	, m_colorBufReadback(0)
167833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
168833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
169833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
170833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Initialization method that creates framebuffer with depth attachment
171833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski */
172833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskivoid PolygonOffsetClampValueTestCaseBase::init()
173833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
174833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
175833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
176833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.genTextures(1, &m_depthBuf);
177833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "genTextures");
178833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.bindTexture(GL_TEXTURE_2D, m_depthBuf);
179833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "bindTexture");
180833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.texStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT16, 64, 64);
181833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "texStorage2D");
182833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
183833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "texParameteri");
184833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
185833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "texParameteri");
186833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
187833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.genTextures(1, &m_colorBuf);
188833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "genTextures");
189833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.bindTexture(GL_TEXTURE_2D, m_colorBuf);
190833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "bindTexture");
191833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 64, 64);
192833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "texStorage2D");
193833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
194833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "texParameteri");
195833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
196833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "texParameteri");
197833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
198833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.genFramebuffers(1, &m_fbo);
199833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "genFramebuffers");
200833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
201833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "bindFramebuffer");
202833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthBuf, 0);
203833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "framebufferTexture2D");
204833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuf, 0);
205833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "framebufferTexture2D");
206833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
207833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (!glu::isContextTypeGLCore(m_context.getRenderContext().getType()))
208833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
209833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.genTextures(1, &m_colorBufReadback);
210833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "genTextures");
211833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.bindTexture(GL_TEXTURE_2D, m_colorBufReadback);
212833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "bindTexture");
213833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 64, 64);
214833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "texStorage2D");
215833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
216833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "texParameteri");
217833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
218833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "texParameteri");
219833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
220833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.genFramebuffers(1, &m_fboReadback);
221833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "genFramebuffers");
222833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.bindFramebuffer(GL_FRAMEBUFFER, m_fboReadback);
223833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "bindFramebuffer");
224833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBufReadback, 0);
225833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "framebufferTexture2D");
226833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
227833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
228833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.viewport(0, 0, 64, 64);
229833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
230833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
231833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** De-Initialization method that releases
232833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski */
233833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskivoid PolygonOffsetClampValueTestCaseBase::deinit()
234833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
235833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
236833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
237833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
238833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "bindFramebuffer");
239833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
240833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (m_fbo)
241833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.deleteFramebuffers(1, &m_fbo);
242833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (m_depthBuf)
243833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.deleteTextures(1, &m_depthBuf);
244833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (m_colorBuf)
245833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.deleteTextures(1, &m_colorBuf);
246833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
247833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (!glu::isContextTypeGLCore(m_context.getRenderContext().getType()))
248833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
249833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		if (m_colorBufReadback)
250833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski			gl.deleteTextures(1, &m_colorBufReadback);
251833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		if (m_fboReadback)
252833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski			gl.deleteFramebuffers(1, &m_fboReadback);
253833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
254833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
255833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
256833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Testing method that verifies if depth values generated after polygon offset clamp are as expected.
257833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski *
258833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski *  @param gl   Function bindings
259833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski */
260833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskivoid PolygonOffsetClampValueTestCaseBase::test(const glw::Functions& gl)
261833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
262833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	const GLfloat vertices[] = { -1.0f, -1.0f, 0.5f, -1.0f, 1.0f, 0.5f, 1.0f, -1.0f, 0.5f, 1.0f, 1.0f, 0.5f };
263833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
264833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Prepare shader program
265833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	std::string vertexColor;
266833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	std::string fragmentColor;
267833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (glu::isContextTypeGLCore(m_context.getRenderContext().getType()))
268833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		vertexColor = std::string(poc_shader_version_450core);
269833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	else
270833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		vertexColor = std::string(poc_shader_version_310es);
271833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	fragmentColor   = vertexColor;
272833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
273833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	vertexColor   = vertexColor + poc_vertexColor;
274833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	fragmentColor = fragmentColor + poc_fragmentColor;
275833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
276833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	ProgramSources testSources = makeVtxFragSources(vertexColor, fragmentColor);
277833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	ShaderProgram  testProgram(gl, testSources);
278833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
279833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (!testProgram.isOk())
280833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
281833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		m_testCtx.getLog() << tcu::TestLog::Message << "TestProgram build failed.\n"
282833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski						   << "Vertex: " << testProgram.getShaderInfo(SHADERTYPE_VERTEX).infoLog << "\n"
283833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski						   << "Fragment: " << testProgram.getShaderInfo(SHADERTYPE_FRAGMENT).infoLog << "\n"
284833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski						   << "Program: " << testProgram.getProgramInfo().infoLog << tcu::TestLog::EndMessage;
285833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
286833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
287833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		return;
288833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
289833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
290833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	ShaderProgram* readDepthProgram   = DE_NULL;
291833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLuint		   readDepthProgramId = 0;
292833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
293833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Prepare shader program for reading depth buffer indirectly
294833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (!glu::isContextTypeGLCore(m_context.getRenderContext().getType()))
295833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
296833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		std::string vertexTexture   = std::string(poc_shader_version_310es) + poc_vertexTexture;
297833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		std::string fragmentTexture = std::string(poc_shader_version_310es) + poc_fragmentTexture;
298833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
299833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		ProgramSources readDepthSources = makeVtxFragSources(vertexTexture, fragmentTexture);
300833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
301833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		readDepthProgram = new ShaderProgram(gl, readDepthSources);
302833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
303833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		if (!readDepthProgram->isOk())
304833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		{
305833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski			m_testCtx.getLog() << tcu::TestLog::Message << "ReadDepthProgram build failed.\n"
306833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "Vertex: " << readDepthProgram->getShaderInfo(SHADERTYPE_VERTEX).infoLog << "\n"
307833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "Fragment: " << readDepthProgram->getShaderInfo(SHADERTYPE_FRAGMENT).infoLog << "\n"
308833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "Program: " << readDepthProgram->getProgramInfo().infoLog << tcu::TestLog::EndMessage;
309833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
310833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
311833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski			return;
312833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		}
313833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
314833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		readDepthProgramId = readDepthProgram->getProgram();
315833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
316833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
317833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.useProgram(testProgram.getProgram());
318833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
319833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
320833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLuint vao;
321833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLuint arrayBuffer;
322833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
323833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Setup depth testing
324833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.enable(GL_DEPTH_TEST);
325833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable");
326833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
327833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.depthFunc(GL_ALWAYS);
328833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc");
329833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
330833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Generate vertex array object
331833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.genVertexArrays(1, &vao);
332833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays");
333833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
334833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.bindVertexArray(vao);
335833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray");
336833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
337833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Setup vertex array buffer
338833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.genBuffers(1, &arrayBuffer);
339833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
340833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
341833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.bindBuffer(GL_ARRAY_BUFFER, arrayBuffer);
342833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
343833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
344833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.bufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
345833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
346833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
347833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Setup vertex attrib pointer
348833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.enableVertexAttribArray(0);
349833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray");
350833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
351833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.vertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
352833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");
353833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
354833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Bind framebuffer for drawing
355833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
356833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer");
357833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
358833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	bool result = true;
35942d218eb376986969507b5a0693dd444c27f6aceAdam Czupryna	for (GLuint i = 0; i < m_testValues.size(); ++i)
360833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
361833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		// Prepare verification variables
362833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLfloat depthValue			  = 0.0f;
363833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLfloat depthValueOffset	  = 0.0f;
364833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLfloat depthValueOffsetClamp = 0.0f;
365833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
366833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		// Draw reference polygon
367833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.disable(GL_POLYGON_OFFSET_FILL);
368833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glDisable");
369833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
370833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
371833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
372833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
373833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
374833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
375833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
376833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		// Get reference depth value
377833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		depthValue = readDepthValue(gl, readDepthProgramId);
378833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
379833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		// Draw polygon with depth offset
380833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.enable(GL_POLYGON_OFFSET_FILL);
381833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable");
382833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
383833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
384833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer");
385833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
386833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.polygonOffset(m_testValues[i].factor, m_testValues[i].units);
387833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glPolygonOffset");
388833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
389833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
390833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
391833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
392833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		depthValueOffset = readDepthValue(gl, readDepthProgramId);
393833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
394833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		// Draw reference polygon
395833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.disable(GL_POLYGON_OFFSET_FILL);
396833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glDisable");
397833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
398833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
399833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer");
400833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
401833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
402833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
403833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
404833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
405833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
406833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
407833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		// Draw polygon with depth offset
408833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.enable(GL_POLYGON_OFFSET_FILL);
409833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable");
410833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
411c1748560576961295f54e25197f72e625bf3b239Alexander Galazin		gl.polygonOffsetClamp(m_testValues[i].factor, m_testValues[i].units, m_testValues[i].clamp);
4125e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glPolygonOffsetClamp");
413833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
414833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
415833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
416833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
417833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		depthValueOffsetClamp = readDepthValue(gl, readDepthProgramId);
418833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
419833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		// Verify results
420833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		result = result && verify(i, depthValue, depthValueOffset, depthValueOffsetClamp);
421833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
422833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
423833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Cleanup
424833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.disableVertexAttribArray(0);
425833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glDisableVertexAttribArray");
426833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
427833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.deleteVertexArrays(1, &arrayBuffer);
428833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteVertexArrays");
429833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
430833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.deleteVertexArrays(1, &vao);
431833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteVertexArrays");
432833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
433833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	gl.disable(GL_POLYGON_OFFSET_FILL);
434833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glDisable");
435833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
436833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (readDepthProgram)
437833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		delete readDepthProgram;
438833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
439833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (result)
440833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
441833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	else
442833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
443833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
444833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
445833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Method .
446833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski *
447833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski *  @param gl   Function bindings
448833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski */
449833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskifloat PolygonOffsetClampValueTestCaseBase::readDepthValue(const glw::Functions& gl, const GLuint readDepthProgramId)
450833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
451833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	GLfloat depthValue = 0.0f;
452833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
453833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (glu::isContextTypeGLCore(m_context.getRenderContext().getType()))
454833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
455833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.readPixels(0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depthValue);
456833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
457833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
458833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// OpenGL ES does not support reading pixels directly from depth buffer
459833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	else
460833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
461833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		// Bind framebuffer for readback
462833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.bindFramebuffer(GL_FRAMEBUFFER, m_fboReadback);
463833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer");
464833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
465833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.disable(GL_DEPTH_TEST);
466833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glDisable");
467833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
468833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.useProgram(readDepthProgramId);
469833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
470833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
471833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.activeTexture(GL_TEXTURE0);
472833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glActiveTexture");
473833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.bindTexture(GL_TEXTURE_2D, m_depthBuf);
474833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture");
475833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.uniform1i(0, 0);
476833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i");
477833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
478833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
479833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
480833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
481833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLubyte pixels[4];
482833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
483833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
484833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
485833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.enable(GL_DEPTH_TEST);
486833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable");
487833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
488833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		// Convert read depth value to GLfloat normalized
489833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		depthValue = (GLfloat)(pixels[0] + pixels[1] * 256) / 0xFFFF;
490833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
491833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		// Bind framebuffer for drawing
492833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
493833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer");
494833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
495833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
496833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	return depthValue;
497833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
498833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
499833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Constructor.
500833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
501833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*  @param context Rendering context
502833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*/
503833a9d392044464e0271ae9c4bc4a262193f24b4Filip DemczewskiPolygonOffsetClampMinMaxTestCase::PolygonOffsetClampMinMaxTestCase(deqp::Context& context)
504833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	: PolygonOffsetClampValueTestCaseBase(
505833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		  context, "PolygonOffsetClampMinMax",
506833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		  "Verifies if polygon offset clamp works as expected for non-zero, finite clamp values")
507833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
508833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
509833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
510833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Initialization method that fills polygonOffset* testing values
511833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski */
512833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskivoid PolygonOffsetClampMinMaxTestCase::init()
513833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
514833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	PolygonOffsetClampValueTestCaseBase::init();
515833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
516833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	m_testValues.clear();
517833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	m_testValues.push_back(PolygonOffsetClampValues(0.0f, -1000.0f, -0.0001f)); // Min offset case
518833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	m_testValues.push_back(PolygonOffsetClampValues(0.0f, 1000.0f, 0.0001f));   // Max offset case
519833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
520833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
521833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Verification method that determines if depth values are as expected
522833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski *
523833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski *  @param caseNo           Case iteration number
524833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski *  @param depth            Reference depth value
525833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski *  @param offsetDepth      Case iteration number
526833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski *  @param offsetClampDepth Case iteration number
527833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski */
52842d218eb376986969507b5a0693dd444c27f6aceAdam Czuprynabool PolygonOffsetClampMinMaxTestCase::verify(GLuint caseNo, GLfloat depth, GLfloat offsetDepth,
529833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski											  GLfloat offsetClampDepth)
530833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
531833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Min offset case
532833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (caseNo == 0)
533833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
534833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		if (depth <= offsetDepth || depth <= offsetClampDepth || offsetDepth >= offsetClampDepth)
535833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		{
536833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski			m_testCtx.getLog() << tcu::TestLog::Message << "PolygonOffsetClampEXT failed at MIN offset test.\n"
537833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "Expected result: "
538833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "refDepth[" << depth << "] > "
539833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "offsetClampDepth[" << offsetClampDepth << "] > "
540833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "offsetDepth[" << offsetDepth << "]" << tcu::TestLog::EndMessage;
541833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
542833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski			return false;
543833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		}
544833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
545833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Max offset case
546833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	else if (caseNo == 1)
547833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
548833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		if (depth >= offsetDepth || depth >= offsetClampDepth || offsetDepth <= offsetClampDepth)
549833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		{
550833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski			m_testCtx.getLog() << tcu::TestLog::Message << "PolygonOffsetClampEXT failed at MAX offset test.\n"
551833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "Expected result: "
552833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "refDepth[" << depth << "] < "
553833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "offsetClampDepth[" << offsetClampDepth << "] < "
554833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski							   << "offsetDepth[" << offsetDepth << "]" << tcu::TestLog::EndMessage;
555833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
556833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski			return false;
557833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		}
558833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
559833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	// Undefined case
560833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	else
561833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		return false;
562833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
563833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	return true;
564833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
565833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
566833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Constructor.
567833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
568833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*  @param context Rendering context
569833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*/
570833a9d392044464e0271ae9c4bc4a262193f24b4Filip DemczewskiPolygonOffsetClampZeroInfinityTestCase::PolygonOffsetClampZeroInfinityTestCase(deqp::Context& context)
571833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	: PolygonOffsetClampValueTestCaseBase(
572833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		  context, "PolygonOffsetClampZeroInfinity",
573833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		  "Verifies if polygon offset clamp works as expected for zero and infinite clamp values")
574833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
575833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
576833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
577833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Initialization method that fills polygonOffset* testing values
578833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski */
579833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskivoid PolygonOffsetClampZeroInfinityTestCase::init()
580833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
581833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	PolygonOffsetClampValueTestCaseBase::init();
582833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
583833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	m_testValues.clear();
584833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	m_testValues.push_back(PolygonOffsetClampValues(0.0f, -1000.0f, 0.0f));		 // Min offset, zero clamp case
585833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	m_testValues.push_back(PolygonOffsetClampValues(0.0f, -1000.0f, -INFINITY)); // Min Offset, infinity clamp case
586833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	m_testValues.push_back(PolygonOffsetClampValues(0.0f, 1000.0f, 0.0f));		 // Max offset, zero clamp case
587833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	m_testValues.push_back(PolygonOffsetClampValues(0.0f, 1000.0f, INFINITY));   // Max Offset, infinity clamp case
588833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
589833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
59042d218eb376986969507b5a0693dd444c27f6aceAdam Czuprynabool PolygonOffsetClampZeroInfinityTestCase::verify(GLuint caseNo, GLfloat depth, GLfloat offsetDepth,
591833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski													GLfloat offsetClampDepth)
592833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
593833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	DE_UNREF(caseNo);
594833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
595833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	if (depth == offsetDepth || depth == offsetClampDepth || offsetDepth != offsetClampDepth)
596833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	{
597833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		m_testCtx.getLog() << tcu::TestLog::Message
598833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski						   << "PolygonOffsetClampEXT failed at Zero/Infinity offset clamp test.\n"
599833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski						   << "Expected result: "
600833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski						   << "refDepth[" << depth << "] != "
601833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski						   << "(offsetClampDepth[" << offsetClampDepth << "] == "
602833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski						   << "offsetDepth[" << offsetDepth << "])" << tcu::TestLog::EndMessage;
603833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
604833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski		return false;
605833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	}
606833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
607833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	return true;
608833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
609833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
610833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Constructor.
611833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*
612833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*  @param context Rendering context.
613833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski*/
614833a9d392044464e0271ae9c4bc4a262193f24b4Filip DemczewskiPolygonOffsetClamp::PolygonOffsetClamp(deqp::Context& context)
615833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	: TestCaseGroup(context, "polygon_offset_clamp",
616833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski					"Verify conformance of CTS_EXT_polygon_offset_clamp implementation")
617833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
618833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
619833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski
620833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski/** Initializes the test group contents. */
621833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewskivoid PolygonOffsetClamp::init()
622833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski{
623833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	addChild(new PolygonOffsetClampAvailabilityTestCase(m_context));
624833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	addChild(new PolygonOffsetClampMinMaxTestCase(m_context));
625833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski	addChild(new PolygonOffsetClampZeroInfinityTestCase(m_context));
626833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski}
627833a9d392044464e0271ae9c4bc4a262193f24b4Filip Demczewski} /* glcts namespace */
628