78 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.compute;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import kha.graphics4.VertexData;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@:headerCode("
							 | 
						||
| 
								 | 
							
								#include <kinc/compute/compute.h>
							 | 
						||
| 
								 | 
							
								")
							 | 
						||
| 
								 | 
							
								@:headerClassCode("
							 | 
						||
| 
								 | 
							
								#ifdef KORE_OPENGL
							 | 
						||
| 
								 | 
							
								kinc_shader_storage_buffer buffer;
							 | 
						||
| 
								 | 
							
								#endif")
							 | 
						||
| 
								 | 
							
								class ShaderStorageBuffer {
							 | 
						||
| 
								 | 
							
									var data: Array<Int>;
							 | 
						||
| 
								 | 
							
									var myCount: Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function new(indexCount: Int, type: VertexData) {
							 | 
						||
| 
								 | 
							
										myCount = indexCount;
							 | 
						||
| 
								 | 
							
										data = new Array<Int>();
							 | 
						||
| 
								 | 
							
										data[myCount - 1] = 0;
							 | 
						||
| 
								 | 
							
										init(indexCount, type);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("
							 | 
						||
| 
								 | 
							
									#ifdef KORE_OPENGL
							 | 
						||
| 
								 | 
							
									kinc_g4_vertex_data type2;
							 | 
						||
| 
								 | 
							
									switch (type) {
							 | 
						||
| 
								 | 
							
									case 0:
							 | 
						||
| 
								 | 
							
										type2 = KINC_G4_VERTEX_DATA_FLOAT1;
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									case 1:
							 | 
						||
| 
								 | 
							
										type2 = KINC_G4_VERTEX_DATA_FLOAT2;
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									case 2:
							 | 
						||
| 
								 | 
							
										type2 = KINC_G4_VERTEX_DATA_FLOAT3;
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									case 3:
							 | 
						||
| 
								 | 
							
										type2 = KINC_G4_VERTEX_DATA_FLOAT4;
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									case 4:
							 | 
						||
| 
								 | 
							
										type2 = KINC_G4_VERTEX_DATA_FLOAT4X4;
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									kinc_shader_storage_buffer_init(&buffer, indexCount, type2);
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
									")
							 | 
						||
| 
								 | 
							
									function init(indexCount: Int, type: VertexData) {
							 | 
						||
| 
								 | 
							
										myCount = indexCount;
							 | 
						||
| 
								 | 
							
										data = new Array<Int>();
							 | 
						||
| 
								 | 
							
										data[myCount - 1] = 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("
							 | 
						||
| 
								 | 
							
										#ifdef KORE_OPENGL
							 | 
						||
| 
								 | 
							
										kinc_shader_storage_buffer_destroy(&buffer);
							 | 
						||
| 
								 | 
							
										#endif
							 | 
						||
| 
								 | 
							
									")
							 | 
						||
| 
								 | 
							
									public function delete(): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function lock(): Array<Int> {
							 | 
						||
| 
								 | 
							
										return data;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("
							 | 
						||
| 
								 | 
							
										#ifdef KORE_OPENGL
							 | 
						||
| 
								 | 
							
										int* indices = kinc_shader_storage_buffer_lock(&buffer);
							 | 
						||
| 
								 | 
							
										for (int i = 0; i < myCount; ++i) {
							 | 
						||
| 
								 | 
							
											indices[i] = data[i];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										kinc_shader_storage_buffer_unlock(&buffer);
							 | 
						||
| 
								 | 
							
										#endif
							 | 
						||
| 
								 | 
							
									")
							 | 
						||
| 
								 | 
							
									public function unlock(): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function count(): Int {
							 | 
						||
| 
								 | 
							
										return myCount;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |