public unsafe BufferedQuery(VulkanRenderer gd, Device device, PipelineFull pipeline, CounterType type, bool result32Bit) { _api = gd.Api; _device = device; _pipeline = pipeline; _type = type; _result32Bit = result32Bit; _isSupported = QueryTypeSupported(gd, type); if (_isSupported) { QueryPipelineStatisticFlags flags = type == CounterType.PrimitivesGenerated ? QueryPipelineStatisticFlags.QueryPipelineStatisticGeometryShaderPrimitivesBit : 0; var queryPoolCreateInfo = new QueryPoolCreateInfo() { SType = StructureType.QueryPoolCreateInfo, QueryCount = 1, QueryType = GetQueryType(type), PipelineStatistics = flags }; gd.Api.CreateQueryPool(device, queryPoolCreateInfo, null, out _queryPool).ThrowOnError(); } var buffer = gd.BufferManager.Create(gd, sizeof(long), forConditionalRendering: true); _bufferMap = buffer.Map(0, sizeof(long)); _defaultValue = result32Bit ? DefaultValueInt : DefaultValue; Marshal.WriteInt64(_bufferMap, _defaultValue); _buffer = buffer; }
public Counters(VulkanRenderer gd, Device device, PipelineFull pipeline) { _pipeline = pipeline; int count = Enum.GetNames(typeof(CounterType)).Length; _counterQueues = new CounterQueue[count]; for (int index = 0; index < count; index++) { CounterType type = (CounterType)index; _counterQueues[index] = new CounterQueue(gd, device, pipeline, type); } }
internal CounterQueue(VulkanGraphicsDevice gd, Device device, PipelineFull pipeline, CounterType type) { _gd = gd; _device = device; _pipeline = pipeline; Type = type; _queryPool = new Queue <BufferedQuery>(QueryPoolInitialSize); for (int i = 0; i < QueryPoolInitialSize; i++) { _queryPool.Enqueue(new BufferedQuery(_gd, _device, _pipeline, type)); } _current = new CounterQueueEvent(this, type, 0); _consumerThread = new Thread(EventConsumer); _consumerThread.Start(); }
internal CounterQueue(VulkanRenderer gd, Device device, PipelineFull pipeline, CounterType type) { _gd = gd; _device = device; _pipeline = pipeline; Type = type; _queryPool = new Queue <BufferedQuery>(QueryPoolInitialSize); for (int i = 0; i < QueryPoolInitialSize; i++) { // AMD Polaris GPUs on Windows seem to have issues reporting 64-bit query results. _queryPool.Enqueue(new BufferedQuery(_gd, _device, _pipeline, type, gd.IsAmdWindows)); } _current = new CounterQueueEvent(this, type, 0); _consumerThread = new Thread(EventConsumer); _consumerThread.Start(); }
public unsafe BufferedQuery(VulkanGraphicsDevice gd, Device device, PipelineFull pipeline, CounterType type) { _api = gd.Api; _device = device; _pipeline = pipeline; var queryPoolCreateInfo = new QueryPoolCreateInfo() { SType = StructureType.QueryPoolCreateInfo, QueryCount = 1, QueryType = GetQueryType(type) }; gd.Api.CreateQueryPool(device, queryPoolCreateInfo, null, out _queryPool).ThrowOnError(); var buffer = gd.BufferManager.Create(gd, sizeof(long), forConditionalRendering: true); _bufferMap = buffer.Map(0, sizeof(long)); Marshal.WriteInt64(_bufferMap, -1L); _buffer = buffer; }