layers: Added per-region memory state tracking
Initially only tracking mem transitions. Need to validate these and still have further work with images.
diff --git a/layers/mem_tracker.h b/layers/mem_tracker.h
index c117aa8..7196b9d 100644
--- a/layers/mem_tracker.h
+++ b/layers/mem_tracker.h
@@ -91,14 +91,16 @@
} MINI_NODE;
struct GLOBAL_MEM_OBJ_NODE;
-
-// Store a single LL of command buffers
-typedef struct _GLOBAL_CB_NODE {
- struct _GLOBAL_CB_NODE* pNextGlobalCBNode;
- MINI_NODE* pMemObjList; // LL of Mem objs referenced by this CB
- XGL_CMD_BUFFER cmdBuffer;
- XGL_FENCE fence; // fence tracking this cmd buffer
-} GLOBAL_CB_NODE;
+// 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
+ union {
+ XGL_MEMORY_STATE_TRANSITION memory;
+ XGL_IMAGE_STATE_TRANSITION image; // use when img attached to this mem obj
+ } transition;
+} MEM_STATE_TRANSITION_NODE;
// Data struct for tracking memory object
typedef struct _GLOBAL_MEM_OBJ_NODE {
@@ -108,11 +110,7 @@
XGL_UINT refCount; // Count of references (obj bindings or CB use)
XGL_GPU_MEMORY mem;
XGL_MEMORY_ALLOC_INFO allocInfo;
- // TODO : Currently using MEM state struct to also track Image states
- union {
- XGL_MEMORY_STATE_TRANSITION memory;
- XGL_IMAGE_STATE_TRANSITION image; // use when img attached to this mem obj
- } transition;
+ MEM_STATE_TRANSITION_NODE* pTransitions; // LL of transitions for this Mem Obj
} GLOBAL_MEM_OBJ_NODE;
typedef struct _GLOBAL_OBJECT_NODE {
@@ -142,3 +140,39 @@
} create_info;
char object_name[32];
} GLOBAL_OBJECT_NODE;
+
+/*
+ * Track a Vertex or Index buffer binding
+ */
+typedef struct _MEMORY_BINDING {
+ XGL_OBJECT mem;
+ XGL_GPU_SIZE offset;
+ XGL_UINT binding;
+ XGL_INDEX_TYPE indexType;
+} MEMORY_BINDING;
+
+/*
+ * Track a Descriptor Set binding
+ */
+typedef struct _DS_BINDING {
+ XGL_PIPELINE_BIND_POINT pipelineBindPoint;
+ XGL_DESCRIPTOR_SET descriptorSet;
+ XGL_UINT slotOffset;
+} DS_BINDING;
+
+// Store a single LL of command buffers
+typedef struct _GLOBAL_CB_NODE {
+ struct _GLOBAL_CB_NODE* pNextGlobalCBNode;
+ XGL_CMD_BUFFER_CREATE_INFO createInfo;
+ MINI_NODE* pMemObjList; // LL of Mem objs referenced by this CB
+ MINI_NODE* pVertexBufList;
+ MINI_NODE* pIndexBufList;
+ GLOBAL_OBJECT_NODE* pDynamicState[XGL_NUM_STATE_BIND_POINT];
+ XGL_PIPELINE pipelines[XGL_NUM_PIPELINE_BIND_POINT];
+ DS_BINDING descriptorSets[XGL_MAX_DESCRIPTOR_SETS];
+ XGL_UINT colorAttachmentCount;
+ XGL_COLOR_ATTACHMENT_BIND_INFO attachments[XGL_MAX_COLOR_ATTACHMENTS];
+ XGL_DEPTH_STENCIL_BIND_INFO dsBindInfo;
+ XGL_CMD_BUFFER cmdBuffer;
+ XGL_FENCE fence; // fence tracking this cmd buffer
+} GLOBAL_CB_NODE;