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; | ||
|  | 	} | ||
|  | } |