74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			GLSL
		
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			GLSL
		
	
	
	
| #version 460
 | |
| 
 | |
| out vec4 o;
 | |
| 
 | |
| // default uniforms will be gathered into a uniform block
 | |
| uniform vec4 a;
 | |
| uniform vec2 b = vec2(0, 0);            // initializer will be ignored
 | |
| layout(location = 0) uniform vec2 c;    // location qualifier will be ignored
 | |
| uniform vec4 d[10];
 | |
| uniform struct e {                      
 | |
|     vec2 x;
 | |
|     float y;
 | |
|     uint z;
 | |
| } structUniform; 
 | |
| 
 | |
| // opaque types will not be grouped into uniform block
 | |
| uniform sampler2D t1;
 | |
| 
 | |
| // shared and packed layout qualifier are silently ignored
 | |
| layout(shared) uniform UniformBlock {
 | |
|     float j;
 | |
|     vec4 k;
 | |
| };
 | |
| 
 | |
| layout(packed) buffer BufferBlock {
 | |
|     float j;
 | |
|     vec4 k;
 | |
| } bufferInstance;
 | |
| 
 | |
| // atomic_uint will be converted to uint and gathered in a buffer block
 | |
| layout(binding = 0) uniform atomic_uint counter1; // offset not used
 | |
| layout(binding = 0) uniform atomic_uint counter2; // offset not used
 | |
| layout(binding = 1) uniform atomic_uint counter3; // offset not used
 | |
| 
 | |
| // atomic counter functions will be converted to equivalent integer atomic operations
 | |
| uint bar() {
 | |
|     uint j = 0;
 | |
|     j = atomicCounterIncrement(counter1);
 | |
|     j = atomicCounterDecrement(counter1);
 | |
|     j = atomicCounter(counter1);
 | |
| 
 | |
|     j = atomicCounterAdd(counter1, 1);
 | |
|     j = atomicCounterAdd(counter1, -1);
 | |
|     j = atomicCounterSubtract(counter1, 1);
 | |
| 
 | |
|     j = atomicCounterMin(counter1, j);
 | |
|     j = atomicCounterMax(counter1, j);
 | |
|     j = atomicCounterAnd(counter1, j);
 | |
| 
 | |
|     j = atomicCounterOr(counter1, j);
 | |
|     j = atomicCounterXor(counter1, j);
 | |
|     
 | |
|     j = atomicCounterExchange(counter1, j);
 | |
|     j = atomicCounterCompSwap(counter1, 0, j);
 | |
| 
 | |
|     atomicCounterIncrement(counter2);
 | |
|     atomicCounterIncrement(counter3);
 | |
| 
 | |
|     memoryBarrierAtomicCounter();
 | |
|     
 | |
|     return j;
 | |
| }
 | |
| 
 | |
| vec4 foo() {
 | |
|     float f = j + bufferInstance.j + structUniform.y + structUniform.z;
 | |
|     vec2 v2 = b + c + structUniform.x;
 | |
|     vec4 v4 = a + d[0] + d[1] + d[2] + k + bufferInstance.k + texture(t1, vec2(0, 0));
 | |
|     return vec4(f) * vec4(v2, 1, 1) * v4;
 | |
| }
 | |
| 
 | |
| void main() {
 | |
|     float j = float(bar());
 | |
|     o = j * foo();
 | |
| } |