layers: Add DrawState dot file output of descriptor details
diff --git a/layers/draw_state.c b/layers/draw_state.c
index de9d71c..d6ae9de 100644
--- a/layers/draw_state.c
+++ b/layers/draw_state.c
@@ -395,6 +395,20 @@
}
g_pSamplerHead = NULL;
}
+static XGL_IMAGE_VIEW_CREATE_INFO* getImageViewCreateInfo(XGL_IMAGE_VIEW view)
+{
+ loader_platform_thread_lock_mutex(&globalLock);
+ IMAGE_NODE* pTrav = g_pImageHead;
+ while (pTrav) {
+ if (view == pTrav->image) {
+ loader_platform_thread_unlock_mutex(&globalLock);
+ return &pTrav->createInfo;
+ }
+ pTrav = pTrav->pNext;
+ }
+ loader_platform_thread_unlock_mutex(&globalLock);
+ return NULL;
+}
// Free all image nodes
static void freeImages()
{
@@ -410,6 +424,20 @@
}
g_pImageHead = NULL;
}
+static XGL_BUFFER_VIEW_CREATE_INFO* getBufferViewCreateInfo(XGL_BUFFER_VIEW view)
+{
+ loader_platform_thread_lock_mutex(&globalLock);
+ BUFFER_NODE* pTrav = g_pBufferHead;
+ while (pTrav) {
+ if (view == pTrav->buffer) {
+ loader_platform_thread_unlock_mutex(&globalLock);
+ return &pTrav->createInfo;
+ }
+ pTrav = pTrav->pNext;
+ }
+ loader_platform_thread_unlock_mutex(&globalLock);
+ return NULL;
+}
// Free all buffer nodes
static void freeBuffers()
{
@@ -470,9 +498,6 @@
}
// For given sampler, return a ptr to its Create Info struct, or NULL if sampler not found
-// TODO : Use this function to display sampler info
-// commenting out for now to avoid warning about not being used
-/*
static XGL_SAMPLER_CREATE_INFO* getSamplerCreateInfo(const XGL_SAMPLER sampler)
{
loader_platform_thread_lock_mutex(&globalLock);
@@ -487,7 +512,6 @@
loader_platform_thread_unlock_mutex(&globalLock);
return NULL;
}
-*/
// Init the pipeline mapping info based on pipeline create info LL tree
// Threading note : Calls to this function should wrapped in mutex
@@ -1275,6 +1299,90 @@
fprintf(pOutFile, "%s", pGVstr);
free(pGVstr);
}
+ if (pSet->ppDescriptors) {
+ //void* pDesc = NULL;
+ fprintf(pOutFile, "\"DESCRIPTORS\" [\nlabel=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD PORT=\"desc\">DESCRIPTORS</TD></TR>");
+ uint32_t i = 0;
+ for (i=0; i < pSet->descriptorCount; i++) {
+ if (pSet->ppDescriptors[i]) {
+ fprintf(pOutFile, "<TR><TD PORT=\"slot%u\">slot%u</TD></TR>", i, i);
+ }
+ }
+ fprintf(pOutFile, "</TABLE>>\n];\n");
+ // Now add the views that are mapped to active descriptors
+ XGL_UPDATE_SAMPLERS* pUS = NULL;
+ XGL_UPDATE_SAMPLER_TEXTURES* pUST = NULL;
+ XGL_UPDATE_IMAGES* pUI = NULL;
+ XGL_UPDATE_BUFFERS* pUB = NULL;
+ XGL_UPDATE_AS_COPY* pUAC = NULL;
+ XGL_SAMPLER_CREATE_INFO* pSCI = NULL;
+ XGL_IMAGE_VIEW_CREATE_INFO* pIVCI = NULL;
+ XGL_BUFFER_VIEW_CREATE_INFO* pBVCI = NULL;
+ for (i=0; i < pSet->descriptorCount; i++) {
+ if (pSet->ppDescriptors[i]) {
+ switch (pSet->ppDescriptors[i]->sType)
+ {
+ case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
+ pUS = (XGL_UPDATE_SAMPLERS*)pSet->ppDescriptors[i];
+ pSCI = getSamplerCreateInfo(pUS->pSamplers[i-pUS->index]);
+ if (pSCI) {
+ sprintf(tmp_str, "SAMPLER%u", i);
+ fprintf(pOutFile, "%s", xgl_gv_print_xgl_sampler_create_info(pSCI, tmp_str));
+ fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
+ }
+ break;
+ case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
+ pUST = (XGL_UPDATE_SAMPLER_TEXTURES*)pSet->ppDescriptors[i];
+ pSCI = getSamplerCreateInfo(pUST->pSamplerImageViews[i-pUST->index].pSampler);
+ if (pSCI) {
+ sprintf(tmp_str, "SAMPLER%u", i);
+ fprintf(pOutFile, "%s", xgl_gv_print_xgl_sampler_create_info(pSCI, tmp_str));
+ fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
+ }
+ pIVCI = getImageViewCreateInfo(pUST->pSamplerImageViews[i-pUST->index].pImageView->view);
+ if (pIVCI) {
+ sprintf(tmp_str, "IMAGE_VIEW%u", i);
+ fprintf(pOutFile, "%s", xgl_gv_print_xgl_image_view_create_info(pIVCI, tmp_str));
+ fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
+ }
+ break;
+ case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
+ pUI = (XGL_UPDATE_IMAGES*)pSet->ppDescriptors[i];
+ pIVCI = getImageViewCreateInfo(pUI->pImageViews[i-pUI->index]->view);
+ if (pIVCI) {
+ sprintf(tmp_str, "IMAGE_VIEW%u", i);
+ fprintf(pOutFile, "%s", xgl_gv_print_xgl_image_view_create_info(pIVCI, tmp_str));
+ fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
+ }
+ break;
+ case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
+ pUB = (XGL_UPDATE_BUFFERS*)pSet->ppDescriptors[i];
+ pBVCI = getBufferViewCreateInfo(pUB->pBufferViews[i-pUB->index]->view);
+ if (pBVCI) {
+ sprintf(tmp_str, "BUFFER_VIEW%u", i);
+ fprintf(pOutFile, "%s", xgl_gv_print_xgl_buffer_view_create_info(pBVCI, tmp_str));
+ fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
+ }
+ break;
+ case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
+ pUAC = (XGL_UPDATE_AS_COPY*)pSet->ppDescriptors[i];
+ // TODO : Need to validate this code
+ // Save off pNext and set to NULL while printing this struct, then restore it
+ void** ppNextPtr = (void*)&pUAC->pNext;
+ void* pSaveNext = *ppNextPtr;
+ *ppNextPtr = NULL;
+ sprintf(tmp_str, "UPDATE_AS_COPY%u", i);
+ fprintf(pOutFile, "%s", xgl_gv_print_xgl_update_as_copy(pUAC, tmp_str));
+ fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [];\n", i, tmp_str);
+ // Restore next ptr
+ *ppNextPtr = pSaveNext;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
fprintf(pOutFile, "}\n");
fprintf(pOutFile, "}\n");
pRegion = pRegion->pNext;
@@ -1784,24 +1892,24 @@
XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
{
XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
- if (XGL_SUCCESS == result) {
- loader_platform_thread_lock_mutex(&globalLock);
- BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE));
-#if ALLOC_DEBUG
- printf("Alloc21 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
-#endif
- pNewNode->buffer = *pBuffer;
- memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_CREATE_INFO));
- pNewNode->pNext = g_pBufferHead;
- g_pBufferHead = pNewNode;
- loader_platform_thread_unlock_mutex(&globalLock);
- }
return result;
}
XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
{
XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
+ if (XGL_SUCCESS == result) {
+ loader_platform_thread_lock_mutex(&globalLock);
+ BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE));
+#if ALLOC_DEBUG
+ printf("Alloc21 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode);
+#endif
+ pNewNode->buffer = *pView;
+ memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_VIEW_CREATE_INFO));
+ pNewNode->pNext = g_pBufferHead;
+ g_pBufferHead = pNewNode;
+ loader_platform_thread_unlock_mutex(&globalLock);
+ }
return result;
}