aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobin Ehlis <tobin@lunarg.com>2015-03-02 10:16:40 -0700
committerTobin Ehlis <tobin@lunarg.com>2015-03-02 16:13:11 -0700
commitaf790e5deac12a608703f310cf719059a2bb7d04 (patch)
treee649a3b57daaa60ca5e9beee667cd8b1cf85ca7e
parent005d19fb5f14e78754c01cad930e55f56278e787 (diff)
downloadusermoji-af790e5deac12a608703f310cf719059a2bb7d04.tar.xz
layers: DrawState Cmd Buffer tracking improvements
Add DbgMarker cmds to cmd buffer instruction linked list Display last 10 touched CBs in dot file Highlight last touched CB in dot file with green color
-rw-r--r--layers/draw_state.c173
-rw-r--r--layers/draw_state.h4
2 files changed, 113 insertions, 64 deletions
diff --git a/layers/draw_state.c b/layers/draw_state.c
index f2a685b6..87c2b145 100644
--- a/layers/draw_state.c
+++ b/layers/draw_state.c
@@ -48,19 +48,19 @@ static uint64_t g_alloc_count = 0;
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;
}
@@ -277,6 +277,10 @@ static char* cmdTypeToString(CMD_TYPE cmd)
return "CMD_BEGINRENDERPASS";
case CMD_ENDRENDERPASS:
return "CMD_ENDRENDERPASS";
+ case CMD_DBGMARKERBEGIN:
+ return "CMD_DBGMARKERBEGIN";
+ case CMD_DBGMARKEREND:
+ return "CMD_DBGMARKEREND";
default:
return "UNKNOWN";
}
@@ -285,6 +289,7 @@ static char* cmdTypeToString(CMD_TYPE cmd)
// 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};
@@ -298,7 +303,11 @@ static BUFFER_NODE* g_pBufferHead = NULL;
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;
@@ -459,6 +468,25 @@ static void freeBuffers()
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)
{
@@ -1237,8 +1265,8 @@ static void setLastBoundDynamicState(const XGL_CMD_BUFFER cmdBuffer, const XGL_D
{
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)) {
@@ -1423,22 +1451,27 @@ static void cbDumpDotFile(char *outFileName)
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");
@@ -2430,8 +2463,8 @@ XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, con
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;
}
@@ -2451,9 +2484,7 @@ XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffe
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;
}
@@ -2472,10 +2503,8 @@ XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
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;
}
@@ -2485,9 +2514,7 @@ XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffe
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;
}
@@ -2496,7 +2523,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PI
{
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);
@@ -2524,7 +2551,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipelineDelta(XGL_CMD_BUFFER cmdBuffer, X
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 {
@@ -2545,7 +2572,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, X
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BINDDESCRIPTORSET);
if (getSetNode(descriptorSet)) {
if (dsUpdateActive(descriptorSet)) {
@@ -2583,7 +2610,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BINDINDEXBUFFER);
// TODO : Track idxBuffer binding
}
@@ -2599,7 +2626,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdBindVertexBuffer(XGL_CMD_BUFFER cmdBuffer, XG
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BINDVERTEXBUFFER);
pCB->lastVtxBinding = binding;
}
@@ -2615,7 +2642,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdDraw(XGL_CMD_BUFFER cmdBuffer, uint32_t first
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_DRAW);
pCB->drawCount[DRAW]++;
char str[1024];
@@ -2635,7 +2662,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexed(XGL_CMD_BUFFER cmdBuffer, uint32_
{
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];
@@ -2655,7 +2682,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BU
{
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];
@@ -2675,7 +2702,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexedIndirect(XGL_CMD_BUFFER cmdBuffer,
{
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];
@@ -2695,7 +2722,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdDispatch(XGL_CMD_BUFFER cmdBuffer, uint32_t x
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_DISPATCH);
}
else {
@@ -2710,7 +2737,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XG
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_DISPATCHINDIRECT);
}
else {
@@ -2725,7 +2752,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFF
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_COPYBUFFER);
}
else {
@@ -2740,7 +2767,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_COPYIMAGE);
}
else {
@@ -2755,7 +2782,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBufferToImage(XGL_CMD_BUFFER cmdBuffer, X
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_COPYBUFFERTOIMAGE);
}
else {
@@ -2770,7 +2797,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImageToBuffer(XGL_CMD_BUFFER cmdBuffer, X
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_COPYIMAGETOBUFFER);
}
else {
@@ -2785,7 +2812,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdCloneImageData(XGL_CMD_BUFFER cmdBuffer, XGL_
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_CLONEIMAGEDATA);
}
else {
@@ -2800,7 +2827,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BU
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_UPDATEBUFFER);
}
else {
@@ -2815,7 +2842,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFF
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_FILLBUFFER);
}
else {
@@ -2830,7 +2857,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImage(XGL_CMD_BUFFER cmdBuffer, XGL
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_CLEARCOLORIMAGE);
}
else {
@@ -2845,7 +2872,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImageRaw(XGL_CMD_BUFFER cmdBuffer,
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_CLEARCOLORIMAGERAW);
}
else {
@@ -2860,7 +2887,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdClearDepthStencil(XGL_CMD_BUFFER cmdBuffer, X
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_CLEARDEPTHSTENCIL);
}
else {
@@ -2875,7 +2902,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdResolveImage(XGL_CMD_BUFFER cmdBuffer, XGL_IM
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_RESOLVEIMAGE);
}
else {
@@ -2890,7 +2917,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_SETEVENT);
}
else {
@@ -2905,7 +2932,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVEN
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_RESETEVENT);
}
else {
@@ -2920,7 +2947,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XG
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_WAITEVENTS);
}
else {
@@ -2935,7 +2962,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, con
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_PIPELINEBARRIER);
}
else {
@@ -2950,7 +2977,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdBeginQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUER
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BEGINQUERY);
}
else {
@@ -2965,7 +2992,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_ENDQUERY);
}
else {
@@ -2980,7 +3007,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdResetQueryPool(XGL_CMD_BUFFER cmdBuffer, XGL_
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_RESETQUERYPOOL);
}
else {
@@ -2995,7 +3022,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdWriteTimestamp(XGL_CMD_BUFFER cmdBuffer, XGL_
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_WRITETIMESTAMP);
}
else {
@@ -3010,7 +3037,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdInitAtomicCounters(XGL_CMD_BUFFER cmdBuffer,
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_INITATOMICCOUNTERS);
}
else {
@@ -3025,7 +3052,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdLoadAtomicCounters(XGL_CMD_BUFFER cmdBuffer,
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_LOADATOMICCOUNTERS);
}
else {
@@ -3040,7 +3067,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdSaveAtomicCounters(XGL_CMD_BUFFER cmdBuffer,
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_SAVEATOMICCOUNTERS);
}
else {
@@ -3067,7 +3094,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BEGINRENDERPASS);
}
else {
@@ -3082,7 +3109,7 @@ XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_R
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
- g_lastCmdBuffer[getTIDIndex()] = cmdBuffer;
+ updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_ENDRENDERPASS);
}
else {
@@ -3164,11 +3191,31 @@ XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetDeviceOption(XGL_DEVICE device, XGL_
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);
}
diff --git a/layers/draw_state.h b/layers/draw_state.h
index 3fcf820e..0176bd4d 100644
--- a/layers/draw_state.h
+++ b/layers/draw_state.h
@@ -181,7 +181,9 @@ typedef enum _CMD_TYPE
CMD_LOADATOMICCOUNTERS,
CMD_SAVEATOMICCOUNTERS,
CMD_BEGINRENDERPASS,
- CMD_ENDRENDERPASS
+ CMD_ENDRENDERPASS,
+ CMD_DBGMARKERBEGIN,
+ CMD_DBGMARKEREND,
} CMD_TYPE;
// Data structure for holding sequence of cmds in cmd buffer
typedef struct _CMD_NODE {