Skip to content

Commit fdbc957

Browse files
Cherser-slibcg
authored andcommitted
mantle: implement query pool functions, add query pool type (v2)
v2: style fix, end renderpass in grCmdResetQueryPool, enable pipelineStatisticsQuery, reorder statistics results
1 parent ed645f6 commit fdbc957

File tree

5 files changed

+109
-39
lines changed

5 files changed

+109
-39
lines changed

src/mantle/mantle_cmd_buf.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,3 +1271,48 @@ GR_VOID GR_STDCALL grCmdResetEvent(
12711271
VKD.vkCmdResetEvent(grCmdBuffer->commandBuffer, grEvent->event,
12721272
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
12731273
}
1274+
1275+
GR_VOID GR_STDCALL grCmdBeginQuery(
1276+
GR_CMD_BUFFER cmdBuffer,
1277+
GR_QUERY_POOL queryPool,
1278+
GR_UINT slot,
1279+
GR_FLAGS flags)
1280+
{
1281+
LOGT("%p %p %u 0x%X\n", cmdBuffer, queryPool, slot, flags);
1282+
const GrCmdBuffer* grCmdBuffer = (GrCmdBuffer*)cmdBuffer;
1283+
const GrDevice* grDevice = GET_OBJ_DEVICE(grCmdBuffer);
1284+
const GrQueryPool* grQueryPool = (GrQueryPool*)queryPool;
1285+
1286+
VKD.vkCmdBeginQuery(grCmdBuffer->commandBuffer, grQueryPool->queryPool, slot,
1287+
flags & GR_QUERY_IMPRECISE_DATA ? 0 : VK_QUERY_CONTROL_PRECISE_BIT);
1288+
}
1289+
1290+
GR_VOID GR_STDCALL grCmdEndQuery(
1291+
GR_CMD_BUFFER cmdBuffer,
1292+
GR_QUERY_POOL queryPool,
1293+
GR_UINT slot)
1294+
{
1295+
LOGT("%p %p %u\n", cmdBuffer, queryPool, slot);
1296+
const GrCmdBuffer* grCmdBuffer = (GrCmdBuffer*)cmdBuffer;
1297+
const GrDevice* grDevice = GET_OBJ_DEVICE(grCmdBuffer);
1298+
const GrQueryPool* grQueryPool = (GrQueryPool*)queryPool;
1299+
1300+
VKD.vkCmdEndQuery(grCmdBuffer->commandBuffer, grQueryPool->queryPool, slot);
1301+
}
1302+
1303+
GR_VOID GR_STDCALL grCmdResetQueryPool(
1304+
GR_CMD_BUFFER cmdBuffer,
1305+
GR_QUERY_POOL queryPool,
1306+
GR_UINT startQuery,
1307+
GR_UINT queryCount)
1308+
{
1309+
LOGT("%p %p %u %u\n", cmdBuffer, queryPool, startQuery, queryCount);
1310+
GrCmdBuffer* grCmdBuffer = (GrCmdBuffer*)cmdBuffer;
1311+
const GrDevice* grDevice = GET_OBJ_DEVICE(grCmdBuffer);
1312+
const GrQueryPool* grQueryPool = (GrQueryPool*)queryPool;
1313+
1314+
grCmdBufferEndRenderPass(grCmdBuffer);
1315+
1316+
VKD.vkCmdResetQueryPool(grCmdBuffer->commandBuffer, grQueryPool->queryPool,
1317+
startQuery, queryCount);
1318+
}

src/mantle/mantle_init_device.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,8 @@ GR_RESULT GR_STDCALL grCreateDevice(
523523
.fillModeNonSolid = VK_TRUE,
524524
.multiViewport = VK_TRUE,
525525
.samplerAnisotropy = VK_TRUE,
526+
.occlusionQueryPrecise = VK_TRUE,
527+
.pipelineStatisticsQuery = VK_TRUE,
526528
.fragmentStoresAndAtomics = VK_TRUE,
527529
},
528530
};

src/mantle/mantle_object.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ typedef struct _GrShader {
318318
typedef struct _GrQueryPool {
319319
GrObject grObj;
320320
VkQueryPool queryPool;
321+
VkQueryType queryType;
321322
} GrQueryPool;
322323

323324
typedef struct _GrQueue {

src/mantle/mantle_query_sync.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,74 @@ GR_RESULT GR_STDCALL grCreateQueryPool(
5252
*grQueryPool = (GrQueryPool) {
5353
.grObj = { GR_OBJ_TYPE_QUERY_POOL, grDevice },
5454
.queryPool = vkQueryPool,
55+
.queryType = createInfo.queryType,
5556
};
5657

5758
*pQueryPool = (GR_QUERY_POOL)grQueryPool;
5859

5960
return GR_SUCCESS;
6061
}
6162

63+
GR_RESULT GR_STDCALL grGetQueryPoolResults(
64+
GR_QUERY_POOL queryPool,
65+
GR_UINT startQuery,
66+
GR_UINT queryCount,
67+
GR_SIZE* pDataSize,
68+
GR_VOID* pData)
69+
{
70+
LOGT("%p %u %u %p %p\n", queryPool, startQuery, queryCount, pDataSize, pData);
71+
GrQueryPool* grQueryPool = (GrQueryPool*)queryPool;
72+
73+
if (grQueryPool == NULL) {
74+
return GR_ERROR_INVALID_HANDLE;
75+
} else if (GET_OBJ_TYPE(grQueryPool) != GR_OBJ_TYPE_QUERY_POOL) {
76+
return GR_ERROR_INVALID_OBJECT_TYPE;
77+
} else if (pDataSize == NULL) {
78+
return GR_ERROR_INVALID_POINTER;
79+
}
80+
81+
const GrDevice* grDevice = GET_OBJ_DEVICE(grQueryPool);
82+
unsigned elemSize = grQueryPool->queryType == VK_QUERY_TYPE_OCCLUSION ?
83+
sizeof(uint64_t) : sizeof(GR_PIPELINE_STATISTICS_DATA);
84+
85+
if (pData == NULL) {
86+
*pDataSize = queryCount * elemSize;
87+
return GR_SUCCESS;
88+
} else if (*pDataSize < queryCount * elemSize) {
89+
return GR_ERROR_INVALID_MEMORY_SIZE;
90+
}
91+
92+
VkResult vkRes = VKD.vkGetQueryPoolResults(grDevice->device, grQueryPool->queryPool,
93+
startQuery, queryCount, *pDataSize, pData,
94+
elemSize, VK_QUERY_RESULT_64_BIT);
95+
if (vkRes != VK_SUCCESS && vkRes != VK_NOT_READY) {
96+
LOGE("vkGetQueryPoolResults failed (%d)\n", vkRes);
97+
} else if (vkRes == VK_SUCCESS && grQueryPool->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) {
98+
GR_PIPELINE_STATISTICS_DATA* stats = (GR_PIPELINE_STATISTICS_DATA*)pData;
99+
100+
// Reorder results to match Mantle (see VkQueryPipelineStatisticFlags)
101+
for (unsigned i = 0; i < queryCount; i++) {
102+
const uint64_t* vkStat = &((uint64_t*)pData)[11 * i];
103+
104+
stats[i] = (GR_PIPELINE_STATISTICS_DATA) {
105+
.psInvocations = vkStat[7],
106+
.cPrimitives = vkStat[6],
107+
.cInvocations = vkStat[5],
108+
.vsInvocations = vkStat[2],
109+
.gsInvocations = vkStat[3],
110+
.gsPrimitives = vkStat[4],
111+
.iaPrimitives = vkStat[1],
112+
.iaVertices = vkStat[0],
113+
.hsInvocations = vkStat[8],
114+
.dsInvocations = vkStat[9],
115+
.csInvocations = vkStat[10],
116+
};
117+
}
118+
}
119+
120+
return getGrResult(vkRes);
121+
}
122+
62123
GR_RESULT GR_STDCALL grCreateFence(
63124
GR_DEVICE device,
64125
const GR_FENCE_CREATE_INFO* pCreateInfo,

src/mantle/stub.c

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,6 @@ GR_RESULT GR_STDCALL grLoadPipeline(
5858
return GR_UNSUPPORTED;
5959
}
6060

61-
// Query and Synchronization Functions
62-
63-
GR_RESULT GR_STDCALL grGetQueryPoolResults(
64-
GR_QUERY_POOL queryPool,
65-
GR_UINT startQuery,
66-
GR_UINT queryCount,
67-
GR_SIZE* pDataSize,
68-
GR_VOID* pData)
69-
{
70-
LOGW("STUB\n");
71-
return GR_UNSUPPORTED;
72-
}
73-
7461
// Multi-Device Management Functions
7562

7663
GR_RESULT GR_STDCALL grOpenSharedMemory(
@@ -142,32 +129,6 @@ GR_VOID GR_STDCALL grCmdMemoryAtomic(
142129
LOGW("STUB\n");
143130
}
144131

145-
GR_VOID GR_STDCALL grCmdBeginQuery(
146-
GR_CMD_BUFFER cmdBuffer,
147-
GR_QUERY_POOL queryPool,
148-
GR_UINT slot,
149-
GR_FLAGS flags)
150-
{
151-
LOGW("STUB\n");
152-
}
153-
154-
GR_VOID GR_STDCALL grCmdEndQuery(
155-
GR_CMD_BUFFER cmdBuffer,
156-
GR_QUERY_POOL queryPool,
157-
GR_UINT slot)
158-
{
159-
LOGW("STUB\n");
160-
}
161-
162-
GR_VOID GR_STDCALL grCmdResetQueryPool(
163-
GR_CMD_BUFFER cmdBuffer,
164-
GR_QUERY_POOL queryPool,
165-
GR_UINT startQuery,
166-
GR_UINT queryCount)
167-
{
168-
LOGW("STUB\n");
169-
}
170-
171132
GR_VOID GR_STDCALL grCmdWriteTimestamp(
172133
GR_CMD_BUFFER cmdBuffer,
173134
GR_ENUM timestampType,

0 commit comments

Comments
 (0)