/// <summary> /// Copy results of queries in a query pool to a host memory region. /// </summary> public Result GetResults(uint firstQuery, uint queryCount, ArrayProxy <byte> data, DeviceSize stride, QueryResultFlags flags) { unsafe { try { Result result = default(Result); GCHandle dataHandle = default(GCHandle); byte * marshalledData = null; if (data.Contents != ProxyContents.Null) { if (data.Contents == ProxyContents.Single) { byte *dataPointer = stackalloc byte[1]; * dataPointer = data.GetSingleValue(); marshalledData = dataPointer; } else { var arrayValue = data.GetArrayValue(); dataHandle = GCHandle.Alloc(arrayValue.Array, GCHandleType.Pinned); marshalledData = (byte *)(dataHandle.AddrOfPinnedObject() + (int)(MemUtil.SizeOf <byte>() * arrayValue.Offset)).ToPointer(); } } else { marshalledData = null; } result = Interop.Commands.vkGetQueryPoolResults(this.parent.handle, this.handle, firstQuery, queryCount, (Size)(data.Length), marshalledData, stride, flags); if (SharpVkException.IsError(result)) { throw SharpVkException.Create(result); } if (dataHandle.IsAllocated) { dataHandle.Free(); } return(result); } finally { Interop.HeapUtil.FreeLog(); } } }