Difference between revisions of "Shader Storage Buffer Object"

From OpenGL.org
Jump to: navigation, search
(Adding the object float.)
(Atomic operations)
(One intermediate revision by the same user not shown)
Line 13: Line 13:
 
SSBOs are a lot like [[Uniform Buffer Object]]s. Shader storage blocks are defined almost identically to uniform blocks. SSBOs are bound to SSBO binding points, just as UBOs are bound to UBO binding points. And so forth.
 
SSBOs are a lot like [[Uniform Buffer Object]]s. Shader storage blocks are defined almost identically to uniform blocks. SSBOs are bound to SSBO binding points, just as UBOs are bound to UBO binding points. And so forth.
  
The principle differences between them are:
+
The major differences between them are:
  
 
# SSBOs are typically much larger. The smallest required UBO size is 16KB; the smallest required SSBO size is 16'''MB''', and typical sizes will be on the order of the size of GPU memory.
 
# SSBOs are typically much larger. The smallest required UBO size is 16KB; the smallest required SSBO size is 16'''MB''', and typical sizes will be on the order of the size of GPU memory.
# SSBOs are writable, even atomically; UBOs are {{code|uniform}}s. SSBOs do need to use memory barriers, similar to [[Image Load Store]] write and read operations.
+
# SSBOs are writable, even atomically; UBOs are {{code|uniform}}s. SSBOs have the same memory characteristics as [[Image Load Store]] operations, so they need appropriate memory barriers.
 
# SSBOs can have unbounded storage, up to the buffer range bound; UBOs must have a specific, fixed storage size. This means that you can have an array of arbitrary length in an SSBO. The actual size of the array, based on the range of the buffer bound, can be queried at runtime in the shader using the {{code|length}} function on the unbounded array variable.
 
# SSBOs can have unbounded storage, up to the buffer range bound; UBOs must have a specific, fixed storage size. This means that you can have an array of arbitrary length in an SSBO. The actual size of the array, based on the range of the buffer bound, can be queried at runtime in the shader using the {{code|length}} function on the unbounded array variable.
  
 
Functionally speaking, SSBOs can be thought of as a much nicer interface to [[Buffer Texture]]s when accessed via [[Image Load Store]].
 
Functionally speaking, SSBOs can be thought of as a much nicer interface to [[Buffer Texture]]s when accessed via [[Image Load Store]].
 +
 +
== Atomic operations ==
 +
 +
There are special atomic functions that can be applied to buffer variables (and to compute shader {{code|shared}} variables). They only take {{code|uint}} or {{code|int}} types, but these can be members of aggregates (structs/arrays) or vector elements (ie: you can atomically access {{code|uvec3.x}}).
 +
 +
All of the atomic functions return the '''''original''''' value.
 +
 +
The atomic operations are (where "''n''int" can be {{code|int}} or {{code|uint}}):
 +
{{clear float}}
 +
''n''int atomicAdd(inout ''n''int {{param|mem}}, ''n''int {{param|data}})
 +
''n''int atomicMin(inout ''n''int {{param|mem}}, ''n''int {{param|data}})
 +
''n''int atomicMax(inout ''n''int {{param|mem}}, ''n''int {{param|data}})
 +
''n''int atomicAnd (inout ''n''int {{param|mem}}, ''n''int {{param|data}})
 +
''n''int atomicOr(inout ''n''int {{param|mem}}, ''n''int {{param|data}})
 +
''n''int atomicXor(inout ''n''int {{param|mem}}, ''n''int {{param|data}})
 +
''n''int atomicExchange(inout ''n''int {{param|mem}}, ''n''int {{param|data}})
 +
''n''int atomicCompSwap(inout ''n''int {{param|mem}}, ''n''int {{param|compare}}, ''n''int {{param|data}})
 +
 +
The last function bears some explanation. It will swap {{param|mem}} with {{param|data}} if {{param|compare}} is equal to the current value of {{param|mem}}.
 +
  
 
{{stub}}
 
{{stub}}

Revision as of 20:41, 20 October 2012

Shader Storage Buffer Object
Core in version 4.5
Core since version 4.3
Core ARB extension ARB_shader_storage_buffer_object

A Shader Storage Buffer Object is a Buffer Object that is used to store and retrieve data from GLSL.

Overview

SSBOs are a lot like Uniform Buffer Objects. Shader storage blocks are defined almost identically to uniform blocks. SSBOs are bound to SSBO binding points, just as UBOs are bound to UBO binding points. And so forth.

The major differences between them are:

  1. SSBOs are typically much larger. The smallest required UBO size is 16KB; the smallest required SSBO size is 16MB, and typical sizes will be on the order of the size of GPU memory.
  2. SSBOs are writable, even atomically; UBOs are uniform​s. SSBOs have the same memory characteristics as Image Load Store operations, so they need appropriate memory barriers.
  3. SSBOs can have unbounded storage, up to the buffer range bound; UBOs must have a specific, fixed storage size. This means that you can have an array of arbitrary length in an SSBO. The actual size of the array, based on the range of the buffer bound, can be queried at runtime in the shader using the length​ function on the unbounded array variable.

Functionally speaking, SSBOs can be thought of as a much nicer interface to Buffer Textures when accessed via Image Load Store.

Atomic operations

There are special atomic functions that can be applied to buffer variables (and to compute shader shared​ variables). They only take uint​ or int​ types, but these can be members of aggregates (structs/arrays) or vector elements (ie: you can atomically access uvec3.x​).

All of the atomic functions return the original value.

The atomic operations are (where "nint" can be int​ or uint​):

nint atomicAdd(inout nint mem​, nint data​)
nint atomicMin(inout nint mem​, nint data​)
nint atomicMax(inout nint mem​, nint data​)
nint atomicAnd (inout nint mem​, nint data​)
nint atomicOr(inout nint mem​, nint data​)
nint atomicXor(inout nint mem​, nint data​)
nint atomicExchange(inout nint mem​, nint data​)
nint atomicCompSwap(inout nint mem​, nint compare​, nint data​)

The last function bears some explanation. It will swap mem​ with data​ if compare​ is equal to the current value of mem​.