| Name |
| |
| ANGLE_external_objects_flags |
| |
| Name Strings |
| |
| GL_ANGLE_memory_object_flags |
| |
| Contributors |
| |
| Shahbaz Youssefi, Google |
| |
| Contact |
| |
| Shahbaz Youssefi, Google (syoussefi 'at' google.com) |
| |
| Status |
| |
| Draft |
| |
| Version |
| |
| Last Modified Date: Nov 10, 2021 |
| Revision: 2 |
| |
| Number |
| |
| TBD |
| |
| Dependencies |
| |
| Written against the OpenGL 4.5 and OpenGL ES 3.2 specifications |
| |
| GL_ANGLE_memory_object_flags requires GL_EXT_memory_object. |
| |
| Overview |
| |
| Building upon the OpenGL memory object framework defined in |
| EXT_external_objects, this extension introduces new Texture entry points |
| for specifying create and usage flags parameters. These parameters match |
| an external Texture's corresponding Vulkan create and usage flags. This |
| allows applications to drop usage flags that are detrimental to |
| performance, or add create flags as necessary. |
| |
| Additionally, these entry points take the pointer to the chain of extension |
| structures appended to VkImageCreateInfo, so that the OpenGL implementation |
| can recreate the image identically. |
| |
| New Procedures and Functions |
| |
| The following commands are added: |
| |
| void TexStorageMemFlags2DANGLE(enum target, |
| sizei levels, |
| enum internalFormat, |
| sizei width, |
| sizei height, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| void TexStorageMemFlags2DMultisampleANGLE(enum target, |
| sizei samples, |
| enum internalFormat, |
| sizei width, |
| sizei height, |
| boolean fixedSampleLocations, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| void TexStorageMemFlags3DANGLE(enum target, |
| sizei levels, |
| enum internalFormat, |
| sizei width, |
| sizei height, |
| sizei depth, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| void TexStorageMemFlags3DMultisampleANGLE(enum target, |
| sizei samples, |
| enum internalFormat, |
| sizei width, |
| sizei height, |
| sizei depth, |
| boolean fixedSampleLocations, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| [[ The following are added if direct state access is supported ]] |
| |
| void TextureStorageMemFlags2DANGLE(uint texture, |
| sizei levels, |
| enum internalFormat, |
| sizei width, |
| sizei height, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| void TextureStorageMemFlags2DMultisampleANGLE(uint texture, |
| sizei samples, |
| enum internalFormat, |
| sizei width, |
| sizei height, |
| boolean fixedSampleLocations, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| void TextureStorageMemFlags3DANGLE(uint texture, |
| sizei levels, |
| enum internalFormat, |
| sizei width, |
| sizei height, |
| sizei depth, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| void TextureStorageMemFlags3DMultisampleANGLE(uint texture, |
| sizei samples, |
| enum internalFormat, |
| sizei width, |
| sizei height, |
| sizei depth, |
| boolean fixedSampleLocations, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| [[ The following are available in OpenGL only ]] |
| |
| void TexStorageMemFlags1DANGLE(enum target, |
| sizei levels, |
| enum internalFormat, |
| sizei width, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| [[ The following are availble in OpenGL only, and only when |
| direct state access is available ]] |
| |
| void TextureStorageMemFlags1DANGLE(uint texture, |
| sizei levels, |
| enum internalFormat, |
| sizei width, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| New Tokens |
| |
| The following tokens are added: |
| |
| Accepted by the <createFlags> parameter of TexStorageMemFlags*ANGLE() and |
| TextureStorageMemFlags*ANGLE(). |
| |
| CREATE_SPARSE_BINDING_BIT_ANGLE 0x00000001 |
| CREATE_SPARSE_RESIDENCY_BIT_ANGLE 0x00000002 |
| CREATE_SPARSE_ALIASED_BIT_ANGLE 0x00000004 |
| CREATE_MUTABLE_FORMAT_BIT_ANGLE 0x00000008 |
| CREATE_CUBE_COMPATIBLE_BIT_ANGLE 0x00000010 |
| CREATE_ALIAS_BIT_ANGLE 0x00000400 |
| CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_ANGLE 0x00000040 |
| CREATE_2D_ARRAY_COMPATIBLE_BIT_ANGLE 0x00000020 |
| CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_ANGLE 0x00000080 |
| CREATE_EXTENDED_USAGE_BIT_ANGLE 0x00000100 |
| CREATE_PROTECTED_BIT_ANGLE 0x00000800 |
| CREATE_DISJOINT_BIT_ANGLE 0x00000200 |
| CREATE_CORNER_SAMPLED_BIT_ANGLE 0x00002000 |
| CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_ANGLE 0x00001000 |
| CREATE_SUBSAMPLED_BIT_ANGLE 0x00004000 |
| |
| Accepted by the <usageFlags> parameter of TexStorageMemFlags*ANGLE() and |
| TextureStorageMemFlags*ANGLE(). |
| |
| USAGE_TRANSFER_SRC_BIT_ANGLE 0x00000001 |
| USAGE_TRANSFER_DST_BIT_ANGLE 0x00000002 |
| USAGE_SAMPLED_BIT_ANGLE 0x00000004 |
| USAGE_STORAGE_BIT_ANGLE 0x00000008 |
| USAGE_COLOR_ATTACHMENT_BIT_ANGLE 0x00000010 |
| USAGE_DEPTH_STENCIL_ATTACHMENT_BIT_ANGLE 0x00000020 |
| USAGE_TRANSIENT_ATTACHMENT_BIT_ANGLE 0x00000040 |
| USAGE_INPUT_ATTACHMENT_BIT_ANGLE 0x00000080 |
| USAGE_SHADING_RATE_IMAGE_BIT_ANGLE 0x00000100 |
| USAGE_FRAGMENT_DENSITY_MAP_BIT_ANGLE 0x00000200 |
| |
| Additions to Chapter 8 of the OpenGL 4.5 Specification (Textures and |
| Samplers) |
| |
| For each list of TexStorage* commands in the 1D, 2D, 3D, |
| 2DMultisample, and 3DMultisample families, add the following |
| variants: |
| |
| void TexStorageMemFlags*ANGLE(<existing parameters>, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| void TextureStorageMemFlags*ANGLE(<existing parameters>, |
| uint memory, |
| uint64 offset, |
| bitfield createFlags, |
| bitfield usageFlags, |
| const void *imageCreateInfoPNext); |
| |
| For each of the TexStorageMemFlags*ANGLE commands, move the description from |
| the corresponding TexStorageMem*EXT from EXT_external_objects under that |
| command and add the following language: |
| |
| "The implementation should apply the same semantics to the internal |
| storage of the texture based on <createFlags>, <usageFlags> and |
| <imageCreateInfoPNext> as the corresonding VkImageCreateFlags, |
| VkImageUsageFlags and chained structs to VkImageCreateInfo would have |
| on a Vulkan image respectively. See tables 8.17 and 8.18 for the |
| mapping between the GL and Vulkan flags. It is undefined behavior if |
| the application provides create flags, usage flags or chained structs |
| that are not identical to those used to create the Vulkan image." |
| |
| Table 8.17: Create flags and corresponding Vulkan Image Create Flags |
| |
| | Create Flag | Equivalent Vulkan Create Flag | |
| +----------------------------------------------------+-----------------------------------------------------------+ |
| | CREATE_SPARSE_BINDING_BIT_ANGLE | VK_IMAGE_CREATE_SPARSE_BINDING_BIT | |
| | CREATE_SPARSE_RESIDENCY_BIT_ANGLE | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | |
| | CREATE_SPARSE_ALIASED_BIT_ANGLE | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | |
| | CREATE_MUTABLE_FORMAT_BIT_ANGLE | VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | |
| | CREATE_CUBE_COMPATIBLE_BIT_ANGLE | VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | |
| | CREATE_ALIAS_BIT_ANGLE | VK_IMAGE_CREATE_ALIAS_BIT | |
| | CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_ANGLE | VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT | |
| | CREATE_2D_ARRAY_COMPATIBLE_BIT_ANGLE | VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT | |
| | CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_ANGLE | VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT | |
| | CREATE_EXTENDED_USAGE_BIT_ANGLE | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT | |
| | CREATE_PROTECTED_BIT_ANGLE | VK_IMAGE_CREATE_PROTECTED_BIT | |
| | CREATE_DISJOINT_BIT_ANGLE | VK_IMAGE_CREATE_DISJOINT_BIT | |
| | CREATE_CORNER_SAMPLED_BIT_ANGLE | VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV | |
| | CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_ANGLE | VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT | |
| | CREATE_SUBSAMPLED_BIT_ANGLE | VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT | |
| +----------------------------------------------------------------------------------------------------------------+ |
| |
| Table 8.18: Usage flags and corresponding Vulkan Image Usage Flags |
| |
| | Usage Flag | Equivalent Vulkan Usage Flag | |
| +------------------------------------------+---------------------------------------------+ |
| | USAGE_TRANSFER_SRC_BIT_ANGLE | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | |
| | USAGE_TRANSFER_DST_BIT_ANGLE | VK_IMAGE_USAGE_TRANSFER_DST_BIT | |
| | USAGE_SAMPLED_BIT_ANGLE | VK_IMAGE_USAGE_SAMPLED_BIT | |
| | USAGE_STORAGE_BIT_ANGLE | VK_IMAGE_USAGE_STORAGE_BIT | |
| | USAGE_COLOR_ATTACHMENT_BIT_ANGLE | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | |
| | USAGE_DEPTH_STENCIL_ATTACHMENT_BIT_ANGLE | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | |
| | USAGE_TRANSIENT_ATTACHMENT_BIT_ANGLE | VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | |
| | USAGE_INPUT_ATTACHMENT_BIT_ANGLE | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | |
| | USAGE_SHADING_RATE_IMAGE_BIT_ANGLE | VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV | |
| | USAGE_FRAGMENT_DENSITY_MAP_BIT_ANGLE | VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT | |
| +----------------------------------------------------------------------------------------+ |
| |
| Add the following errors for each of the TexStorageMemFlags*ANGLE commands: |
| |
| "An INVALID_VALUE error is generated if <createFlags> has a bit set |
| other than those specified in table 8.17." |
| |
| "An INVALID_VALUE error is generated if <usageFlags> has a bit set |
| other than those specified in table 8.18." |
| |
| For each of the TexStorageMem*EXT commands, change the description of |
| TexStorageMem*EXT and TextureStorageMem*EXT as such: |
| |
| "Calling TexStorageMem*EXT is equivalent to calling |
| TexStorageMemFlags*ANGLE with 0 as <createFlags>, all |
| Vulkan-supported usage flags as <usageFlags>, even if there are no |
| corresponding GL flags specified in this extension, and NULL as |
| <imageCreateInfoPNext>." |
| |
| Issues |
| |
| 1) Can the GL and Vulkan create and usage flag values diverge? |
| |
| RESOLVED: No. It is expected for the application to provide the flags |
| used to create the Vulkan image verbatim. |
| |
| 2) What if Vulkan adds new create and usage flags? |
| |
| RESOLVED: If the implementation is too old to be aware of those flags, |
| the functions from GL_EXT_memory_object must be used instead. New flags |
| can be added through new extensions that build on this extension. |
| |
| 3) Should the GL implementation apply the same validation as Vulkan based |
| on the create and usage flags? |
| |
| RESOLVED: No. The application has already created an image with these |
| flags in Vulkan, so the GL implementation can assume they are valid. |
| Validating this is expensive and unnecessary in almost all applications. |
| |
| 4) How can extension structs applied to VkImageCreateInfo be communicated |
| to the GL implementation? |
| |
| RESOLVED: The chain of structs itself is directly passed to the |
| implementation. |
| |
| Revision History |
| |
| Revision 2, 2021-11-10 (Shahbaz Youssefi) |
| - Added the imageCreateInfoPNext parameter. |
| |
| Revision 1, 2020-08-03 (Shahbaz Youssefi) |
| - Initial draft based on EXT_external_objects. |