13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL (ES) Module 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ----------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief GLES Scissor tests 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsScissorTests.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsTextureTestUtil.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h" 288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deRandom.hpp" 298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deUniquePtr.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestCase.hpp" 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuImageCompare.hpp" 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVector.hpp" 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVectorUtil.hpp" 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTexture.hpp" 368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuStringTemplate.hpp" 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluStrUtil.hpp" 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluDrawUtil.hpp" 408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluPixelTransfer.hpp" 418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluObjectWrapper.hpp" 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp" 448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "glwFunctions.hpp" 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include <map> 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gls 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing namespace ScissorTestInternal; 588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing namespace glw; // GL types 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::ConstPixelBufferAccess; 618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::PixelBufferAccess; 628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::TestLog; 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::vector; 658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::string; 668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::map; 678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::Vec3; 688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::Vec4; 698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::IVec4; 708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::UVec4; 718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid drawQuad (const glw::Functions& gl, deUint32 program, const Vec3& p0, const Vec3& p1) 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Vertex data. 758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float hz = (p0.z() + p1.z()) * 0.5f; 768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float position[] = 778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry p0.x(), p0.y(), p0.z(), 1.0f, 798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry p0.x(), p1.y(), hz, 1.0f, 808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry p1.x(), p0.y(), hz, 1.0f, 818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry p1.x(), p1.y(), p1.z(), 1.0f 828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry }; 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint16 indices[] = { 0, 1, 2, 2, 1, 3 }; 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deInt32 posLoc = gl.getAttribLocation(program, "a_position"); 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.useProgram(program); 898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.enableVertexAttribArray(posLoc); 908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.vertexAttribPointer(posLoc, 4, GL_FLOAT, GL_FALSE, 0, &position[0]); 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.drawElements(GL_TRIANGLES, DE_LENGTH_OF_ARRAY(indices), GL_UNSIGNED_SHORT, &indices[0]); 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disableVertexAttribArray(posLoc); 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid drawPrimitives (const glw::Functions& gl, deUint32 program, const deUint32 type, const vector<float>& vertices, const vector<deUint16>& indices) 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deInt32 posLoc = gl.getAttribLocation(program, "a_position"); 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TCU_CHECK(posLoc >= 0); 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.useProgram(program); 1058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.enableVertexAttribArray(posLoc); 1068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.vertexAttribPointer(posLoc, 4, GL_FLOAT, GL_FALSE, 0, &vertices[0]); 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.drawElements(type, GLsizei(indices.size()), GL_UNSIGNED_SHORT, &indices[0]); 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disableVertexAttribArray(posLoc); 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytemplate<typename T> 1148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid clearEdges(const tcu::PixelBufferAccess& access, const T& color, const IVec4& scissorArea) 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int y = 0; y < access.getHeight(); y++) 1178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int x = 0; x < access.getWidth(); x++) 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (y < scissorArea.y() || 1208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry y >= scissorArea.y() + scissorArea.w() || 1218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry x < scissorArea.x() || 1228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry x >= scissorArea.x()+ scissorArea.z()) 1238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry access.setPixel(color, x, y); 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryglu::ProgramSources genShaders(glu::GLSLVersion version) 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const string vtxSource = "${VERSION}\n" 1308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "${IN} highp vec4 a_position;\n" 1318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "void main(){\n" 1328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry " gl_Position = a_position;\n" 1338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "}\n"; 1348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const string frgSource = "${VERSION}\n" 1368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "${OUT_DECL}" 1378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "uniform highp vec4 u_color;\n" 1388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "void main(){\n" 1398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry " ${OUTPUT} = u_color;\n" 1408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry "}\n"; 1418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry map<string, string> params; 1438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch(version) 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case glu::GLSL_VERSION_100_ES: 1478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry params["VERSION"] = "#version 100"; 1488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry params["IN"] = "attribute"; 1498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry params["OUT_DECL"] = ""; 1508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry params["OUTPUT"] = "gl_FragColor"; 1518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 1528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case glu::GLSL_VERSION_300_ES: 1548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case glu::GLSL_VERSION_310_ES: // Assumed to support 3.0 1558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry params["VERSION"] = "#version 300 es"; 1568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry params["IN"] = "in"; 1578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry params["OUT_DECL"] = "out mediump vec4 f_color;\n"; 1588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry params["OUTPUT"] = "f_color"; 1598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 1608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 1628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(!"Unsupported version"); 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return glu::makeVtxFragSources(tcu::StringTemplate(vtxSource).specialize(params), tcu::StringTemplate(frgSource).specialize(params)); 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry// Wrapper class, provides iterator & reporting logic 1698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass ScissorCase : public tcu::TestCase 1708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic: 1728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ScissorCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char *name, const char* desc, const Vec4& scissorArea); 1738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual ~ScissorCase (void) {} 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual IterateResult iterate (void); 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprotected: 1788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual void render (GLuint program, const IVec4& viewport) const = 0; 1798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::RenderContext& m_renderCtx; 1818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4 m_scissorArea; 1828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}; 1838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryScissorCase::ScissorCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char *name, const char* desc, const Vec4& scissorArea) 1858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : TestCase (testCtx, name, desc) 1868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_renderCtx (renderCtx) 1878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_scissorArea (scissorArea) 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1913c827367444ee418f129b2c238299f49d3264554Jarkko PoyryScissorCase::IterateResult ScissorCase::iterate (void) 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry using TextureTestUtil::RandomViewport; 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glw::Functions& gl = m_renderCtx.getFunctions(); 1968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TestLog& log = m_testCtx.getLog(); 1978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glu::ShaderProgram shader (m_renderCtx, genShaders(glu::getContextTypeGLSLVersion(m_renderCtx.getType()))); 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const RandomViewport viewport (m_renderCtx.getRenderTarget(), 256, 256, deStringHash(getName())); 2008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const IVec4 relScissorArea (int(m_scissorArea.x()*viewport.width), 2018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int(m_scissorArea.y()*viewport.height), 2028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int(m_scissorArea.z()*viewport.width), 2038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int(m_scissorArea.w()*viewport.height)); 2048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const IVec4 absScissorArea (relScissorArea.x() + viewport.x, 2058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry relScissorArea.y() + viewport.y, 2068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry relScissorArea.z(), 2078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry relScissorArea.w()); 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::Surface refImage (viewport.width, viewport.height); 2108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::Surface resImage (viewport.width, viewport.height); 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (!shader.isOk()) 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << shader; 2158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Shader compile/link failed"); 2168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return STOP; 2178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Viewport area is " << IVec4(viewport.x, viewport.y, viewport.width, viewport.height) << TestLog::EndMessage; 2208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Scissor area is " << absScissorArea << TestLog::EndMessage; 2218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Render reference (no scissors) 2238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Rendering reference (scissors disabled)" << TestLog::EndMessage; 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.useProgram(shader.getProgram()); 2278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearColor(0.125f, 0.25f, 0.5f, 1.0f); 2308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearDepthf(1.0f); 2318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearStencil(0); 2328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_DEPTH_TEST); 2338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_STENCIL_TEST); 2348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_SCISSOR_TEST); 2358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 2368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry render(shader.getProgram(), IVec4(viewport.x, viewport.y, viewport.width, viewport.height)); 2388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::readPixels(m_renderCtx, viewport.x, viewport.y, refImage.getAccess()); 2408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GLU_CHECK_ERROR(gl.getError()); 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Render result (scissors) 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Rendering result (scissors enabled)" << TestLog::EndMessage; 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.useProgram(shader.getProgram()); 2488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearColor(0.125f, 0.25f, 0.5f, 1.0f); 2518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearDepthf(1.0f); 2528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearStencil(0); 2538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_DEPTH_TEST); 2548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_STENCIL_TEST); 2558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_SCISSOR_TEST); 2568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.scissor(absScissorArea.x(), absScissorArea.y(), absScissorArea.z(), absScissorArea.w()); 2598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.enable(GL_SCISSOR_TEST); 2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry render(shader.getProgram(), IVec4(viewport.x, viewport.y, viewport.width, viewport.height)); 2628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::readPixels(m_renderCtx, viewport.x, viewport.y, resImage.getAccess()); 2648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GLU_CHECK_ERROR(gl.getError()); 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Manual 'scissors' for reference image 2688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Clearing area outside scissor area from reference" << TestLog::EndMessage; 2698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry clearEdges(refImage.getAccess(), IVec4(32, 64, 128, 255), relScissorArea); 2708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (tcu::floatThresholdCompare(log, "ComparisonResult", "Image comparison result", refImage.getAccess(), resImage.getAccess(), Vec4(0.02f, 0.02f, 0.02f, 0.02f), tcu::COMPARE_LOG_RESULT)) 2728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 2748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed"); 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return STOP; 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Tests scissoring with multiple primitive types 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ScissorPrimitiveCase : public ScissorCase 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 2838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ScissorPrimitiveCase (tcu::TestContext& testCtx, 2848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::RenderContext& renderCtx, 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name, 2868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* desc, 2878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4& scissorArea, 2888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4& renderArea, 2898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry PrimitiveType type, 2908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int primitiveCount); 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual ~ScissorPrimitiveCase (void){} 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected: 2948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual void render (GLuint program, const IVec4& viewport) const; 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 2978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4 m_renderArea; 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const PrimitiveType m_primitiveType; 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int m_primitiveCount; 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryScissorPrimitiveCase::ScissorPrimitiveCase (tcu::TestContext& testCtx, 3038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::RenderContext& renderCtx, 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name, 3058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* desc, 3068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4& scissorArea, 3078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4& renderArea, 3088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry PrimitiveType type, 3098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int primitiveCount) 3108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : ScissorCase (testCtx, renderCtx, name, desc, scissorArea) 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_renderArea (renderArea) 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_primitiveType (type) 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_primitiveCount (primitiveCount) 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid ScissorPrimitiveCase::render (GLuint program, const IVec4&) const 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glw::Functions& gl = m_renderCtx.getFunctions(); 3208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4 white (1.0f, 1.0f, 1.0f, 1.0); 3218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4 primitiveArea (m_renderArea.x()*2.0f-1.0f, 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_renderArea.x()*2.0f-1.0f, 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_renderArea.z()*2.0f, 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_renderArea.w()*2.0f); 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const float quadPositions[] = 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 1.0f, 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1.0f, 1.0f, 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1.0f, 0.0f 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const float triPositions[] = 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1.0f, 0.0f, 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.5f, 1.0f, 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const float linePositions[] = 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1.0f, 1.0f 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const float pointPosition[] = 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.5f, 0.5f 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float* positionSet[] = { pointPosition, linePositions, triPositions, quadPositions }; 3508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int vertexCountSet[]= { 1, 2, 3, 4 }; 3518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int indexCountSet[] = { 1, 2, 3, 6 }; 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint16 baseIndices[] = { 0, 1, 2, 2, 1, 3 }; 3548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float* basePositions = positionSet[m_primitiveType]; 3558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int vertexCount = vertexCountSet[m_primitiveType]; 3568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int indexCount = indexCountSet[m_primitiveType]; 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float scale = 1.44f/deFloatSqrt(float(m_primitiveCount)*2.0f); // Magic value to roughly fill the render area with primitives at a readable density 3598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry vector<float> positions (4*vertexCount*m_primitiveCount); 3608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry vector<deUint16> indices (indexCount*m_primitiveCount); 3618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry de::Random rng (1234); 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int primNdx = 0; primNdx < m_primitiveCount; primNdx++) 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float dx = m_primitiveCount>1 ? rng.getFloat() : 0.0f; 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float dy = m_primitiveCount>1 ? rng.getFloat() : 0.0f; 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int vertNdx = 0; vertNdx < vertexCount; vertNdx++) 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int ndx = primNdx*4*vertexCount + vertNdx*4; 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry positions[ndx+0] = (basePositions[vertNdx*2 + 0]*scale + dx)*primitiveArea.z() + primitiveArea.x(); 3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry positions[ndx+1] = (basePositions[vertNdx*2 + 1]*scale + dy)*primitiveArea.w() + primitiveArea.y(); 3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry positions[ndx+2] = 0.2f; 3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry positions[ndx+3] = 1.0f; 3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int ndx = 0; ndx < indexCount; ndx++) 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry indices[primNdx*indexCount + ndx] = baseIndices[ndx] + primNdx*vertexCount; 3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, "u_color"), 1, white.m_data); 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_primitiveType) 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case TRIANGLE: drawPrimitives(gl, program, GL_TRIANGLES, positions, indices); break; 3868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case LINE: drawPrimitives(gl, program, GL_LINES, positions, indices); break; 3878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case POINT: drawPrimitives(gl, program, GL_POINTS, positions, indices); break; 3888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: DE_ASSERT(false); break; 3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry// Test effect of scissor on default framebuffer clears 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ScissorClearCase : public ScissorCase 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 3968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ScissorClearCase (tcu::TestContext& testCtx, 3978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::RenderContext& renderCtx, 3988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name, 3998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* desc, 4008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4& scissorArea, 4018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 clearMode); 4028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual ~ScissorClearCase (void) {} 4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual void init (void); 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected: 4078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual void render (GLuint program, const IVec4& viewport) const; 4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 4108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 m_clearMode; //!< Combination of the flags accepted by glClear 4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryScissorClearCase::ScissorClearCase (tcu::TestContext& testCtx, 4148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::RenderContext& renderCtx, 4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name, 4168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* desc, 4178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4& scissorArea, 4188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 clearMode) 4198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : ScissorCase (testCtx, renderCtx, name, desc, scissorArea) 4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_clearMode (clearMode) 4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ScissorClearCase::init (void) 4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if ((m_clearMode & GL_DEPTH_BUFFER_BIT) && m_renderCtx.getRenderTarget().getDepthBits() == 0) 4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw tcu::NotSupportedError("Cannot clear depth; no depth buffer present", "", __FILE__, __LINE__); 4288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry else if ((m_clearMode & GL_STENCIL_BUFFER_BIT) && m_renderCtx.getRenderTarget().getStencilBits() == 0) 4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw tcu::NotSupportedError("Cannot clear stencil; no stencil buffer present", "", __FILE__, __LINE__); 4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid ScissorClearCase::render (GLuint program, const IVec4&) const 4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glw::Functions& gl = m_renderCtx.getFunctions(); 4358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4 white (1.0f, 1.0f, 1.0f, 1.0); 4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearColor(0.6f, 0.1f, 0.1f, 1.0); 4388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearDepthf(0.0f); 4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_clearMode & GL_DEPTH_BUFFER_BIT) 4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.enable(GL_DEPTH_TEST); 4438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.depthFunc(GL_GREATER); 4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_clearMode & GL_STENCIL_BUFFER_BIT) 4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearStencil(123); 4498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.enable(GL_STENCIL_TEST); 4508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.stencilFunc(GL_EQUAL, 123, ~0u); 4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_clearMode & GL_COLOR_BUFFER_BIT) 4548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearColor(0.1f, 0.6f, 0.1f, 1.0); 4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clear(m_clearMode); 4578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_SCISSOR_TEST); 4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, "u_color"), 1, white.getPtr()); 4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!(m_clearMode & GL_COLOR_BUFFER_BIT)) 4628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry drawQuad(gl, program, Vec3(-1.0f, -1.0f, 0.5f), Vec3(1.0f, 1.0f, 0.5f)); 4638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_DEPTH_TEST); 4658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_STENCIL_TEST); 4668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass FramebufferBlitCase : public ScissorCase 4698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic: 4718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry FramebufferBlitCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc, const Vec4& scissorArea); 4728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual ~FramebufferBlitCase (void) {} 4738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual void init (void); 4758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual void deinit (void); 4768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprotected: 4788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry typedef de::MovePtr<glu::Framebuffer> FramebufferP; 4798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry enum {SIZE = 64}; 4818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual void render (GLuint program, const IVec4& viewport) const; 4838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry FramebufferP m_fbo; 4858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}; 4868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFramebufferBlitCase::FramebufferBlitCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc, const Vec4& scissorArea) 4888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : ScissorCase(testCtx, renderCtx, name, desc, scissorArea) 4898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FramebufferBlitCase::init (void) 4938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (m_renderCtx.getRenderTarget().getNumSamples()) 4958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry throw tcu::NotSupportedError("Cannot blit to multisampled framebuffer", "", __FILE__, __LINE__); 4968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glw::Functions& gl = m_renderCtx.getFunctions(); 4988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glu::Renderbuffer colorbuf (gl); 4998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 clearColor (1.0f, 0.5, 0.125f, 1.0f); 5008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_fbo = FramebufferP(new glu::Framebuffer(gl)); 5028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, **m_fbo); 5048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindRenderbuffer(GL_RENDERBUFFER, *colorbuf); 5068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, SIZE, SIZE); 5078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.framebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, *colorbuf); 5088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearBufferfv(GL_COLOR, 0, clearColor.getPtr()); 5108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_renderCtx.getDefaultFramebuffer()); 5118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 5128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FramebufferBlitCase::deinit (void) 5148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_fbo.clear(); 5168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 5178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FramebufferBlitCase::render(GLuint program, const IVec4& viewport) const 5198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glw::Functions& gl = m_renderCtx.getFunctions(); 5218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int width = viewport.z(); 5238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int height = viewport.w(); 5248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deInt32 defaultFramebuffer = m_renderCtx.getDefaultFramebuffer(); 5258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_UNREF(program); 5278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // blit to default framebuffer 5298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindFramebuffer(GL_READ_FRAMEBUFFER, **m_fbo); 5308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, defaultFramebuffer); 5318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.blitFramebuffer(0, 0, SIZE, SIZE, viewport.x(), viewport.y(), viewport.x() + width, viewport.y() + height, GL_COLOR_BUFFER_BIT, GL_NEAREST); 5338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindFramebuffer(GL_READ_FRAMEBUFFER, defaultFramebuffer); 5358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 5368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystruct BufferFmtDesc 5388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TextureFormat texFmt; 5408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GLenum colorFmt; 5418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}; 5428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystruct Color 5448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry enum Type {FLOAT, INT, UINT}; 5468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry Type type; 5488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry union 5508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry float f[4]; 5528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deInt32 i[4]; 5538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 u[4]; 5548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry }; 5558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry Color(const float f_[4]) : type(FLOAT) { f[0] = f_[0]; f[1] = f_[1]; f[2] = f_[2]; f[3] = f_[3]; } 5578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry Color(const deInt32 i_[4]) : type(INT) { i[0] = i_[0]; i[1] = i_[1]; i[2] = i_[2]; i[3] = i_[3]; } 5588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry Color(const deUint32 u_[4]) : type(UINT) { u[0] = u_[0]; u[1] = u_[1]; u[2] = u_[2]; u[3] = u_[3]; } 5598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}; 5608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass FramebufferClearCase : public tcu::TestCase 5628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic: 5648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry FramebufferClearCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc, ClearType clearType); 5658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual ~FramebufferClearCase (void) {} 5668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual IterateResult iterate (void); 5688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprivate: 5708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry static void clearBuffers (const glw::Functions& gl, Color color, float depth, int stencil); 5718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry static Color getBaseColor (const BufferFmtDesc& bufferFmt); 5728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry static Color getMainColor (const BufferFmtDesc& bufferFmt); 5738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry static BufferFmtDesc getBufferFormat (ClearType type); 5748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry virtual void render (GLuint program) const; 5768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::RenderContext& m_renderCtx; 5788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const ClearType m_clearType; 5798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}; 5808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFramebufferClearCase::FramebufferClearCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc, ClearType clearType) 5828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : tcu::TestCase (testCtx, name, desc) 5838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_renderCtx (renderCtx) 5848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_clearType (clearType) 5858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 5878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FramebufferClearCase::clearBuffers (const glw::Functions& gl, Color color, float depth, int stencil) 5898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 5908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch(color.type) 5918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case Color::FLOAT: gl.clearBufferfv (GL_COLOR, 0, color.f); break; 5938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case Color::INT: gl.clearBufferiv (GL_COLOR, 0, color.i); break; 5948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case Color::UINT: gl.clearBufferuiv(GL_COLOR, 0, color.u); break; 5958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 5968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(false); 5978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearBufferfv(GL_DEPTH, 0, &depth); 6008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.clearBufferiv(GL_STENCIL, 0, &stencil); 6018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 6028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFramebufferClearCase::IterateResult FramebufferClearCase::iterate (void) 6048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 6058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TestLog& log = m_testCtx.getLog(); 6068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glw::Functions& gl = m_renderCtx.getFunctions(); 6078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glu::ShaderProgram shader (m_renderCtx, genShaders(glu::getContextTypeGLSLVersion(m_renderCtx.getType()))); 6088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glu::Framebuffer fbo (gl); 6108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glu::Renderbuffer colorbuf (gl); 6118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glu::Renderbuffer depthbuf (gl); 6128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const BufferFmtDesc bufferFmt = getBufferFormat(m_clearType); 6148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Color baseColor = getBaseColor(bufferFmt); 6158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int width = 64; 6178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int height = 64; 6188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const IVec4 scissorArea (8, 8, 48, 48); 6208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry vector<deUint8> refData (width*height*bufferFmt.texFmt.getPixelSize()); 6228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry vector<deUint8> resData (width*height*bufferFmt.texFmt.getPixelSize()); 6238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::PixelBufferAccess refAccess (bufferFmt.texFmt, width, height, 1, &refData[0]); 6258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::PixelBufferAccess resAccess (bufferFmt.texFmt, width, height, 1, &resData[0]); 6268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (!shader.isOk()) 6288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 6298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << shader; 6308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Shader compile/link failed"); 6318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return STOP; 6328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 6338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, *fbo); 6358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindFramebuffer(GL_READ_FRAMEBUFFER, *fbo); 6368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Color 6388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindRenderbuffer(GL_RENDERBUFFER, *colorbuf); 6398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.renderbufferStorage(GL_RENDERBUFFER, bufferFmt.colorFmt, width, height); 6408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.framebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, *colorbuf); 6418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Depth/stencil 6438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindRenderbuffer(GL_RENDERBUFFER, *depthbuf); 6448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.renderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); 6458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.framebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, *depthbuf); 6468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Scissor area is " << scissorArea << TestLog::EndMessage; 6488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Render reference 6508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 6518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Rendering reference (scissors disabled)" << TestLog::EndMessage; 6528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.useProgram(shader.getProgram()); 6548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.viewport(0, 0, width, height); 6558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_DEPTH_TEST); 6578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_STENCIL_TEST); 6588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_SCISSOR_TEST); 6598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry clearBuffers(gl, baseColor, 1.0f, 0); 6618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry render(shader.getProgram()); 6638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::readPixels(m_renderCtx, 0, 0, refAccess); 6658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GLU_CHECK_ERROR(gl.getError()); 6668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 6678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Render result 6698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 6708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Rendering result (scissors enabled)" << TestLog::EndMessage; 6718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.useProgram(shader.getProgram()); 6738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.viewport(0, 0, width, height); 6748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_DEPTH_TEST); 6768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_STENCIL_TEST); 6778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_SCISSOR_TEST); 6788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry clearBuffers(gl, baseColor, 1.0f, 0); 6808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.enable(GL_SCISSOR_TEST); 6828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.scissor(scissorArea.x(), scissorArea.y(), scissorArea.z(), scissorArea.w()); 6838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry render(shader.getProgram()); 6858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::readPixels(m_renderCtx, 0, 0, resAccess); 6878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GLU_CHECK_ERROR(gl.getError()); 6888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 6898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 6918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry bool resultOk = false; 6928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (baseColor.type) 6948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 6958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case Color::FLOAT: 6968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry clearEdges(refAccess, Vec4(baseColor.f[0], baseColor.f[1], baseColor.f[2], baseColor.f[3]), scissorArea); 6978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry resultOk = tcu::floatThresholdCompare(log, "ComparisonResult", "Image comparison result", refAccess, resAccess, Vec4(0.02f, 0.02f, 0.02f, 0.02f), tcu::COMPARE_LOG_RESULT); 6988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 6998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case Color::INT: 7018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry clearEdges(refAccess, IVec4(baseColor.i[0], baseColor.i[1], baseColor.i[2], baseColor.i[3]), scissorArea); 7028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry resultOk = tcu::intThresholdCompare(log, "ComparisonResult", "Image comparison result", refAccess, resAccess, UVec4(2, 2, 2, 2), tcu::COMPARE_LOG_RESULT); 7038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 7048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case Color::UINT: 7068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry clearEdges(refAccess, UVec4(baseColor.u[0], baseColor.u[1], baseColor.u[2], baseColor.u[3]), scissorArea); 7078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry resultOk = tcu::intThresholdCompare(log, "ComparisonResult", "Image comparison result", refAccess, resAccess, UVec4(2, 2, 2, 2), tcu::COMPARE_LOG_RESULT); 7088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 7098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 7108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (resultOk) 7128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 7138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry else 7148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed"); 7158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 7168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return STOP; 7188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 7198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryColor FramebufferClearCase::getBaseColor (const BufferFmtDesc& bufferFmt) 7218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 7228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float f[4] = {0.125f, 0.25f, 0.5f, 1.0f}; 7238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deInt32 i[4] = {0, 0, 0, 0}; 7248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 u[4] = {0, 0, 0, 0}; 7258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch(bufferFmt.colorFmt) 7278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 7288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8: return Color(f); 7298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8I: return Color(i); 7308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8UI: return Color(u); 7318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 7328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(false); 7338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 7348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return Color(f); 7368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 7378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryColor FramebufferClearCase::getMainColor (const BufferFmtDesc& bufferFmt) 7398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 7408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float f[4] = {1.0f, 1.0f, 0.5f, 1.0f}; 7418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deInt32 i[4] = {127, -127, 0, 127}; 7428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 u[4] = {255, 255, 0, 255}; 7438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch(bufferFmt.colorFmt) 7458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 7468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8: return Color(f); 7478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8I: return Color(i); 7488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case GL_RGBA8UI: return Color(u); 7498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 7508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(false); 7518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 7528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return Color(f); 7548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 7558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryBufferFmtDesc FramebufferClearCase::getBufferFormat (ClearType type) 7578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 7588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry BufferFmtDesc retval; 7598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (type) 7618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 7628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CLEAR_COLOR_FLOAT: 7638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retval.colorFmt = GL_RGBA16F; 7648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retval.texFmt = tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::HALF_FLOAT); 7658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(!"Floating point clear not implemented");// \todo [2014-1-23 otto] pixel read format & type, nothing guaranteed, need extension... 7668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 7678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CLEAR_COLOR_INT: 7698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retval.colorFmt = GL_RGBA8I; 7708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retval.texFmt = tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32); 7718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 7728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CLEAR_COLOR_UINT: 7748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retval.colorFmt = GL_RGBA8UI; 7758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retval.texFmt = tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32); 7768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 7778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 7798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retval.colorFmt = GL_RGBA8; 7808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry retval.texFmt = tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8); 7818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry break; 7828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 7838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return retval; 7858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 7868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FramebufferClearCase::render (GLuint program) const 7888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 7898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glw::Functions& gl = m_renderCtx.getFunctions(); 7908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const BufferFmtDesc bufferFmt = getBufferFormat(m_clearType); 7928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Color clearColor = getMainColor(bufferFmt); 7938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int clearStencil = 123; 7958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float clearDepth = 0.5f; 7968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (m_clearType) 7988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 7998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CLEAR_COLOR_FIXED: gl.clearBufferfv (GL_COLOR, 0, clearColor.f); break; 8008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CLEAR_COLOR_FLOAT: gl.clearBufferfv (GL_COLOR, 0, clearColor.f); break; 8018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CLEAR_COLOR_INT: gl.clearBufferiv (GL_COLOR, 0, clearColor.i); break; 8028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CLEAR_COLOR_UINT: gl.clearBufferuiv(GL_COLOR, 0, clearColor.u); break; 8038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CLEAR_DEPTH: gl.clearBufferfv (GL_DEPTH, 0, &clearDepth); break; 8048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CLEAR_STENCIL: gl.clearBufferiv (GL_STENCIL, 0, &clearStencil); break; 8058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case CLEAR_DEPTH_STENCIL: gl.clearBufferfi (GL_DEPTH_STENCIL, 0, clearDepth, clearStencil); break; 8068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 8078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 8088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(false); 8098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 8108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 8118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const bool useDepth = (m_clearType == CLEAR_DEPTH || m_clearType == CLEAR_DEPTH_STENCIL); 8128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const bool useStencil = (m_clearType == CLEAR_STENCIL || m_clearType == CLEAR_DEPTH_STENCIL); 8138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 8148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Render something to expose changes to depth/stencil buffer 8158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (useDepth || useStencil) 8168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 8178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (useDepth) 8188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.enable(GL_DEPTH_TEST); 8198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 8208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (useStencil) 8218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.enable(GL_STENCIL_TEST); 8228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 8238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.stencilFunc(GL_EQUAL, clearStencil, ~0u); 8248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.depthFunc(GL_GREATER); 8258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.disable(GL_SCISSOR_TEST); 8268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 8278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(program, "u_color"), 1, clearColor.f); 8288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry drawQuad(gl, program, tcu::Vec3(-1.0f, -1.0f, 0.6f), tcu::Vec3(1.0f, 1.0f, 0.6f)); 8298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 8308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 8318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 8328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // Anonymous 8338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 8348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace ScissorTestInternal 8358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 8368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 8378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::TestNode* createPrimitiveTest (tcu::TestContext& testCtx, 8388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::RenderContext& renderCtx, 8398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name, 8408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* desc, 8418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4& scissorArea, 8428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4& renderArea, 8438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry PrimitiveType type, 8448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int primitiveCount) 8458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 8468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return new ScissorPrimitiveCase(testCtx, renderCtx, name, desc, scissorArea, renderArea, type, primitiveCount); 8478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 8488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 8498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::TestNode* createClearTest (tcu::TestContext& testCtx, 8508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::RenderContext& renderCtx, 8518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name, 8528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* desc, 8538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4& scissorArea, 8548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 clearMode) 8558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 8568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return new ScissorClearCase(testCtx, renderCtx, name, desc, scissorArea, clearMode); 8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::TestNode* createFramebufferClearTest (tcu::TestContext& testCtx, 8608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::RenderContext& renderCtx, 8618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name, 8628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* desc, 8638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ClearType clearType) 8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return new FramebufferClearCase(testCtx, renderCtx, name, desc, clearType); 8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::TestNode* createFramebufferBlitTest (tcu::TestContext& testCtx, 8698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::RenderContext& renderCtx, 8708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name, 8718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* desc, 8728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const Vec4& scissorArea) 8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return new FramebufferBlitCase(testCtx, renderCtx, name, desc, scissorArea); 8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // ScissorTestInternal 8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional 8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gls 8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 881