-------------------------------------------------------------------------
drawElements Quality Program Test Specification
-----------------------------------------------

Copyright 2014 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-------------------------------------------------------------------------
    Framebuffer completeness tests.

Tests:
 + dEQP-GLES3.functional.fbo.completeness.renderable.*
 + dEQP-GLES3.functional.fbo.completeness.attachment_combinations.*
 + dEQP-GLES3.functional.fbo.completeness.size.zero
 + dEQP-GLES3.functional.fbo.completeness.size.distinct
 + dEQP-GLES3.functional.fbo.completeness.size.layer.*
 + dEQP-GLES3.functional.fbo.completeness.size.samples.*

Includes:
 + glCheckFramebufferStatus return value check
 + Single attachments with all standard (and many extension) formats
 + All combinations of color, depth and stencil attachments
 + Zero-sized attachment
 + Differently sized attachments
 + Multilayer attachments
 + Compatibility of multisample attachments

Excludes:
 + Trying FBO operations on in/complete FBOs.
 + Completeness status changes after the FBO is modified.

Description:

These tests check that the implementation reports framebuffer completeness
status correctly. Most test cases create a single framebuffer object, create
some renderbuffers and/or textures and attach them to the FBO, and then call
glCheckFramebufferStatus on it. The returned value is compared against a set
of legal return values that is calculated from the arguments given to image
creation and attachment functions. The test passes if the return value is
found in this set. Some test cases may also expect image creation to fail
before it can be attached.

For each test case, the test log shows the configurations of the created
images and attachments, the set of expected status values and the actual
returned status value.


The "renderable.*" test cases iterate through all the texture formats and
attachment points and attach a single texture or renderbuffer with that format
at that attachment point.

The purpose of these tests is to check that the implementation's notion of
color/depth/stencil-renderability adheres to the GLES specification and
extensions. Both renderability and non-renderability of unexpected formats are
reported as test failures.


The "attachment_combination.*" test cases attach some textures and/or
renderbuffers with suitable formats to none, some or all of the framebuffer's
attachment points. The expected status values are as follows:

* If there are no attachments, GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
  must be returned.

* If there is both a depth and a stencil attachment and one is a texture and
  the other is a renderbuffer, GL_FRAMEBUFFER_UNSUPPORTED must be returned.

* Otherwise, GL_FRAMEBUFFER_COMPLETE must be returned.

Note that GLES3 requires the depth and stencil attachments to be the same
image. When a test case has both a depth and a stencil attachment and either
both are textures or both are renderbuffers, the same image is used for both
attachments.


The "size.*" test cases check that attachment sizes are treated correctly.

The "size.zero" test case creates a framebuffer object with a single
zero-sized renderbuffer attachment. The glCheckFramebufferStatus call is
expected to return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT. Note that creating
and attaching the zero-sized renderbuffer is still expected to succeed.

The "size.distinct" test case creates a framebuffer object with two
attachments with different sizes. The glCheckFramebufferStatus call is
expected to return GL_FRAMEBUFFER_COMPLETE.


The "layer.*" test cases create various layered textures (two-dimensional
array textures or 3D textures) and attach them to framebuffer objects with
glFramebufferTextureLayer. The framebuffer status is expected to be
GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT when the attached layer number is
greater than or equal to the number of layers in the texture.


The "samples.*" test cases attach textures and/or renderbuffers with various
numbers of samples. The framebuffer status is expected to be
GL_FRAMEBUFFER_COMPLETE when the attachments have the same number of samples
(taking textures to have zero samples), or
GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE otherwise.

Because implementations are allowed to allocate more samples than
requested, a framebuffer object whose attachments have requested a
different, but non-zero, number of samples, is allowed to check either
as complete or incomplete.

If a test case requests more samples than the implementation supports,
the case is reported as "not supported".
