Name OES_copy_image Name Strings GL_OES_copy_image Contact Daniel Koch, NVIDIA Corporation (dkoch 'at' nvidia.com) Contributors Ian Stewart, NVIDIA Graham Connor, Imagination Ben Bowman, Imagination Jonathan Putsman, Imagination And the contributors to ARB_copy_image Notice Copyright (c) 2012-2013 The Khronos Group Inc. Copyright terms at http://www.khronos.org/registry/speccopyright.html Specification Update Policy Khronos-approved extension specifications are updated in response to issues and bugs prioritized by the Khronos OpenGL ES Working Group. For extensions which have been promoted to a core Specification, fixes will first appear in the latest version of that core Specification, and will eventually be backported to the extension document. This policy is described in more detail at https://www.khronos.org/registry/OpenGL/docs/update_policy.php Status Approved by the OpenGL ES Working Group Ratified by the Khronos Board of Promoters on November 7, 2014 Version Last Modified Date: June 18, 2014 Revision: 1 Number OpenGL ES Extension #208 Dependencies OpenGL ES 3.0 is required. This extension is written against the OpenGL ES 3.0 specification. This extension interacts with EXT_texture_view and OES_texture_view. This extension interacts with EXT_texture_buffer and OES_texture_buffer. This extension interacts with EXT_texture_cube_map_array and OES_texture_cube_map_array. This extension interacts with EXT_texture_compression_s3tc. This extension interacts with EXT_texture_compression_rgtc. This extension interacts with EXT_texture_compression_bptc. This extension interacts with KHR_texture_compression_astc_ldr. This extension interacts with KHR_texture_compression_astc_hdr. This extension interacts with OES_texture_compression_astc. Overview This extension enables efficient image data transfer between image objects (i.e. textures and renderbuffers) without the need to bind the objects or otherwise configure the rendering pipeline. This is accomplised by adding a new entry-point CopyImageSubData, which takes a named source and destination. CopyImageSubData does not perform general-purpose conversions such as scaling, resizing, blending, color-space, or format conversions. It should be considered to operate in a manner similar to a CPU memcpy, but using the GPU for the copy. CopyImageSubData supports copies between images with different internal formats, if the formats are compatible as described in this extension. CopyImageSubData also supports copying between compressed and uncompressed images if the compressed block / uncompressed texel sizes are the same. New Procedures and Functions void CopyImageSubDataOES( uint srcName, enum srcTarget, int srcLevel, int srcX, int srcY, int srcZ, uint dstName, enum dstTarget, int dstLevel, int dstX, int dstY, int dstZ, sizei srcWidth, sizei srcHeight, sizei srcDepth); New Tokens None Additions to Chapter 4 of the OpenGL ES 3.0 Specification (Per-Fragment Operations and the Framebuffer) Append to section 4.3.3 (Copying Pixels): The function void CopyImageSubDataOES( uint srcName, enum srcTarget, int srcLevel, int srcX, int srcY, int srcZ, uint dstName, enum dstTarget, int dstLevel, int dstX, int dstY, int dstZ, sizei srcWidth, sizei srcHeight, sizei srcDepth); may be used to copy a region of texel data between two image objects. An image object may be either a texture or a renderbuffer. CopyImageSubData does not perform general-purpose conversions such as scaling, resizing, blending, color-space, or format conversions. It should be considered to operate in a manner similar to a CPU memcpy. CopyImageSubData can copy between images with different internal formats, provided the formats are compatible. CopyImageSubData also allows copying between certain types of compressed and uncompressed internal formats as detailed in Table 4.X.1. This copy does not perform on-the-fly compression or decompression. When copying from an uncompressed internal format to a compressed internal format, each texel of uncompressed data becomes a single block of compressed data. When copying from a compressed internal format to an uncompressed internal format, a block of compressed data becomes a single texel of uncompressed data. The texel size of the uncompressed format must be the same size the block size of the compressed formats. Thus it is permitted to copy between a 128-bit uncompressed format and a compressed format which uses 8-bit 4x4 blocks, or between a 64-bit uncompressed format and a compressed format which uses 4-bit 4x4 blocks. INVALID_OPERATION is generated if the texel size of the uncompressed image is not equal to the block size of the compressed image. The source object is identified by and . Similarly the destination object is identified by and . The interpretation of the name depends on the value of the corresponding target parameter. If the target parameter is RENDERBUFFER, the name is interpreted as the name of a renderbuffer object. If the target parameter is a texture target, the name is interpreted as a texture object. All texture targets are accepted, with the exception of TEXTURE_BUFFER_OES and the cubemap face selectors described in table 3.17. INVALID_ENUM is generated if either target is not RENDERBUFFER or a valid texture target, or is TEXTURE_BUFFER, or is one of the cubemap face selectors described in table 3.21, or if the target does not match the type of the object. INVALID_OPERATION is generated if either object is a texture and the texture is not complete (as defined in section 3.8.13), if the source and destination internal formats are not compatible (see below), or if the number of samples do not match. INVALID_VALUE is generated if either name does not correspond to a valid renderbuffer or texture object according to the corresponding target parameter. and identify the source and destination level of detail. For textures, this must be a valid level of detail in the texture object. For renderbuffers, this value must be zero. INVALID_VALUE is generated if the specified level is not a valid level for the image. , , and specify the lower left texel coordinates of a -wide by -high by -deep rectangular subregion of the source texel array. Similarly, , and specify the coordinates of a subregion of the destination texel array. The source and destination subregions must be contained entirely within the specified level of the corresponding image objects. The dimensions are always specified in texels, even for compressed texture formats. But it should be noted that if only one of the source and destination textures is compressed then the number of texels touched in the compressed image will be a factor of the block size larger than in the uncompressed image. INVALID_VALUE is generated if the dimensions of the either subregion exceeds the boundaries of the corresponding image object, or if the image format is compressed and the dimensions of the subregion fail to meet the alignment constraints of the format. If the source and destination images are identical, and the source and destination rectangles overlap, the result of the operation is undefined. Slices of a TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY_OES, TEXTURE_3D and faces of TEXTURE_CUBE_MAP are all compatible provided they share a compatible internal format, and multiple slices or faces may be copied between these objects with a single call by specifying the starting slice with and , and the number of slices to be copied with . Cubemap textures always have six faces which are selected by a zero-based face index, according to the order specified in table 3.21. For the purposes of CopyImageSubData, two internal formats are considered compatible if any of the following conditions are met: * the formats are the same, * the formats are both listed in the same entry of Table 4.X.2, or * one format is compressed and the other is uncompressed and Table 4.X.1 lists the two formats in the same row. If the formats are not compatible INVALID_OPERATION is generated. ------------------------------------------------------------------------------ | Texel / | Uncompressed | | | Block | internal format | Compressed internal format | | size | | | ------------------------------------------------------------------------------ | 128-bit | RGBA32UI, | COMPRESSED_RGBA_S3TC_DXT3_EXT, | | | RGBA32I, | COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, | | | RGBA32F | COMPRESSED_RGBA_S3TC_DXT5_EXT, | | | | COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, | | | | COMPRESSED_RG_RGTC2_EXT, | | | | COMPRESSED_SIGNED_RG_RGTC2_EXT, | | | | COMPRESSED_RGBA_BPTC_UNORM_EXT, | | | | COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, | | | | COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, | | | | COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, | | | | COMPRESSED_RGBA8_ETC2_EAC, | | | | COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, | | | | COMPRESSED_RG11_EAC, | | | | COMPRESSED_SIGNED_RG11_EAC, | | | | COMPRESSED_RGBA_ASTC_4x4_KHR, | | | | COMPRESSED_RGBA_ASTC_5x4_KHR, | | | | COMPRESSED_RGBA_ASTC_5x5_KHR, | | | | COMPRESSED_RGBA_ASTC_6x5_KHR, | | | | COMPRESSED_RGBA_ASTC_6x6_KHR, | | | | COMPRESSED_RGBA_ASTC_8x5_KHR, | | | | COMPRESSED_RGBA_ASTC_8x6_KHR, | | | | COMPRESSED_RGBA_ASTC_8x8_KHR, | | | | COMPRESSED_RGBA_ASTC_10x5_KHR, | | | | COMPRESSED_RGBA_ASTC_10x6_KHR, | | | | COMPRESSED_RGBA_ASTC_10x8_KHR, | | | | COMPRESSED_RGBA_ASTC_10x10_KHR, | | | | COMPRESSED_RGBA_ASTC_12x10_KHR, | | | | COMPRESSED_RGBA_ASTC_12x12_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, | | | | COMPRESSED_RGBA_ASTC_3x3x3_OES, | | | | COMPRESSED_RGBA_ASTC_4x3x3_OES, | | | | COMPRESSED_RGBA_ASTC_4x4x3_OES, | | | | COMPRESSED_RGBA_ASTC_4x4x4_OES, | | | | COMPRESSED_RGBA_ASTC_5x4x4_OES, | | | | COMPRESSED_RGBA_ASTC_5x5x4_OES, | | | | COMPRESSED_RGBA_ASTC_5x5x5_OES, | | | | COMPRESSED_RGBA_ASTC_6x5x5_OES, | | | | COMPRESSED_RGBA_ASTC_6x6x5_OES, | | | | COMPRESSED_RGBA_ASTC_6x6x6_OES, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES, | | | | COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES | ------------------------------------------------------------------------------ | 64-bit | RGBA16F, RG32F, | COMPRESSED_RGB_S3TC_DXT1_EXT, | | | RGBA16UI, RG32UI, | COMPRESSED_SRGB_S3TC_DXT1_EXT, | | | RGBA16I, RG32I, | COMPRESSED_RGBA_S3TC_DXT1_EXT, | | | | COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, | | | | COMPRESSED_RED_RGTC1_EXT, | | | | COMPRESSED_SIGNED_RED_RGTC1_EXT, | | | | COMPRESSED_RGB8_ETC2, | | | | COMPRESSED_SRGB8_ETC2, | | | | COMPRESSED_R11_EAC, | | | | COMPRESSED_SIGNED_R11_EAC, | | | | COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, | | | | COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 | ------------------------------------------------------------------------------ Table 4.X.1: Compatible internal formats for copying between compressed and uncompressed internal formats with CopyImageSubDataOES. Formats in the same row can be copied between each other. -------------------------------------------------------------------------- | Class | Internal formats | -------------------------------------------------------------------------- | VIEW_CLASS_128_BITS | RGBA32F, RGBA32UI, RGBA32I | -------------------------------------------------------------------------- | VIEW_CLASS_96_BITS | RGB32F, RGB32UI, RGB32I | -------------------------------------------------------------------------- | VIEW_CLASS_64_BITS | RGBA16F, RG32F, RGBA16UI, RG32UI, | | | RGBA16I, RG32I | -------------------------------------------------------------------------- | VIEW_CLASS_48_BITS | RGB16F, RGB16UI, RGB16I | -------------------------------------------------------------------------- | VIEW_CLASS_32_BITS | RG16F, R11F_G11F_B10F, R32F, | | | RGB10_A2UI, RGBA8UI, RG16UI, R32UI, | | | RGBA8I, RG16I, R32I, RGB10_A2, RGBA8, | | | RGBA8_SNORM, SRGB8_ALPHA8, RGB9_E5 | ------------------------------------------------------------------------- | VIEW_CLASS_24_BITS | RGB8, RGB8_SNORM, SRGB8, RGB8UI, RGB8I | -------------------------------------------------------------------------- | VIEW_CLASS_16_BITS | R16F, RG8UI, R16UI, RG8I, R16I, RG8, | | | RG8_SNORM | -------------------------------------------------------------------------- | VIEW_CLASS_8_BITS | R8UI, R8I, R8, R8_SNORM | -------------------------------------------------------------------------- | VIEW_CLASS_RGTC1_RED | COMPRESSED_RED_RGTC1_EXT, | | | COMPRESSED_SIGNED_RED_RGTC1_EXT | -------------------------------------------------------------------------- | VIEW_CLASS_RGTC2_RG | COMPRESSED_RG_RGTC2_EXT, | | | COMPRESSED_SIGNED_RG_RGTC2_EXT | -------------------------------------------------------------------------- | VIEW_CLASS_BPTC_UNORM | COMPRESSED_RGBA_BPTC_UNORM_EXT, | | | COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT | -------------------------------------------------------------------------- | VIEW_CLASS_BPTC_FLOAT | COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, | | | COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT | -------------------------------------------------------------------------- | VIEW_CLASS_S3TC_DXT1_RGB | COMPRESSED_RGB_S3TC_DXT1_EXT, | | | COMPRESSED_SRGB_S3TC_DXT1_EXT | -------------------------------------------------------------------------- | VIEW_CLASS_S3TC_DXT1_RGBA | COMPRESSED_RGBA_S3TC_DXT1_EXT, | | | COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT | -------------------------------------------------------------------------- | VIEW_CLASS_S3TC_DXT3_RGBA | COMPRESSED_RGBA_S3TC_DXT3_EXT, | | | COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT | -------------------------------------------------------------------------- | VIEW_CLASS_S3TC_DXT5_RGBA | COMPRESSED_RGBA_S3TC_DXT5_EXT, | | | COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT | -------------------------------------------------------------------------- | VIEW_CLASS_EAC_R11 | COMPRESSED_R11_EAC, | | | COMPRESSED_SIGNED_R11_EAC | -------------------------------------------------------------------------- | VIEW_CLASS_EAC_RG11 | COMPRESSED_RG11_EAC, | | | COMPRESSED_SIGNED_RG11_EAC | -------------------------------------------------------------------------- | VIEW_CLASS_ETC2_RGB | COMPRESSED_RGB8_ETC2, | | | COMPRESSED_SRGB8_ETC2 | -------------------------------------------------------------------------- | VIEW_CLASS_ETC2_RGBA | COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, | | | COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 | -------------------------------------------------------------------------- | VIEW_CLASS_ETC2_EAC_RGBA | COMPRESSED_RGBA8_ETC2_EAC, | | | COMPRESSED_SRGB8_ALPHA8_ETC2_EAC | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_4x4_RGBA | COMPRESSED_RGBA_ASTC_4x4_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_5x4_RGBA | COMPRESSED_RGBA_ASTC_5x4_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_5x5_RGBA | COMPRESSED_RGBA_ASTC_5x5_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_6x5_RGBA | COMPRESSED_RGBA_ASTC_6x5_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_6x6_RGBA | COMPRESSED_RGBA_ASTC_6x6_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_8x5_RGBA | COMPRESSED_RGBA_ASTC_8x5_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_8x6_RGBA | COMPRESSED_RGBA_ASTC_8x6_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_8x8_RGBA | COMPRESSED_RGBA_ASTC_8x8_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_10x5_RGBA | COMPRESSED_RGBA_ASTC_10x5_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_10x6_RGBA | COMPRESSED_RGBA_ASTC_10x6_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_10x8_RGBA | COMPRESSED_RGBA_ASTC_10x8_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_10x10_RGBA | COMPRESSED_RGBA_ASTC_10x10_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_12x10_RGBA | COMPRESSED_RGBA_ASTC_12x10_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_12x12_RGBA | COMPRESSED_RGBA_ASTC_12x12_KHR, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_3x3x3_RGBA | COMPRESSED_RGBA_ASTC_3x3x3_OES, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_4x3x3_RGBA | COMPRESSED_RGBA_ASTC_4x3x3_OES, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_4x4x3_RGBA | COMPRESSED_RGBA_ASTC_4x4x3_OES, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_4x4x4_RGBA | COMPRESSED_RGBA_ASTC_4x4x4_OES, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_5x4x4_RGBA | COMPRESSED_RGBA_ASTC_5x4x4_OES, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_5x5x4_RGBA | COMPRESSED_RGBA_ASTC_5x5x4_OES, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_5x5x5_RGBA | COMPRESSED_RGBA_ASTC_5x5x5_OES, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_6x5x5_RGBA | COMPRESSED_RGBA_ASTC_6x5x5_OES, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_6x6x5_RGBA | COMPRESSED_RGBA_ASTC_6x6x5_OES, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES | -------------------------------------------------------------------------- | VIEW_CLASS_ASTC_6x6x6_RGBA | COMPRESSED_RGBA_ASTC_6x6x6_OES, | | | COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES | -------------------------------------------------------------------------- Table 4.X.2: Compatible internal formats for CopyImageSubDataOES. Formats in the same entry may be copied between each other. [[Note that if texture_view is supported, this table should be replaced with a reference to Table 3.X.2 from that extension.]] If the internal format does not exactly match the internal format of the original texture, the contents of the memory are reinterpreted in the same manner as for image bindings described in section 3.8.X (Texture Image Loads and Stores). Dependencies on EXT_texture_view or OES_texture_view: As written, this extension incorporates some of the "view class" terminology that is introduced by EXT_texture_view or OES_texture_view. However this is only enough to define the equivalence classes and does not actually imply the texture view capability. If EXT_texture_view or OES_texture_view is supported, Table 4.X.2 should be replaced with a reference to Table 3.X.2 from the appropriate extension instead. Dependencies on EXT_texture_buffer or OES_texture_buffer If EXT_texture_buffer or OES_texture_buffer is not supported, then remove all references to TEXTURE_BUFFER_EXT or TEXTURE_BUFFER_OES, respectively. If EXT_texture_buffer is supported but OES_texture_buffer is not, replace all references to TEXTURE_BUFFER_OES with TEXTURE_BUFFER_EXT. Dependencies on EXT_texture_cube_map_array or OES_texture_cube_map_array If EXT_texture_cube_map_array or OES_texture_cube_map_array is not supported, then remove all references to TEXTURE_CUBE_MAP_ARRAY_EXT or TEXTURE_CUBE_MAP_ARRAY_OES, respectively. If EXT_texture_cube_map_array is supported but OES_texture_cube_map_array is not, replace all references to TEXTURE_CUBE_MAP_ARRAY_OES with TEXTURE_CUBE_MAP_ARRAY_EXT. Dependencies on EXT_texture_compression_s3tc If EXT_texture_compression_s3tc is not supported, remove any references to S3TC compressed texture formats. Dependencies on EXT_texture_compression_rgtc If EXT_texture_compression_rgtc is not supported, remove any references to the RGTC compressed texture formats. Dependencies on EXT_texture_compression_bptc If EXT_texture_compression_bptc is not supported, remove any references to the PBTC compressed texture formats. Dependencies on KHR_texture_compression_astc_ldr If KHR_texture_compression_astc_ldr is not supported, remove any references to the ASTC LDR compressed texture formats. Dependencies on KHR_texture_compression_astc_hdr If KHR_texture_compression_astc_hdr is not supported, remove any references to the ASTC HDR compressed texture formats. Dependencies on OES_texture_compression_astc If OES_texture_compression_astc is not supported, remove any references to the ASTC 3D compressed texture formats. Errors CopyImageSubDataOES may fail with any of the following errors: INVALID_ENUM is generated * if either or - is not RENDERBUFFER or a valid non-proxy texture target - is TEXTURE_BUFFER, or - is one of the cubemap face selectors described in table 3.17, * if the target does not match the type of the object. INVALID_OPERATION is generated * if either object is a texture and the texture is not complete, * if the source and destination formats are not compatible, * if the source and destination number of samples do not match, * if one image is compressed and the other is uncompressed and the block size of compressed image is not equal to the texel size of the compressed image. INVALID_VALUE is generated * if either or does not correspond to a valid renderbuffer or texture object according to the corresponding target parameter, or * if the specified level is not a valid level for the image, or * if the dimensions of the either subregion exceeds the boundaries of the corresponding image object, or * if the image format is compressed and the dimensions of the subregion fail to meet the alignment constraints of the format. Sample Code TBD Issues Note: these issues apply specifically to the definition of OES_copy_image, which is based on the OpenGL ARB_copy_image extension as updated by OpenGL 4.4. Resolved issues from ARB_copy_image have been removed but remain largely applicable to this extension. That extension can be found in the OpenGL Registry. (1) What functionality was removed from ARB_copy_image? - removed mention of proxy textures, TEXTURE_1D_ARRAY target - removed mention of RGBA16, RGBA16_SNORM texture formats - removed compatibility profile interactions and negative borders (2) What functionality was changed or added relative to ARB_copy_image? - added compatibility class definition to avoid texture_view dependency - added ability to copy to/from ETC2/EAC formats and uncompressed formats - added ability to copy between ETC2/EAC formats that are compatible - added ability to copy to/from ASTC formats and uncompressed formats - added ability to copy between ASTC formats that are compatible (3) Is copying from/to images with ETC2/EAC compressed texture formats defined? RESOLVED: Yes. This extension adds support for copying between ETC2/EAC compressed texture formats that belong to the same view class. It also adds the ability to copy between uncompressed texture formats and compressed ETC2/EAC texture formats and in a similar fashion the other compressed formats. This was requirement was not added to GL 4.x, because at the time GL 4.x HW did not natively support ETC2/EAC compressed textures, and thus it was expected that they may be uncompressed or transcoded. It is expected that this may be a very useful capability for mobile parts and so this capability is included here. For GL 4.x hardware that wishes to expose this capability, it will need to transparently handle these copies as if the compressed formats where natively supported. (4) Is copying from/to images with ASTC compressed texture formats defined? RESOLVED. Yes, as in issue 3. Any of the ASTC LHR, HDR, or 3D formats that are supported may be copied within their compatibility class. (5) What is the behavior when the source and destination images are the same? RESOLVED: This was also not stated in GL 4.4, ARB_copy_image or NV_copy_image. This was clarified to be undefined behaviour in Bug 11355. We follow that resolution here. (6) Should the R16, RG16, RGB16, and RGBA16 (and _SNORM) texture formats be supported? RESOLVED. No. OpenGL ES 3.0 does not support these formats. They were considered for late addition to OpenGL ES 3.1 in Bug 11366, but didn't make the cut. In the absence of another extension to add them, they are not supported here either. Revision History Rev. Date Author Changes ---- ---------- -------- ----------------------------------------- 1 06/18/2014 dkoch Initial OES version based on EXT. No functional changes.