зеркало из https://github.com/AvaloniaUI/angle.git
334 строки
17 KiB
Plaintext
334 строки
17 KiB
Plaintext
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.
|