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 Framebuffer completeness tests. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fFboCompletenessTests.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsFboCompletenessTests.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sstream> 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glw; 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing deqp::gls::Range; 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace deqp::gls::FboUtil; 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace deqp::gls::FboUtil::config; 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace fboc = deqp::gls::fboc; 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef tcu::TestCase::IterateResult IterateResult; 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string; 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::ostringstream; 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3ColorRenderables[] = 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // GLES3, 4.4.4: "An internal format is color-renderable if it is one of 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // the formats from table 3.12 noted as color-renderable..." 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_R8, GL_RG8, GL_RGB8, GL_RGB565, GL_RGBA4, GL_RGB5_A1, GL_RGBA8, 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_RGB10_A2, GL_RGB10_A2UI, GL_SRGB8_ALPHA8, 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_R8I, GL_R8UI, GL_R16I, GL_R16UI, GL_R32I, GL_R32UI, 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_RG8I, GL_RG8UI, GL_RG16I, GL_RG16UI, GL_RG32I, GL_RG32UI, 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_RGBA8I, GL_RGBA8UI, GL_RGBA16I, GL_RGBA16UI, GL_RGBA32I, GL_RGBA32UI, 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3UnsizedColorRenderables[] = 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // "...or if it is unsized format RGBA or RGB." 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // See Table 3.3 in GLES3. 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_UNSIZED_FORMATKEY(GL_RGBA, GL_UNSIGNED_BYTE), 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_UNSIZED_FORMATKEY(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4), 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_UNSIZED_FORMATKEY(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1), 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_UNSIZED_FORMATKEY(GL_RGB, GL_UNSIGNED_BYTE), 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_UNSIZED_FORMATKEY(GL_RGB, GL_UNSIGNED_SHORT_5_6_5), 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3DepthRenderables[] = 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // GLES3, 4.4.4: "An internal format is depth-renderable if it is one of 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // the formats from table 3.13." 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32F, 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8, 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3StencilRboRenderables[] = 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // GLES3, 4.4.4: "An internal format is stencil-renderable if it is 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // STENCIL_INDEX8..." 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_STENCIL_INDEX8, 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3StencilRenderables[] = 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // "...or one of the formats from table 3.13 whose base internal format is 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // DEPTH_STENCIL." 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8, 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_es3TextureFloatFormats[] = 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_RGBA32F, GL_RGBA16F, GL_R11F_G11F_B10F, 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_RG32F, GL_RG16F, GL_R32F, GL_R16F, 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_RGBA16F, GL_RGB16F, GL_RG16F, GL_R16F, 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 96ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyrystatic const FormatKey s_es3NotRenderableTextureFormats[] = 97ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry{ 98ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry GL_R8_SNORM, GL_RG8_SNORM, GL_RGB8_SNORM, GL_RGBA8_SNORM, 99ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry GL_RGB9_E5, GL_SRGB8, 100ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry GL_RGB8I, GL_RGB16I, GL_RGB32I, 101ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry GL_RGB8UI, GL_RGB16UI,GL_RGB32UI, 102ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry}; 103ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatEntry s_es3Formats[] = 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Renderbuffers don't support unsized formats 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { REQUIRED_RENDERABLE | COLOR_RENDERABLE | TEXTURE_VALID, 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_ARRAY_RANGE(s_es3UnsizedColorRenderables) }, 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { REQUIRED_RENDERABLE | COLOR_RENDERABLE | RENDERBUFFER_VALID | TEXTURE_VALID, 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_ARRAY_RANGE(s_es3ColorRenderables) }, 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { REQUIRED_RENDERABLE | DEPTH_RENDERABLE | RENDERBUFFER_VALID | TEXTURE_VALID, 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_ARRAY_RANGE(s_es3DepthRenderables) }, 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { REQUIRED_RENDERABLE | STENCIL_RENDERABLE | RENDERBUFFER_VALID, 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_ARRAY_RANGE(s_es3StencilRboRenderables) }, 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { REQUIRED_RENDERABLE | STENCIL_RENDERABLE | RENDERBUFFER_VALID | TEXTURE_VALID, 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_ARRAY_RANGE(s_es3StencilRenderables) }, 117ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry { TEXTURE_VALID, 118ef47bf903439ca2c12640ec0f397d29e8bd4f197Jarkko Pöyry GLS_ARRAY_RANGE(s_es3NotRenderableTextureFormats) }, 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // These are not color-renderable in vanilla ES3, but we need to mark them 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // as valid for textures, since EXT_color_buffer_(half_)float brings in 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // color-renderability and only renderbuffer-validity. 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { TEXTURE_VALID, 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_ARRAY_RANGE(s_es3TextureFloatFormats) }, 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// GL_EXT_color_buffer_float 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatKey s_extColorBufferFloatFormats[] = 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_RGBA32F, GL_RGBA16F, GL_R11F_G11F_B10F, GL_RG32F, GL_RG16F, GL_R32F, GL_R16F, 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry// GL_OES_texture_stencil8 1348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic const FormatKey s_extOESTextureStencil8[] = 1358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_STENCIL_INDEX8, 1378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}; 1388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const FormatExtEntry s_es3ExtFormats[] = 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "GL_EXT_color_buffer_float", 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // These are already texture-valid in ES3, the extension just adds RBO 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // support and makes them color-renderable. 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry REQUIRED_RENDERABLE | COLOR_RENDERABLE | RENDERBUFFER_VALID, 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLS_ARRAY_RANGE(s_extColorBufferFloatFormats) }, 1478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "GL_OES_texture_stencil8", 1488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Note: es3 RBO tests actually cover the first two requirements 1498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // - kept here for completeness 1508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry REQUIRED_RENDERABLE | STENCIL_RENDERABLE | TEXTURE_VALID, 1518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GLS_ARRAY_RANGE(s_extOESTextureStencil8) } 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ES3Checker : public Checker 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ES3Checker (void) 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : m_numSamples (-1) 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_depthStencilImage (0) 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_depthStencilType (GL_NONE) {} 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void check (GLenum attPoint, const Attachment& att, const Image* image); 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry //! The common number of samples of images. 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLsizei m_numSamples; 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry //! The common image for depth and stencil attachments. 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLuint m_depthStencilImage; 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLenum m_depthStencilType; 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ES3Checker::check (GLenum attPoint, const Attachment& att, const Image* image) 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLsizei imgSamples = imageNumSamples(*image); 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_numSamples == -1) 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_numSamples = imgSamples; 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // GLES3: "The value of RENDERBUFFER_SAMPLES is the same for all attached 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // renderbuffers and, if the attached images are a mix of renderbuffers 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // and textures, the value of RENDERBUFFER_SAMPLES is zero." 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // On creating a renderbuffer: "If _samples_ is zero, then 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // RENDERBUFFER_SAMPLES is set to zero. Otherwise [...] the resulting 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // value for RENDERBUFFER_SAMPLES is guaranteed to be greater than or 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // equal to _samples_ and no more than the next larger sample count 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // supported by the implementation." 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Either all attachments are zero-sample renderbuffers and/or 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textures, or none of them are. 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry require((m_numSamples == 0) == (imgSamples == 0), 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE); 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // If the attachments requested a different number of samples, the 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // implementation is allowed to report this as incomplete. However, it 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // is also possible that despite the different requests, the 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // implementation allocated the same number of samples to both. Hence 2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // reporting the framebuffer as complete is also legal. 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry canRequire(m_numSamples == imgSamples, 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE); 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // "Depth and stencil attachments, if present, are the same image." 2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (attPoint == GL_DEPTH_ATTACHMENT || attPoint == GL_STENCIL_ATTACHMENT) 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_depthStencilImage == 0) 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_depthStencilImage = att.imageName; 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_depthStencilType = attachmentType(att); 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry require(m_depthStencilImage == att.imageName && 2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_depthStencilType == attachmentType(att), 2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_FRAMEBUFFER_UNSUPPORTED); 2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct NumLayersParams 2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLenum textureKind; //< GL_TEXTURE_3D or GL_TEXTURE_2D_ARRAY 2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLsizei numLayers; //< Number of layers in texture 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLsizei attachmentLayer; //< Layer referenced by attachment 2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static string getName (const NumLayersParams& params); 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static string getDescription (const NumLayersParams& params); 2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystring NumLayersParams::getName (const NumLayersParams& params) 2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ostringstream os; 2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const string kindStr = params.textureKind == GL_TEXTURE_3D ? "3d" : "2darr"; 2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry os << kindStr << "_" << params.numLayers << "_" << params.attachmentLayer; 2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return os.str(); 2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystring NumLayersParams::getDescription (const NumLayersParams& params) 2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ostringstream os; 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const string kindStr = (params.textureKind == GL_TEXTURE_3D 2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ? "3D Texture" 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : "2D Array Texture"); 2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry os << kindStr + ", " 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << params.numLayers << " layers, " 2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "attached layer " << params.attachmentLayer << "."; 2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return os.str(); 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NumLayersTest : public fboc::ParamTest<NumLayersParams> 2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NumLayersTest (fboc::Context& ctx, NumLayersParams param) 2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : fboc::ParamTest<NumLayersParams> (ctx, param) {} 2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IterateResult build (FboBuilder& builder); 2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2603c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIterateResult NumLayersTest::build (FboBuilder& builder) 2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureLayered* texCfg = DE_NULL; 2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const GLenum target = GL_COLOR_ATTACHMENT0; 2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_params.textureKind) 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_TEXTURE_3D: 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry texCfg = &builder.makeConfig<Texture3D>(); 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_TEXTURE_2D_ARRAY: 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry texCfg = &builder.makeConfig<Texture2DArray>(); 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(!"Impossible case"); 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry texCfg->internalFormat = getDefaultFormat(target, GL_TEXTURE); 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry texCfg->width = 64; 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry texCfg->height = 64; 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry texCfg->numLayers = m_params.numLayers; 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const GLuint tex = builder.glCreateTexture(*texCfg); 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureLayerAttachment* att = &builder.makeConfig<TextureLayerAttachment>(); 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry att->layer = m_params.attachmentLayer; 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry att->imageName = tex; 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry builder.glAttach(target, att); 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return STOP; 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry SAMPLES_NONE = -2, 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry SAMPLES_TEXTURE = -1 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct NumSamplesParams 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // >= 0: renderbuffer with N samples, -1: texture, -2: no attachment 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLsizei numSamples[3]; 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static string getName (const NumSamplesParams& params); 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static string getDescription (const NumSamplesParams& params); 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystring NumSamplesParams::getName (const NumSamplesParams& params) 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ostringstream os; 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool first = true; 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (const GLsizei* ns = DE_ARRAY_BEGIN(params.numSamples); 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ns != DE_ARRAY_END(params.numSamples); 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ns++) 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (first) 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry first = false; 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry os << "_"; 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (*ns == SAMPLES_NONE) 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry os << "none"; 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (*ns == SAMPLES_TEXTURE) 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry os << "tex"; 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry os << "rbo" << *ns; 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return os.str(); 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystring NumSamplesParams::getDescription (const NumSamplesParams& params) 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ostringstream os; 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool first = true; 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const char* const s_names[] = { "color", "depth", "stencil" }; 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == DE_LENGTH_OF_ARRAY(params.numSamples)); 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < DE_LENGTH_OF_ARRAY(s_names); i++) 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLsizei ns = params.numSamples[i]; 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (ns == SAMPLES_NONE) 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry continue; 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (first) 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry first = false; 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry os << ", "; 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (ns == SAMPLES_TEXTURE) 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry os << "texture " << s_names[i] << " attachment"; 3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry os << ns << "-sample renderbuffer " << s_names[i] << " attachment"; 3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return os.str(); 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NumSamplesTest : public fboc::ParamTest<NumSamplesParams> 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NumSamplesTest (fboc::Context& ctx, NumSamplesParams param) 3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : fboc::ParamTest<NumSamplesParams> (ctx, param) {} 3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IterateResult build (FboBuilder& builder); 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3643c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIterateResult NumSamplesTest::build (FboBuilder& builder) 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const GLenum s_targets[] = 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_DEPTH_ATTACHMENT, 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Non-integer formats for each attachment type. 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \todo [2013-12-17 lauri] Add fixed/floating/integer metadata for formats so 3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // we can pick one smartly or maybe try several. 3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const GLenum s_formats[] = 3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GL_RGBA8, GL_RGB565, GL_DEPTH_COMPONENT24, 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_targets) == DE_LENGTH_OF_ARRAY(m_params.numSamples)); 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < DE_LENGTH_OF_ARRAY(s_targets); i++) 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const GLenum target = s_targets[i]; 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const ImageFormat fmt = { s_formats[i], GL_NONE }; 3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const GLsizei ns = m_params.numSamples[i]; 3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (ns == -2) 3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry continue; 3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (ns == -1) 3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry attachTargetToNew(target, GL_TEXTURE, fmt, 64, 64, builder); 3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Renderbuffer& rboCfg = builder.makeConfig<Renderbuffer>(); 3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rboCfg.internalFormat = fmt; 3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rboCfg.width = rboCfg.height = 64; 3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rboCfg.numSamples = ns; 3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const GLuint rbo = builder.glCreateRbo(rboCfg); 4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Implementations do not necessarily support sample sizes greater than 1. 4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK_AND_THROW(NotSupportedError, 4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry builder.getError() != GL_INVALID_OPERATION, 4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "Unsupported number of samples"); 4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RenderbufferAttachment& att = builder.makeConfig<RenderbufferAttachment>(); 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry att.imageName = rbo; 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry builder.glAttach(target, &att); 4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return STOP; 4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ES3CheckerFactory : public CheckerFactory 4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Checker* createChecker (void) { return new ES3Checker(); } 4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TestGroup : public TestCaseGroup 4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TestGroup (Context& context); 4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void init (void); 4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ES3CheckerFactory m_checkerFactory; 4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry fboc::Context m_fboc; 4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TestGroup::init (void) 4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(m_fboc.createRenderableTests()); 4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(m_fboc.createAttachmentTests()); 4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(m_fboc.createSizeTests()); 4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TestCaseGroup* layerTests = new TestCaseGroup( 4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry getContext(), "layer", "Tests for layer attachments"); 4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const NumLayersParams s_layersParams[] = 4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { // textureKind numLayers attachmentKind 4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { GL_TEXTURE_2D_ARRAY, 1, 0 }, 4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { GL_TEXTURE_2D_ARRAY, 1, 3 }, 4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { GL_TEXTURE_2D_ARRAY, 4, 3 }, 4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { GL_TEXTURE_2D_ARRAY, 4, 15 }, 4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { GL_TEXTURE_3D, 1, 0 }, 4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { GL_TEXTURE_3D, 1, 15 }, 4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { GL_TEXTURE_3D, 4, 15 }, 4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { GL_TEXTURE_3D, 64, 15 }, 4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (const NumLayersParams* lp = DE_ARRAY_BEGIN(s_layersParams); 4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry lp != DE_ARRAY_END(s_layersParams); 4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ++lp) 4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry layerTests->addChild(new NumLayersTest(m_fboc, *lp)); 4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(layerTests); 4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TestCaseGroup* sampleTests = new TestCaseGroup( 4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry getContext(), "samples", "Tests for multisample attachments"); 4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const NumSamplesParams s_samplesParams[] = 4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 0, SAMPLES_NONE, SAMPLES_NONE } }, 4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 1, SAMPLES_NONE, SAMPLES_NONE } }, 4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 2, SAMPLES_NONE, SAMPLES_NONE } }, 4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 0, SAMPLES_TEXTURE, SAMPLES_NONE } }, 4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 1, SAMPLES_TEXTURE, SAMPLES_NONE } }, 4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 2, SAMPLES_TEXTURE, SAMPLES_NONE } }, 4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 2, 1, SAMPLES_NONE } }, 4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 2, 2, SAMPLES_NONE } }, 4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 0, 0, SAMPLES_TEXTURE } }, 4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 1, 2, 0 } }, 4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 2, 2, 0 } }, 4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 1, 1, 1 } }, 4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { { 1, 2, 4 } }, 4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (const NumSamplesParams* lp = DE_ARRAY_BEGIN(s_samplesParams); 4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry lp != DE_ARRAY_END(s_samplesParams); 4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ++lp) 4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry sampleTests->addChild(new NumSamplesTest(m_fboc, *lp)); 4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(sampleTests); 4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4853c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTestGroup::TestGroup (Context& ctx) 4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCaseGroup (ctx, "completeness", "Completeness tests") 4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_checkerFactory () 4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_fboc (ctx.getTestContext(), ctx.getRenderContext(), m_checkerFactory) 4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const FormatEntries stdRange = GLS_ARRAY_RANGE(s_es3Formats); 4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const FormatExtEntries extRange = GLS_ARRAY_RANGE(s_es3ExtFormats); 4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_fboc.addFormats(stdRange); 4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_fboc.addExtFormats(extRange); 4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_fboc.setHaveMulticolorAtts(true); // Vanilla ES3 has multiple color attachments 4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytcu::TestCaseGroup* createFboCompletenessTests (Context& context) 4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return new TestGroup(context); 5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional 5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3 5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 506