Shader Storage Buffer Object: Difference between revisions
(Not a stub, but still has a missing section.) |
(SSBO vs. UBO performance) |
||
Line 16: | Line 16: | ||
# SSBOs are writable, even atomically; UBOs are {{code|uniform}}s. SSBOs reads and writes use [[Memory_Model#Incoherent_memory_access|incoherent memory accesses]], so they need the appropriate barriers, just as [[Image Load Store]] operations. | # SSBOs are writable, even atomically; UBOs are {{code|uniform}}s. SSBOs reads and writes use [[Memory_Model#Incoherent_memory_access|incoherent memory accesses]], so they need the appropriate barriers, just as [[Image Load Store]] operations. | ||
# 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. | ||
# SSBO access, all things being equal, will likely be slower than UBO access. SSBOs generally are accesses like buffer textures, while UBO data is accessed through internal shader-accessible memory reads. | |||
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]]. |
Revision as of 17:31, 9 February 2015
|
||||||||||||
OpenGL Objects
|
A Shader Storage Buffer Object is a Buffer Object that is used to store and retrieve data from within the OpenGL Shading Language.
SSBOs are a lot like Uniform Buffer Objects. Shader storage blocks are defined by Interface Block (GLSL)s in almost the same way as uniform blocks. Buffer objects that store SSBOs are bound to SSBO binding points, just as buffer objects for uniforms are bound to UBO binding points. And so forth.
The major differences between them are:
- SSBOs can be 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.
- SSBOs are writable, even atomically; UBOs are uniforms. SSBOs reads and writes use incoherent memory accesses, so they need the appropriate barriers, just as Image Load Store operations.
- 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.
- SSBO access, all things being equal, will likely be slower than UBO access. SSBOs generally are accesses like buffer textures, while UBO data is accessed through internal shader-accessible memory reads.
Functionally speaking, SSBOs can be thought of as a much nicer interface to Buffer Textures when accessed via Image Load Store.
Shader specification
SSBOs are interface blocks who's storage comes from Buffer Objects. The way to define them in GLSL is stated on that page.
Atomic operations
There are special atomic functions that can be applied to buffer variables (and also 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 term "nint" can be int or uint.
Adds data to mem.
The mem's value is no lower than data.
The mem's value is no greater than data.
mem becomes the bitwise-and between mem and data.
mem becomes the bitwise-or between mem and data.
mem becomes the bitwise-xor between mem and data.
Sets mem's value to data.
If the current value of mem is equal to compare, then mem is set to data. Otherwise it is left unchanged.
OpenGL usage
TODO: This section needs to be filled in. |