blob: b610b8e5692607d55548ab3832fad03936e15f24 [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.6.1">
<meta name="author" content="Khronos 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.6.3/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 OpenCL Working Group</span><br>
<span id="revnumber">version 2.2-7,</span>
<span id="revdate">Sat, 12 May 2018 13:21:27 +0000</span>
<br><span id="revremark">from git branch: master commit: ab6da3001e9eeafaa36c18888ca7eb4ebb9768af</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="#consumption">2. SPIR-V Consumption</a>
<ul class="sectlevel2">
<li><a href="#_validation_rules">2.1. Validation Rules</a></li>
<li><a href="#_source_language_encoding">2.2. Source Language Encoding</a></li>
<li><a href="#_numerical_type_formats">2.3. Numerical Type Formats</a></li>
<li><a href="#_supported_types">2.4. Supported Types</a></li>
<li><a href="#_image_channel_order_mapping">2.5. Image Channel Order Mapping</a></li>
<li><a href="#_image_channel_data_type_mapping">2.6. Image Channel Data Type Mapping</a></li>
<li><a href="#_kernels">2.7. Kernels</a></li>
<li><a href="#_kernel_return_types">2.8. Kernel Return Types</a></li>
<li><a href="#_kernel_arguments">2.9. Kernel Arguments</a></li>
</ul>
</li>
<li><a href="#opencl2_2">3. OpenCL 2.2</a>
<ul class="sectlevel2">
<li><a href="#_full_profile">3.1. Full Profile</a></li>
<li><a href="#_embedded_profile">3.2. Embedded Profile</a></li>
<li><a href="#_validation_rules_2">3.3. Validation Rules</a></li>
</ul>
</li>
<li><a href="#opencl2_1">4. OpenCL 2.1</a>
<ul class="sectlevel2">
<li><a href="#_full_profile_2">4.1. Full Profile</a></li>
<li><a href="#_embedded_profile_2">4.2. Embedded Profile</a></li>
<li><a href="#_validation_rules_3">4.3. Validation Rules</a></li>
</ul>
</li>
<li><a href="#opencl2_0">5. OpenCL 2.0</a>
<ul class="sectlevel2">
<li><a href="#_full_profile_3">5.1. Full Profile</a></li>
<li><a href="#_embedded_profile_3">5.2. Embedded Profile</a></li>
<li><a href="#_validation_rules_4">5.3. Validation Rules</a></li>
</ul>
</li>
<li><a href="#opencl1_2">6. OpenCL 1.2</a>
<ul class="sectlevel2">
<li><a href="#_full_profile_4">6.1. Full Profile</a></li>
<li><a href="#_embedded_profile_4">6.2. Embedded Profile</a></li>
<li><a href="#_validation_rules_5">6.3. Validation Rules</a></li>
</ul>
</li>
<li><a href="#opencl_extensions">7. OpenCL Extensions</a>
<ul class="sectlevel2">
<li><a href="#_declaring_spir_v_extensions">7.1. Declaring SPIR-V Extensions</a></li>
<li><a href="#_full_and_embedded_profile_extensions">7.2. Full and Embedded Profile Extensions</a></li>
<li><a href="#_embedded_profile_extensions">7.3. Embedded Profile Extensions</a></li>
</ul>
</li>
<li><a href="#numerical_compliance">8. OpenCL Numerical Compliance</a>
<ul class="sectlevel2">
<li><a href="#_rounding_modes">8.1. Rounding Modes</a></li>
<li><a href="#_rounding_modes_for_conversions">8.2. Rounding Modes for Conversions</a></li>
<li><a href="#_out_of_range_conversions">8.3. Out-of-Range Conversions</a></li>
<li><a href="#_inf_nan_and_denormalized_numbers">8.4. INF, NaN, and Denormalized Numbers</a></li>
<li><a href="#_floating_point_exceptions">8.5. Floating-Point Exceptions</a></li>
<li><a href="#relative-error-as-ulps">8.6. Relative Error as ULPs</a></li>
<li><a href="#_edge_case_behavior">8.7. Edge Case Behavior</a></li>
</ul>
</li>
<li><a href="#image_addressing_and_filtering">9. Image Addressing and Filtering</a>
<ul class="sectlevel2">
<li><a href="#image-coordinates">9.1. Image Coordinates</a></li>
<li><a href="#addressing-and-filter-modes">9.2. Addressing and Filter Modes</a></li>
<li><a href="#precision-of-addressing-and-filter-modes">9.3. Precision of Addressing and Filter Modes</a></li>
<li><a href="#conversion-rules">9.4. Conversion Rules</a></li>
<li><a href="#selecting-an-image-from-an-image-array">9.5. Selecting an Image from an Image Array</a></li>
<li><a href="#_data_format_for_reading_and_writing_images">9.6. Data Format for Reading and Writing Images</a></li>
<li><a href="#_sampled_and_sampler_less_reads">9.7. Sampled and Sampler-less Reads</a></li>
</ul>
</li>
<li><a href="#references">10. Normative References</a></li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Copyright 2008-2018 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 is a registered trademark and Khronos, 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 Silicon Graphics
International 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">1. Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p><a href="#opencl-spec"><strong>OpenCL</strong></a> (Open Computing Language) 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 these heterogeneous processing platforms.</p>
</div>
<div class="paragraph">
<p>Parallel programs in OpenCL may be written in the <a href="#opencl-c-spec">OpenCL C</a>
source language, or may compiled from OpenCL C, <a href="#opencl-cpp-spec">OpenCL
C++</a>, or other source languages into SPIR-V modules.</p>
</div>
<div class="paragraph">
<p>All SPIR-V intermediate binary modules are consumed by environments, such as
an API, a specific version of an API, or an implementation of an API.
The environment describes required support for some SPIR-V capabilities,
additional semantics for some SPIR-V instructions, and additional validation
rules a module must adhere to in order to be considered valid.</p>
</div>
<div class="paragraph">
<p>This document describes the environment for implementations of the OpenCL
API.
It is written for compiler developers who are generating SPIR-V modules to
be consumed by the OpenCL API, for implementors of the OpenCL API who are
consuming SPIR-V modules, and by software developers who are using SPIR-V
modules with the OpenCL API.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="consumption">2. SPIR-V Consumption</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This section describes common properties of all OpenCL environments.
Subsequent sections describe environments for specific versions of OpenCL,
and how an environment may additionally be modified via OpenCL or SPIR-V
extensions.</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="_validation_rules">2.1. Validation Rules</h3>
<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="ulist">
<ul>
<li>
<p>The <em>Execution Model</em> declared in <strong>OpEntryPoint</strong> must be <strong>Kernel</strong>.</p>
</li>
<li>
<p>The <em>Addressing Model</em> declared in <strong>OpMemoryModel</strong> must be either
<strong>Physical32</strong> or <strong>Physical64</strong>:</p>
<div class="ulist">
<ul>
<li>
<p>Modules indicating a <strong>Physical32</strong> <em>Addressing Model</em> are valid for
OpenCL devices reporting <code>32</code> for <code>CL_DEVICE_ADDRESS_BITS</code>.</p>
</li>
<li>
<p>Modules indicating a <strong>Physical64</strong> <em>Addressing Model</em> are valid for
OpenCL devices reporting <code>64</code> for <code>CL_DEVICE_ADDRESS_BITS</code>.</p>
</li>
</ul>
</div>
</li>
<li>
<p>The <em>Memory Model</em> declared in <strong>OpMemoryModel</strong> must be <strong>OpenCL</strong>.</p>
</li>
<li>
<p>For all <strong>OpTypeInt</strong> integer type-declaration instructions:</p>
<div class="ulist">
<ul>
<li>
<p><em>Signedness</em> must be 0, indicating no signedness semantics.</p>
</li>
</ul>
</div>
</li>
<li>
<p>For all <strong>OpTypeImage</strong> type-declaration instructions:</p>
<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>
</li>
<li>
<p>The image write instruction <strong>OpImageWrite</strong> must not include any optional
<em>Image Operands</em>.</p>
</li>
<li>
<p>The image read instructions <strong>OpImageRead</strong>, <strong>OpImageFetch</strong>, and
<strong>OpImageSampleExplicitLod</strong> must not include the optional <em>Image Operand</em>
<strong>ConstOffset</strong>.</p>
</li>
<li>
<p>For all <strong>Atomic Instructions</strong>:</p>
<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>
</li>
<li>
<p>Recursion is not supported.
The static function call graph for an entry point must not contain
cycles.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_source_language_encoding">2.2. 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>Hence, OpenCL C 1.2 would be encoded as <code>0x00010200</code>, and OpenCL C 2.0 as
<code>0x00020000</code>.</p>
</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.
Hence, OpenCL C++ 2.2 would be encoded as <code>0x00020200</code>.</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">2.3. 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">2.4. 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">2.4.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">2.4.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 spread">
<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>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Dim</em></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Depth</em></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Arrayed</em></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Description</strong></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>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>
<div class="sect3">
<h4 id="_other_data_types">2.4.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 spread">
<caption class="title">Table 2. Other Data Types</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Type</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Description</strong></p></td>
</tr>
<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 type.</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 type.</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 type</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">2.5. 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 spread">
<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">2.6. 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 spread">
<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>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">2.7. 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>
<div class="sect2">
<h3 id="_kernel_return_types">2.8. Kernel Return Types</h3>
<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="sect2">
<h3 id="_kernel_arguments">2.9. Kernel Arguments</h3>
<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>
<div class="sect1">
<h2 id="opencl2_2">3. OpenCL 2.2</h2>
<div class="sectionbody">
<div class="paragraph">
<p>An OpenCL 2.2 environment must accept SPIR-V 1.0, 1.1, and 1.2 modules.</p>
</div>
<div class="sect2">
<h3 id="_full_profile">3.1. Full Profile</h3>
<div class="paragraph">
<p>An OpenCL 2.2 Full Profile environment is guaranteed to support the
following SPIR-V capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Address</strong></p>
</li>
<li>
<p><strong>DeviceEnqueue</strong></p>
</li>
<li>
<p><strong>Float16Buffer</strong></p>
</li>
<li>
<p><strong>GenericPointer</strong></p>
</li>
<li>
<p><strong>Groups</strong></p>
</li>
<li>
<p><strong>Int64</strong></p>
</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>Pipes</strong></p>
</li>
<li>
<p><strong>Vector16</strong></p>
</li>
<li>
<p><strong>SubgroupDispatch</strong></p>
</li>
<li>
<p><strong>PipeStorage</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The following capabilities may be optionally supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageBasic</strong>, if <code>CL_DEVICE_IMAGE_SUPPORT</code> is <code>CL_TRUE</code></p>
</li>
<li>
<p><strong>Float64</strong>, if the device supports double precision floating-point</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If <strong>ImageBasic</strong> is supported then the following capabilities must also be
supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageReadWrite</strong></p>
</li>
<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>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_embedded_profile">3.2. Embedded Profile</h3>
<div class="paragraph">
<p>An OpenCL 2.2 Embedded Profile environment is guaranteed to support the
following SPIR-V capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Address</strong></p>
</li>
<li>
<p><strong>DeviceEnqueue</strong></p>
</li>
<li>
<p><strong>Float16Buffer</strong></p>
</li>
<li>
<p><strong>GenericPointer</strong></p>
</li>
<li>
<p><strong>Groups</strong></p>
</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>Pipes</strong></p>
</li>
<li>
<p><strong>Vector16</strong></p>
</li>
<li>
<p><strong>SubgroupDispatch</strong></p>
</li>
<li>
<p><strong>PipeStorage</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Furthermore, the following capabilities may optionally be supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageBasic</strong>, if <code>CL_DEVICE_IMAGE_SUPPORT</code> is <code>CL_TRUE</code></p>
</li>
<li>
<p><strong>Float64</strong>, if the device supports double precision floating-point</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If <strong>ImageBasic</strong> is supported then the following capabilities must also be
supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageReadWrite</strong></p>
</li>
<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>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_validation_rules_2">3.3. Validation Rules</h3>
<div class="paragraph">
<p>The following are a list of validation rules for SPIR-V modules executing in
an OpenCL 2.2 environment:</p>
</div>
<div class="paragraph">
<p><em>Scope</em> for <em>Execution</em> is generally limited to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Workgroup</strong></p>
</li>
<li>
<p><strong>Subgroup</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><em>Scope</em> for <em>Memory</em> is generally limited to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>CrossDevice</strong></p>
</li>
<li>
<p><strong>Device</strong></p>
</li>
<li>
<p><strong>Workgroup</strong></p>
</li>
<li>
<p><strong>Invocation</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><em>Scope</em> for <em>Execution</em> for the <strong>OpGroupAsyncCopy</strong> and <strong>OpGroupWaitEvents</strong>
instructions is specifically limited to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Workgroup</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The <em>Pointer</em> operand to all <strong>Atomic Instructions</strong> may additionally be a
pointer to the <strong>Generic</strong> <em>Storage Class</em>, however behavior is still
undefined if the <strong>Generic</strong> pointer represents a pointer to the <strong>Function</strong>
<em>Storage Class</em>.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="opencl2_1">4. OpenCL 2.1</h2>
<div class="sectionbody">
<div class="paragraph">
<p>An OpenCL 2.1 environment must accept SPIR-V 1.0 modules.</p>
</div>
<div class="sect2">
<h3 id="_full_profile_2">4.1. Full Profile</h3>
<div class="paragraph">
<p>An OpenCL 2.1 Full Profile environment is guaranteed to support the
following SPIR-V capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Address</strong></p>
</li>
<li>
<p><strong>DeviceEnqueue</strong></p>
</li>
<li>
<p><strong>Float16Buffer</strong></p>
</li>
<li>
<p><strong>GenericPointer</strong></p>
</li>
<li>
<p><strong>Groups</strong></p>
</li>
<li>
<p><strong>Int64</strong></p>
</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>Pipes</strong></p>
</li>
<li>
<p><strong>Vector16</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The following capabilities may be optionally supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageBasic</strong>, if <code>CL_DEVICE_IMAGE_SUPPORT</code> is <code>CL_TRUE</code></p>
</li>
<li>
<p><strong>Float64</strong>, if the device supports double precision floating-point</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If <strong>ImageBasic</strong> is supported then the following capabilities must also be
supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageReadWrite</strong></p>
</li>
<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>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_embedded_profile_2">4.2. Embedded Profile</h3>
<div class="paragraph">
<p>An OpenCL 2.1 Embedded Profile environment is guaranteed to support the
following SPIR-V capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Address</strong></p>
</li>
<li>
<p><strong>DeviceEnqueue</strong></p>
</li>
<li>
<p><strong>Float16Buffer</strong></p>
</li>
<li>
<p><strong>GenericPointer</strong></p>
</li>
<li>
<p><strong>Groups</strong></p>
</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>Pipes</strong></p>
</li>
<li>
<p><strong>Vector16</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Furthermore, the following capabilities may optionally be supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageBasic</strong>, if <code>CL_DEVICE_IMAGE_SUPPORT</code> is <code>CL_TRUE</code></p>
</li>
<li>
<p><strong>Float64</strong>, if the device supports double precision floating-point</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If <strong>ImageBasic</strong> is supported then the following capabilities must also be
supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageReadWrite</strong></p>
</li>
<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>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_validation_rules_3">4.3. Validation Rules</h3>
<div class="paragraph">
<p>The following are a list of validation rules for SPIR-V modules executing in
an OpenCL 2.1 environment:</p>
</div>
<div class="paragraph">
<p><em>Scope</em> for <em>Execution</em> is generally limited to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Workgroup</strong></p>
</li>
<li>
<p><strong>Subgroup</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><em>Scope</em> for <em>Memory</em> is generally limited to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>CrossDevice</strong></p>
</li>
<li>
<p><strong>Device</strong></p>
</li>
<li>
<p><strong>Workgroup</strong></p>
</li>
<li>
<p><strong>Invocation</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><em>Scope</em> for <em>Execution</em> for the <strong>OpGroupAsyncCopy</strong> and <strong>OpGroupWaitEvents</strong>
instructions is specifically limited to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Workgroup</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The <em>Pointer</em> operand to all <strong>Atomic Instructions</strong> may additionally be a
pointer to the <strong>Generic</strong> <em>Storage Class</em>, however behavior is still
undefined if the <strong>Generic</strong> pointer represents a pointer to the <strong>Function</strong>
<em>Storage Class</em>.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="opencl2_0">5. OpenCL 2.0</h2>
<div class="sectionbody">
<div class="paragraph">
<p>An OpenCL 2.0 environment must accept SPIR-V 1.0 modules if it includes the
optional extension <code>cl_khr_il_program</code> in the host API
<code>CL_PLATFORM_EXTENSIONS</code> or <code>CL_DEVICE_EXTENSIONS</code> string.</p>
</div>
<div class="sect2">
<h3 id="_full_profile_3">5.1. Full Profile</h3>
<div class="paragraph">
<p>An OpenCL 2.0 Full Profile environment is guaranteed to support the
following SPIR-V capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Address</strong></p>
</li>
<li>
<p><strong>DeviceEnqueue</strong></p>
</li>
<li>
<p><strong>Float16Buffer</strong></p>
</li>
<li>
<p><strong>GenericPointer</strong></p>
</li>
<li>
<p><strong>Groups</strong></p>
</li>
<li>
<p><strong>Int64</strong></p>
</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>Pipes</strong></p>
</li>
<li>
<p><strong>Vector16</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The following capabilities may be optionally supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageBasic</strong>, if <code>CL_DEVICE_IMAGE_SUPPORT</code> is <code>CL_TRUE</code></p>
</li>
<li>
<p><strong>Float64</strong>, if the device supports double precision floating-point</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If <strong>ImageBasic</strong> is supported then the following capabilities must also be
supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageReadWrite</strong></p>
</li>
<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>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_embedded_profile_3">5.2. Embedded Profile</h3>
<div class="paragraph">
<p>An OpenCL 2.0 Embedded Profile environment is guaranteed to support the
following SPIR-V capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Address</strong></p>
</li>
<li>
<p><strong>DeviceEnqueue</strong></p>
</li>
<li>
<p><strong>Float16Buffer</strong></p>
</li>
<li>
<p><strong>GenericPointer</strong></p>
</li>
<li>
<p><strong>Groups</strong></p>
</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>Pipes</strong></p>
</li>
<li>
<p><strong>Vector16</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Furthermore, the following capabilities may optionally be supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageBasic</strong>, if <code>CL_DEVICE_IMAGE_SUPPORT</code> is <code>CL_TRUE</code></p>
</li>
<li>
<p><strong>Float64</strong>, if the device supports double precision floating-point</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If <strong>ImageBasic</strong> is supported then the following capabilities must also be
supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageReadWrite</strong></p>
</li>
<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>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_validation_rules_4">5.3. Validation Rules</h3>
<div class="paragraph">
<p>The following are a list of validation rules for SPIR-V modules executing in
an OpenCL 2.0 environment:</p>
</div>
<div class="paragraph">
<p><em>Scope</em> for <em>Execution</em> is generally limited to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Workgroup</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><em>Scope</em> for <em>Memory</em> is generally limited to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>CrossDevice</strong></p>
</li>
<li>
<p><strong>Device</strong></p>
</li>
<li>
<p><strong>Workgroup</strong></p>
</li>
<li>
<p><strong>Invocation</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The <em>Pointer</em> operand to all <strong>Atomic Instructions</strong> may additionally be a
pointer to the <strong>Generic</strong> <em>Storage Class</em>, however behavior is still
undefined if the <strong>Generic</strong> pointer represents a pointer to the <strong>Function</strong>
<em>Storage Class</em>.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="opencl1_2">6. OpenCL 1.2</h2>
<div class="sectionbody">
<div class="paragraph">
<p>An OpenCL 1.2 environment must accept SPIR-V 1.0 modules if it includes the
optional extension <code>cl_khr_il_program</code> in the host API
<code>CL_PLATFORM_EXTENSIONS</code> or <code>CL_DEVICE_EXTENSIONS</code> string.</p>
</div>
<div class="sect2">
<h3 id="_full_profile_4">6.1. Full Profile</h3>
<div class="paragraph">
<p>An OpenCL 1.2 Full Profile environment is guaranteed to support the
following SPIR-V capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Address</strong></p>
</li>
<li>
<p><strong>Float16Buffer</strong></p>
</li>
<li>
<p><strong>Groups</strong></p>
</li>
<li>
<p><strong>Int64</strong></p>
</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>
</ul>
</div>
<div class="paragraph">
<p>The following capabilities may be optionally supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageBasic</strong>, if <code>CL_DEVICE_IMAGE_SUPPORT</code> is <code>CL_TRUE</code></p>
</li>
<li>
<p><strong>Float64</strong>, if the device supports double precision floating-point</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If <strong>ImageBasic</strong> is supported 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>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_embedded_profile_4">6.2. Embedded Profile</h3>
<div class="paragraph">
<p>An OpenCL 1.2 Embedded Profile environment is guaranteed to support the
following SPIR-V capabilities:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Address</strong></p>
</li>
<li>
<p><strong>Float16Buffer</strong></p>
</li>
<li>
<p><strong>Groups</strong></p>
</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>Pipes</strong></p>
</li>
<li>
<p><strong>Vector16</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The following capabilities may be optionally supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>ImageBasic</strong>, if <code>CL_DEVICE_IMAGE_SUPPORT</code> is <code>CL_TRUE</code></p>
</li>
<li>
<p><strong>Float64</strong>, if the device supports double precision floating-point</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If <strong>ImageBasic</strong> is supported 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>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_validation_rules_5">6.3. Validation Rules</h3>
<div class="paragraph">
<p>The following are a list of validation rules for SPIR-V modules executing in
an OpenCL 1.2 environment:</p>
</div>
<div class="paragraph">
<p><em>Scope</em> for <em>Execution</em> is generally limited to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Workgroup</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><em>Scope</em> for <em>Memory</em> is generally limited to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>CrossDevice</strong></p>
</li>
<li>
<p><strong>Device</strong></p>
</li>
<li>
<p><strong>Workgroup</strong></p>
</li>
<li>
<p><strong>Invocation</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The following <strong>Group Instructions</strong> are not supported:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>OpGroupAll</strong></p>
</li>
<li>
<p><strong>OpGroupAny</strong></p>
</li>
<li>
<p><strong>OpGroupBroadcast</strong></p>
</li>
<li>
<p><strong>OpGroupIAdd</strong></p>
</li>
<li>
<p><strong>OpGroupFAdd</strong></p>
</li>
<li>
<p><strong>OpGroupFMin</strong></p>
</li>
<li>
<p><strong>OpGroupUMin</strong></p>
</li>
<li>
<p><strong>OpGroupSMin</strong></p>
</li>
<li>
<p><strong>OpGroupFMax</strong></p>
</li>
<li>
<p><strong>OpGroupUMax</strong></p>
</li>
<li>
<p><strong>OpGroupSMax</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>For the <strong>Barrier Instructions</strong> <strong>OpControlBarrier</strong> and <strong>OpMemoryBarrier</strong>, the
<em>Scope</em> for execution must be <strong>Workgroup</strong>, the <em>Scope</em> for memory must be
<strong>Workgroup</strong>, and the <em>Memory Semantics</em> must be <strong>SequentiallyConsistent</strong>.</p>
</div>
<div class="paragraph">
<p>For the <strong>Atomic Instructions</strong>, the <em>Scope</em> must be <strong>Device</strong>, and the <em>Memory
Semantics</em> must be <strong>Relaxed</strong>.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="opencl_extensions">7. OpenCL Extensions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>An OpenCL environment may be modified by <a href="#opencl-extension-spec">OpenCL
extensions</a>. For example, some OpenCL extensions may require support
for support for additional SPIR-V capabilities or instructions, or by
relaxing SPIR-V restrictions.
Some OpenCL extensions may modify the OpenCL environment by requiring
consumption of a SPIR-V module that uses a SPIR-V extension. In this case,
the implementation will include the OpenCL extension in the host API
<code>CL_PLATFORM_EXTENSIONS</code> or <code>CL_DEVICE_EXTENSIONS</code> string, but not the
corresponding SPIR-V extension.</p>
</div>
<div class="paragraph">
<p>This section describes how the OpenCL environment is modified by Khronos
(<code>khr</code>) OpenCL extensions. Other OpenCL extensions, such as multi-vendor
(<code>ext</code>) extensions or vendor-specific extensions, describe how they modify
the OpenCL environment in their individual extension specifications. The
Khronos OpenCL extensions require no corresponding SPIR-V extensions.</p>
</div>
<div class="sect2">
<h3 id="_declaring_spir_v_extensions">7.1. Declaring SPIR-V Extensions</h3>
<div class="paragraph">
<p>A SPIR-V module declares use of a SPIR-V extension using <strong>OpExtension</strong> and
the name of the SPIR-V extension. For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>OpExtension "SPV_KHR_extension_name"</pre>
</div>
</div>
<div class="paragraph">
<p>Only use of SPIR-V extensions may be declared in a SPIR-V module using
<strong>OpExtension</strong>; there is never a need to declare use of an OpenCL extension
in a SPIR-V module using <strong>OpExtension</strong>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_full_and_embedded_profile_extensions">7.2. Full and Embedded Profile Extensions</h3>
<div class="sect3">
<h4 id="_code_cl_khr_3d_image_writes_code">7.2.1. <code>cl_khr_3d_image_writes</code></h4>
<div class="paragraph">
<p>If the OpenCL environment supports the extension <code>cl_khr_3d_image_writes</code>,
then the environment must accept <em>Image</em> operands to <strong>OpImageWrite</strong> that
are declared with with dimensionality <em>Dim</em> equal to <strong>3D</strong>.</p>
</div>
</div>
<div class="sect3">