blob: 4c4995c15dbe3df8fcedb937600036640bbbf2f1 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1-transitional.dtd">
<!-- saved from url=(0013)about:internet -->
<?xml-stylesheet type="text/xsl" href="mathml.xsl"?><html xmlns="http://www.w3.org/1999/xhtml" xmlns:pref="http://www.w3.org/2002/Math/preference" xmlns:xlink="http://www.w3.org/1999/xlink" pref:renderer="mathplayer-dl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style xmlns="" type="text/css">
/* This style sets a margin around the entire page */
html, body {
margin: 10px;
}
p {
font: normal 16px verdana, sans-serif;
margin: 0;
padding-bottom:12px;
}
h1 {
font: bold 25px verdana, sans-serif;
margin-top: 0;
margin-bottom: 3px;
padding-top: 0;
padding-bottom: 0;
}
h2 {
font: bold 19px verdana, sans-serif;
margin-top: 28px;
margin-bottom: 3px;
padding-top: 0;
padding-bottom: 0;
}
h3 {
font: bold 19px verdana, sans-serif !important;
margin-top: 28px;
margin-bottom: 3px;
padding-top: 0;
padding-bottom: 0;
}
li {
font: normal 16px verdana, sans-serif;
margin-top: 0;
margin-bottom: 18px;
padding-top: 0;
padding-bottom: 0;
}
.pdparam {
font: italic 16px verdana, sans-serif;
}
.term {
font: italic 16px verdana, sans-serif;
font-weight: normal;
}
.type {
font: normal 16px verdana, sans-serif !important;
}
.parameter {
font-style: italic;
}
a:link, a:visited {
color: blue;
text-decoration: none;
font: normal 16px;
}
a:hover {
background-color: #FFFF99;
font: normal 16px;
}
div.funcsynopsis {
text-align: left;
background-color: #e6e6e6;
font: normal 16px verdana, sans-serif;
padding-top: 10px;
padding-bottom: 10px;
}
div.funcsynopsis table {
border-collapse: separate;
font: normal 16px verdana, sans-serif;
}
div.funcsynopsis td {
background-color: #e6e6e6;
border: 0 solid #000;
padding: 1px;
font: normal 16px verdana, sans-serif;
}
div.refsect1 {
font-family: verdana, sans-serif;
font-size: 16px;
}
code.constant {
font: normal 16px courier new, monospace !important;
}
span.errorname {
font: normal 16px verdana, sans-serif !important;
}
code.function {
font: bold 16px verdana, sans-serif !important;
}
b.fsfunc {
font: bold 16px verdana, sans-serif !important;
}
code.varname {
font: italic 16px verdana, sans-serif;
}
code.replaceable {
font: italic 16px courier new, monospace;
}
code.funcdef {
font: normal 16px verdana, sans-serif !important;
}
.citerefentry {
font: normal 16px verdana, sans-serif !important;
}
.parameter {
font-style: italic;
}
code.fsfunc {
font: normal 16px verdana, sans-serif !important;
}
/* PARAMETER: This style controls spacing between the terms in Parameter section */
dt {
margin-top: 15px;
}
/* TABLES: These styles apply to all tables OTHER than the Synopsis and Example tables */
div.refsect1 table {
width: 100%;
margin-top: 10px;
background-color: #FFF;
border-collapse: collapse;
border-color: #000;
border-width: 1px;
font: normal 16px verdana, sans-serif;
}
div.refsect1 th {
border-collapse: collapse;
border-color: #000;
border-width: 1px;
font: bold 16px verdana, sans-serif;
}
div.refsect1 td {
background-color: #FFF;
padding: 5px;
vertical-align: text-top;
border-collapse: collapse;
border-color: #000;
border-width: 1px;
font: normal 16px verdana, sans-serif;
}
div.refsect1 p{
font: normal 16px verdana, sans-serif;
margin-top: 8px;
margin-bottom: 8px;
padding-top: 0;
padding-bottom: 0;
}
/* EXAMPLE: These styles apply only to the Example section */
div.refsect2 {
font: normal 16px courier new, monospace !important;
}
div.refsect2 table {
margin-top: 0;
background-color: #e6e6e6;
width: 100%;
border: 0 solid #000;
padding: 2px;
font: normal 16px courier new, monospace !important;
}
div.refsect2 td {
background-color: #e6e6e6;
font: normal 16px courier new, monospace !important;
white-space:pre;
}
/* COPYRIGHT: This style formats the text of the copyright statement at the bottom of the page */
div.refsect3 {
font: normal 11px verdana, sans-serif;
margin-top: 50px;
margin-bottom: 20px;
padding-top: 0;
padding-bottom: 0;
}
</style>
<title>enqueue_kernel</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1" />
<meta name="keywords" content="enqueue_kernel" />
</head>
<body>
<div class="refentry">
<a id="id-1"></a>
<div class="titlepage"></div>
<div xmlns="" class="refnamediv">
<a xmlns="http://www.w3.org/1999/xhtml" id="enqueue_kernel"></a>
<h1>enqueue_kernel</h1>
<p>
Enqueue the block for execution to <code xmlns="http://www.w3.org/1999/xhtml" class="varname">queue</code>.
</p>
</div>
<div class="refsynopsisdiv">
<h2></h2>
<div class="funcsynopsis">
<table xmlns="" border="0" summary="Function synopsis" cellspacing="0" cellpadding="0">
<tr valign="bottom">
<td>
<code xmlns="http://www.w3.org/1999/xhtml" class="funcdef">
<a class="link" href="scalarDataTypes.html" target="pagedisplay">int</a>
<strong class="fsfunc">
enqueue_kernel
</strong>
(</code>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">queue_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">queue</var>
, </td>
</td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="enums.html#kernel_enqueue_flags_t" target="pagedisplay">kernel_enqueue_flags_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">flags</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
const <a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">ndrange_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">ndrange</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="scalarDataTypes.html" target="pagedisplay">void</a>
<var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">^block)(void)</var>
<code>)</code></td>
</tr>
</table>
</div>
<div class="funcsynopsis">
<table xmlns="" border="0" summary="Function synopsis" cellspacing="0" cellpadding="0">
<tr valign="bottom">
<td>
<code xmlns="http://www.w3.org/1999/xhtml" class="funcdef">
<a class="link" href="scalarDataTypes.html" target="pagedisplay">int</a>
<strong class="fsfunc">
enqueue_kernel
</strong>
(</code>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">queue_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">queue</var>
, </td>
</td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="enums.html#kernel_enqueue_flags_t" target="pagedisplay">kernel_enqueue_flags_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">flags</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
const <a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">ndrange_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">ndrange</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="scalarDataTypes.html" target="pagedisplay">uint</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">num_events_in_wait_list</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
const <a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">clk_event_t</a>
<var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">event_wait_list</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">clk_event_t</a>
<var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">event_ret</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="scalarDataTypes.html" target="pagedisplay">void</a>
<var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">^block)(void)</var>
<code>)</code></td>
</tr>
</table>
</div>
<div class="funcsynopsis">
<table xmlns="" border="0" summary="Function synopsis" cellspacing="0" cellpadding="0">
<tr valign="bottom">
<td>
<code xmlns="http://www.w3.org/1999/xhtml" class="funcdef">
<a class="link" href="scalarDataTypes.html" target="pagedisplay">int</a>
<strong class="fsfunc">
enqueue_kernel
</strong>
(</code>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">queue_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">queue</var>
, </td>
</td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="enums.html#kernel_enqueue_flags_t" target="pagedisplay">kernel_enqueue_flags_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">flags</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
const <a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">ndrange_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">ndrange</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="scalarDataTypes.html" target="pagedisplay">void</a>
<var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">^block)(local void *, ...)</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="scalarDataTypes.html" target="pagedisplay">uint</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">size0, ...</var>
<code>)</code></td>
</tr>
</table>
</div>
<div class="funcsynopsis">
<table xmlns="" border="0" summary="Function synopsis" cellspacing="0" cellpadding="0">
<tr valign="bottom">
<td>
<code xmlns="http://www.w3.org/1999/xhtml" class="funcdef">
<a class="link" href="scalarDataTypes.html" target="pagedisplay">int</a>
<strong class="fsfunc">
enqueue_kernel
</strong>
(</code>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">queue_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">queue</var>
, </td>
</td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="enums.html#kernel_enqueue_flags_t" target="pagedisplay">kernel_enqueue_flags_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">flags</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
const <a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">ndrange_t</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">ndrange</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="scalarDataTypes.html" target="pagedisplay">uint</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">num_events_in_wait_list</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
const <a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">clk_event_t</a>
<var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">event_wait_list</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="otherDataTypes.html" target="pagedisplay">clk_event_t</a>
<var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">event_ret</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="scalarDataTypes.html" target="pagedisplay">void</a>
<var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">^block)(local void *, ...)</var>
, </td>
</tr>
<tr valign="top">
<td> </td>
<td>
<a xmlns="http://www.w3.org/1999/xhtml" class="link" href="scalarDataTypes.html" target="pagedisplay">uint</a>
 <var xmlns="http://www.w3.org/1999/xhtml" class="pdparam">size0, ...</var>
<code>)</code></td>
</tr>
</table>
</div>
</div>
<div class="refsect1">
<a id="description"></a>
<h2>Description</h2>
<p>
Enqueue the block for execution to <code class="varname">queue</code>.
If an event is returned, <code class="function">enqueue_kernel</code>
performs an implicit retain on the returned event.
</p>
<p>
OpenCL 2.0 allows a kernel to independently enqueue to the same device, without host
interaction. A kernel may enqueue code represented by Block syntax, and control execution
order with event dependencies including user events and markers. There are several advantages
to using the Block syntax: it is more compact; it does not require a
<span class="type">cl_kernel</span> object; and
enqueuing can be done as a single semantic step.
</p>
<p>
The <code class="function">enqueue_kernel</code> built-in function
allows a work-item to enqueue a block. Work-items can
enqueue multiple blocks to a device queue(s).
</p>
<p>
The <span class="type">kernel_enqueue_flags_t</span> argument to
<code class="function">enqueue_kernel</code> built-in functions can
be used to specify when the child kernel begins
execution. Supported values are described in the
table below. (Implementations are not required to honor this flag.
Implementations may not schedule kernel launch earlier than
the point specified by this flag, however):
</p>
<div class="informaltable">
<table class="informaltable" border="1">
<colgroup>
<col align="left" class="col1" />
<col align="left" class="col2" />
</colgroup>
<thead>
<tr>
<th align="left">kernel_enqueue_flags_t enum</th>
<th align="left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">
<code class="constant">CLK_ENQUEUE_FLAGS_NO_WAIT</code>
</td>
<td align="left">
Indicates that the enqueued kernels
do not need to wait for the parent
kernel to finish execution before
they begin execution.
</td>
</tr>
<tr>
<td align="left">
<code class="constant">CLK_ENQUEUE_FLAGS_WAIT_KERNEL</code>
</td>
<td align="left">
Indicates that all work-items of the
parent kernel must finish executing
and all immediate side effects
committed before the enqueued
child kernel may begin execution.
(Immediate meaning not side effects resulting from child kernels.
The side effects would include stores to global
memory and pipe reads and writes.)
</td>
</tr>
<tr>
<td align="left">
<code class="constant">CLK_ENQUEUE_FLAGS_WAIT_WORK_GROUP</code>
</td>
<td align="left">
Indicates that the enqueued kernels
wait only for the workgroup that
enqueued the kernels to finish
before they begin execution.
This acts as a memory synchronization point between
work-items in a work-group and child kernels enqueued by
work-items in the work-group.
</td>
</tr>
</tbody>
</table>
</div>
<p>
NOTE: The <span class="type">kernel_enqueue_flags_t</span>
flags are useful when a kernel enqueued from the
host and executing on a device enqueues kernels
on the device. The kernel enqueued from the
host may not have an event associated with it.
The <span class="type">kernel_enqueue_flags_t</span> flags allow
the developer to indicate when the child
kernels can begin execution.
</p>
</div>
<div class="refsect1">
<a id="notes"></a>
<h2>Notes</h2>
<p>
A block passed to <code class="function">enqueue_kernel</code>
can have arguments declared to be a pointer to local
memory. The <code class="function">enqueue_kernel</code> built-in
function variants allow blocks to be enqueued with a
variable number of arguments. Each argument must be
declared to be a pointer of a data type to
local memory. These <code class="function">enqueue_kernel</code>
built-in function variants also have a corresponding
number of arguments each of type uint that follow
the block argument. These arguments
specify the size of each local memory pointer
argument of the enqueued block.
</p>
<p>
If the
<a class="citerefentry" href="cl_khr_device_enqueue_local_arg_types.html"><span class="citerefentry"><span class="refentrytitle">cl_khr_device_enqueue_local_arg_types</span></span></a>
extension is enabled, then replace all occurrences of
<code class="code">local void *</code>
in the table above with
<code class="code">local gentype *</code>.
We use the generic type name <code class="code">gentype</code>
to indicate the built-in OpenCL C scalar or
vector integer or floating-point data types, or
any user defined type built from these scalar and
vector data types which can be used as the type
of the pointee of the arguments of the kernel
enqueue functions listed above.
</p>
</div>
<div class="refsect2">
<a id="example1"></a>
<h3>
Example
</h3>
<p>
Below are some examples of how to enqueue a block.
</p>
<div class="informaltable">
<table class="informaltable" border="0">
<colgroup>
<col align="left" class="col1" />
</colgroup>
<tbody>
<tr>
<td align="left">
kernel void
my_func_A(global int *a, global int *b, global int *c)
{
...
}
kernel void
my_func_B(global int *a, global int *b, global int *c)
{
ndrange_t ndrange;
// build ndrange information
...
// example – enqueue a kernel as a block
enqueue_kernel(get_default_queue(), ndrange,
^{my_func_A(a, b, c);});
...
}
kernel void
my_func_C(global int *a, global int *b, global int *c)
{
ndrange_t ndrange;
// build ndrange information
...
// note that a, b and c are variables in scope of
// the block
void (^my_block_A)(void) = ^{my_func_A(a, b, c);};
// enqueue the block variable
enqueue_kernel(get_default_queue(),
CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
ndrange,
my_block_A);
...
}
</td>
</tr>
</tbody>
</table>
</div>
<p>
The example below shows how to declare a block literal and enqueue it.
</p>
<div class="informaltable">
<table class="informaltable" border="0">
<colgroup>
<col align="left" class="col1" />
</colgroup>
<tbody>
<tr>
<td align="left">
kernel void
my_func(global int *a, global int *b)
{
ndrange_t ndrange;
// build ndrange information
...
// note that a, b and c are variables in scope of
// the block
void (^my_block_A)(void) =
^{ size_t id = get_global_id(0);
b[id] += a[id];
};
// enqueue the block variable
enqueue_kernel(get_default_queue(),
CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
ndrange,
my_block_A);
// or we could have done the following
enqueue_kernel(get_default_queue(),
CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
ndrange,
^{
size_t id = get_global_id(0);
b[id] += a[id];
};
}
</td>
</tr>
</tbody>
</table>
</div>
<p>
NOTE: Blocks passed to <code class="function">enqueue_kernel</code>
cannot use global variables or stack variables
local to the enclosing lexical scope that are a
pointer type in the local or private address space.
</p>
<div class="informaltable">
<table class="informaltable" border="0">
<colgroup>
<col align="left" class="col1" />
</colgroup>
<tbody>
<tr>
<td align="left">
kernel void
foo(global int *a, local int *lptr, …)
{
enqueue_kernel(get_default_queue(),
CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
ndrange,
^{
size_t id = get_global_id(0);
local int *p = lptr; // undefined behavior
};
}
</td>
</tr>
</tbody>
</table>
</div>
<p>
See section 6.13.17 of the specification for more information and examples.
</p>
</div>
<div class="refsect1">
<a id="errors"></a>
<h2>Errors</h2>
<p>
<code class="function">enqueue_kernel</code> returns
<span class="errorname">CL_SUCCESS</span> if the
block is enqueued successfully and returns
<span class="errorname">CL_ENQUEUE_FAILURE</span>
otherwise. If the –g compile option is
specified in compiler options passed to
<a class="citerefentry" href="clCompileProgram.html"><span class="citerefentry"><span class="refentrytitle">clCompileProgram</span></span></a> or
<a class="citerefentry" href="clBuildProgram.html"><span class="citerefentry"><span class="refentrytitle">clBuildProgram</span></span></a>
when compiling or building the parent program, the following
errors may be returned instead of
<span class="errorname">CL_ENQUEUE_FAILURE</span> to indicate
why <code class="function">enqueue_kernel</code>
failed to enqueue the block:
</p>
<div class="itemizedlist">
<ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem" style="list-style-type: disc"><span class="errorname">CLK_INVALID_QUEUE</span> if <code class="varname">queue</code> is not
a valid device queue.
</li>
<li class="listitem" style="list-style-type: disc"><span class="errorname">CLK_INVALID_NDRANGE</span> if <code class="varname">ndrange</code>
is not a valid ND-range descriptor or if the
program was compiled with <code class="code">–cl-uniform-work-group-size</code>
and the local_work_size is specified in <code class="varname">ndrange</code>
but the global_work_size specified in <code class="varname">ndrange</code>
is not a multiple of the local_work_size.
</li>
<li class="listitem" style="list-style-type: disc"><span class="errorname">CLK_INVALID_EVENT_WAIT_LIST</span> if
<code class="varname">event_wait_list</code> is NULL and
<code class="varname">num_events_in_wait_list</code> &gt; 0, or if
<code class="varname">event_wait_list</code> is not NULL and
<code class="varname">num_events_in_wait_list</code> is 0, or if event objects in
<code class="varname">event_wait_list</code> are not valid events.
</li>
<li class="listitem" style="list-style-type: disc"><span class="errorname">CLK_DEVICE_QUEUE_FULL</span> if
<code class="varname">queue</code> is full.
</li>
<li class="listitem" style="list-style-type: disc"><span class="errorname">CLK_INVALID_ARG_SIZE</span> if size of local memory arguments is 0.
</li>
<li class="listitem" style="list-style-type: disc"><span class="errorname">CLK_EVENT_ALLOCATION_FAILURE</span>
if <code class="varname">event_ret</code> is not NULL and an event could not
be allocated.
</li>
<li class="listitem" style="list-style-type: disc"><span class="errorname">CLK_OUT_OF_RESOURCES</span>
if there is a failure to queue the block in <code class="varname">queue</code>
because of insufficient resources needed to execute the kernel.
</li>
</ul>
</div>
</div>
<div class="refsect1">
<a id="specification"></a>
<h2>Specification</h2>
<p>
<img src="pdficon_small1.gif" />
<a href="https://www.khronos.org/registry/cl/specs/opencl-2.1-openclc.pdf#page=162" target="OpenCL Spec">OpenCL Specification</a>
</p>
</div>
<div xmlns="" class="refsect3" lang="en" xml:lang="en"><a xmlns="http://www.w3.org/1999/xhtml" id="Copyright"></a><h4 xmlns="http://www.w3.org/1999/xhtml"></h4><img xmlns="http://www.w3.org/1999/xhtml" src="KhronosLogo.jpg" /><p xmlns="http://www.w3.org/1999/xhtml"></p>Copyright © 2007-2015 The Khronos Group Inc.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and/or associated documentation files (the
"Materials"), to deal in the Materials without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Materials, and to
permit persons to whom the Materials are furnished to do so, subject to
the condition that this copyright notice and permission notice shall be included
in all copies or substantial portions of the Materials.
</div>
</div>
</body>
</html>