55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #version 450
 | |
| 
 | |
| #define MAX_VIEWS gl_MaxMeshViewCountNV
 | |
| 
 | |
| #define BARRIER() \
 | |
|     memoryBarrierShared(); \
 | |
|     barrier();
 | |
| 
 | |
| #extension GL_NV_mesh_shader : enable
 | |
| 
 | |
| layout(local_size_x = 32) in;
 | |
| 
 | |
| // test use of shared memory in task shaders:
 | |
| layout(binding=0) writeonly uniform image2D uni_image;
 | |
| uniform block0 {
 | |
|     uint uni_value;
 | |
| };
 | |
| shared vec4 mem[10];
 | |
| 
 | |
| // test use of task memory in task shaders:
 | |
| taskNV out Task {
 | |
|     vec2 dummy;
 | |
|     vec2 submesh[3];
 | |
|     uint viewID;
 | |
| } mytask;
 | |
| 
 | |
| void main()
 | |
| {
 | |
|     uint iid = gl_LocalInvocationID.x;
 | |
|     uint gid = gl_WorkGroupID.x;
 | |
|     uint viewID = gl_MeshViewIndicesNV[gl_MeshViewCountNV%MAX_VIEWS];
 | |
| 
 | |
|     // 1. shared memory load and stores
 | |
|     for (uint i = 0; i < 10; ++i) {
 | |
|         mem[i] = vec4(i + uni_value);
 | |
|     }
 | |
|     imageStore(uni_image, ivec2(iid), mem[gid]);
 | |
|     imageStore(uni_image, ivec2(iid), mem[gid+1]);
 | |
| 
 | |
|     BARRIER();
 | |
| 
 | |
|     // 2. task memory stores
 | |
| 
 | |
|     mytask.dummy      = vec2(30.0, 31.0);
 | |
|     mytask.submesh[0] = vec2(32.0, 33.0);
 | |
|     mytask.submesh[1] = vec2(34.0, 35.0);
 | |
|     mytask.submesh[2] = mytask.submesh[gid%2];
 | |
|     mytask.viewID     = viewID;
 | |
| 
 | |
|     BARRIER();
 | |
| 
 | |
|     // 3. set task count
 | |
|     gl_TaskCountNV = 3;
 | |
| }
 | 
