diff options
| author | Tobin Ehlis <tobin@lunarg.com> | 2015-02-18 14:38:11 -0700 |
|---|---|---|
| committer | Tobin Ehlis <tobin@lunarg.com> | 2015-02-18 16:23:54 -0700 |
| commit | bd7849e964ea2a951b3e7169b6f81bbbac817f1b (patch) | |
| tree | 826ec67e57ec91e43abb325779ddadbd82575b3f | |
| parent | 400092548d9f5206982bef16754ecf27042a6e72 (diff) | |
| download | usermoji-bd7849e964ea2a951b3e7169b6f81bbbac817f1b.tar.xz | |
layers: Fix DrawState bug in UPDATE image/buffer shadowing
| -rw-r--r-- | layers/draw_state.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/layers/draw_state.c b/layers/draw_state.c index 4dc377cd..ee1d3022 100644 --- a/layers/draw_state.c +++ b/layers/draw_state.c @@ -659,7 +659,6 @@ static bool32_t validateUpdateSize(GENERIC_HEADER* pUpdateStruct, uint32_t layou return 0; return 1; } - // Determine the update type, allocate a new struct of that type, shadow the given pUpdate // struct into the new struct and return ptr to shadow struct cast as GENERIC_HEADER static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate) @@ -668,7 +667,9 @@ static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate) size_t array_size = 0; size_t base_array_size = 0; size_t total_array_size = 0; + size_t baseBuffAddr = 0; XGL_UPDATE_BUFFERS* pUBCI; + XGL_UPDATE_IMAGES* pUICI; switch (pUpdate->sType) { case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS: @@ -690,15 +691,20 @@ static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate) } break; case XGL_STRUCTURE_TYPE_UPDATE_IMAGES: + pUICI = (XGL_UPDATE_IMAGES*)pUpdate; pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_IMAGES)); memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_IMAGES)); base_array_size = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*) * ((XGL_UPDATE_IMAGES*)pNewNode)->count; total_array_size = (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) * ((XGL_UPDATE_IMAGES*)pNewNode)->count) + base_array_size; XGL_IMAGE_VIEW_ATTACH_INFO*** pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO***)&((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews; *pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO**)malloc(total_array_size); - for (uint32_t i = 0; i < ((XGL_UPDATE_IMAGES*)pNewNode)->count; i++) { - *pppLocalImageViews[i] = (XGL_IMAGE_VIEW_ATTACH_INFO*)(*pppLocalImageViews + base_array_size + (i * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO))); - memcpy(*pppLocalImageViews[i], ((XGL_UPDATE_IMAGES*)pUpdate)->pImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)); +#if ALLOC_DEBUG + printf("Alloc16 #%lu *pppLocalImageViews addr(%p)\n", ++g_alloc_count, (void*)*pppLocalImageViews); +#endif + baseBuffAddr = (size_t)(*pppLocalImageViews) + base_array_size; + for (uint32_t i = 0; i < pUICI->count; i++) { + *pppLocalImageViews[i] = (XGL_IMAGE_VIEW_ATTACH_INFO*)(baseBuffAddr + (i * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO))); + memcpy(*pppLocalImageViews[i], pUICI->pImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)); } break; case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS: @@ -709,9 +715,13 @@ static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate) total_array_size = (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * pUBCI->count) + base_array_size; XGL_BUFFER_VIEW_ATTACH_INFO*** pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO***)&((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews; *pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO**)malloc(total_array_size); +#if ALLOC_DEBUG + printf("Alloc18 #%lu *pppLocalBufferViews addr(%p)\n", ++g_alloc_count, (void*)*pppLocalBufferViews); +#endif + baseBuffAddr = (size_t)(*pppLocalBufferViews) + base_array_size; for (uint32_t i = 0; i < pUBCI->count; i++) { // Set ptr and then copy data into that ptr - *pppLocalBufferViews[i] = (XGL_BUFFER_VIEW_ATTACH_INFO*)(*pppLocalBufferViews + base_array_size + (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * i)); + *pppLocalBufferViews[i] = (XGL_BUFFER_VIEW_ATTACH_INFO*)(baseBuffAddr + (i * sizeof(XGL_BUFFER_VIEW_ATTACH_INFO))); memcpy(*pppLocalBufferViews[i], pUBCI->pBufferViews[i], sizeof(XGL_BUFFER_VIEW_ATTACH_INFO)); } break; |
