static uint64_t g_free_count = 0;
#endif
#define MAX_TID 513
-static loader_platform_thread_id tidMapping[MAX_TID] = {0};
+static loader_platform_thread_id g_tidMapping[MAX_TID] = {0};
static uint32_t g_maxTID = 0;
// Map actual TID to an index value and return that index
// This keeps TIDs in range from 0-MAX_TID and simplifies compares between runs
static uint32_t getTIDIndex() {
loader_platform_thread_id tid = loader_platform_get_thread_id();
for (uint32_t i = 0; i < g_maxTID; i++) {
- if (tid == tidMapping[i])
+ if (tid == g_tidMapping[i])
return i;
}
// Don't yet have mapping, set it and return newly set index
uint32_t retVal = (uint32_t) g_maxTID;
- tidMapping[g_maxTID++] = tid;
+ g_tidMapping[g_maxTID++] = tid;
assert(g_maxTID < MAX_TID);
return retVal;
}
return "CMD_BEGINRENDERPASS";
case CMD_ENDRENDERPASS:
return "CMD_ENDRENDERPASS";
+ case CMD_DBGMARKERBEGIN:
+ return "CMD_DBGMARKERBEGIN";
+ case CMD_DBGMARKEREND:
+ return "CMD_DBGMARKEREND";
default:
return "UNKNOWN";
}
// Just track 2 shaders for now
#define XGL_NUM_GRAPHICS_SHADERS XGL_SHADER_STAGE_COMPUTE
#define MAX_SLOTS 2048
+#define NUM_COMMAND_BUFFERS_TO_DISPLAY 10
static uint64_t g_drawCount[NUM_DRAW_TYPES] = {0, 0, 0, 0};
static GLOBAL_CB_NODE* g_pCmdBufferHead = NULL;
// Track the last cmd buffer touched by this thread
static XGL_CMD_BUFFER g_lastCmdBuffer[MAX_TID] = {NULL};
+// Track the last group of CBs touched for displaying to dot file
+static GLOBAL_CB_NODE* g_pLastTouchedCB[NUM_COMMAND_BUFFERS_TO_DISPLAY] = {NULL};
+static uint32_t g_lastTouchedCBIndex = 0;
// Track the last global DrawState of interest touched by any thread
+static GLOBAL_CB_NODE* g_lastGlobalCB = NULL;
static PIPELINE_NODE* g_lastBoundPipeline = NULL;
static DYNAMIC_STATE_NODE* g_lastBoundDynamicState[XGL_NUM_STATE_BIND_POINT] = {NULL};
static XGL_DESCRIPTOR_SET g_lastBoundDescriptorSet = NULL;
g_pBufferHead = NULL;
}
static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb);
+
+static void updateCBTracking(XGL_CMD_BUFFER cb)
+{
+ g_lastCmdBuffer[getTIDIndex()] = cb;
+ GLOBAL_CB_NODE* pCB = getCBNode(cb);
+ loader_platform_thread_lock_mutex(&globalLock);
+ g_lastGlobalCB = pCB;
+ // TODO : This is a dumb algorithm. Need smart LRU that drops off oldest
+ for (uint32_t i = 0; i < NUM_COMMAND_BUFFERS_TO_DISPLAY; i++) {
+ if (g_pLastTouchedCB[i] == pCB) {
+ loader_platform_thread_unlock_mutex(&globalLock);
+ return;
+ }
+ }
+ g_pLastTouchedCB[g_lastTouchedCBIndex++] = pCB;
+ g_lastTouchedCBIndex = g_lastTouchedCBIndex % NUM_COMMAND_BUFFERS_TO_DISPLAY;
+ loader_platform_thread_unlock_mutex(&globalLock);
+}
+
// Print the last bound dynamic state
static void printDynamicState(const XGL_CMD_BUFFER cb)
{
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
+ updateCBTracking(cmdBuffer);
loader_platform_thread_lock_mutex(&globalLock);
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
addCmd(pCB, CMD_BINDDYNAMICSTATEOBJECT);
DYNAMIC_STATE_NODE* pTrav = g_pDynamicStateHead[sType];
while (pTrav && (state != pTrav->stateObj)) {
pOutFile = fopen(outFileName, "w");
fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
fprintf(pOutFile, "subgraph cluster_cmdBuffers\n{\nlabel=\"Command Buffers\"\n");
- for (uint32_t i=0; i < MAX_TID; i++) {
- if (g_lastCmdBuffer[i]) {
- GLOBAL_CB_NODE* pCB = getCBNode(g_lastCmdBuffer[i]);
- if (pCB) {
- fprintf(pOutFile, "subgraph cluster_cmdBuffer%u\n{\nlabel=\"Command Buffer #%u\"\n", i, i);
- CMD_NODE* pCmd = pCB->pCmds;
- uint32_t instNum = 0;
- while (pCmd) {
- if (instNum)
- fprintf(pOutFile, "\"CB%pCMD%u\" -> \"CB%pCMD%u\" [];\n", (void*)pCB->cmdBuffer, instNum-1, (void*)pCB->cmdBuffer, instNum);
+ GLOBAL_CB_NODE* pCB = g_pCmdBufferHead;
+ for (uint32_t i = 0; i < NUM_COMMAND_BUFFERS_TO_DISPLAY; i++) {
+ pCB = g_pLastTouchedCB[i];
+ if (pCB) {
+ fprintf(pOutFile, "subgraph cluster_cmdBuffer%u\n{\nlabel=\"Command Buffer #%u\"\n", i, i);
+ CMD_NODE* pCmd = pCB->pCmds;
+ uint32_t instNum = 0;
+ while (pCmd) {
+ if (instNum) {
+ fprintf(pOutFile, "\"CB%pCMD%u\" -> \"CB%pCMD%u\" [];\n", (void*)pCB->cmdBuffer, instNum-1, (void*)pCB->cmdBuffer, instNum);
+ }
+ if (pCB == g_lastGlobalCB) {
+ fprintf(pOutFile, "\"CB%pCMD%u\" [\nlabel=<<TABLE BGCOLOR=\"#00FF00\" BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD>CMD#</TD><TD>%u</TD></TR><TR><TD>CMD Type</TD><TD>%s</TD></TR></TABLE>>\n];\n", (void*)pCB->cmdBuffer, instNum, instNum, cmdTypeToString(pCmd->type));
+ }
+ else {
fprintf(pOutFile, "\"CB%pCMD%u\" [\nlabel=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD>CMD#</TD><TD>%u</TD></TR><TR><TD>CMD Type</TD><TD>%s</TD></TR></TABLE>>\n];\n", (void*)pCB->cmdBuffer, instNum, instNum, cmdTypeToString(pCmd->type));
- ++instNum;
- pCmd = pCmd->pNext;
}
- fprintf(pOutFile, "}\n");
+ ++instNum;
+ pCmd = pCmd->pNext;
}
+ fprintf(pOutFile, "}\n");
}
}
fprintf(pOutFile, "}\n");
pCB->flags = pCreateInfo->flags;
pCB->queueType = pCreateInfo->queueType;
pCB->lastVtxBinding = MAX_BINDING;
- g_lastCmdBuffer[getTIDIndex()] = *pCmdBuffer;
loader_platform_thread_unlock_mutex(&globalLock);
+ updateCBTracking(*pCmdBuffer);
}
return result;
}
sprintf(str, "In xglBeginCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer);
layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
}
- loader_platform_thread_lock_mutex(&globalLock);
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
- loader_platform_thread_unlock_mutex(&globalLock);
+ updateCBTracking(cmdBuffer);
}
return result;
}
sprintf(str, "In xglEndCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer);
layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
}
- loader_platform_thread_lock_mutex(&globalLock);
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
- loader_platform_thread_unlock_mutex(&globalLock);
- cbDumpDotFile("cb_dump.dot");
+ updateCBTracking(cmdBuffer);
+ //cbDumpDotFile("cb_dump.dot");
}
return result;
}
XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
if (XGL_SUCCESS == result) {
resetCB(cmdBuffer);
- loader_platform_thread_lock_mutex(&globalLock);
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
- loader_platform_thread_unlock_mutex(&globalLock);
+ updateCBTracking(cmdBuffer);
}
return result;
}
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
loader_platform_thread_lock_mutex(&globalLock);
g_lastBoundPipeline = cmdBuffer;
loader_platform_thread_unlock_mutex(&globalLock);
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
// TODO : Handle storing Pipeline Deltas to cmd buffer here
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BINDPIPELINEDELTA);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BINDDESCRIPTORSET);
if (getSetNode(descriptorSet)) {
if (dsUpdateActive(descriptorSet)) {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BINDINDEXBUFFER);
// TODO : Track idxBuffer binding
}
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BINDVERTEXBUFFER);
pCB->lastVtxBinding = binding;
}
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_DRAW);
pCB->drawCount[DRAW]++;
char str[1024];
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_DRAWINDEXED);
pCB->drawCount[DRAW_INDEXED]++;
char str[1024];
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_DRAWINDIRECT);
pCB->drawCount[DRAW_INDIRECT]++;
char str[1024];
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_DRAWINDEXEDINDIRECT);
pCB->drawCount[DRAW_INDEXED_INDIRECT]++;
char str[1024];
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_DISPATCH);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_DISPATCHINDIRECT);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_COPYBUFFER);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_COPYIMAGE);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_COPYBUFFERTOIMAGE);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_COPYIMAGETOBUFFER);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_CLONEIMAGEDATA);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_UPDATEBUFFER);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_FILLBUFFER);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_CLEARCOLORIMAGE);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_CLEARCOLORIMAGERAW);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_CLEARDEPTHSTENCIL);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_RESOLVEIMAGE);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_SETEVENT);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_RESETEVENT);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_WAITEVENTS);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_PIPELINEBARRIER);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BEGINQUERY);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_ENDQUERY);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_RESETQUERYPOOL);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_WRITETIMESTAMP);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_INITATOMICCOUNTERS);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_LOADATOMICCOUNTERS);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_SAVEATOMICCOUNTERS);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BEGINRENDERPASS);
}
else {
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_ENDRENDERPASS);
}
else {
XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
{
+ GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
+ if (pCB) {
+ updateCBTracking(cmdBuffer);
+ addCmd(pCB, CMD_DBGMARKERBEGIN);
+ }
+ else {
+ char str[1024];
+ sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
+ layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
+ }
nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
}
XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
{
+ GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
+ if (pCB) {
+ updateCBTracking(cmdBuffer);
+ addCmd(pCB, CMD_DBGMARKEREND);
+ }
+ else {
+ char str[1024];
+ sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
+ layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
+ }
nextTable.CmdDbgMarkerEnd(cmdBuffer);
}