+++ /dev/null
-<?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" pref:renderer="mathplayer-dl"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><link rel="stylesheet" type="text/css" href="opengl-man.css" /><title>glMemoryBarrier - OpenGL 4 Reference Pages</title><meta name="generator" content="DocBook XSL Stylesheets V1.69.1" /></head><body><div class="refentry" lang="en" xml:lang="en"><a id="glMemoryBarrier"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>glMemoryBarrier — defines a barrier ordering memory transactions</p></div><div class="refsynopsisdiv"><h2>C Specification</h2><div class="funcsynopsis"><p><code class="funcdef">void <b class="fsfunc">glMemoryBarrier</b>(</code>GLbitfield <var class="pdparam">barriers</var><code>)</code>;</p></div></div><div class="refsect1" lang="en" xml:lang="en"><a id="parameters"></a><h2>Parameters</h2><div class="variablelist"><dl><dt><span class="term"><em class="parameter"><code>barriers</code></em></span></dt><dd><p>
- Specifies the barriers to insert. Must be a bitwise combination of <code class="constant">GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT</code>,
- <code class="constant">GL_ELEMENT_ARRAY_BARRIER_BIT</code>, <code class="constant">GL_UNIFORM_BARRIER_BIT</code>, <code class="constant">GL_TEXTURE_FETCH_BARRIER_BIT</code>,
- <code class="constant">GL_SHADER_IMAGE_ACCESS_BARRIER_BIT</code>, <code class="constant">GL_COMMAND_BARRIER_BIT</code>, <code class="constant">GL_PIXEL_BUFFER_BARRIER_BIT</code>,
- <code class="constant">GL_TEXTURE_UPDATE_BARRIER_BIT</code>, <code class="constant">GL_BUFFER_UPDATE_BARRIER_BIT</code>,
- <code class="constant">GL_FRAMEBUFFER_BARRIER_BIT</code>, <code class="constant">GL_TRANSFORM_FEEDBACK_BARRIER_BIT</code>, <code class="constant">GL_ATOMIC_COUNTER_BARRIER_BIT</code>,
- or <code class="constant">GL_SHADER_STORAGE_BARRIER_BIT</code>.
- If the special value <code class="constant">GL_ALL_BARRIER_BITS</code> is specified, all supported barriers will be inserted.
- </p></dd></dl></div></div><div class="refsect1" lang="en" xml:lang="en"><a id="description"></a><h2>Description</h2><p>
- <code class="function">glMemoryBarrier</code> defines a barrier ordering the memory transactions issued prior to the
- command relative to those issued after the barrier. For the purposes of
- this ordering, memory transactions performed by shaders are considered to
- be issued by the rendering command that triggered the execution of the
- shader. <em class="parameter"><code>barriers</code></em> is a bitfield indicating the set of operations that
- are synchronized with shader stores; the bits used in <em class="parameter"><code>barriers</code></em> are as
- follows:
- </p><p>
- </p><div class="variablelist"><dl><dt><span class="term"><code class="constant">GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT</code></span></dt><dd><p>
- If set, vertex data sourced from
- buffer objects after the barrier will reflect data written by shaders
- prior to the barrier. The set of buffer objects affected by this bit
- is derived from the buffer object bindings used for
- generic vertex attributes derived from the <code class="constant">GL_VERTEX_ATTRIB_ARRAY_BUFFER</code> bindings.
- </p></dd><dt><span class="term"><code class="constant">GL_ELEMENT_ARRAY_BARRIER_BIT</code></span></dt><dd><p>
- If set, vertex array indices sourced from
- buffer objects after the barrier will reflect data written by shaders
- prior to the barrier. The buffer objects affected by this bit are
- derived from the <code class="constant">GL_ELEMENT_ARRAY_BUFFER</code> binding.
- </p></dd><dt><span class="term"><code class="constant">GL_UNIFORM_BARRIER_BIT</code></span></dt><dd><p>
- Shader uniforms sourced from buffer objects after the barrier will reflect data
- written by shaders prior to the barrier.
- </p></dd><dt><span class="term"><code class="constant">GL_TEXTURE_FETCH_BARRIER_BIT</code></span></dt><dd><p>
- Texture fetches from shaders, including
- fetches from buffer object memory via buffer textures, after the
- barrier will reflect data written by shaders prior to the barrier.
- </p></dd><dt><span class="term"><code class="constant">GL_SHADER_IMAGE_ACCESS_BARRIER_BIT</code></span></dt><dd><p>
- Memory accesses using shader image
- load, store, and atomic built-in functions issued after the barrier
- will reflect data written by shaders prior to the barrier.
- Additionally, image stores and atomics issued after the barrier will
- not execute until all memory accesses (e.g., loads, stores, texture
- fetches, vertex fetches) initiated prior to the barrier complete.
- </p></dd><dt><span class="term"><code class="constant">GL_COMMAND_BARRIER_BIT</code></span></dt><dd><p>
- Command data sourced from buffer objects by
- Draw*Indirect commands after the barrier will reflect data written by
- shaders prior to the barrier. The buffer objects affected by this bit
- are derived from the <code class="constant">GL_DRAW_INDIRECT_BUFFER</code> binding.
- </p></dd><dt><span class="term"><code class="constant">GL_PIXEL_BUFFER_BARRIER_BIT</code></span></dt><dd><p>
- Reads and writes of buffer objects via the
- <code class="constant">GL_PIXEL_PACK_BUFFER</code> and <code class="constant">GL_PIXEL_UNPACK_BUFFER</code>
- bindings (via <a href="glReadPixels.xml"><span class="citerefentry"><span class="refentrytitle">glReadPixels</span></span></a>,
- <a href="glTexSubImage.xml"><span class="citerefentry"><span class="refentrytitle">glTexSubImage</span></span></a>, etc.) after the
- barrier will reflect data written by shaders prior to the barrier.
- Additionally, buffer object writes issued after the barrier will wait
- on the completion of all shader writes initiated prior to the barrier.
- </p></dd><dt><span class="term"><code class="constant">GL_TEXTURE_UPDATE_BARRIER_BIT</code></span></dt><dd><p>
- Writes to a texture via <code class="function">glTex(Sub)Image*</code>,
- <code class="function">glCopyTex(Sub)Image*</code>, <code class="function">glCompressedTex(Sub)Image*</code>, and reads via
- <a href="glGetTexImage.xml"><span class="citerefentry"><span class="refentrytitle">glGetTexImage</span></span></a> after the barrier will reflect data written by shaders
- prior to the barrier. Additionally, texture writes from these
- commands issued after the barrier will not execute until all shader
- writes initiated prior to the barrier complete.
- </p></dd><dt><span class="term"><code class="constant">GL_BUFFER_UPDATE_BARRIER_BIT</code></span></dt><dd><p>
- Reads or writes via <a href="glBufferSubData.xml"><span class="citerefentry"><span class="refentrytitle">glBufferSubData</span></span></a>,
- <a href="glCopyBufferSubData.xml"><span class="citerefentry"><span class="refentrytitle">glCopyBufferSubData</span></span></a>,
- or <a href="glGetBufferSubData.xml"><span class="citerefentry"><span class="refentrytitle">glGetBufferSubData</span></span></a>, or
- to buffer object memory mapped by <a href="glMapBuffer.xml"><span class="citerefentry"><span class="refentrytitle">glMapBuffer</span></span></a>
- or <a href="glMapBufferRange.xml"><span class="citerefentry"><span class="refentrytitle">glMapBufferRange</span></span></a> after the barrier
- will reflect data written by shaders prior to the barrier.
- Additionally, writes via these commands issued after the barrier will
- wait on the completion of any shader writes to the same memory
- initiated prior to the barrier.
- </p></dd><dt><span class="term"><code class="constant">GL_FRAMEBUFFER_BARRIER_BIT</code></span></dt><dd><p>
- Reads and writes via framebuffer object
- attachments after the barrier will reflect data written by shaders
- prior to the barrier. Additionally, framebuffer writes issued after
- the barrier will wait on the completion of all shader writes issued
- prior to the barrier.
- </p></dd><dt><span class="term"><code class="constant">GL_TRANSFORM_FEEDBACK_BARRIER_BIT</code></span></dt><dd><p>
- Writes via transform feedback
- bindings after the barrier will reflect data written by shaders prior
- to the barrier. Additionally, transform feedback writes issued after
- the barrier will wait on the completion of all shader writes issued
- prior to the barrier.
- </p></dd><dt><span class="term"><code class="constant">GL_ATOMIC_COUNTER_BARRIER_BIT</code></span></dt><dd><p>
- Accesses to atomic counters after the
- barrier will reflect writes prior to the barrier.
- </p></dd><dt><span class="term"><code class="constant">GL_SHADER_STORAGE_BARRIER_BIT</code></span></dt><dd><p>
- Accesses to shader storage blocks after the
- barrier will reflect writes prior to the barrier.
- </p></dd></dl></div><p>
- </p><p>
- If <em class="parameter"><code>barriers</code></em> is <code class="constant">GL_ALL_BARRIER_BITS</code>, shader memory accesses
- will be synchronized relative to all the operations described above.
- </p><p>
- Implementations may cache buffer object and texture image memory that
- could be written by shaders in multiple caches; for example, there may be
- separate caches for texture, vertex fetching, and one or more caches for
- shader memory accesses. Implementations are not required to keep these
- caches coherent with shader memory writes. Stores issued by one
- invocation may not be immediately observable by other pipeline stages or
- other shader invocations because the value stored may remain in a cache
- local to the processor executing the store, or because data overwritten by
- the store is still in a cache elsewhere in the system. When <code class="function">glMemoryBarrier</code>
- is called, the GL flushes and/or invalidates any caches relevant to the
- operations specified by the <em class="parameter"><code>barriers</code></em> parameter to ensure consistent
- ordering of operations across the barrier.
- </p><p>
- To allow for independent shader invocations to communicate by reads and
- writes to a common memory address, image variables in the OpenGL Shading
- Language may be declared as "coherent". Buffer object or texture image
- memory accessed through such variables may be cached only if caches are
- automatically updated due to stores issued by any other shader invocation.
- If the same address is accessed using both coherent and non-coherent
- variables, the accesses using variables declared as coherent will observe
- the results stored using coherent variables in other invocations. Using
- variables declared as "coherent" guarantees only that the results of
- stores will be immediately visible to shader invocations using
- similarly-declared variables; calling <code class="function">glMemoryBarrier</code> is required to ensure
- that the stores are visible to other operations.
- </p><p>
- The following guidelines may be helpful in choosing when to use coherent
- memory accesses and when to use barriers.
- </p><p>
- </p><div class="itemizedlist"><ul type="disc"><li><p>Data that are read-only or constant may be accessed without using
- coherent variables or calling MemoryBarrier(). Updates to the
- read-only data via API calls such as BufferSubData will invalidate
- shader caches implicitly as required.</p></li><li><p>Data that are shared between shader invocations at a fine granularity
- (e.g., written by one invocation, consumed by another invocation) should
- use coherent variables to read and write the shared data.</p></li><li><p>Data written by one shader invocation and consumed by other shader
- invocations launched as a result of its execution ("dependent
- invocations") should use coherent variables in the producing shader
- invocation and call memoryBarrier() after the last write. The consuming
- shader invocation should also use coherent variables.</p></li><li><p>Data written to image variables in one rendering pass and read by the
- shader in a later pass need not use coherent variables or
- memoryBarrier(). Calling MemoryBarrier() with the
- SHADER_IMAGE_ACCESS_BARRIER_BIT set in <em class="parameter"><code>barriers</code></em> between passes is
- necessary.</p></li><li><p>Data written by the shader in one rendering pass and read by another
- mechanism (e.g., vertex or index buffer pulling) in a later pass need
- not use coherent variables or memoryBarrier(). Calling
- <code class="function">glMemoryBarrier</code> with the appropriate bits set in <em class="parameter"><code>barriers</code></em> between
- passes is necessary.</p></li></ul></div><p>
- </p></div><div class="refsect1" lang="en" xml:lang="en"><a id="notes"></a><h2>Notes</h2><p>
- <code class="function">glMemoryBarrier</code> is available only if the GL version is 4.2 or higher.
- </p><p>
- <code class="constant">GL_SHADER_STORAGE_BARRIER_BIT</code> is available only if the GL version is 4.3 or higher.
- </p></div><div class="refsect1" lang="en" xml:lang="en"><a id="errors"></a><h2>Errors</h2><p>
- <code class="constant">GL_INVALID_VALUE</code> is generated if <em class="parameter"><code>barriers</code></em> contains any bits
- other than those listed above, or is not the special value <code class="constant">GL_ALL_BARRIER_BITS</code>.
- </p></div><div class="refsect1" lang="en" xml:lang="en"><a id="seealso"></a><h2>See Also</h2><p>
- <a href="glBindImageTexture.xml"><span class="citerefentry"><span class="refentrytitle">glBindImageTexture</span></span></a>,
- <a href="glBufferData.xml"><span class="citerefentry"><span class="refentrytitle">glBufferData</span></span></a>,
- <a href="glMapBuffer.xml"><span class="citerefentry"><span class="refentrytitle">glMapBuffer</span></span></a>,
- <a href="glMapBufferRange.xml"><span class="citerefentry"><span class="refentrytitle">glMapBufferRange</span></span></a>,
- <a href="glFlushMappedBufferRange.xml"><span class="citerefentry"><span class="refentrytitle">glFlushMappedBufferRange</span></span></a>
- </p></div><div class="refsect1" lang="en" xml:lang="en"><a id="Copyright"></a><h2>Copyright</h2><p>
- Copyright <span class="trademark"></span>© 2011 Khronos Group.
- This material may be distributed subject to the terms and conditions set forth in
- the Open Publication License, v 1.0, 8 June 1999.
- <a href="http://opencontent.org/openpub/" target="_top">http://opencontent.org/openpub/</a>.
- </p></div></div></body></html>