blob: 6b916cd3d7c9899674b3a1d170d96c347db96adf [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 1.5.8">
<meta name="author" content="Khronos&#174; OpenCL Working Group">
<title>The OpenCL&#8482; SPIR-V Environment Specification</title>
<style>
/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
/* ========================================================================== HTML5 display definitions ========================================================================== */
/** Correct `block` display not defined in IE 8/9. */
article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; }
/** Correct `inline-block` display not defined in IE 8/9. */
audio, canvas, video { display: inline-block; }
/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */
audio:not([controls]) { display: none; height: 0; }
/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */
[hidden], template { display: none; }
script { display: none !important; }
/* ========================================================================== Base ========================================================================== */
/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */
html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ }
/** Remove default margin. */
body { margin: 0; }
/* ========================================================================== Links ========================================================================== */
/** Remove the gray background color from active links in IE 10. */
a { background: transparent; }
/** Address `outline` inconsistency between Chrome and other browsers. */
a:focus { outline: thin dotted; }
/** Improve readability when focused and also mouse hovered in all browsers. */
a:active, a:hover { outline: 0; }
/* ========================================================================== Typography ========================================================================== */
/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */
h1 { font-size: 2em; margin: 0.67em 0; }
/** Address styling not present in IE 8/9, Safari 5, and Chrome. */
abbr[title] { border-bottom: 1px dotted; }
/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */
b, strong { font-weight: bold; }
/** Address styling not present in Safari 5 and Chrome. */
dfn { font-style: italic; }
/** Address differences between Firefox and other browsers. */
hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }
/** Address styling not present in IE 8/9. */
mark { background: #ff0; color: #000; }
/** Correct font family set oddly in Safari 5 and Chrome. */
code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; }
/** Improve readability of pre-formatted text in all browsers. */
pre { white-space: pre-wrap; }
/** Set consistent quote types. */
q { quotes: "\201C" "\201D" "\2018" "\2019"; }
/** Address inconsistent and variable font size in all browsers. */
small { font-size: 80%; }
/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sup { top: -0.5em; }
sub { bottom: -0.25em; }
/* ========================================================================== Embedded content ========================================================================== */
/** Remove border when inside `a` element in IE 8/9. */
img { border: 0; }
/** Correct overflow displayed oddly in IE 9. */
svg:not(:root) { overflow: hidden; }
/* ========================================================================== Figures ========================================================================== */
/** Address margin not present in IE 8/9 and Safari 5. */
figure { margin: 0; }
/* ========================================================================== Forms ========================================================================== */
/** Define consistent border, margin, and padding. */
fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }
/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */
legend { border: 0; /* 1 */ padding: 0; /* 2 */ }
/** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */
button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ }
/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */
button, input { line-height: normal; }
/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */
button, select { text-transform: none; }
/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */
button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ }
/** Re-set default cursor for disabled elements. */
button[disabled], html input[disabled] { cursor: default; }
/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */
input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ }
/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */
input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; }
/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
/** Remove inner padding and border in Firefox 4+. */
button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */
textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ }
/* ========================================================================== Tables ========================================================================== */
/** Remove most spacing between table cells. */
table { border-collapse: collapse; border-spacing: 0; }
meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; width: 768px; }
meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; width: 1280px; }
meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; width: 1440px; }
*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }
html, body { font-size: 100%; }
body { background: white; color: #222222; padding: 0; margin: 0; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; }
a:hover { cursor: pointer; }
img, object, embed { max-width: 100%; height: auto; }
object, embed { height: 100%; }
img { -ms-interpolation-mode: bicubic; }
#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; }
.left { float: left !important; }
.right { float: right !important; }
.text-left { text-align: left !important; }
.text-right { text-align: right !important; }
.text-center { text-align: center !important; }
.text-justify { text-align: justify !important; }
.hide { display: none; }
.antialiased { -webkit-font-smoothing: antialiased; }
img { display: inline-block; vertical-align: middle; }
textarea { height: auto; min-height: 50px; }
select { width: 100%; }
object, svg { display: inline-block; vertical-align: middle; }
.center { margin-left: auto; margin-right: auto; }
.spread { width: 100%; }
p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; }
.subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { line-height: 1.4; color: black; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; }
/* Typography resets */
div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; }
/* Default Link Styles */
a { color: #0068b0; text-decoration: none; line-height: inherit; }
a:hover, a:focus { color: #333333; }
a img { border: none; }
/* Default paragraph styles */
p { font-family: Noto, sans-serif; font-weight: normal; font-size: 1em; line-height: 1.6; margin-bottom: 0.75em; text-rendering: optimizeLegibility; }
p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }
/* Default header styles */
h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: Noto, sans-serif; font-weight: normal; font-style: normal; color: black; text-rendering: optimizeLegibility; margin-top: 0.5em; margin-bottom: 0.5em; line-height: 1.2125em; }
h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #4d4d4d; line-height: 0; }
h1 { font-size: 2.125em; }
h2 { font-size: 1.6875em; }
h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; }
h4 { font-size: 1.125em; }
h5 { font-size: 1.125em; }
h6 { font-size: 1em; }
hr { border: solid #dddddd; border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; }
/* Helpful Typography Defaults */
em, i { font-style: italic; line-height: inherit; }
strong, b { font-weight: bold; line-height: inherit; }
small { font-size: 60%; line-height: inherit; }
code { font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; color: #264357; }
/* Lists */
ul, ol, dl { font-size: 1em; line-height: 1.6; margin-bottom: 0.75em; list-style-position: outside; font-family: Noto, sans-serif; }
ul, ol { margin-left: 1.5em; }
ul.no-bullet, ol.no-bullet { margin-left: 1.5em; }
/* Unordered Lists */
ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ }
ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; }
ul.square { list-style-type: square; }
ul.circle { list-style-type: circle; }
ul.disc { list-style-type: disc; }
ul.no-bullet { list-style: none; }
/* Ordered Lists */
ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; }
/* Definition Lists */
dl dt { margin-bottom: 0.3em; font-weight: bold; }
dl dd { margin-bottom: 0.75em; }
/* Abbreviations */
abbr, acronym { text-transform: uppercase; font-size: 90%; color: black; border-bottom: 1px dotted #dddddd; cursor: help; }
abbr { text-transform: none; }
/* Blockquotes */
blockquote { margin: 0 0 0.75em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; }
blockquote cite { display: block; font-size: 0.8125em; color: #5e93b8; }
blockquote cite:before { content: "\2014 \0020"; }
blockquote cite a, blockquote cite a:visited { color: #5e93b8; }
blockquote, blockquote p { line-height: 1.6; color: #333333; }
/* Microformats */
.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #dddddd; padding: 0.625em 0.75em; }
.vcard li { margin: 0; display: block; }
.vcard .fn { font-weight: bold; font-size: 0.9375em; }
.vevent .summary { font-weight: bold; }
.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; }
@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; }
h1 { font-size: 2.75em; }
h2 { font-size: 2.3125em; }
h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; }
h4 { font-size: 1.4375em; } }
/* Tables */
table { background: white; margin-bottom: 1.25em; border: solid 1px #d8d8ce; }
table thead, table tfoot { background: -webkit-linear-gradient(top, #add386, #90b66a); font-weight: bold; }
table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: white; text-align: left; }
table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: #6d6e71; }
table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #edf2f2; }
table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.4; }
body { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; tab-size: 4; }
h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; }
a:hover, a:focus { text-decoration: underline; }
.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; }
.clearfix:after, .float-group:after { clear: both; }
*:not(pre) > code { font-size: inherit; font-style: normal !important; letter-spacing: 0; padding: 0; background-color: white; -webkit-border-radius: 0; border-radius: 0; line-height: inherit; word-wrap: break-word; }
*:not(pre) > code.nobreak { word-wrap: normal; }
*:not(pre) > code.nowrap { white-space: nowrap; }
pre, pre > code { line-height: 1.6; color: #264357; font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; }
em em { font-style: normal; }
strong strong { font-weight: normal; }
.keyseq { color: #333333; }
kbd { font-family: Consolas, "Liberation Mono", Courier, monospace; display: inline-block; color: black; font-size: 0.65em; line-height: 1.45; background-color: #f7f7f7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; margin: 0 0.15em; padding: 0.2em 0.5em; vertical-align: middle; position: relative; top: -0.1em; white-space: nowrap; }
.keyseq kbd:first-child { margin-left: 0; }
.keyseq kbd:last-child { margin-right: 0; }
.menuseq, .menuref { color: #000; }
.menuseq b:not(.caret), .menuref { font-weight: inherit; }
.menuseq { word-spacing: -0.02em; }
.menuseq b.caret { font-size: 1.25em; line-height: 0.8; }
.menuseq i.caret { font-weight: bold; text-align: center; width: 0.45em; }
b.button:before, b.button:after { position: relative; top: -1px; font-weight: normal; }
b.button:before { content: "["; padding: 0 3px 0 2px; }
b.button:after { content: "]"; padding: 0 2px 0 3px; }
#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 1.5em; padding-right: 1.5em; }
#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; }
#header:after, #content:after, #footnotes:after, #footer:after { clear: both; }
#content { margin-top: 1.25em; }
#content:before { content: none; }
#header > h1:first-child { color: black; margin-top: 2.25rem; margin-bottom: 0; }
#header > h1:first-child + #toc { margin-top: 8px; border-top: 1px solid #dddddd; }
#header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { border-bottom: 1px solid #dddddd; padding-bottom: 8px; }
#header .details { border-bottom: 1px solid #dddddd; line-height: 1.45; padding-top: 0.25em; padding-bottom: 0.25em; padding-left: 0.25em; color: #5e93b8; display: -ms-flexbox; display: -webkit-flex; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; }
#header .details span:first-child { margin-left: -0.125em; }
#header .details span.email a { color: #333333; }
#header .details br { display: none; }
#header .details br + span:before { content: "\00a0\2013\00a0"; }
#header .details br + span.author:before { content: "\00a0\22c5\00a0"; color: #333333; }
#header .details br + span#revremark:before { content: "\00a0|\00a0"; }
#header #revnumber { text-transform: capitalize; }
#header #revnumber:after { content: "\00a0"; }
#content > h1:first-child:not([class]) { color: black; border-bottom: 1px solid #dddddd; padding-bottom: 8px; margin-top: 0; padding-top: 1rem; margin-bottom: 1.25rem; }
#toc { border-bottom: 0 solid #dddddd; padding-bottom: 0.5em; }
#toc > ul { margin-left: 0.125em; }
#toc ul.sectlevel0 > li > a { font-style: italic; }
#toc ul.sectlevel0 ul.sectlevel1 { margin: 0.5em 0; }
#toc ul { font-family: Noto, sans-serif; list-style-type: none; }
#toc li { line-height: 1.3334; margin-top: 0.3334em; }
#toc a { text-decoration: none; }
#toc a:active { text-decoration: underline; }
#toctitle { color: black; font-size: 1.2em; }
@media only screen and (min-width: 768px) { #toctitle { font-size: 1.375em; }
body.toc2 { padding-left: 15em; padding-right: 0; }
#toc.toc2 { margin-top: 0 !important; background-color: white; position: fixed; width: 15em; left: 0; top: 0; border-right: 1px solid #dddddd; border-top-width: 0 !important; border-bottom-width: 0 !important; z-index: 1000; padding: 1.25em 1em; height: 100%; overflow: auto; }
#toc.toc2 #toctitle { margin-top: 0; margin-bottom: 0.8rem; font-size: 1.2em; }
#toc.toc2 > ul { font-size: 0.9em; margin-bottom: 0; }
#toc.toc2 ul ul { margin-left: 0; padding-left: 1em; }
#toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; }
body.toc2.toc-right { padding-left: 0; padding-right: 15em; }
body.toc2.toc-right #toc.toc2 { border-right-width: 0; border-left: 1px solid #dddddd; left: auto; right: 0; } }
@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; padding-right: 0; }
#toc.toc2 { width: 20em; }
#toc.toc2 #toctitle { font-size: 1.375em; }
#toc.toc2 > ul { font-size: 0.95em; }
#toc.toc2 ul ul { padding-left: 1.25em; }
body.toc2.toc-right { padding-left: 0; padding-right: 20em; } }
#content #toc { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 0; border-radius: 0; }
#content #toc > :first-child { margin-top: 0; }
#content #toc > :last-child { margin-bottom: 0; }
#footer { max-width: 100%; background-color: none; padding: 1.25em; }
#footer-text { color: black; line-height: 1.44; }
#content { margin-bottom: 0.625em; }
.sect1 { padding-bottom: 0.625em; }
@media only screen and (min-width: 768px) { #content { margin-bottom: 1.25em; }
.sect1 { padding-bottom: 1.25em; } }
.sect1:last-child { padding-bottom: 0; }
.sect1 + .sect1 { border-top: 0 solid #dddddd; }
#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; z-index: 1001; width: 1.5ex; margin-left: -1.5ex; display: block; text-decoration: none !important; visibility: hidden; text-align: center; font-weight: normal; }
#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: "\00A7"; font-size: 0.85em; display: block; padding-top: 0.1em; }
#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; }
#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: black; text-decoration: none; }
#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: black; }
.audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { margin-bottom: 1.25em; }
.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-rendering: optimizeLegibility; text-align: left; }
table.tableblock > caption.title { white-space: nowrap; overflow: visible; max-width: 0; }
.paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { color: black; }
table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; }
.admonitionblock > table { border-collapse: separate; border: 0; background: none; width: 100%; }
.admonitionblock > table td.icon { text-align: center; width: 80px; }
.admonitionblock > table td.icon img { max-width: initial; }
.admonitionblock > table td.icon .title { font-weight: bold; font-family: Noto, sans-serif; text-transform: uppercase; }
.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid #dddddd; color: #5e93b8; }
.admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; }
.exampleblock > .content { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 0; border-radius: 0; }
.exampleblock > .content > :first-child { margin-top: 0; }
.exampleblock > .content > :last-child { margin-bottom: 0; }
.sidebarblock { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 0; border-radius: 0; }
.sidebarblock > :first-child { margin-top: 0; }
.sidebarblock > :last-child { margin-bottom: 0; }
.sidebarblock > .content > .title { color: black; margin-top: 0; }
.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; }
.literalblock pre, .listingblock pre:not(.highlight), .listingblock pre[class="highlight"], .listingblock pre[class^="highlight "], .listingblock pre.CodeRay, .listingblock pre.prettyprint { background: #eeeeee; }
.sidebarblock .literalblock pre, .sidebarblock .listingblock pre:not(.highlight), .sidebarblock .listingblock pre[class="highlight"], .sidebarblock .listingblock pre[class^="highlight "], .sidebarblock .listingblock pre.CodeRay, .sidebarblock .listingblock pre.prettyprint { background: #f2f1f1; }
.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { border: 1px hidden #666666; -webkit-border-radius: 0; border-radius: 0; word-wrap: break-word; padding: 1.25em 1.5625em 1.125em 1.5625em; font-size: 0.8125em; }
.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock pre.nowrap, .listingblock pre[class].nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; }
@media only screen and (min-width: 768px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.90625em; } }
@media only screen and (min-width: 1280px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 1em; } }
.literalblock.output pre { color: #eeeeee; background-color: #264357; }
.listingblock pre.highlightjs { padding: 0; }
.listingblock pre.highlightjs > code { padding: 1.25em 1.5625em 1.125em 1.5625em; -webkit-border-radius: 0; border-radius: 0; }
.listingblock > .content { position: relative; }
.listingblock code[data-lang]:before { display: none; content: attr(data-lang); position: absolute; font-size: 0.75em; top: 0.425rem; right: 0.5rem; line-height: 1; text-transform: uppercase; color: #999; }
.listingblock:hover code[data-lang]:before { display: block; }
.listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: #999; }
.listingblock.terminal pre .command:not([data-prompt]):before { content: "$"; }
table.pyhltable { border-collapse: separate; border: 0; margin-bottom: 0; background: none; }
table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; line-height: 1.6; }
table.pyhltable td.code { padding-left: .75em; padding-right: 0; }
pre.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #dddddd; }
pre.pygments .lineno { display: inline-block; margin-right: .25em; }
table.pyhltable .linenodiv { background: none !important; padding-right: 0 !important; }
.quoteblock { margin: 0 1em 0.75em 1.5em; display: table; }
.quoteblock > .title { margin-left: -1.5em; margin-bottom: 0.75em; }
.quoteblock blockquote, .quoteblock blockquote p { color: #333333; font-size: 1.15rem; line-height: 1.75; word-spacing: 0.1em; letter-spacing: 0; font-style: italic; text-align: justify; }
.quoteblock blockquote { margin: 0; padding: 0; border: 0; }
.quoteblock blockquote:before { content: "\201c"; float: left; font-size: 2.75em; font-weight: bold; line-height: 0.6em; margin-left: -0.6em; color: black; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); }
.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
.quoteblock .attribution { margin-top: 0.5em; margin-right: 0.5ex; text-align: right; }
.quoteblock .quoteblock { margin-left: 0; margin-right: 0; padding: 0.5em 0; border-left: 3px solid #5e93b8; }
.quoteblock .quoteblock blockquote { padding: 0 0 0 0.75em; }
.quoteblock .quoteblock blockquote:before { display: none; }
.verseblock { margin: 0 1em 0.75em 1em; }
.verseblock pre { font-family: "Open Sans", "DejaVu Sans", sans; font-size: 1.15rem; color: #333333; font-weight: 300; text-rendering: optimizeLegibility; }
.verseblock pre strong { font-weight: 400; }
.verseblock .attribution { margin-top: 1.25rem; margin-left: 0.5ex; }
.quoteblock .attribution, .verseblock .attribution { font-size: 0.8125em; line-height: 1.45; font-style: italic; }
.quoteblock .attribution br, .verseblock .attribution br { display: none; }
.quoteblock .attribution cite, .verseblock .attribution cite { display: block; letter-spacing: -0.025em; color: #5e93b8; }
.quoteblock.abstract { margin: 0 0 0.75em 0; display: block; }
.quoteblock.abstract blockquote, .quoteblock.abstract blockquote p { text-align: left; word-spacing: 0; }
.quoteblock.abstract blockquote:before, .quoteblock.abstract blockquote p:first-of-type:before { display: none; }
table.tableblock { max-width: 100%; border-collapse: separate; }
table.tableblock td > .paragraph:last-child p > p:last-child, table.tableblock th > p:last-child, table.tableblock td > p:last-child { margin-bottom: 0; }
table.tableblock, th.tableblock, td.tableblock { border: 0 solid #d8d8ce; }
table.grid-all > thead > tr > .tableblock, table.grid-all > tbody > tr > .tableblock { border-width: 0 1px 1px 0; }
table.grid-all > tfoot > tr > .tableblock { border-width: 1px 1px 0 0; }
table.grid-cols > * > tr > .tableblock { border-width: 0 1px 0 0; }
table.grid-rows > thead > tr > .tableblock, table.grid-rows > tbody > tr > .tableblock { border-width: 0 0 1px 0; }
table.grid-rows > tfoot > tr > .tableblock { border-width: 1px 0 0 0; }
table.grid-all > * > tr > .tableblock:last-child, table.grid-cols > * > tr > .tableblock:last-child { border-right-width: 0; }
table.grid-all > tbody > tr:last-child > .tableblock, table.grid-all > thead:last-child > tr > .tableblock, table.grid-rows > tbody > tr:last-child > .tableblock, table.grid-rows > thead:last-child > tr > .tableblock { border-bottom-width: 0; }
table.frame-all { border-width: 1px; }
table.frame-sides { border-width: 0 1px; }
table.frame-topbot { border-width: 1px 0; }
th.halign-left, td.halign-left { text-align: left; }
th.halign-right, td.halign-right { text-align: right; }
th.halign-center, td.halign-center { text-align: center; }
th.valign-top, td.valign-top { vertical-align: top; }
th.valign-bottom, td.valign-bottom { vertical-align: bottom; }
th.valign-middle, td.valign-middle { vertical-align: middle; }
table thead th, table tfoot th { font-weight: bold; }
tbody tr th { display: table-cell; line-height: 1.4; background: -webkit-linear-gradient(top, #add386, #90b66a); }
tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: white; font-weight: bold; }
p.tableblock > code:only-child { background: none; padding: 0; }
p.tableblock { font-size: 1em; }
td > div.verse { white-space: pre; }
ol { margin-left: 1.75em; }
ul li ol { margin-left: 1.5em; }
dl dd { margin-left: 1.125em; }
dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; }
ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.375em; }
ul.checklist, ul.none, ol.none, ul.no-bullet, ol.no-bullet, ol.unnumbered, ul.unstyled, ol.unstyled { list-style-type: none; }
ul.no-bullet, ol.no-bullet, ol.unnumbered { margin-left: 0.625em; }
ul.unstyled, ol.unstyled { margin-left: 0; }
ul.checklist { margin-left: 0.625em; }
ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { width: 1.25em; font-size: 0.8em; position: relative; bottom: 0.125em; }
ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; }
ul.inline { display: -ms-flexbox; display: -webkit-box; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; list-style: none; margin: 0 0 0.375em -0.75em; }
ul.inline > li { margin-left: 0.75em; }
.unstyled dl dt { font-weight: normal; font-style: normal; }
ol.arabic { list-style-type: decimal; }
ol.decimal { list-style-type: decimal-leading-zero; }
ol.loweralpha { list-style-type: lower-alpha; }
ol.upperalpha { list-style-type: upper-alpha; }
ol.lowerroman { list-style-type: lower-roman; }
ol.upperroman { list-style-type: upper-roman; }
ol.lowergreek { list-style-type: lower-greek; }
.hdlist > table, .colist > table { border: 0; background: none; }
.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; }
td.hdlist1, td.hdlist2 { vertical-align: top; padding: 0 0.625em; }
td.hdlist1 { font-weight: bold; padding-bottom: 0.75em; }
.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }
.colist > table tr > td:first-of-type { padding: 0.4em 0.75em 0 0.75em; line-height: 1; vertical-align: top; }
.colist > table tr > td:first-of-type img { max-width: initial; }
.colist > table tr > td:last-of-type { padding: 0.25em 0; }
.thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; -webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; }
.imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 1.25em 0; }
.imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 1.25em 0.625em; }
.imageblock > .title { margin-bottom: 0; }
.imageblock.thumb, .imageblock.th { border-width: 6px; }
.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; }
.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; }
.image.left { margin-right: 0.625em; }
.image.right { margin-left: 0.625em; }
a.image { text-decoration: none; display: inline-block; }
a.image object { pointer-events: none; }
sup.footnote, sup.footnoteref { font-size: 0.875em; position: static; vertical-align: super; }
sup.footnote a, sup.footnoteref a { text-decoration: none; }
sup.footnote a:active, sup.footnoteref a:active { text-decoration: underline; }
#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; }
#footnotes hr { width: 20%; min-width: 6.25em; margin: -0.25em 0 0.75em 0; border-width: 1px 0 0 0; }
#footnotes .footnote { padding: 0 0.375em 0 0.225em; line-height: 1.3334; font-size: 0.875em; margin-left: 1.2em; margin-bottom: 0.2em; }
#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; margin-left: -1.05em; }
#footnotes .footnote:last-of-type { margin-bottom: 0; }
#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; }
.gist .file-data > table { border: 0; background: #fff; width: 100%; margin-bottom: 0; }
.gist .file-data > table td.line-data { width: 99%; }
div.unbreakable { page-break-inside: avoid; }
.big { font-size: larger; }
.small { font-size: smaller; }
.underline { text-decoration: underline; }
.overline { text-decoration: overline; }
.line-through { text-decoration: line-through; }
.aqua { color: #00bfbf; }
.aqua-background { background-color: #00fafa; }
.black { color: black; }
.black-background { background-color: black; }
.blue { color: #0000bf; }
.blue-background { background-color: #0000fa; }
.fuchsia { color: #bf00bf; }
.fuchsia-background { background-color: #fa00fa; }
.gray { color: #606060; }
.gray-background { background-color: #7d7d7d; }
.green { color: #006000; }
.green-background { background-color: #007d00; }
.lime { color: #00bf00; }
.lime-background { background-color: #00fa00; }
.maroon { color: #600000; }
.maroon-background { background-color: #7d0000; }
.navy { color: #000060; }
.navy-background { background-color: #00007d; }
.olive { color: #606000; }
.olive-background { background-color: #7d7d00; }
.purple { color: #600060; }
.purple-background { background-color: #7d007d; }
.red { color: #bf0000; }
.red-background { background-color: #fa0000; }
.silver { color: #909090; }
.silver-background { background-color: #bcbcbc; }
.teal { color: #006060; }
.teal-background { background-color: #007d7d; }
.white { color: #bfbfbf; }
.white-background { background-color: #fafafa; }
.yellow { color: #bfbf00; }
.yellow-background { background-color: #fafa00; }
span.icon > .fa { cursor: default; }
a span.icon > .fa { cursor: inherit; }
.admonitionblock td.icon [class^="fa icon-"] { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #29475c; }
.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; }
.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; }
.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; }
.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; }
.conum[data-value] { display: inline-block; color: #fff !important; background-color: black; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; font-size: 0.75em; width: 1.67em; height: 1.67em; line-height: 1.67em; font-family: "Open Sans", "DejaVu Sans", sans-serif; font-style: normal; font-weight: bold; }
.conum[data-value] * { color: #fff !important; }
.conum[data-value] + b { display: none; }
.conum[data-value]:after { content: attr(data-value); }
pre .conum[data-value] { position: relative; top: -0.125em; }
b.conum * { color: inherit !important; }
.conum:not([data-value]):empty { display: none; }
h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { border-bottom: 1px solid #dddddd; }
.sect1 { padding-bottom: 0; }
#toctitle { color: #00406F; font-weight: normal; margin-top: 1.5em; }
.sidebarblock { border-color: #aaa; }
code { -webkit-border-radius: 4px; border-radius: 4px; }
p.tableblock.header { color: #6d6e71; }
.literalblock pre, .listingblock pre { background: #eeeeee; }
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
/*pre.CodeRay {background-color:#f7f7f8;}*/
.CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
.CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
.CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
table.CodeRay td{vertical-align: top;line-height:1.45}
table.CodeRay td.line-numbers{text-align:right}
table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
table.CodeRay td.code{padding:0 0 0 .5em}
table.CodeRay td.code>pre{padding:0}
.CodeRay .debug{color:#fff !important;background:#000080 !important}
.CodeRay .annotation{color:#007}
.CodeRay .attribute-name{color:#000080}
.CodeRay .attribute-value{color:#700}
.CodeRay .binary{color:#509}
.CodeRay .comment{color:#998;font-style:italic}
.CodeRay .char{color:#04d}
.CodeRay .char .content{color:#04d}
.CodeRay .char .delimiter{color:#039}
.CodeRay .class{color:#458;font-weight:bold}
.CodeRay .complex{color:#a08}
.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
.CodeRay .color{color:#099}
.CodeRay .class-variable{color:#369}
.CodeRay .decorator{color:#b0b}
.CodeRay .definition{color:#099}
.CodeRay .delimiter{color:#000}
.CodeRay .doc{color:#970}
.CodeRay .doctype{color:#34b}
.CodeRay .doc-string{color:#d42}
.CodeRay .escape{color:#666}
.CodeRay .entity{color:#800}
.CodeRay .error{color:#808}
.CodeRay .exception{color:inherit}
.CodeRay .filename{color:#099}
.CodeRay .function{color:#900;font-weight:bold}
.CodeRay .global-variable{color:#008080}
.CodeRay .hex{color:#058}
.CodeRay .integer,.CodeRay .float{color:#099}
.CodeRay .include{color:#555}
.CodeRay .inline{color:#000}
.CodeRay .inline .inline{background:#ccc}
.CodeRay .inline .inline .inline{background:#bbb}
.CodeRay .inline .inline-delimiter{color:#d14}
.CodeRay .inline-delimiter{color:#d14}
.CodeRay .important{color:#555;font-weight:bold}
.CodeRay .interpreted{color:#b2b}
.CodeRay .instance-variable{color:#008080}
.CodeRay .label{color:#970}
.CodeRay .local-variable{color:#963}
.CodeRay .octal{color:#40e}
.CodeRay .predefined{color:#369}
.CodeRay .preprocessor{color:#579}
.CodeRay .pseudo-class{color:#555}
.CodeRay .directive{font-weight:bold}
.CodeRay .type{font-weight:bold}
.CodeRay .predefined-type{color:inherit}
.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
.CodeRay .key{color:#808}
.CodeRay .key .delimiter{color:#606}
.CodeRay .key .char{color:#80f}
.CodeRay .value{color:#088}
.CodeRay .regexp .delimiter{color:#808}
.CodeRay .regexp .content{color:#808}
.CodeRay .regexp .modifier{color:#808}
.CodeRay .regexp .char{color:#d14}
.CodeRay .regexp .function{color:#404;font-weight:bold}
.CodeRay .string{color:#d20}
.CodeRay .string .string .string{background:#ffd0d0}
.CodeRay .string .content{color:#d14}
.CodeRay .string .char{color:#d14}
.CodeRay .string .delimiter{color:#d14}
.CodeRay .shell{color:#d14}
.CodeRay .shell .delimiter{color:#d14}
.CodeRay .symbol{color:#990073}
.CodeRay .symbol .content{color:#a60}
.CodeRay .symbol .delimiter{color:#630}
.CodeRay .tag{color:#008080}
.CodeRay .tag-special{color:#d70}
.CodeRay .variable{color:#036}
.CodeRay .insert{background:#afa}
.CodeRay .delete{background:#faa}
.CodeRay .change{color:#aaf;background:#007}
.CodeRay .head{color:#f8f;background:#505}
.CodeRay .insert .insert{color:#080}
.CodeRay .delete .delete{color:#800}
.CodeRay .change .change{color:#66f}
.CodeRay .head .head{color:#f4f}
</style>
<link rel="stylesheet" href="../katex/katex.min.css">
<script src="../katex/katex.min.js"></script>
<script src="../katex/contrib/auto-render.min.js"></script>
<!-- Use KaTeX to render math once document is loaded, see
https://github.com/Khan/KaTeX/tree/master/contrib/auto-render -->
<script>
document.addEventListener("DOMContentLoaded", function () {
renderMathInElement(
document.body,
{
delimiters: [
{ left: "$$", right: "$$", display: true},
{ left: "\\[", right: "\\]", display: true},
{ left: "$", right: "$", display: false},
{ left: "\\(", right: "\\)", display: false}
]
}
);
});
</script></head>
<body class="book toc2 toc-left" style="max-width: 100;">
<div id="header">
<h1>The OpenCL<sup>&#8482;</sup> SPIR-V Environment Specification</h1>
<div class="details">
<span id="author" class="author">Khronos<sup>&#174;</sup> OpenCL Working Group</span><br>
<span id="revnumber">version v3.0.8,</span>
<span id="revdate">Wed, 30 Jun 2021 20:00:00 +0000</span>
<br><span id="revremark">from git branch: master commit: 09130de814688ec7b463cb089986b807c628ead3</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#introduction">1. Introduction</a></li>
<li><a href="#common-properties">2. Common Properties</a>
<ul class="sectlevel2">
<li><a href="#_supported_spir_v_versions">2.1. Supported SPIR-V Versions</a></li>
<li><a href="#_extended_instruction_sets">2.2. Extended Instruction Sets</a></li>
<li><a href="#_source_language_encoding">2.3. Source Language Encoding</a></li>
<li><a href="#_numerical_type_formats">2.4. Numerical Type Formats</a></li>
<li><a href="#_supported_types">2.5. Supported Types</a></li>
<li><a href="#_image_channel_order_mapping">2.6. Image Channel Order Mapping</a></li>
<li><a href="#_image_channel_data_type_mapping">2.7. Image Channel Data Type Mapping</a></li>
<li><a href="#_kernels">2.8. Kernels</a></li>
<li><a href="#_built_in_variables">2.9. Built-in Variables</a></li>
<li><a href="#_alignment_of_types">2.10. Alignment of Types</a></li>
</ul>
</li>
<li><a href="#required-capabilities">3. Required Capabilities</a>
<ul class="sectlevel2">
<li><a href="#required-capabilities-1.0">3.1. SPIR-V 1.0</a></li>
<li><a href="#required-capabilities-1.1">3.2. SPIR-V 1.1</a></li>
<li><a href="#required-capabilities-1.2">3.3. SPIR-V 1.2</a></li>
</ul>
</li>
<li><a href="#validation-rules">4. Validation Rules</a></li>
<li><a href="#opencl_extensions">5. OpenCL Extensions</a>
<ul class="sectlevel2">
<li><a href="#_declaring_spir_v_extensions">5.1. Declaring SPIR-V Extensions</a></li>
<li><a href="#_full_and_embedded_profile_extensions">5.2. Full and Embedded Profile Extensions</a></li>
<li><a href="#_embedded_profile_extensions">5.3. Embedded Profile Extensions</a></li>
</ul>
</li>
<li><a href="#numerical_compliance">6. OpenCL Numerical Compliance</a>
<ul class="sectlevel2">
<li><a href="#_rounding_modes">6.1. Rounding Modes</a></li>
<li><a href="#_rounding_modes_for_conversions">6.2. Rounding Modes for Conversions</a></li>
<li><a href="#_out_of_range_conversions">6.3. Out-of-Range Conversions</a></li>
<li><a href="#_inf_nan_and_denormalized_numbers">6.4. INF, NaN, and Denormalized Numbers</a></li>
<li><a href="#_floating_point_exceptions">6.5. Floating-Point Exceptions</a></li>
<li><a href="#relative-error-as-ulps">6.6. Relative Error as ULPs</a></li>
<li><a href="#_edge_case_behavior">6.7. Edge Case Behavior</a></li>
</ul>
</li>
<li><a href="#image_addressing_and_filtering">7. Image Addressing and Filtering</a>
<ul class="sectlevel2">
<li><a href="#image-coordinates">7.1. Image Coordinates</a></li>
<li><a href="#addressing-and-filter-modes">7.2. Addressing and Filter Modes</a></li>
<li><a href="#precision-of-addressing-and-filter-modes">7.3. Precision of Addressing and Filter Modes</a></li>
<li><a href="#conversion-rules">7.4. Conversion Rules</a></li>
<li><a href="#selecting-an-image-from-an-image-array">7.5. Selecting an Image from an Image Array</a></li>
<li><a href="#_data_format_for_reading_and_writing_images">7.6. Data Format for Reading and Writing Images</a></li>
<li><a href="#_sampled_and_sampler_less_reads">7.7. Sampled and Sampler-less Reads</a></li>
</ul>
</li>
<li><a href="#references">8. Normative References</a></li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Copyright 2008-2021 The Khronos Group.</p>
</div>
<div class="paragraph">
<p>This specification is protected by copyright laws and contains material proprietary
to the Khronos Group, Inc. Except as described by these terms, it or any components
may not be reproduced, republished, distributed, transmitted, displayed, broadcast
or otherwise exploited in any manner without the express prior written permission
of Khronos Group.</p>
</div>
<div class="paragraph">
<p>Khronos Group grants a conditional copyright license to use and reproduce the
unmodified specification for any purpose, without fee or royalty, EXCEPT no licenses
to any patent, trademark or other intellectual property rights are granted under
these terms. Parties desiring to implement the specification and make use of
Khronos trademarks in relation to that implementation, and receive reciprocal patent
license protection under the Khronos IP Policy must become Adopters and confirm the
implementation as conformant under the process defined by Khronos for this
specification; see <a href="https://www.khronos.org/adopters" class="bare">https://www.khronos.org/adopters</a>.</p>
</div>
<div class="paragraph">
<p>Khronos Group makes no, and expressly disclaims any, representations or warranties,
express or implied, regarding this specification, including, without limitation:
merchantability, fitness for a particular purpose, non-infringement of any
intellectual property, correctness, accuracy, completeness, timeliness, and
reliability. Under no circumstances will the Khronos Group, or any of its Promoters,
Contributors or Members, or their respective partners, officers, directors,
employees, agents or representatives be liable for any damages, whether direct,
indirect, special or consequential damages for lost revenues, lost profits, or
otherwise, arising from or in connection with these materials.</p>
</div>
<div class="paragraph">
<p>Vulkan and Khronos are registered trademarks, and OpenXR, SPIR, SPIR-V, SYCL, WebGL,
WebCL, OpenVX, OpenVG, EGL, COLLADA, glTF, NNEF, OpenKODE, OpenKCAM, StreamInput,
OpenWF, OpenSL ES, OpenMAX, OpenMAX AL, OpenMAX IL, OpenMAX DL, OpenML and DevU are
trademarks of the Khronos Group Inc. ASTC is a trademark of ARM Holdings PLC,
OpenCL is a trademark of Apple Inc. and OpenGL and OpenML are registered trademarks
and the OpenGL ES and OpenGL SC logos are trademarks of Hewlett Packard Enterprise
used under license by Khronos. All other product names, trademarks,
and/or company names are used solely for identification and belong to their
respective owners.</p>
</div>
<div style="page-break-after: always;"></div>
</div>
</div>
<div class="sect1">
<h2 id="introduction"><a class="anchor" href="#introduction"></a>1. Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p><a href="#opencl-spec">OpenCL</a> is an open, royalty-free, standard for general
purpose parallel programming across CPUs, GPUs, and other processors, giving
software developers portable and efficient access to the power of
heterogeneous processing platforms.</p>
</div>
<div class="paragraph">
<p><a href="#spirv-spec">SPIR-V</a> is an open, royalty-free, standard intermediate
language capable of representing parallel compute kernels that are executed
by implementations of the OpenCL standard.</p>
</div>
<div class="paragraph">
<p>SPIR-V is adaptable to multiple execution environments: a SPIR-V module is
consumed by an execution environment, as specified by a client API.
This document describes the SPIR-V execution environment for implementations
of the OpenCL standard.
The SPIR-V execution environment describes required support for some SPIR-V
capabilities, additional semantics for some SPIR-V instructions, and
additional validation rules that a SPIR-V binary module must adhere to in
order to be considered valid.</p>
</div>
<div class="paragraph">
<p>This document is written for compiler developers who are generating SPIR-V
modules intended to be consumed by the OpenCL API, for implementors of the
OpenCL API who are consuming SPIR-V modules, and for software developers who
are using SPIR-V modules with the OpenCL API.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="common-properties"><a class="anchor" href="#common-properties"></a>2. Common Properties</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This section describes common properties of all OpenCL environments that
consume SPIR-V modules.</p>
</div>
<div class="paragraph">
<p>A SPIR-V module passed to an OpenCL environment is interpreted as a series
of 32-bit words in host endianness, with literal strings packed as described
in the SPIR-V specification.
The first few words of the SPIR-V module must be a magic number and a SPIR-V
version number, as described in the SPIR-V specification.</p>
</div>
<div class="sect2">
<h3 id="_supported_spir_v_versions"><a class="anchor" href="#_supported_spir_v_versions"></a>2.1. Supported SPIR-V Versions</h3>
<div class="paragraph">
<p>An OpenCL environment describes the versions of SPIR-V modules that it
supports using the <code>CL_DEVICE_<wbr>IL_<wbr>VERSION</code> query in OpenCL 2.1 or newer,
the <code>CL_DEVICE_<wbr>ILS_<wbr>WITH_<wbr>VERSION</code> query in OpenCL 3.0 or newer, or the
<code>CL_DEVICE_<wbr>IL_<wbr>VERSION_<wbr>KHR</code> query in the <code>cl_khr_il_program</code> extension.</p>
</div>
<div class="paragraph">
<p>OpenCL environments that support the <code>cl_khr_il_program</code> extension or
OpenCL 2.1 must support SPIR-V 1.0 modules. OpenCL environments that support
OpenCL 2.2 must support SPIR-V 1.0, 1.1, and 1.2 modules.
Use the <code>CL_DEVICE_<wbr>IL_<wbr>VERSION</code> or <code>CL_DEVICE_<wbr>ILS_<wbr>WITH_<wbr>VERSION</code> query
to determine the versions of SPIR-V modules that are supported by
OpenCL environments that support OpenCL 3.0.</p>
</div>
</div>
<div class="sect2">
<h3 id="_extended_instruction_sets"><a class="anchor" href="#_extended_instruction_sets"></a>2.2. Extended Instruction Sets</h3>
<div class="paragraph">
<p>OpenCL environments supporting SPIR-V must support SPIR-V modules that import
the <strong>OpenCL.std</strong>
<a href="#opencl-extended-instruction-set">extended instruction set for OpenCL</a>
using <strong>OpExtInstImport</strong>. For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>... = OpExtInstImport "OpenCL.std"</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_source_language_encoding"><a class="anchor" href="#_source_language_encoding"></a>2.3. Source Language Encoding</h3>
<div class="paragraph">
<p>If a SPIR-V module represents a program written in OpenCL C, then the
<em>Source Language</em> operand for the <strong>OpSource</strong> instruction should be
<strong>OpenCL_C</strong>, and the 32-bit literal language <em>Version</em> should describe the
version of OpenCL C, encoded MSB to LSB as:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>0 | Major Number | Minor Number | Revision Number (optional)</pre>
</div>
</div>
<div class="paragraph">
<p>If a SPIR-V module represents a program written in OpenCL C++, then the
<em>Source Language</em> operand for the <strong>OpSource</strong> instruction should be
<strong>OpenCL_CPP</strong>, and the 32-bit literal language <em>Version</em> should describe the
version of OpenCL C++, encoded similarly.</p>
</div>
<div class="paragraph">
<p>The source language version is purely informational and has no semantic
meaning.</p>
</div>
</div>
<div class="sect2">
<h3 id="_numerical_type_formats"><a class="anchor" href="#_numerical_type_formats"></a>2.4. Numerical Type Formats</h3>
<div class="paragraph">
<p>For all OpenCL environments, floating-point types are represented and stored
using <a href="#ieee-754-spec">IEEE-754</a> semantics.
All integer formats are represented and stored using 2&#8217;s-complement format.</p>
</div>
</div>
<div class="sect2">
<h3 id="_supported_types"><a class="anchor" href="#_supported_types"></a>2.5. Supported Types</h3>
<div class="paragraph">
<p>The following types are supported by OpenCL environments.
Note that some types may require additional capabilities, and may not be
supported by all OpenCL environments.</p>
</div>
<div class="paragraph">
<p>OpenCL environments support arrays declared using <strong>OpTypeArray</strong>, structs
declared using <strong>OpTypeStruct</strong>, functions declared using <strong>OpTypeFunction</strong>,
and pointers declared using <strong>OpTypePointer</strong>.</p>
</div>
<div class="sect3">
<h4 id="_basic_scalar_and_vector_types"><a class="anchor" href="#_basic_scalar_and_vector_types"></a>2.5.1. Basic Scalar and Vector Types</h4>
<div class="paragraph">
<p><strong>OpTypeVoid</strong> is supported.</p>
</div>
<div class="paragraph">
<p>The following scalar types are supported by OpenCL environments:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>OpTypeBool</strong></p>
</li>
<li>
<p><strong>OpTypeInt</strong>, with <em>Width</em> equal to 8, 16, 32, or 64, and with
<em>Signedness</em> equal to zero, indicating no signedness semantics.</p>
</li>
<li>
<p><strong>OpTypeFloat</strong>, with <em>Width</em> equal to 16, 32, or 64.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>OpenCL environments support vector types declared using <strong>OpTypeVector</strong>.
The vector <em>Component Type</em> may be any of the scalar types described
above.
Supported vector <em>Component Counts</em> are 2, 3, 4, 8, or 16.</p>
</div>
</div>
<div class="sect3">
<h4 id="_image_related_data_types"><a class="anchor" href="#_image_related_data_types"></a>2.5.2. Image-Related Data Types</h4>
<div class="paragraph">
<p>The following table describes the <strong>OpTypeImage</strong> image types supported by
OpenCL environments:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 1. Image Types</caption>
<colgroup>
<col style="width: 16.6666%;">
<col style="width: 16.6666%;">
<col style="width: 16.6666%;">
<col style="width: 50.0002%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"><em>Dim</em></th>
<th class="tableblock halign-left valign-top"><em>Depth</em></th>
<th class="tableblock halign-left valign-top"><em>Arrayed</em></th>
<th class="tableblock halign-left valign-top"><strong>Description</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1D</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A 1D image.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1D</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A 1D image array.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2D</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A 2D image.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2D</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A 2D depth image.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2D</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A 2D image array.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2D</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A 2D depth image array.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>3D</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A 3D image.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Buffer</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A 1D buffer image.</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p><strong>OpTypeSampler</strong> may be used to declare sampler types in OpenCL environments.</p>
</div>
<div class="paragraph">
<p><strong>OpTypeSampledImage</strong> may be used to declare combined image and sampler types in OpenCL environments.</p>
</div>
</div>
<div class="sect3">
<h4 id="_other_data_types"><a class="anchor" href="#_other_data_types"></a>2.5.3. Other Data Types</h4>
<div class="paragraph">
<p>The following table describes other data types that may be used in an
OpenCL environment:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 2. Other Data Types</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"><strong>Type</strong></th>
<th class="tableblock halign-left valign-top"><strong>Description</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeEvent</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL event representing async copies from global to local memory and vice-versa.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeDeviceEvent</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL device-side event representing commands enqueued to device command queues.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypePipe</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL pipe.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeReserveId</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL pipe reservation identifier.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeQueue</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL device-side command queue.</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_image_channel_order_mapping"><a class="anchor" href="#_image_channel_order_mapping"></a>2.6. Image Channel Order Mapping</h3>
<div class="paragraph">
<p>The following table describes how the results of the SPIR-V
<strong>OpImageQueryOrder</strong> instruction correspond to the OpenCL host API image
channel orders.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 3. Image Channel Order mapping</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"><strong>SPIR-V Image Channel Order</strong></th>
<th class="tableblock halign-left valign-top"><strong>OpenCL Image Channel Order</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>R</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_R</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>A</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_A</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>RG</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RG</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>RA</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RA</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>RGB</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RGB</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>RGBA</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RGBA</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>BGRA</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_BGRA</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ARGB</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_ARGB</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Intensity</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_INTENSITY</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Luminance</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_LUMINANCE</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Rx</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_Rx</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>RGx</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RGx</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>RGBx</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RGBx</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Depth</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_DEPTH</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>DepthStencil</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_DEPTH_STENCIL</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>sRGB</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_sRGB</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>sRGBA</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_sRGBA</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>sBGRA</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_sBGRA</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>sRGBx</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_sRGBx</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_image_channel_data_type_mapping"><a class="anchor" href="#_image_channel_data_type_mapping"></a>2.7. Image Channel Data Type Mapping</h3>
<div class="paragraph">
<p>The following table describes how the results of the SPIR-V
<strong>OpImageQueryFormat</strong> instruction correspond to the OpenCL host API image
channel data types.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 4. Image Channel Data Type mapping</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"><strong>SPIR-V Image Channel Data Type</strong></th>
<th class="tableblock halign-left valign-top"><strong>OpenCL Image Channel Data Type</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>SnormInt8</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_SNORM_INT8</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>SnormInt16</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_SNORM_INT16</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormInt8</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_INT8</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormInt16</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_INT16</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormInt24</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_INT24</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormShort565</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_SHORT_565</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormShort555</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_SHORT_555</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormInt101010</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_INT_101010</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormInt101010_2</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_INT_101010_2</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>SignedInt8</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_SIGNED_INT8</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>SignedInt16</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_SIGNED_INT16</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>SignedInt32</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_SIGNED_INT32</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnsignedInt8</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNSIGNED_INT8</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnsignedInt16</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNSIGNED_INT16</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnsignedInt32</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNSIGNED_INT32</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>HalfFloat</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_HALF_FLOAT</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Float</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_FLOAT</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_kernels"><a class="anchor" href="#_kernels"></a>2.8. Kernels</h3>
<div class="paragraph">
<p>An <strong>OpFunction</strong> in a SPIR-V module that is identified with <strong>OpEntryPoint</strong>
defines an OpenCL kernel that may be invoked using the OpenCL host API
enqueue kernel interfaces.</p>
</div>
<div class="sect3">
<h4 id="_kernel_return_types"><a class="anchor" href="#_kernel_return_types"></a>2.8.1. Kernel Return Types</h4>
<div class="paragraph">
<p>The <em>Result Type</em> for an <strong>OpFunction</strong> identified with <strong>OpEntryPoint</strong> must be
<strong>OpTypeVoid</strong>.</p>
</div>
</div>
<div class="sect3">
<h4 id="_kernel_arguments"><a class="anchor" href="#_kernel_arguments"></a>2.8.2. Kernel Arguments</h4>
<div class="paragraph">
<p>An <strong>OpFunctionParameter</strong> for an <strong>OpFunction</strong> that is identified with
<strong>OpEntryPoint</strong> defines an OpenCL kernel argument.
Allowed types for OpenCL kernel arguments are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>OpTypeInt</strong></p>
</li>
<li>
<p><strong>OpTypeFloat</strong></p>
</li>
<li>
<p><strong>OpTypeStruct</strong></p>
</li>
<li>
<p><strong>OpTypeVector</strong></p>
</li>
<li>
<p><strong>OpTypePointer</strong></p>
</li>
<li>
<p><strong>OpTypeSampler</strong></p>
</li>
<li>
<p><strong>OpTypeImage</strong></p>
</li>
<li>
<p><strong>OpTypePipe</strong></p>
</li>
<li>
<p><strong>OpTypeQueue</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>For <strong>OpTypeInt</strong> parameters, supported <em>Widths</em> are 8, 16, 32, and 64, and
must have no signedness semantics.</p>
</div>
<div class="paragraph">
<p>For <strong>OpTypeFloat</strong> parameters, <em>Width</em> must be 32.</p>
</div>
<div class="paragraph">
<p>For <strong>OpTypeStruct</strong> parameters, supported structure <em>Member Types</em> are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>OpTypeInt</strong></p>
</li>
<li>
<p><strong>OpTypeFloat</strong></p>
</li>
<li>
<p><strong>OpTypeStruct</strong></p>
</li>
<li>
<p><strong>OpTypeVector</strong></p>
</li>
<li>
<p><strong>OpTypePointer</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>For <strong>OpTypePointer</strong> parameters, supported <em>Storage Classes</em> are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>CrossWorkgroup</strong></p>
</li>
<li>
<p><strong>Workgroup</strong></p>
</li>
<li>
<p><strong>UniformConstant</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>OpenCL kernel argument types must have a representation in the OpenCL host
API.</p>
</div>
<div class="paragraph">
<p>Environments that support extensions or optional features may allow
additional types in an entry point&#8217;s parameter list.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_built_in_variables"><a class="anchor" href="#_built_in_variables"></a>2.9. Built-in Variables</h3>
<div class="paragraph">
<p>An <strong>OpVariable</strong> in a SPIR-V module with the <strong>BuiltIn</strong> decoration represents
a built-in variable.
All built-in variables must be in the <strong>Input</strong> storage class.</p>
</div>
<div class="paragraph">
<p>The following table describes the required SPIR-V type for built-in variables.
In this table, <code>size_t</code> is used as a generic type to represent:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>OpTypeInt</strong> with <em>Width</em> equal to 32 if the <em>Addressing Model</em> declared in <strong>OpMemoryModel</strong> is <strong>Physical32</strong>.</p>
</li>
<li>
<p><strong>OpTypeInt</strong> with <em>Width</em> equal to 64 if the <em>Addressing Model</em> declared in <strong>OpMemoryModel</strong> is <strong>Physical64</strong>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The mapping from an OpenCL C built-in function to the SPIR-V <strong>BuiltIn</strong> is informational and non-normative.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 28.5714%;">
<col style="width: 28.5714%;">
<col style="width: 42.8572%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"><strong>OpenCL C Function</strong></th>
<th class="tableblock halign-left valign-top"><strong>SPIR-V BuiltIn</strong></th>
<th class="tableblock halign-left valign-top"><strong>Required SPIR-V Type</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_work_dim</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>WorkDim</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeInt</strong> with <em>Width</em> equal to 32</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_global_size</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>GlobalSize</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeVector</strong> of 3 components of <code>size_t</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_global_id</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>GlobalInvocationId</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeVector</strong> of 3 components of <code>size_t</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_local_size</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>WorkgroupSize</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeVector</strong> of 3 components of <code>size_t</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_enqueued_local_size</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>EnqueuedWorkgroupSize</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeVector</strong> of 3 components of <code>size_t</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_local_id</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>LocalInvocationId</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeVector</strong> of 3 components of <code>size_t</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_num_groups</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>NumWorkgroups</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeVector</strong> of 3 components of <code>size_t</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_group_id</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>WorkgroupId</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeVector</strong> of 3 components of <code>size_t</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_global_offset</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>GlobalOffset</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeVector</strong> of 3 components of <code>size_t</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_global_linear_id</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>GlobalLinearId</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_local_linear_id</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>LocalInvocationIndex</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_sub_group_size</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>SubgroupSize</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeInt</strong> with <em>Width</em> equal to 32</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_max_sub_group_size</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>SubgroupMaxSize</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeInt</strong> with <em>Width</em> equal to 32</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_num_sub_groups</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>NumSubgroups</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeInt</strong> with <em>Width</em> equal to 32</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_enqueued_num_sub_groups</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>NumEnqueuedSubgroups</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeInt</strong> with <em>Width</em> equal to 32</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_sub_group_id</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>SubgroupId</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeInt</strong> with <em>Width</em> equal to 32</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>get_sub_group_local_id</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>SubgroupLocalInvocationId</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeInt</strong> with <em>Width</em> equal to 32</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_alignment_of_types"><a class="anchor" href="#_alignment_of_types"></a>2.10. Alignment of Types</h3>
<div class="paragraph">
<p>Objects of type <strong>OpTypeInt</strong>, <strong>OpTypeFloat</strong>, and <strong>OpTypePointer</strong> must be aligned
in memory to the size of the type in bytes. Objects of type <strong>OpTypeVector</strong> with
these component types must be aligned in memory to the size of the vector type
in bytes. For 3-component vector types, the size of the vector type is four
times the size the component type.</p>
</div>
<div class="paragraph">
<p>The compiler is responsible for aligning objects allocated by <strong>OpVariable</strong> to
the appropriate alignment as required by the <em>Result Type</em>.</p>
</div>
<div class="paragraph">
<p>For <strong>OpTypePointer</strong> arguments to a function, the compiler may assume that the
pointer is appropriately aligned as required by the <em>Type</em> that the pointer
points to.</p>
</div>
<div class="paragraph">
<p>Behavior of an unaligned load or store is undefined.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="required-capabilities"><a class="anchor" href="#required-capabilities"></a>3. Required Capabilities</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="required-capabilities-1.0"><a class="anchor" href="#required-capabilities-1.0"></a>3.1. SPIR-V 1.0</h3>
<div class="paragraph">
<p>An OpenCL environment that supports SPIR-V 1.0 must support SPIR-V 1.0
modules that declare the following capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Addresses</strong></p>
</li>
<li>
<p><strong>Float16Buffer</strong></p>
</li>
<li>
<p><strong>Int64</strong></p>
<div class="ulist">
<ul>
<li>
<p>For Full Profile devices.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Int16</strong></p>
</li>
<li>
<p><strong>Int8</strong></p>
</li>
<li>
<p><strong>Kernel</strong></p>
</li>
<li>
<p><strong>Linkage</strong></p>
</li>
<li>
<p><strong>Vector16</strong></p>
</li>
<li>
<p><strong>DeviceEnqueue</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices supporting Device-Side Enqueue (where <code>CL_DEVICE_<wbr>DEVICE_<wbr>ENQUEUE_<wbr>CAPABILITIES</code> is not <code>0</code>).</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>GenericPointer</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices supporting the Generic Address Space (where <code>CL_DEVICE_<wbr>GENERIC_<wbr>ADDRESS_<wbr>SPACE_<wbr>SUPPORT</code> is <code>CL_TRUE</code>).</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Groups</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices supporting Subgroups (where <code>CL_DEVICE_<wbr>MAX_<wbr>NUM_<wbr>SUB_<wbr>GROUPS</code> is not <code>0</code>) or Work Group Collective Functions (where <code>CL_DEVICE_<wbr>WORK_<wbr>GROUP_<wbr>COLLECTIVE_<wbr>FUNCTIONS_<wbr>SUPPORT</code> is <code>CL_TRUE</code>).</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Pipes</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices supporting Pipes (where <code>CL_DEVICE_<wbr>PIPE_<wbr>SUPPORT</code> is <code>CL_TRUE</code>).</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>ImageBasic</strong></p>
<div class="ulist">
<ul>
<li>
<p>For devices supporting Images (where <code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code> is <code>CL_TRUE</code>)</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Float64</strong></p>
<div class="ulist">
<ul>
<li>
<p>For devices supporting Double Precision Floating-Point (where <code>CL_DEVICE_<wbr>DOUBLE_<wbr>FP_<wbr>CONFIG</code> is not <code>0</code>)</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>If the OpenCL environment supports the <strong>ImageBasic</strong> capability, then
the following capabilities must also be supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>LiteralSampler</strong></p>
</li>
<li>
<p><strong>Sampled1D</strong></p>
</li>
<li>
<p><strong>Image1D</strong></p>
</li>
<li>
<p><strong>SampledBuffer</strong></p>
</li>
<li>
<p><strong>ImageBuffer</strong></p>
</li>
<li>
<p><strong>ImageReadWrite</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices supporting Read-Write Images (where <code>CL_DEVICE_<wbr>MAX_<wbr>READ_<wbr>WRITE_<wbr>IMAGE_<wbr>ARGS</code> is not <code>0</code>)</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="required-capabilities-1.1"><a class="anchor" href="#required-capabilities-1.1"></a>3.2. SPIR-V 1.1</h3>
<div class="paragraph">
<p>An OpenCL environment supporting SPIR-V 1.1 must support SPIR-V 1.1
modules that declare the capabilities required for SPIR-V 1.0 modules,
above.</p>
</div>
<div class="paragraph">
<p>In addition, an OpenCL environment consuming SPIR-V 1.1 must support
SPIR-V 1.1 modules that declare the following capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>SubgroupDispatch</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.2 devices, or OpenCL 3.0 devices supporting Subgroups (where <code>CL_DEVICE_<wbr>MAX_<wbr>NUM_<wbr>SUB_<wbr>GROUPS</code> is not <code>0</code>)</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>PipeStorage</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.2 devices.</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="required-capabilities-1.2"><a class="anchor" href="#required-capabilities-1.2"></a>3.3. SPIR-V 1.2</h3>
<div class="paragraph">
<p>An OpenCL environment supporting SPIR-V 1.2 must support SPIR-V 1.2
modules that declare the capabilities required for SPIR-V 1.1 modules,
above.</p>
</div>
<div class="paragraph">
<p>SPIR-V 1.2 does not add any new required capabilities.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="validation-rules"><a class="anchor" href="#validation-rules"></a>4. Validation Rules</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The following are a list of validation rules that apply to SPIR-V modules
executing in all OpenCL environments:</p>
</div>
<div class="paragraph">
<p>The <em>Execution Model</em> declared in <strong>OpEntryPoint</strong> must be <strong>Kernel</strong>.</p>
</div>
<div class="paragraph">
<p>The <em>Addressing Model</em> declared in <strong>OpMemoryModel</strong> must be either:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Physical32</strong> (for OpenCL devices reporting <code>32</code> for <code>CL_DEVICE_<wbr>ADDRESS_<wbr>BITS</code>)</p>
</li>
<li>
<p><strong>Physical64</strong> (for OpenCL devices reporting <code>64</code> for <code>CL_DEVICE_<wbr>ADDRESS_<wbr>BITS</code>)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The <em>Memory Model</em> declared in <strong>OpMemoryModel</strong> must be <strong>OpenCL</strong>.</p>
</div>
<div class="paragraph">
<p>For all <strong>OpTypeInt</strong> integer type-declaration instructions:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><em>Signedness</em> must be 0, indicating no signedness semantics.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>For all <strong>OpTypeImage</strong> type-declaration instructions:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><em>Sampled Type</em> must be <strong>OpTypeVoid</strong>.</p>
</li>
<li>
<p><em>Sampled</em> must be 0, indicating that the image usage will be known at
run time, not at compile time.</p>
</li>
<li>
<p><em>MS</em> must be 0, indicating single-sampled content.</p>
</li>
<li>
<p><em>Arrayed</em> may only be set to 1, indicating arrayed content, when <em>Dim</em>
is set to <strong>1D</strong> or <strong>2D</strong>.</p>
</li>
<li>
<p><em>Image Format</em> must be <strong>Unknown</strong>, indicating that the image does not
have a specified format.</p>
</li>
<li>
<p>The optional image <em>Access Qualifier</em> must be present.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The image write instruction <strong>OpImageWrite</strong> must not include any optional
<em>Image Operands</em>.</p>
</div>
<div class="paragraph">
<p>The image read instructions <strong>OpImageRead</strong> and <strong>OpImageSampleExplicitLod</strong>
must not include the optional <em>Image Operand</em> <strong>ConstOffset</strong>.</p>
</div>
<div class="paragraph">
<p>For all <strong>Atomic Instructions</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Only 32-bit integer types are supported for the <em>Result Type</em> and/or
type of <em>Value</em>.</p>
</li>
<li>
<p>The <em>Pointer</em> operand must be a pointer to the <strong>Function</strong>, <strong>Workgroup</strong>,
or <strong>CrossWorkgroup</strong> <em>Storage Classes</em>. Note that an <strong>Atomic Instruction</strong>
on a pointer to the <strong>Function</strong> <em>Storage Class</em> is valid, but does not
have defined behavior.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Recursion is not supported.
The static function call graph for an entry point must not contain cycles.</p>
</div>
<div class="paragraph">
<p>Whether irreducible control flow is legal is implementation defined.</p>
</div>
<div class="paragraph">
<p>For the instructions <strong>OpGroupAsyncCopy</strong> and <strong>OpGroupWaitEvents</strong>,
<em>Scope</em> for <em>Execution</em> must be:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Workgroup</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>For the <strong>Group and Subgroup Instructions</strong>, <em>Scope</em> for <em>Execution</em> must
be one of:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Workgroup</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices
supporting Work Group Collective Functions (where
<code>CL_DEVICE_<wbr>WORK_<wbr>GROUP_<wbr>COLLECTIVE_<wbr>FUNCTIONS_<wbr>SUPPORT</code> is <code>CL_TRUE</code>).</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Subgroup</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices supporting
Subgroups (where <code>CL_DEVICE_<wbr>MAX_<wbr>NUM_<wbr>SUB_<wbr>GROUPS</code> is not <code>0</code>)</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>For all other instructions, <em>Scope</em> for <em>Execution</em> must be one of:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Workgroup</strong></p>
</li>
<li>
<p><strong>Subgroup</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices supporting
Subgroups (where <code>CL_DEVICE_<wbr>MAX_<wbr>NUM_<wbr>SUB_<wbr>GROUPS</code> is not <code>0</code>)</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>In an OpenCL 1.2 environment,
for the <strong>Barrier Instructions</strong> <strong>OpControlBarrier</strong> and <strong>OpMemoryBarrier</strong>, the
<em>Scope</em> for <em>Memory</em> must be <strong>Workgroup</strong>, and the memory-order constraint in
<em>Memory Semantics</em> must be <strong>SequentiallyConsistent</strong>.
Otherwise, <em>Scope</em> for <em>Memory</em> must be one of:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>CrossDevice</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices
supporting <code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>ALL_<wbr>DEVICES</code> in
<code>CL_DEVICE_<wbr>ATOMIC_<wbr>FENCE_<wbr>CAPABILITIES</code>.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Device</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices
supporting <code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>DEVICE</code> in
<code>CL_DEVICE_<wbr>ATOMIC_<wbr>FENCE_<wbr>CAPABILITIES</code>.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Workgroup</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices
supporting <code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>WORK_<wbr>GROUP</code> in
<code>CL_DEVICE_<wbr>ATOMIC_<wbr>FENCE_<wbr>CAPABILITIES</code>.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Subgroup</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices supporting
Subgroups (where <code>CL_DEVICE_<wbr>MAX_<wbr>NUM_<wbr>SUB_<wbr>GROUPS</code> is not <code>0</code>).</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Invocation</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices
supporting <code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>WORK_<wbr>ITEM</code> in
<code>CL_DEVICE_<wbr>ATOMIC_<wbr>FENCE_<wbr>CAPABILITIES</code>.</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>And, the memory-order constraint in <em>Memory Semantics</em> must be one of:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>None (Relaxed)</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices
supporting <code>CL_DEVICE_<wbr>ATOMIC_<wbr>ORDER_<wbr>RELAXED</code> in
<code>CL_DEVICE_<wbr>ATOMIC_<wbr>FENCE_<wbr>CAPABILITIES</code>.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Acquire</strong>, <strong>Release</strong>, or <strong>AcquireRelease</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices
supporting <code>CL_DEVICE_<wbr>ATOMIC_<wbr>ORDER_<wbr>ACQ_<wbr>REL</code> in
<code>CL_DEVICE_<wbr>ATOMIC_<wbr>FENCE_<wbr>CAPABILITIES</code>.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>SequentiallyConsistent</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices
supporting <code>CL_DEVICE_<wbr>ATOMIC_<wbr>ORDER_<wbr>SEQ_<wbr>CST</code> in
<code>CL_DEVICE_<wbr>ATOMIC_<wbr>FENCE_<wbr>CAPABILITIES</code>.</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>In all OpenCL environments, for the <strong>Barrier Instruction</strong> <strong>OpControlBarrier</strong>,
when the <em>Scope</em> for <em>Execution</em> is <strong>Subgroup</strong>, behavior is undefined unless
all invocations in the subgroup execute the same dynamic instance of the
instruction.</p>
</div>
<div class="paragraph">
<p>In an OpenCL 1.2 environment,
for the <strong>Atomic Instructions</strong>, the <em>Scope</em> for <em>Memory</em> must be <strong>Device</strong>,
and the memory-order constraint in <em>Memory Semantics</em> must be <strong>Relaxed</strong>.
Otherwise, <em>Scope</em> for <em>Memory</em> must be one of:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>CrossDevice</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices
supporting <code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>ALL_<wbr>DEVICES</code> in
<code>CL_DEVICE_<wbr>ATOMIC_<wbr>MEMORY_<wbr>CAPABILITIES</code>.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Device</strong></p>
<div class="ulist">
<ul>
<li>
<p>For OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, or OpenCL 3.0 devices