layers: Update DrawState to support all Gfx shader types and to shadow full Gfx Pipeline state
diff --git a/layers/draw_state.c b/layers/draw_state.c
index 0692aef..ba46a39 100644
--- a/layers/draw_state.c
+++ b/layers/draw_state.c
@@ -69,15 +69,89 @@
}
}
}
+// Return the size of the underlying struct based on struct type
+static XGL_SIZE sTypeStructSize(XGL_STRUCTURE_TYPE sType)
+{
+ switch (sType)
+ {
+ case XGL_STRUCTURE_TYPE_APPLICATION_INFO:
+ return sizeof(XGL_APPLICATION_INFO);
+ case XGL_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
+ return sizeof(XGL_DEVICE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO:
+ return sizeof(XGL_MEMORY_ALLOC_INFO);
+ case XGL_STRUCTURE_TYPE_MEMORY_OPEN_INFO:
+ return sizeof(XGL_MEMORY_OPEN_INFO);
+ case XGL_STRUCTURE_TYPE_PEER_MEMORY_OPEN_INFO:
+ return sizeof(XGL_PEER_MEMORY_OPEN_INFO);
+ case XGL_STRUCTURE_TYPE_MEMORY_VIEW_ATTACH_INFO:
+ return sizeof(XGL_MEMORY_VIEW_ATTACH_INFO);
+ case XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO:
+ return sizeof(XGL_IMAGE_VIEW_ATTACH_INFO);
+ case XGL_STRUCTURE_TYPE_MEMORY_STATE_TRANSITION:
+ return sizeof(XGL_MEMORY_STATE_TRANSITION);
+ case XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO:
+ return sizeof(XGL_IMAGE_VIEW_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO:
+ return sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO:
+ return sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO:
+ return sizeof(XGL_SHADER_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO:
+ return sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO:
+ return sizeof(XGL_SAMPLER_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO:
+ return sizeof(XGL_DESCRIPTOR_SET_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_RASTER_STATE_CREATE_INFO:
+ return sizeof(XGL_RASTER_STATE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_MSAA_STATE_CREATE_INFO:
+ return sizeof(XGL_MSAA_STATE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_COLOR_BLEND_STATE_CREATE_INFO:
+ return sizeof(XGL_COLOR_BLEND_STATE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_DEPTH_STENCIL_STATE_CREATE_INFO:
+ return sizeof(XGL_DEPTH_STENCIL_STATE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO:
+ return sizeof(XGL_CMD_BUFFER_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO:
+ return sizeof(XGL_EVENT_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO:
+ return sizeof(XGL_FENCE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO:
+ return sizeof(XGL_QUEUE_SEMAPHORE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_SEMAPHORE_OPEN_INFO:
+ return sizeof(XGL_QUEUE_SEMAPHORE_OPEN_INFO);
+ case XGL_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO:
+ return sizeof(XGL_QUERY_POOL_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:
+ return sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
+ return sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:
+ return sizeof(XGL_PIPELINE_IA_STATE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO:
+ return sizeof(XGL_PIPELINE_DB_STATE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:
+ return sizeof(XGL_PIPELINE_CB_STATE);
+ case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:
+ return sizeof(XGL_PIPELINE_RS_STATE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:
+ return sizeof(XGL_PIPELINE_TESS_STATE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO:
+ return sizeof(XGL_IMAGE_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:
+ return sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO);
+ case XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO:
+ return sizeof(XGL_LAYER_CREATE_INFO);
+ default:
+ return 0;
+ }
+}
+
// Block of code at start here for managing/tracking Pipeline state that this layer cares about
// Just track 2 shaders for now
-#define VS 0
-#define FS 1
-#define DRAW 0
-#define DRAW_INDEXED 1
-#define DRAW_INDIRECT 2
-#define DRAW_INDEXED_INDIRECT 3
-#define NUM_DRAW_TYPES 4
+#define XGL_NUM_GRAPHICS_SHADERS XGL_SHADER_STAGE_COMPUTE
#define MAX_SLOTS 2048
static uint64_t drawCount[NUM_DRAW_TYPES] = {0, 0, 0, 0};
@@ -87,17 +161,19 @@
XGL_DESCRIPTOR_SLOT_INFO* pShaderMappingSlot;
} SHADER_DS_MAPPING;
-typedef struct _PIPELINE_NODE {
- XGL_PIPELINE pipeline;
- struct _PIPELINE_NODE* pNext;
- SHADER_DS_MAPPING dsMapping[2][XGL_MAX_DESCRIPTOR_SETS];
-} PIPELINE_NODE;
-
typedef struct _PIPELINE_LL_HEADER {
XGL_STRUCTURE_TYPE sType;
const XGL_VOID* pNext;
} PIPELINE_LL_HEADER;
+typedef struct _PIPELINE_NODE {
+ XGL_PIPELINE pipeline;
+ struct _PIPELINE_NODE *pNext;
+ PIPELINE_LL_HEADER *pCreateTree; // Ptr to shadow of data in create tree
+ // 1st dimension of array is shader type
+ SHADER_DS_MAPPING dsMapping[XGL_NUM_GRAPHICS_SHADERS][XGL_MAX_DESCRIPTOR_SETS];
+} PIPELINE_NODE;
+
static PIPELINE_NODE *pPipelineHead = NULL;
static XGL_PIPELINE lastBoundPipeline = NULL;
@@ -115,37 +191,31 @@
// Init the pipeline mapping info based on pipeline create info LL tree
static void initPipeline(PIPELINE_NODE *pPipeline, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo)
{
+ // First init create info, we'll shadow the structs as we go down the tree
+ pPipeline->pCreateTree = (PIPELINE_LL_HEADER*)malloc(sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
+ memcpy(pPipeline->pCreateTree, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO));
+ PIPELINE_LL_HEADER *pShadowTrav = pPipeline->pCreateTree;
PIPELINE_LL_HEADER *pTrav = (PIPELINE_LL_HEADER*)pCreateInfo->pNext;
while (pTrav) {
+ // Shadow the struct
+ pShadowTrav->pNext = (PIPELINE_LL_HEADER*)malloc(sTypeStructSize(pTrav->sType));
+ // Typically pNext is const so have to cast to avoid warning when we modify it here
+ memcpy((void*)pShadowTrav->pNext, pTrav, sTypeStructSize(pTrav->sType));
+ pShadowTrav = (PIPELINE_LL_HEADER*)pShadowTrav->pNext;
+ // Special copy of DS Mapping info
if (XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO == pTrav->sType) {
XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pSSCI = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*)pTrav;
- if (XGL_SHADER_STAGE_VERTEX == pSSCI->shader.stage) {
- for (uint32_t i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++) {
- if (pSSCI->shader.descriptorSetMapping[i].descriptorCount > MAX_SLOTS) {
- char str[1024];
- sprintf(str, "descriptorCount for Vertex Shader exceeds 2048 (%u), is this correct? Changing to 0", pSSCI->shader.descriptorSetMapping[i].descriptorCount);
- layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_DESCRIPTOR_MAX_EXCEEDED, "DS", str);
- pSSCI->shader.descriptorSetMapping[i].descriptorCount = 0;
- }
- pPipeline->dsMapping[0][i].slotCount = pSSCI->shader.descriptorSetMapping[i].descriptorCount;
- // Deep copy DS Slot array
- pPipeline->dsMapping[0][i].pShaderMappingSlot = (XGL_DESCRIPTOR_SLOT_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SLOT_INFO)*pPipeline->dsMapping[0][i].slotCount);
- memcpy(pPipeline->dsMapping[0][i].pShaderMappingSlot, pSSCI->shader.descriptorSetMapping[i].pDescriptorInfo, sizeof(XGL_DESCRIPTOR_SLOT_INFO)*pPipeline->dsMapping[0][i].slotCount);
+ for (uint32_t i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++) {
+ if (pSSCI->shader.descriptorSetMapping[i].descriptorCount > MAX_SLOTS) {
+ char str[1024];
+ sprintf(str, "descriptorCount for %s exceeds 2048 (%u), is this correct? Changing to 0", string_XGL_PIPELINE_SHADER_STAGE(pSSCI->shader.stage), pSSCI->shader.descriptorSetMapping[i].descriptorCount);
+ layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_DESCRIPTOR_MAX_EXCEEDED, "DS", str);
+ pSSCI->shader.descriptorSetMapping[i].descriptorCount = 0;
}
- }
- else if (XGL_SHADER_STAGE_FRAGMENT == pSSCI->shader.stage) {
- for (uint32_t i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++) {
- if (pSSCI->shader.descriptorSetMapping[i].descriptorCount > MAX_SLOTS) {
- char str[1024];
- sprintf(str, "descriptorCount for Frag Shader exceeds 2048 (%u), is this correct? Changing to 0", pSSCI->shader.descriptorSetMapping[i].descriptorCount);
- layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_DESCRIPTOR_MAX_EXCEEDED, "DS", str);
- pSSCI->shader.descriptorSetMapping[i].descriptorCount = 0;
- }
- pPipeline->dsMapping[1][i].slotCount = pSSCI->shader.descriptorSetMapping[i].descriptorCount;
- // Deep copy DS Slot array
- pPipeline->dsMapping[1][i].pShaderMappingSlot = (XGL_DESCRIPTOR_SLOT_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SLOT_INFO)*pPipeline->dsMapping[1][i].slotCount);
- memcpy(pPipeline->dsMapping[1][i].pShaderMappingSlot, pSSCI->shader.descriptorSetMapping[i].pDescriptorInfo, sizeof(XGL_DESCRIPTOR_SLOT_INFO)*pPipeline->dsMapping[1][i].slotCount);
- }
+ pPipeline->dsMapping[pSSCI->shader.stage][i].slotCount = pSSCI->shader.descriptorSetMapping[i].descriptorCount;
+ // Deep copy DS Slot array
+ pPipeline->dsMapping[pSSCI->shader.stage][i].pShaderMappingSlot = (XGL_DESCRIPTOR_SLOT_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SLOT_INFO)*pPipeline->dsMapping[pSSCI->shader.stage][i].slotCount);
+ memcpy(pPipeline->dsMapping[pSSCI->shader.stage][i].pShaderMappingSlot, pSSCI->shader.descriptorSetMapping[i].pDescriptorInfo, sizeof(XGL_DESCRIPTOR_SLOT_INFO)*pPipeline->dsMapping[pSSCI->shader.stage][i].slotCount);
}
}
pTrav = (PIPELINE_LL_HEADER*)pTrav->pNext;
@@ -175,7 +245,7 @@
typedef struct _DS_SLOT {
XGL_UINT slot;
- XGL_DESCRIPTOR_SLOT_INFO shaderSlotInfo[2];
+ XGL_DESCRIPTOR_SLOT_INFO shaderSlotInfo[XGL_NUM_GRAPHICS_SHADERS];
// Only 1 of 4 possible slot mappings active
XGL_UINT activeMapping;
XGL_UINT mappingMask; // store record of different mappings used
@@ -366,7 +436,7 @@
layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_DS_BOUND, "DS", str);
}
else { // We have a good DS & Pipeline, store pipeline mappings in DS
- for (uint32_t j = 0; j < 2; j++) { // j is shader selector
+ for (uint32_t j = 0; j < XGL_NUM_GRAPHICS_SHADERS; j++) { // j is shader selector
for (uint32_t k = 0; k < XGL_MAX_DESCRIPTOR_SETS; k++) {
if (pPipeTrav->dsMapping[j][k].slotCount > pDS->numSlots) {
sprintf(str, "DS Mapping for shader %u has more slots (%u) than DS %p (%u)!", j, pPipeTrav->dsMapping[j][k].slotCount, (void*)pDS->dsID, pDS->numSlots);
@@ -421,7 +491,7 @@
return XGL_FALSE;
}
if (XGL_TRUE == error) {
- sprintf(str, "DS Slot #%u binding of %s does not match %s shader mapping of %s", slot, stringSlotBinding(slotBinding), (shaderStage == VS) ? "Vtx" : "Frag", string_XGL_DESCRIPTOR_SET_SLOT_TYPE(shaderMapping));
+ sprintf(str, "DS Slot #%u binding of %s does not match %s shader mapping of %s", slot, stringSlotBinding(slotBinding), string_XGL_PIPELINE_SHADER_STAGE(shaderStage), string_XGL_DESCRIPTOR_SET_SLOT_TYPE(shaderMapping));
layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_DS_MAPPING_MISMATCH, "DS", str);
return XGL_FALSE;
}
@@ -479,9 +549,9 @@
break;
}
// For each shader type, check its mapping
- for (uint32_t k = 0; k < 2; k++) {
+ for (uint32_t k = 0; k < XGL_NUM_GRAPHICS_SHADERS; k++) {
if (XGL_SLOT_UNUSED != pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType) {
- sprintf(tmp_str, " Shader type %s has %s slot type mapping to shaderEntityIndex %u\n", (k == 0) ? "VS" : "FS", string_XGL_DESCRIPTOR_SET_SLOT_TYPE(pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType), pDS->dsSlot[j].shaderSlotInfo[k].shaderEntityIndex);
+ sprintf(tmp_str, " Shader type %s has %s slot type mapping to shaderEntityIndex %u\n", string_XGL_PIPELINE_SHADER_STAGE(k), string_XGL_DESCRIPTOR_SET_SLOT_TYPE(pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType), pDS->dsSlot[j].shaderSlotInfo[k].shaderEntityIndex);
strcat(ds_config_str, tmp_str);
verifyShaderSlotMapping(j, pDS->dsSlot[j].activeMapping, k, pDS->dsSlot[j].shaderSlotInfo[k].slotObjectType);
}