 fb18b6df28
			
		
	
	
		fb18b6df28
		
	
	
	
	
		
			
			For GLSL function imageAtomicStore, it will be translated to OpImageTexelPointer + OpAtomicStore. The result type of OpImageTexelPointer must be the same as the sampled type of OpTypeImage. On translation, the result type is mistakenly fetched from operand list operands[2] while operands[2] corresponds to sampleNum whose type is always uint. This leads to an error if the image type is iimageXXX that is int image.
		
			
				
	
	
		
			75 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #version 450
 | |
| #extension GL_KHR_memory_scope_semantics : require
 | |
| #extension GL_ARB_gpu_shader_int64 : require
 | |
| 
 | |
| #pragma use_vulkan_memory_model
 | |
| 
 | |
| shared uint value;
 | |
| shared int atomi;
 | |
| shared uint atomu;
 | |
| layout(binding = 0, r32ui) workgroupcoherent uniform uimage2D imageu;
 | |
| layout(binding = 1, r32i) volatile coherent uniform iimage2D imagei;
 | |
| layout(binding = 5, r32i) nonprivate uniform iimage2D imagej[2];
 | |
| layout (binding = 2) buffer BufferU { workgroupcoherent uint x; } bufferu;
 | |
| layout (binding = 3) coherent buffer BufferI { uint x; } bufferi;
 | |
| struct A { uint x[2]; };
 | |
| layout (binding = 4) volatile buffer BufferJ { subgroupcoherent A a; } bufferj[2];
 | |
| layout (binding = 6) nonprivate uniform sampler2D samp[2];
 | |
| layout (binding = 7) nonprivate uniform BufferK { uint x; } bufferk;
 | |
| shared uint64_t atomu64;
 | |
| shared int64_t atomi64;
 | |
| layout (binding = 8) volatile buffer BufferL { uint x; } bufferl;
 | |
| layout (binding = 9) buffer BufferM { volatile uint x; } bufferm;
 | |
| layout(binding = 10, r32i) volatile coherent uniform iimage2DMS imageMS;
 | |
| 
 | |
| 
 | |
| void main()
 | |
| {
 | |
|     int origi = atomicAdd(atomi, 3, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);
 | |
|     uint origu = atomicAnd(atomu, value);
 | |
|     origi = atomicLoad(atomi, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);
 | |
|     atomicStore(atomu, value, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
 | |
|     origi = imageAtomicLoad(imagei, ivec2(0,0), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);
 | |
|     origu = imageAtomicAdd(imageu, ivec2(0,0), 3u, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);
 | |
|     imageAtomicStore(imageu, ivec2(0,0), 4u, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
 | |
|     origu = atomicOr(atomu, 7u, gl_ScopeDevice, 0, 0);
 | |
|     origu = atomicXor(atomu, 7u, gl_ScopeDevice, 0, 0);
 | |
|     origu = atomicMin(atomu, value, gl_ScopeDevice, 0, 0);
 | |
|     origi = atomicMax(atomi, 7, gl_ScopeDevice, 0, 0);
 | |
|     origi = atomicExchange(atomi, origi, gl_ScopeDevice, 0, 0);
 | |
|     origu = atomicCompSwap(atomu, 10u, value, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);
 | |
|     atomicAdd(bufferu.x, 1, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);
 | |
|     memoryBarrier(gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);
 | |
|     controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);
 | |
|     controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, 0, 0);
 | |
| 
 | |
|     uint y;
 | |
|     y = bufferu.x;
 | |
|     bufferu.x = y;
 | |
|     y = bufferi.x;
 | |
|     y = bufferj[0].a.x[1];
 | |
|     bufferi.x = y;
 | |
|     bufferj[0].a.x[1] = y;
 | |
|     bufferj[0].a = bufferj[1].a;
 | |
|     bufferi.x = bufferk.x;
 | |
| 
 | |
|     imageLoad(imagei, ivec2(0,0));
 | |
|     imageLoad(imagej[0], ivec2(0,0));
 | |
|     imageStore(imagej[1], ivec2(0,0), ivec4(0,0,0,0));
 | |
|     texture(samp[0], vec2(0,0));
 | |
| 
 | |
|     atomu64 = atomicMax(atomu64, uint64_t(7), gl_ScopeDevice, 0, 0);
 | |
|     atomicCompSwap(atomi64, int64_t(10), int64_t(atomu64), gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);
 | |
| 
 | |
|     y = bufferl.x;
 | |
|     atomicAdd(bufferl.x, 1);
 | |
|     atomicOr(bufferm.x, 2);
 | |
|     imageAtomicAdd(imagei, ivec2(0,0), 3);
 | |
|     atomicAdd(bufferu.x, 4u, gl_ScopeDevice, 0, 0);
 | |
|     atomicAdd(bufferu.x, 5u, gl_ScopeDevice, 0, gl_SemanticsVolatile);
 | |
| 
 | |
|     imageAtomicStore(imageMS, ivec2(0,0), 1, 4, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
 | |
|     imageAtomicStore(imagei, ivec2(0,0), -7, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
 | |
| }
 | |
| 
 |