-------------------------------------------------------------------------
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-GLES2.functional.fbo.completeness.renderable.*
 + dEQP-GLES2.functional.fbo.completeness.attachment_combinations.*
 + dEQP-GLES2.functional.fbo.completeness.attachment_combinations.exists_supported
 + dEQP-GLES2.functional.fbo.completeness.size.zero
 + dEQP-GLES2.functional.fbo.completeness.size.distinct

Includes:
 + glCheckFramebufferStatus return value check
 + Single attachments with all standard (and many extension) formats
 + All combinations of color0, depth and stencil attachments
   - And other color attachments if GL_NV_fbo_color_attachments is exposed
 + Existence of a supported combination of formats
 + Zero-sized attachment
 + Differently sized 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.

Note that the GLES2 spec allows implementations to return
GL_FRAMEBUFFER_UNSUPPORTED for practically any framebuffer configurations. See
"attachment_combinations.exists_supported" for a test that ensures that at
least one combination of attachment formats is supported.

Also note that the GLES2 spec is notoriously ambiguous regarding the
renderability of unsized formats that correspond to renderable sized formats.
See Khronos bug 7333 <https://cvs.khronos.org/bugzilla/show_bug.cgi?id=7333>
for details. This test expects the following behavior:

* The type/unsized-format combinations corresponding to the color-renderable
  sized formats in table 4.5 are expected to be color-renderable. (Consensus
  in bug 7333.)

* If OES_rgb8_rgba8 is exposed, the combinations ubyte/RGB and ubyte/RGBA are
  expected to be color-renderable. (Consensus in bug 7333.)

* If extensions state explicitly the renderability of a format, the
  implementation is expected to adhere to that.

* If an extension makes another sized format renderable, and there is no text
  about the renderability of the corresponding type/unsized-format
  combination, then it is allowed but not required to be renderable.

* If a type/unsized-format combination is not specified to be renderable and
  does not correspond to a renderable sized format, then it is expected to be
  unrenderable.


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.

* Otherwise, GL_FRAMEBUFFER_COMPLETE or GL_FRAMEBUFFER_UNSUPPORTED must be
  returned.

If the implementation declares support for GL_NV_fbo_color_attachments, all
color attachments are used in the tests.

Some tests may return the status "NotSupported" because the implementation
does support a depth- or stencil-renderable texture format.

Note that GLES2, unlike GLES3, allows the depth and stencil attachments to be
distinct images, and in fact requires them to be, since without extensions
there is no format that is both depth- and stencil-renderable. When a test
case has both a depth and a stencil attachment, they are always distinct
images.

The test case "attachment_combinations.exists_supported" iterates through all
standard GLES2 renderable formats and attempts to find at least one
combination of attachments and formats such that the framebuffer checks as
complete. The test fails if no such combination is found.


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_INCOMPLETE_DIMENSIONS.
