blob: 82811b309463ab1b94a7e5a3dc0e7be8334426fc [file] [log] [blame]
Name
ARB_spirv_extensions
Name String
GL_ARB_spirv_extensions
Contact
Daniel Koch, NVIDIA Corporation (dkoch at nvidia.com)
Contributors
Daniel Rakos, AMD
John Kessenich, Google
Members of the OpenGL Working Group
Status
Complete
Version
Last Modified Date: February 20, 2018
Revision: 9
Number
ARB Extension #194
Dependencies
This extensions is written against the OpenGL 4.5 Specification
(Core Profile - July 7, 2016)
This extension requires ARB_gl_spirv.
This extension interacts with ARB_shader_ballot and
SPV_KHR_shader_ballot.
This extension interacts with ARB_shader_draw_parameters and
SPV_KHR_shader_draw_parameters.
This extension interacts with ARB_shader_group_vote and
SPV_KHR_subgroup_vote.
This extension interacts with NV_stereo_view_rendering and
SPV_NV_stereo_view_rendering.
This extension interacts with NV_viewport_array2 and
SPV_NV_viewport_array2.
This extension interacts with ARB_shader_viewport_layer_array
and SPV_NV_viewport_array2.
This extension interacts with NV_geometry_shader_passthrough
and SPV_NV_geometry_shader_passthrough.
This extension interacts with NV_sample_mask_override_coverage
and SPV_NV_sample_mask_override_coverage.
This extension interacts with AMD_shader_explicit_vertex_parameter
and SPV_AMD_shader_explicit_vertex_parameter.
This extension interacts with AMD_gpu_shader_half_float
and SPV_AMD_gpu_shader_half_float.
This extension interacts with ARB_shader_atomic_counter_ops and
SPV_KHR_shader_atomic_counter_ops.
This extension interacts with ARB_post_depth_coverage,
EXT_post_depth_coverage and SPV_KHR_post_depth_coverage.
This extension interacts with SPV_KHR_storage_buffer_storage_class.
Overview
ARB_gl_spirv added support for using SPIR-V modules in OpenGL.
However it only added support for SPIR-V 1.0 concepts that were part of
the OpenGL 4.5 Core Profile.
There are a great number of additional OpenGL ARB and vendor extensions
which add shading language concepts and since they were defined prior
to the existence of SPIR-V support in OpenGL they don't add SPIR-V support
for their additional features. Ideally GL_ARB_gl_spirv would have added
support for them, but as noted in Issue 27 of that extension, support for
them was left as a future exercise.
Now that at least some of that functionality has been defined via SPIR-V
extensions, there is currently no way for an OpenGL implementation to
advertise that is supports additional SPIR-V extensions.
This extension provides a mechanism for an implementation to advertise
which SPIR-V extensions it supports, and further provides a place where
the SPIR-V environment for those extensions can be documented for OpenGL.
It is expected that this document can be extended over time as SPIR-V
support for additional extensions is added. The mapping between GLSL and
SPIR-V concepts and any other pertinent information can be provided here
as interactions with the corresponding OpenGL and SPIR-V extensions.
New Procedures and Functions
None
New Tokens
Accepted by the <name> parameter of GetStringi:
SPIR_V_EXTENSIONS 0x9553
Accepted by the <pname> parameter of GetIntegerv:
NUM_SPIR_V_EXTENSIONS 0x9554
Modifications to Chapter 7 of the OpenGL 4.5 (Core Profile) Specification
(Programs and Shaders)
[[Modifications when SPV_KHR_storage_buffer_storage_class is supported]]
(replace section "7.6.2.spv SPIR-V Uniform Offsets and Strides" added by
ARB_gl_spirv with the following:)
"The SPIR-V decorations *GLSLShared* or *GLSLPacked* must not be used.
A variable in the *Uniform* or *StorageBuffer* Storage Class decorated
as a *Block* must be explicitly laid out using the *Offset*,
*ArrayStride*, and *MatrixStride* decorations. If the variable is in
the *Uniform* storage class decorated as a *BufferBlock* or in the
*StorageBuffer* storage class decorated as a *Block*, its offsets and
strides must not contradict std430 alignment and minimum offset
requirements. Otherwise, its offsets and strides must not contradict
std140 alignment and minimum offset requirements."
Modifications to Chapter 22 of the OpenGL 4.5 (Core Profile) Specification
(Context State Queries)
Additions to section 22.2 (Pointer, String, and Related Context Queries)
Add the following to the description of tokens accepted by
GetStringi:
"If <name> is SPIR_V_EXTENSIONS, the SPIR-V extension name
corresponding to the <index>th supported SPIR-V extension
(specified as the Name String in the corresponding SPIR-V
extension document) will be returned. <index> may range from zero
to the value of NUM_SPIR_V_EXTENSIONS minus one. The value of
NUM_SPIR_V_EXTENSIONS can be queried using the GetInteger
command. There is no defined relationship between any particular
extension name and the <index> values and a SPIR-V extension name
may correspond to a different <index> in different GL contexts
and/or implementations."
Modify the INVALID_ENUM error for the GetStringi command to be:
"An INVALID_ENUM error is generated if <name> is not EXTENSIONS,
SHADING_LANGUAGE_VERSION, or SPIR_V_EXTENSIONS."
Modifications to Appendix A.spv of the OpenGL 4.5 (Core Profile) Specification
(The OpenGL SPIR-V Execution Environment) [as added by GL_ARB_gl_spirv]
Additions to section A.spv.2 (Valid SPIR-V Built-In Variable Decorations)
Built-in Variable Decoration Minimum GL version (Extension)
---------------------------- -----------------------------
SubgroupEqMaskKHR (ARB_shader_ballot)
SubgroupGeMaskKHR (ARB_shader_ballot)
SubgroupGtMaskKHR (ARB_shader_ballot)
SubgroupLeMaskKHR (ARB_shader_ballot)
SubgroupLtMaskKHR (ARB_shader_ballot)
BaseVertex (ARB_shader_draw_parameters)
BaseInstance (ARB_shader_draw_parameters)
DrawIndex (ARB_shader_draw_parameters)
SecondaryPositionNV (NV_stereo_view_rendering)
SecondaryViewportMaskNV (NV_stereo_view_rendering)
ViewportMaskNV (NV_viewport_array2)
BaryCoordNoPerspAMD (AMD_shader_explicit_vertex_parameter)
BaryCoordNoPerspCentroidAMD (AMD_shader_explicit_vertex_parameter)
BaryCoordNoPerspSampleAMD (AMD_shader_explicit_vertex_parameter)
BaryCoordSmoothAMD (AMD_shader_explicit_vertex_parameter)
BaryCoordSmoothCentroidAMD (AMD_shader_explicit_vertex_parameter)
BaryCoordSmoothSampleAMD (AMD_shader_explicit_vertex_parameter)
BaryCoordPullModelAMD (AMD_shader_explicit_vertex_parameter)
Additions to section A.spv.3 (Valid SPIR-V Capabilities)
Implementations supporting ARB_shader_ballot and
SPV_KHR_shader_ballot must support the following operand declared
by OpCapability:
SubgroupBallotKHR
Implementations supporting ARB_shader_draw_parameters and
SPV_KHR_shader_draw_parameters must support the following operand
declared by OpCapability:
DrawParameters
Implementations supporting ARB_shader_group_vote and
SPV_KHR_subgroup_vote must support the following operand declared
by OpCapability:
SubgroupVoteKHR
Implementations supporting NV_stereo_view_rendering and
SPV_NV_stereo_view_rendering must support the following operand
declared by OpCapability:
ShaderStereoViewNV
Implementations supporting NV_viewport_array2 and
SPV_NV_viewport_array2 must support the following operands
declared by OpCapability:
ShaderViewportIndexLayerNV
ShaderViewportMaskNV
Implementations supporting ARB_shader_viewport_layer_array and
SPV_NV_viewport_array2 must support the following operands
declared by OpCapability:
ShaderViewportIndexLayerNV
Implementations supporting NV_geometry_shader_passthrough and
SPV_NV_geometry_shader_passthrough must support the following
operand declared by OpCapability:
GeometryShaderPassthroughNV
Implementations supporting NV_sample_mask_override_coverage and
SPV_NV_sample_mask_override_coverage must suport the following
operand declared by OpCapability:
SampleMaskOverrideCoverageNV
Implementations supporting AMD_gpu_shader_half_float and
SPV_AMD_gpu_shader_half_float must support the following operand
declared by OpCapability:
Float16
Implementations supporting ARB_shader_atomic_counter_ops and
SPV_KHR_shader_atomic_counter_ops must support the following
operand declared by OpCapability:
AtomicStorageOps
Implementations supporting ARB_post_depth_coverage
(or EXT_post_depth_coverage) and SPV_KHR_post_depth_coverage
must support the following operand declared by OpCapability:
SampleMaskPostDepthCoverage
Additions to section A.spv.4 (Validation rules)
[[Additions for SPV_NV_viewport_array2]]
* The code:ViewportRelativeNV decoration must: only be used on a variable
decorated with code:Layer in the vertex, tessellation evaluation, or
geometry shader stages.
* The code:ViewportRelativeNV decoration must: not be used unless a
variable decorated with one of code:ViewportIndex or
code:ViewportMaskNV is also statically used by the same
code:OpEntryPoint.
* The code:ViewportMaskNV and code:ViewportIndex decorations must: not
both be statically used by one or more code:OpEntryPoint's that form
the vertex processing stages of a graphics pipeline.
[[Additions for SPV_AMD_shader_explicit_vertex_parameter]]
* The code:CustomInterpAMD decoration must not be used on variables with
Storage Class other than *Input* or on variables used in the interface
of non-fragment shader entry points.
[[Modifications if SPV_KHR_storage_buffer_storage_class is supported]]
- Add *StorageBuffer* to the list of Storage Classes that are accepted.
(replace the following statement from ARB_gl_spirv)
- OpTypeRuntimeArray must only be used for the last member of an
OpTypeStruct in the Uniform Storage Class and is decorated as
BufferBlock.
(with the following:)
- OpTypeRuntimeArray must: only be used for the last member of an
OpTypeStruct that is in the StorageBuffer storage class
decorated as Block, or that is in the Uniform storage
class decorated as BufferBlock.
New State
Add the following rows to Table 23.56 (Implementation Dependent Version
and Extensions support)
Get Value Type Get Minimum Description Sec.
Command Value
--------------------- ----- ----------- ------- ---------------- ----
SPIR_V_EXTENSIONS n x S GetStringi - Supported SPIR-V 22.2
extension names
NUM_SPIR_V_EXTENSIONS Z+ GetIntegerv 0 No. of supported 22.2
SPIR-V extension
names
Interactions with ARB_shader_ballot and SPV_KHR_shader_ballot:
When using these extensions the following GLSL -> SPIR-V mapping is used:
* in uint64_t gl_SubGroupEqMaskARB; -> SubgroupEqMaskKHR,
* in uint64_t gl_SubGroupGeMaskARB; -> SubgroupGeMaskKHR,
* in uint64_t gl_SubGroupGtMaskARB; -> SubgroupGtMaskKHR,
* in uint64_t gl_SubGroupLeMaskARB; -> SubgroupLeMaskKHR,
* in uint64_t gl_SubGroupLtMaskARB; -> SubgroupLtMaskKHR,
* in uint gl_SubGroupInvocationARB; -> SubgroupLocalInvocationId,
* uniform uint gl_SubGroupSizeARB; -> SubgroupSize,
* ballotARB() -> OpSubgroupBallotKHR,
* readFirstInvocationARB() -> OpSubgroupFirstInvocationKHR, and
* readInvocationARB() -> OpSubgroupReadInvocationKHR.
Interactions with ARB_shader_draw_parameters and
SPV_KHR_shader_draw_parameters:
When using these extensions the following GLSL -> SPIR-V mapping is used:
* in int gl_BaseInstanceARB; -> BaseInstance,
* in int gl_BaseVertexARB; -> BaseVertex, and
* in int gl_DrawIDARB; -> DrawIndex.
Interactions with ARB_shader_group_vote and SPV_KHR_subgroup_vote:
When using these extensions the following GLSL -> SPIR-V mapping is used:
* anyInvocationARB() -> OpSubgroupAnyKHR,
* allInvocationsARB() -> OpSubgroupAllKHR, and
* allInvocationsEqualARB() -> OpSubgroupAllEqualKHR.
Interactions with NV_stereo_view_rendering and SPV_NV_stereo_view_rendering:
When using these extensions the following GLSL -> SPIR-V mapping is used:
* highp vec4 gl_SecondaryPositionNV; -> SecondaryPositionNV,
* highp int gl_SecondaryViewportMaskNV[]; -> SecondaryViewportMaskNV, and
* layout (secondary_view_offset = n) -> SecondaryViewportRelativeNV.
Interactions with NV_viewport_array2 and SPV_NV_viewport_array2:
When using these extensions the following GLSL -> SPIR-V mapping is used:
* highp int gl_ViewportMask[] -> ViewportMaskNV, and
* layout (viewport_relative) -> ViewportRelativeNV.
Interactions with ARB_shader_viewport_layer_array and SPV_NV_viewport_array2:
When using these extensions, gl_Layer and gl_ViewportIndex can be written
from Vertex or Tessellation shaders.
Interactions with NV_geometry_shader_passthrough and
SPV_NV_geometry_shader_passthrough:
When using these extensions the following GLSL -> SPIR-V mapping is used:
* layout(passthrough) -> PassthroughNV.
Interactions with NV_sample_mask_override_coverage and
SPV_NV_sample_mask_override_coverage:
When using these extensions the following GLSL -> SPIR-V mapping is used:
* layout(override_coverage) -> OverrideCoverageNV.
Interactions with AMD_shader_explicit_vertex_parameter and
SPV_AMD_shader_explicit_vertex_parameter:
When using these extensions the following GLSL -> SPIR-V mapping is used:
* explicitInterpAMD -> ExplicitInterpAMD
* in vec2 gl_BaryCoordNoPerspAMD; -> BaryCoordNoPerspAMD
* in vec2 gl_BaryCoordNoPerspCentroidAMD; -> BaryCoordNoPerspCentroidAMD
* in vec2 gl_BaryCoordNoPerspSampleAMD; -> BaryCoordNoPerspSampleAMD
* in vec2 gl_BaryCoordSmoothAMD; -> BaryCoordSmoothAMD
* in vec2 gl_BaryCoordSmoothCentroidAMD; -> BaryCoordSmoothCentroidAMD
* in vec2 gl_BaryCoordSmoothSampleAMD; -> BaryCoordSmoothSampleAMD
* in vec3 gl_BaryCoordPullModelAMD; -> BaryCoordPullModelAMD
Interactions with AMD_gpu_shader_half_float and SPV_AMD_gpu_shader_half_float:
When using these extensions, 16-bit floating-point types are permitted
for a number of additional data-types and built-in functions.
Interactions with ARB_shader_atomic_counter_ops and
SPV_KHR_shader_atomic_counter_ops:
When using these extensions the following GLSL -> SPIR-V mapping is used:
* uint atomicCounterAddARB() -> OpAtomicIAdd
* uint atomicCounterSubtractARB() -> OpAtomicISub
* uint atomicCounterMinARB() -> OpAtomicUMin
* uint atomicCounterMaxARB() -> OpAtomicUMax
* uint atomicCounterAndARB() -> OpAtomicAnd
* uint atomicCounterOrARB() -> OpAtomicOr
* uint atomicCounterXorARB() -> OpAtomicXor
* uint atomicCounterExchangeARB() -> OpAtomicExchange
* uint atomicCounterCompSwapARB() -> OpAtomicCompareExchange
Interactions with ARB_post_depth_coverage or EXT_post_depth_coverage and
SPV_KHR_post_depth_coverage:
When using these extensions the following GLSL -> SPIR-V mapping is used:
* layout(post_depth_coverage) -> PostDepthCoverage.
Interactions with SPV_KHR_storage_buffer_storage_class:
When SPV_KHR_storage_buffer_storage class is supported, shader storage
buffer objects can be mapped to SPIR-V using the *StorageBuffer* storage
class and decorated as *Block*, which is considered equivalent (and
preferred to) declaring them with the *Uniform* storage class and
decorating them with the *BufferBlock* decoration:
buffer blockN { ... } ...; -> Uniform, with BufferBlock decoration
buffer blockN { ... } ...; -> StorageBuffer, with Block decoration (preferred)
If SPV_KHR_storage_buffer_storage_class is not supported, ignore all
references to the StorageBuffer storage class.
Issues
1. Where should we document environment interactions for new SPIR-V
extensions?
DISCUSSION. The environment interactions could be:
a) added to the corresponding (existing) GL extension? This means they
would be spread across all manner of documents and hard to find.
We would prefer to have them documented in few locations.
b) added to ARB_gl_spirv? This means ARB_gl_spirv would be an ever
growing document which is a bit strange as it gives no way to
advertise or enable the new functionality. Also that document effectively
corresponds go GL 4.5 level functionality and is going to be rolled
into OpenGL 4.6.
c) added to this extension? This document becomes the ever growing version
instead, and it does provide a query to be able to tell if new
functionality is supported by an implementation.
RESOLVED. Pick (c). New GL extensions should add their SPIR-V environment
restrictions for OpenGL to this document. It it is recommended to include a
pointer to this extension from the new GL extension.
2. Does that mean we can add brand new SPIR-V functionality to GL just by
editing this extension?
RESOLVED. Only for shader functionality that already exists in OpenGL
by a previous extension. For completely new functionality it should be
done via a new API extension that adds any necessary API support as
well as defining the GLSL-version of the functionality.
3. If a new GL extension is added that includes SPIR-V support via a
new SPIR-V extension does it's SPIR-V extension also get enumerated by
the SPIR_V_EXTENSIONS_ARB query?.
RESOLVED. Yes. It's good to include it for consistency. Any SPIR-V
functionality supported beyond the SPIR-V version that is required
for the GL API version should be enumerated.
4. Does (3) mean that we should have a query for the version of SPIR-V
that is supported as well?
RESOLVED. No. With ARB_gl_spirv (and in OpenGL 4.6) OpenGL only supports
SPIR-V 1.0. If we want to support additional versions of SPIR-V we'll need
to update the SPIR-V environment which will require a new GL extension to
to do this.
Revision History
Rev. Date Author Changes
---- ----------- ------------ ---------------------------------
1 2017-01-22 dgkoch Initial revision
2 2017-04-08 dgkoch Add additional extensions and issues.
3 2017-04-21 dgkoch Assign tokens
4 2017-04-22 dgkoch Add SPV_KHR_shader_atomic_counter_ops
and add GLSL->SPIR-V mappings.
5 2017-04-24 dgkoch remove ARB suffixes and resolve issue 4.
6 2017-04-25 dgkoch Add SPV_KHR_post_depth_coverage.
7 2017-05-09 dgkoch fix typos.
8 2017-07-14 dgkoch Add SPV_KHR_storage_buffer_storage_class.
9 2018-02-20 dgkoch Update storage class whitelist to include
storage buffers (SPIR-V/issues/166)