瀏覽代碼

added disassemble, release some resources

Nicolas Cannasse 8 年之前
父節點
當前提交
f9bbbde274
共有 2 個文件被更改,包括 61 次插入3 次删除
  1. 26 1
      libs/directx/directx.cpp
  2. 35 2
      libs/directx/dx/Driver.hx

+ 26 - 1
libs/directx/directx.cpp

@@ -189,12 +189,26 @@ HL_PRIM void HL_NAME(release_buffer)( dx_buffer *b ) {
 HL_PRIM vbyte *HL_NAME(compile_shader)( vbyte *data, int dataSize, char *source, char *entry, char *target, int flags, bool *error, int *size ) {
 	ID3DBlob *code;
 	ID3DBlob *errorMessage;
+	vbyte *ret;
 	if( D3DCompile(data,dataSize,source,NULL,NULL,entry,target,flags,0,&code,&errorMessage) != S_OK ) {
 		*error = true;
 		code = errorMessage;
 	}
 	*size = code->GetBufferSize();
-	return hl_copy_bytes((vbyte*)code->GetBufferPointer(),*size);
+	ret = hl_copy_bytes((vbyte*)code->GetBufferPointer(),*size);
+	code->Release();
+	return ret;
+}
+
+HL_PRIM vbyte *HL_NAME(disassemble_shader)( vbyte *data, int dataSize, int flags, vbyte *comments, int *size ) {
+	ID3DBlob *out;
+	vbyte *ret;
+	if( D3DDisassemble(data,dataSize,flags,(char*)comments,&out) != S_OK )
+		return NULL;
+	*size = out->GetBufferSize();
+	ret = hl_copy_bytes((vbyte*)out->GetBufferPointer(),*size);
+	out->Release();
+	return ret;
 }
 
 HL_PRIM dx_vshader *HL_NAME(create_vertex_shader)( vbyte *code, int size ) {
@@ -211,6 +225,10 @@ HL_PRIM dx_pshader *HL_NAME(create_pixel_shader)( vbyte *code, int size ) {
 	return shader;
 }
 
+HL_PRIM void HL_NAME(release_shader)( ID3D11DeviceChild *v ) {
+	v->Release();
+}
+
 HL_PRIM void HL_NAME(draw_indexed)( int count, int start, int baseVertex ) {
 	driver->context->DrawIndexed(count,start,baseVertex);
 }
@@ -247,6 +265,10 @@ HL_PRIM void HL_NAME(ia_set_input_layout)( dx_layout *l ) {
 	driver->context->IASetInputLayout(l);
 }
 
+HL_PRIM void HL_NAME(release_layout)( dx_layout *l ) {
+	l->Release();
+}
+
 typedef struct {
 	hl_type *t;
 	D3D11_INPUT_ELEMENT_DESC desc;
@@ -280,7 +302,10 @@ DEFINE_PRIM(_BUFFER, create_buffer, _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
 DEFINE_PRIM(_BYTES, buffer_map, _BUFFER _I32 _I32 _BOOL);
 DEFINE_PRIM(_VOID, buffer_unmap, _BUFFER _I32);
 DEFINE_PRIM(_VOID, release_buffer, _BUFFER);
+DEFINE_PRIM(_VOID, release_shader, _SHADER);
+DEFINE_PRIM(_VOID, release_layout, _LAYOUT);
 DEFINE_PRIM(_BYTES, compile_shader, _BYTES _I32 _BYTES _BYTES _BYTES _I32 _REF(_BOOL) _REF(_I32));
+DEFINE_PRIM(_BYTES, disassemble_shader, _BYTES _I32 _I32 _BYTES _REF(_I32));
 DEFINE_PRIM(_SHADER, create_vertex_shader, _BYTES _I32);
 DEFINE_PRIM(_SHADER, create_pixel_shader, _BYTES _I32);
 DEFINE_PRIM(_VOID, draw_indexed, _I32 _I32 _I32);

+ 35 - 2
libs/directx/dx/Driver.hx

@@ -2,9 +2,15 @@ package dx;
 
 typedef DriverInstance = hl.Abstract<"dx_driver">;
 
-typedef Shader = hl.Abstract<"dx_shader">;
+abstract Shader(hl.Abstract<"dx_shader">) {
+	@:hlNative("directx", "release_shader") public function release() {
+	}
+}
 
-typedef Layout = hl.Abstract<"dx_layout">;
+abstract Layout(hl.Abstract<"dx_layout">) {
+	@:hlNative("directx", "release_layout") public function release() {
+	}
+}
 
 @:enum abstract DriverInitFlags(Int) {
 	var None = 0;
@@ -60,11 +66,25 @@ typedef Layout = hl.Abstract<"dx_layout">;
 	static inline function controlPointPatchList(count:Int) : PrimitiveTopology return cast (count + 32);
 }
 
+@:enum abstract DisassembleFlags(Int) {
+	var None = 0;
+	var EnableColorCode = 1;
+	var EnableDefaultValuePrints = 2;
+	var EnableInstructionNumbering = 4;
+	var EnableInsructionCycle = 8;
+	var DisableDebugInfo = 0x10;
+	var EnableInstructionOffset = 0x20;
+	var InstructionOnly = 0x40;
+	var PrintHexLiterals = 0x80;
+	@:op(a | b) static function or(a:DisassembleFlags, b:DisassembleFlags) : DisassembleFlags;
+}
+
 @:enum abstract LayoutClassification(Int) {
 	var PerVertexData = 0;
 	var PerInstanceData = 0;
 }
 
+
 class LayoutElement {
 	public var semanticName : hl.Bytes;
 	public var semanticIndex : Int;
@@ -114,6 +134,14 @@ class Driver {
 		return out.toBytes(size);
 	}
 
+	public static function disassembleShader( data : haxe.io.Bytes, flags : DisassembleFlags, ?comments : String ) : String {
+		var size = 0;
+		var out = dxDisassembleShader(data, data.length, flags, comments == null ? null : @:privateAccess comments.toUtf8(), size);
+		if( out == null )
+			throw "Could not disassemble shader";
+		return @:privateAccess String.fromUTF8(out);
+	}
+
 	public static function createVertexShader( bytes : haxe.io.Bytes ) {
 		return dxCreateVertexShader(bytes, bytes.length);
 	}
@@ -163,6 +191,11 @@ class Driver {
 		return null;
 	}
 
+	@:hlNative("directx", "disassemble_shader")
+	static function dxDisassembleShader( data : hl.Bytes, size : Int, flags : DisassembleFlags, comments : hl.Bytes, outSize : hl.Ref<Int> ) : hl.Bytes {
+		return null;
+	}
+
 	@:hlNative("directx","create_vertex_shader")
 	static function dxCreateVertexShader( data : hl.Bytes, size : Int ) : Shader {
 		return null;