1
0
mirror of https://github.com/Yours3lf/rpi-vk-driver.git synced 2024-12-01 13:24:20 +01:00
rpi-vk-driver/driver/query.c

219 lines
6.8 KiB
C

#include "common.h"
#include "declarations.h"
//TODO VkPerformanceQuerySubmitInfoKHR
//TODO query test
VKAPI_ATTR VkResult VKAPI_CALL RPIFUNC(vkAcquireProfilingLockKHR)(
VkDevice device,
const VkAcquireProfilingLockInfoKHR* pInfo)
{
PROFILESTART(RPIFUNC(vkAcquireProfilingLockKHR));
//TODO
PROFILEEND(RPIFUNC(vkAcquireProfilingLockKHR));
return VK_SUCCESS;
}
VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkReleaseProfilingLockKHR)(
VkDevice device)
{
PROFILESTART(RPIFUNC(vkReleaseProfilingLockKHR));
//TODO
PROFILEEND(RPIFUNC(vkReleaseProfilingLockKHR));
}
VKAPI_ATTR VkResult VKAPI_CALL RPIFUNC(vkCreateQueryPool)(
VkDevice device,
const VkQueryPoolCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkQueryPool* pQueryPool)
{
PROFILESTART(RPIFUNC(vkCreateQueryPool));
assert(device);
assert(pQueryPool);
_queryPool* qp = ALLOCATE(sizeof(_queryPool), 1, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
if(pCreateInfo->queryType == VK_QUERY_TYPE_OCCLUSION)
{
UNSUPPORTED(VK_QUERY_TYPE_OCCLUSION);
}
else if(pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS)
{
UNSUPPORTED(VK_QUERY_TYPE_PIPELINE_STATISTICS);
}
else if(pCreateInfo->queryType == VK_QUERY_TYPE_TIMESTAMP)
{
UNSUPPORTED(VK_QUERY_TYPE_TIMESTAMP);
}
else if(pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR)
{
qp->queryCount = pCreateInfo->queryCount;
qp->type = pCreateInfo->queryType;
qp->queryPool = ALLOCATE(sizeof(_query) * qp->queryCount, 1, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
VkQueryPoolPerformanceCreateInfoKHR ci = *(VkQueryPoolPerformanceCreateInfoKHR*)pCreateInfo->pNext;
for(uint32_t c = 0; c < qp->queryCount; ++c)
{
assert(ci.counterIndexCount <= VC4_PERFCNT_NUM_EVENTS);
qp->queryPool[c].numEnabledCounters = ci.counterIndexCount;
memcpy(qp->queryPool[c].enabledCounters, ci.pCounterIndices, sizeof(uint32_t) * ci.counterIndexCount);
for(uint32_t d = 0; d < ci.counterIndexCount; d += DRM_VC4_MAX_PERF_COUNTERS)
{
qp->queryPool[c].perfmonIDs[d / DRM_VC4_MAX_PERF_COUNTERS] = vc4_create_perfmon(controlFd, &qp->queryPool[c].enabledCounters[d], qp->queryPool[c].numEnabledCounters > DRM_VC4_MAX_PERF_COUNTERS ? DRM_VC4_MAX_PERF_COUNTERS : qp->queryPool[c].numEnabledCounters);
memset(&qp->queryPool[c].counterValues[d / DRM_VC4_MAX_PERF_COUNTERS][0], 0, sizeof(uint64_t) * DRM_VC4_MAX_PERF_COUNTERS);
}
}
*pQueryPool = qp;
}
PROFILEEND(RPIFUNC(vkCreateQueryPool));
return VK_SUCCESS;
}
VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkCmdResetQueryPool)(
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t firstQuery,
uint32_t queryCount)
{
PROFILESTART(RPIFUNC(vkCmdResetQueryPool));
//TODO
PROFILEEND(RPIFUNC(vkCmdResetQueryPool));
}
VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkDestroyQueryPool)(
VkDevice device,
VkQueryPool queryPool,
const VkAllocationCallbacks* pAllocator)
{
PROFILESTART(RPIFUNC(vkDestroyQueryPool));
assert(device);
assert(queryPool);
_queryPool* qp = queryPool;
for(uint32_t c = 0; c < qp->queryCount; ++c)
{
for(uint32_t d = 0; d < qp->queryPool[c].numEnabledCounters; d += DRM_VC4_MAX_PERF_COUNTERS)
{
vc4_destroy_perfmon(controlFd, qp->queryPool[c].perfmonIDs[d / DRM_VC4_MAX_PERF_COUNTERS]);
}
}
FREE(qp->queryPool);
PROFILEEND(RPIFUNC(vkDestroyQueryPool));
}
VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkCmdEndQuery)(
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t query)
{
PROFILESTART(RPIFUNC(vkCmdEndQuery));
assert(commandBuffer);
assert(queryPool);
_commandBuffer* cmdBuf = commandBuffer;
cmdBuf->perfmonID = 0;
PROFILEEND(RPIFUNC(vkCmdEndQuery));
}
VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkCmdBeginQuery)(
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t query,
VkQueryControlFlags flags)
{
PROFILESTART(RPIFUNC(vkCmdBeginQuery));
assert(commandBuffer);
assert(queryPool);
//TODO flags
_commandBuffer* cmdBuf = commandBuffer;
_queryPool* qp = queryPool;
//pass id will select the perfmon at submit
cmdBuf->perfmonID = qp->queryPool[query].perfmonIDs;
PROFILEEND(RPIFUNC(vkCmdBeginQuery));
}
VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkCmdCopyQueryPoolResults)(
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t firstQuery,
uint32_t queryCount,
VkBuffer dstBuffer,
VkDeviceSize dstOffset,
VkDeviceSize stride,
VkQueryResultFlags flags)
{
PROFILESTART(RPIFUNC(vkCmdCopyQueryPoolResults));
//TODO
PROFILEEND(RPIFUNC(vkCmdCopyQueryPoolResults));
}
VKAPI_ATTR VkResult VKAPI_CALL RPIFUNC(vkGetQueryPoolResults)(
VkDevice device,
VkQueryPool queryPool,
uint32_t firstQuery,
uint32_t queryCount,
size_t dataSize,
void* pData,
VkDeviceSize stride,
VkQueryResultFlags flags)
{
PROFILESTART(RPIFUNC(vkGetQueryPoolResults));
assert(device);
assert(queryPool);
//TODO flags
//TODO return values etc.
_queryPool* qp = queryPool;
for(uint32_t c = firstQuery; c < queryCount; ++c)
{
for(uint32_t d = 0; d < qp->queryPool[c].numEnabledCounters; d += DRM_VC4_MAX_PERF_COUNTERS)
{
vc4_perfmon_get_values(controlFd, qp->queryPool[c].perfmonIDs[d / DRM_VC4_MAX_PERF_COUNTERS], &qp->queryPool[c].counterValues[d / DRM_VC4_MAX_PERF_COUNTERS][0]);
}
uint32_t counter = 0;
for(uint32_t d = 0; d < dataSize; d += stride, ++counter)
{
VkPerformanceCounterResultKHR* result = ((char*)pData) + d;
result->uint64 = qp->queryPool[c].counterValues[counter / DRM_VC4_MAX_PERF_COUNTERS][counter % DRM_VC4_MAX_PERF_COUNTERS];
}
}
PROFILEEND(RPIFUNC(vkGetQueryPoolResults));
return VK_SUCCESS;
}
VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkCmdWriteTimestamp)(
VkCommandBuffer commandBuffer,
VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool,
uint32_t query)
{
UNSUPPORTED(VK_QUERY_TYPE_TIMESTAMP);
}