// TODO : Flag error for missing node
}
else {
- MEM_STATE_TRANSITION_NODE* pMTNode = pTrav->pTransitions;
+ MEM_STATE_TRANSITION_NODE* pMTNode = pTrav->pRegions;
MEM_STATE_TRANSITION_NODE* pPrevMTNode = pMTNode;
// TODO : Not sure of best way (or need) to distinguish mem from image here
// Verify that it's being used as memory (not image)
- //if (!pTrav->pTransitions.isMem) {
+ //if (!pTrav->pRegions.isMem) {
// TODO : Flag error for setting mem transition on image memory
//}
// Basic state update algorithm
MEM_STATE_TRANSITION_NODE* pNewNode = (MEM_STATE_TRANSITION_NODE*)malloc(sizeof(MEM_STATE_TRANSITION_NODE));
memset(pNewNode, 0, sizeof(MEM_STATE_TRANSITION_NODE));
memcpy(&pNewNode->transition, pTransition, sizeof(XGL_MEMORY_STATE_TRANSITION));
+ // Increment numRegions here and will be appropriately decremented below if needed
+ pTrav->numRegions++;
if (!pMTNode) { // Initialization case, just set HEAD ptr to new node
- pTrav->pTransitions = pNewNode;
+ pTrav->pRegions = pNewNode;
}
else {
// If offset of new state is less than current offset, insert it & update state after it as needed
saveStartNode = 1;
pMTNode->transition.memory.regionSize = pTransition->offset - pMTNode->transition.memory.offset;
pMTNode->pNext = pNewNode;
+ // TODO: Verify that prev newState matches new oldState
}
else { // start point of regions are equal
// Prev ptr now points to new region
- if (pPrevMTNode == pTrav->pTransitions)
- pTrav->pTransitions = pNewNode;
+ if (pPrevMTNode == pTrav->pRegions)
+ pTrav->pRegions = pNewNode;
else
pPrevMTNode->pNext = pNewNode;
}
+ // New region is overlaying old region so make sure states match
+ if (pMTNode->transition.memory.newState != pNewNode->transition.memory.oldState) {
+ char str[1024];
+ sprintf(str, "Setting Memory state transition for mem %p, current newState of %s doesn't match overlapping transition oldState of %s", mem, string_XGL_MEMORY_STATE(pMTNode->transition.memory.newState), string_XGL_MEMORY_STATE(pNewNode->transition.memory.oldState));
+ layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_STATE, "MEM", str);
+ }
// Start point insertion complete, find end point
XGL_GPU_SIZE newEndPoint = pTransition->offset + pTransition->regionSize;
XGL_GPU_SIZE curEndPoint = pMTNode->transition.memory.offset + pMTNode->transition.memory.regionSize;
pMTNode = pMTNode->pNext;
// TODO : Handle NULL pMTNode case
curEndPoint = pMTNode->transition.memory.offset + pMTNode->transition.memory.regionSize;
+ if (pMTNode->transition.memory.newState != pNewNode->transition.memory.oldState) {
+ char str[1024];
+ sprintf(str, "Setting Memory state transition for mem %p, current newState of %s doesn't match overlapping transition oldState of %s", mem, string_XGL_MEMORY_STATE(pMTNode->transition.memory.newState), string_XGL_MEMORY_STATE(pNewNode->transition.memory.oldState));
+ layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_STATE, "MEM", str);
+ }
}
if (newEndPoint < curEndPoint) {
// split end region
pFreeMe = pMTNode;
}
// Free any regions that are no longer needed
- if ((1 == saveStartNode) && (NULL != pFreeMe))
+ if ((1 == saveStartNode) && (NULL != pFreeMe)) {
pFreeMe = pFreeMe->pNext;
+ numToFree--;
+ }
+ pTrav->numRegions -= numToFree;
MEM_STATE_TRANSITION_NODE* pNodeToFree;
while (numToFree) {
pNodeToFree = pFreeMe;
if (pAllocInfo) { // TODO : How to handle Wsi-created alloc?
// Create initial state node that covers entire allocation
// TODO : How to handle image memory?
+ pTrav->numRegions = 0; // This will be updated during setMemTransition call
XGL_MEMORY_STATE_TRANSITION initMemStateTrans;
memset(&initMemStateTrans, 0, sizeof(XGL_MEMORY_STATE_TRANSITION));
initMemStateTrans.sType = XGL_STRUCTURE_TYPE_MEMORY_STATE_TRANSITION;
if (pGlobalMemObjHead == pTrav)
pGlobalMemObjHead = pTrav->pNextGlobalNode;
// delete transition list off of this node
- MEM_STATE_TRANSITION_NODE* pMSTNode = pTrav->pTransitions;
+ MEM_STATE_TRANSITION_NODE* pMSTNode = pTrav->pRegions;
MEM_STATE_TRANSITION_NODE* pPrevMSTNode = pMSTNode;
while(pMSTNode) {
pPrevMSTNode = pMSTNode;
XGL_MEMORY_STATE_TRANSITION initMemStateTrans;
memset(&initMemStateTrans, 0, sizeof(XGL_MEMORY_STATE_TRANSITION));
initMemStateTrans.mem = mem;
- initMemStateTrans.oldState = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
- initMemStateTrans.newState = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
+ //initMemStateTrans.oldState = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
+ //initMemStateTrans.newState = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
+ // TODO : For now just using initial memory state
+ initMemStateTrans.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
+ initMemStateTrans.newState = XGL_MEMORY_STATE_DATA_TRANSFER;
initMemStateTrans.offset = 0;
initMemStateTrans.regionSize = pTrav->allocInfo.allocationSize;
setMemTransition(mem, &initMemStateTrans);
pCBTrav = pCBTrav->pNext;
}
}
+ MEM_STATE_TRANSITION_NODE* pTrans = pTrav->pRegions;
+ if (!pTrans) {
+ sprintf(str, " No regions");
+ layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ }
+ else {
+ sprintf(str, " XGL_MEMORY_STATE_TRANSITION (MST) regions list w/ HEAD at %p:", pTrans);
+ layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ while (pTrans) {
+ sprintf(str, " MST_NODE(%p):\n%s", pTrans, xgl_print_xgl_memory_state_transition(&pTrans->transition.memory, "{MEM}INFO : "));
+ layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
+ pTrans = pTrans->pNext;
+ }
+ }
pTrav = pTrav->pNextGlobalNode;
}
}
MEMTRACK_MEMORY_BINDING_ERROR = 12, // Error during one of many calls that bind memory to object or CB
MEMTRACK_OUT_OF_MEMORY_ERROR = 13, // malloc failed
MEMTRACK_MEMORY_LEAK = 14, // Failure to call xglFreeMemory on Mem Obj prior to DestroyDevice
- MEMTRACK_INVALID_STATE = 15, // Failure to call xglFreeMemory on Mem Obj prior to DestroyDevice
+ MEMTRACK_INVALID_STATE = 15, // Memory not in the correct state
} MEM_TRACK_ERROR;
/*
// Store a linked-list of transition nodes to account for different states across a single mem obj
typedef struct _MEM_STATE_TRANSITION_NODE {
struct _MEM_STATE_TRANSITION_NODE* pNext;
- uint32_t numRegions; // Allocation may be broken into various regions
- uint32_t isMem; // 1 for memory, 0 for image
+ //uint32_t isMem; // 1 for memory, 0 for image
union {
XGL_MEMORY_STATE_TRANSITION memory;
XGL_IMAGE_STATE_TRANSITION image; // use when img attached to this mem obj
XGL_UINT refCount; // Count of references (obj bindings or CB use)
XGL_GPU_MEMORY mem;
XGL_MEMORY_ALLOC_INFO allocInfo;
- MEM_STATE_TRANSITION_NODE* pTransitions; // LL of transitions for this Mem Obj
+ uint32_t numRegions; // Allocation may be broken into various regions
+ MEM_STATE_TRANSITION_NODE* pRegions; // LL of transitions for this Mem Obj
} GLOBAL_MEM_OBJ_NODE;
typedef struct _GLOBAL_OBJECT_NODE {