-------------------------------------------------------------------------
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.
-------------------------------------------------------------------------
    Object lifetime tests.

Tests:
 + dEQP-GLES3.functional.lifetime.*

Includes:
 + The following OpenGL ES 3.0 object types
   - Buffers
   - Textures
   - Renderbuffers
   - Framebuffers
   - Shaders
   - Programs
   - Queries
   - Transform feedbacks
   - Vertex arrays
   - Samplers
 + Object existence tests based on Is* queries
   - After calling Gen* or Create*
   - After calling Gen* or Create*, then Delete*
   - After calling Gen*, then Bind*
   - After calling Gen*, then Bind*, then Delete*
   - After calling Bind* without preceding Gen*
   - After calling CreateProgram, then UseProgram, then DeleteProgram
   - After calling BeginTransformFeedback, then DeleteTransformFeedbacks
 + Tests for deleting an object that is attached to a container
   - Is* queries for the name of the deleted object
   - Reading from the container
   - Writing to the container

Excludes:
 + Sync objects
 + Deleting an object that is currently bound in another context

Description:

These tests check that creation and deletion of objects adheres to the
OpenGL ES 3.0 specification. The tests check the existence of objects as
reported by the Is* family of GL functions, the state of bindings as
reported in various state variables, and the behavior of containers with
deleted objects.

NOTE: Because these tests try to delete objects that are directly or
indirectly attached to the current context, a faulty OpenGL ES
implementation may reclaim and later reallocate memory that is still
being referenced. This may result in unpredictable errors at some later
time. Use of external memory debugging tools may be required to
accurately identify these errors.

The "gen.*" test cases call the object type's Gen* or Create* function
to allocate a new name, and then check whether the name is used, i.e.
whether a new object was created for the name (as reported by the result
of the corresponding Is* function). In OpenGL ES 3.0, the Create*
functions and the GenSamplers function must always create an object, and
the other Gen* functions must never create an object.

The "delete.*" test cases call an object type's Gen* or Create* function
followed by the Delete* function. They then check that the generated
name is no longer in use.

The "bind.*" test cases call an object type's Gen* function followed by
its Bind* function. They then check that the name is in use.

The "delete_bound.*" test cases call an object type's Gen* function
followed by its Bind* function and Delete* function. They then check
that the name is no longer in use and that the binding has been removed.

The "bind_no_gen.*" test cases call the object type's Bind* function for
a random name that has not been produced by the Gen* function. They then
check whether the function call succeeded. In OpenGL ES 3.0, the
BindBuffer, BindFramebuffer, BindRenderbuffer and BindTexture functions
must succeed for arbitrary object names, and the other Bind* functions
must fail.

The "delete_used.program" test case creates a new program object (along
with associated shader objects) and makes it the current program with
the glUseProgram function. The program object is then deleted. The test
checks that the name of the program remains in use and is flagged for
deletion. Then the program is made non-current and the test checks that
the name becomes unused.

The "delete_active.transform_feedback" test case creates a new transform
feedback object, makes it active with the BeginTransformFeedback
function, and then attempts to delete it. The test checks that the
deletion fails.

The "attach.*" family of test cases create a container object (a
framebuffer, vertex array, transform feedback, or program) and attach
another object (a texture, renderbuffer, buffer or shader) to it. The
attached object is then deleted.

In the "attach.deleted_name.*" test cases, the container is queried for
its attachment, and the existence of the deleted attachment object is
checked. In OpenGL ES 3.0, shader objects must exist even after deletion
if they are attached to a program.

In the "attach.deleted_input.*" test cases, the container is read from
(by reading a framebuffer's pixel contents or using a program or vertex
array for drawing) first before the attachment is deleted, and then
again after deleting the attachment and creating a new object of the
attachment type. If the results differ, the new object erroneously
affected the container's state.

In the "attach.deleted_output.*" test cases, the container is written to
(by drawing to a framebuffer or by using a transform feedback) first
after deleting the attachment and then again after creating a new object
of the attachment type. If the writing affected the new object state, it
erroneously shared state with the deleted attachment.
