bug-14575: normalized queue priorities
diff --git a/demos/cube.c b/demos/cube.c
index a435c01..1abf525 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -2304,11 +2304,13 @@
     VkPhysicalDeviceFeatures physDevFeatures;
     vkGetPhysicalDeviceFeatures(demo->gpu, &physDevFeatures);
 
+    float queue_priorities[1] = { 0.0 };
     const VkDeviceQueueCreateInfo queue = {
         .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
         .pNext = NULL,
         .queueFamilyIndex = gfx_queue_idx,
         .queueCount = 1,
+        .pQueuePriorities = queue_priorities
     };
 
     VkDeviceCreateInfo device = {
diff --git a/demos/tri.c b/demos/tri.c
index d03bf16..66dccf6 100644
--- a/demos/tri.c
+++ b/demos/tri.c
@@ -1814,11 +1814,13 @@
         .extensionCount = enabled_extension_count,
         .ppEnabledExtensionNames = (const char *const*) extension_names,
     };
+    float queue_priorities[1] = { 0.0 };
     const VkDeviceQueueCreateInfo queue = {
         .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
         .pNext = NULL,
         .queueFamilyIndex = 0,
         .queueCount = 1,
+        .pQueuePriorities = queue_priorities
     };
     uint32_t gpu_count;
 
diff --git a/demos/vulkaninfo.c b/demos/vulkaninfo.c
index 482f27a..8becb4c 100644
--- a/demos/vulkaninfo.c
+++ b/demos/vulkaninfo.c
@@ -655,10 +655,13 @@
     if (!gpu->queue_reqs)
         ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY);
     for (i = 0; i < gpu->queue_count; i++) {
+        float *queue_priorities = malloc(gpu->queue_props[i].queueCount * sizeof(float));
+        memset(queue_priorities, 0, gpu->queue_props[i].queueCount * sizeof(float));
         gpu->queue_reqs[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
         gpu->queue_reqs[i].pNext = NULL;
         gpu->queue_reqs[i].queueFamilyIndex = i;
         gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount;
+        gpu->queue_reqs[i].pQueuePriorities = queue_priorities;
     }
 
     vkGetPhysicalDeviceMemoryProperties(gpu->obj, &gpu->memory_props);
@@ -674,6 +677,9 @@
     app_dev_destroy(&gpu->dev);
     free(gpu->device_extensions);
     free(gpu->queue_reqs);
+    for (uint32_t i = 0; i < gpu->queue_count; i++) {
+        free((void *) gpu->queue_reqs[i].pQueuePriorities);
+    }
     free(gpu->queue_props);
 }
 
diff --git a/icd/intel/dev.c b/icd/intel/dev.c
index 3fe20d5..4f02058 100644
--- a/icd/intel/dev.c
+++ b/icd/intel/dev.c
@@ -77,6 +77,8 @@
 
         assert((q->queueFamilyIndex < INTEL_GPU_ENGINE_COUNT &&
             q->queueCount == 1 && !dev->queues[q->queueFamilyIndex]) && "Invalid Queue request");
+        /* Help catch places where we forgot to initialize pQueuePriorities */
+        assert(q->pQueuePriorities);
         ret = intel_queue_create(dev, q->queueFamilyIndex,
                     &dev->queues[q->queueFamilyIndex]);
 
diff --git a/icd/intel/gpu.c b/icd/intel/gpu.c
index c96b435..81f1430 100644
--- a/icd/intel/gpu.c
+++ b/icd/intel/gpu.c
@@ -259,6 +259,9 @@
     pLimits->maxDescriptorSetSampledImages       = 128;
 
     // storage images and buffers not implemented; left at zero
+
+    // required to support at least two queue priorities
+    pLimits->discreteQueuePriorities = 2;
 }
 
 void intel_gpu_get_props(const struct intel_gpu *gpu,
diff --git a/icd/intel/obj.c b/icd/intel/obj.c
index ba4f254..c447716 100644
--- a/icd/intel/obj.c
+++ b/icd/intel/obj.c
@@ -172,6 +172,9 @@
         dbg->create_info_size = size;
 
         size += sizeof(src->pRequestedQueues[0]) * src->requestedQueueCount;
+        for (uint32_t i = 0; i < src->requestedQueueCount; i++) {
+            size += src->pRequestedQueues[i].queueCount * sizeof(float);
+        }
         size += sizeof(src->ppEnabledExtensionNames[0]) * src->extensionCount;
         for (uint32_t i = 0; i < src->extensionCount; i++) {
             size += strlen(src->ppEnabledExtensionNames[i]) + 1;
@@ -190,6 +193,12 @@
         memcpy(d, src->pRequestedQueues, size);
         dst->pRequestedQueues = (const VkDeviceQueueCreateInfo *) d;
         d += size;
+        for (uint32_t i = 0; i < src->requestedQueueCount; i++) {
+            size = sizeof(float) * dst->pRequestedQueues[i].queueCount;
+            memcpy(d, src->pRequestedQueues[i].pQueuePriorities, size);
+            *((float **) &dst->pRequestedQueues[i].pQueuePriorities) = (float *) d;
+            d += size;
+        }
 
         size = sizeof(src->ppEnabledExtensionNames[0]) * src->extensionCount;
         dst->ppEnabledExtensionNames = (const char **) d;
diff --git a/include/vulkan.h b/include/vulkan.h
index ceac03a..e938a5b 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -1276,6 +1276,7 @@
     uint32_t                                    maxClipDistances;
     uint32_t                                    maxCullDistances;
     uint32_t                                    maxCombinedClipAndCullDistances;
+    uint32_t                                    discreteQueuePriorities;
     float                                       pointSizeRange[2];
     float                                       lineWidthRange[2];
     float                                       pointSizeGranularity;
@@ -1331,6 +1332,7 @@
     const void*                                 pNext;
     uint32_t                                    queueFamilyIndex;
     uint32_t                                    queueCount;
+    const float*                                pQueuePriorities;
 } VkDeviceQueueCreateInfo;
 
 typedef struct {
diff --git a/tests/vktestbinding.cpp b/tests/vktestbinding.cpp
index f78cc72..01c7f45 100644
--- a/tests/vktestbinding.cpp
+++ b/tests/vktestbinding.cpp
@@ -275,6 +275,8 @@
         qi.pNext = NULL;
         qi.queueFamilyIndex = i;
         qi.queueCount = queue_props[i].queueCount;
+        std::vector<float> queue_priorities (qi.queueCount, 0.0);
+        qi.pQueuePriorities = queue_priorities.data();
         if (queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
             graphics_queue_node_index_ = i;
         }
diff --git a/vktrace/src/vktrace_extensions/vktracevulkan/layers/vktrace_snapshot.c b/vktrace/src/vktrace_extensions/vktracevulkan/layers/vktrace_snapshot.c
index b8a456b..c1738dd 100644
--- a/vktrace/src/vktrace_extensions/vktracevulkan/layers/vktrace_snapshot.c
+++ b/vktrace/src/vktrace_extensions/vktracevulkan/layers/vktrace_snapshot.c
@@ -71,6 +71,11 @@
         uint32_t i;
         vktrace_vk_malloc_and_copy((void**)&pDestCreateInfo, sizeof(VkDeviceCreateInfo), pSrcCreateInfo);
         vktrace_vk_malloc_and_copy((void**)&pDestCreateInfo->pRequestedQueues, pSrcCreateInfo->requestedQueueCount*sizeof(VkDeviceQueueCreateInfo), pSrcCreateInfo->pRequestedQueues);
+        for (i = 0; i < pSrcCreateInfo->requestedQueueCount; i++) {
+            vktrace_vk_malloc_and_copy((void**)&pDestCreateInfo->pRequestedQueues[i].pQueuePriorities,
+                                       pSrcCreateInfo->pRequestedQueues[i].queueCount*sizeof(float),
+                                       pSrcCreateInfo->pRequestedQueues[i].pQueuePriorities);
+        }
 
         if (pSrcCreateInfo->extensionCount > 0)
         {
diff --git a/vktrace/src/vktrace_extensions/vktracevulkan/vkreplay/vkreplay_vkdisplay.cpp b/vktrace/src/vktrace_extensions/vktracevulkan/vkreplay/vkreplay_vkdisplay.cpp
index a57816c..13ee51e 100644
--- a/vktrace/src/vktrace_extensions/vktracevulkan/vkreplay/vkreplay_vkdisplay.cpp
+++ b/vktrace/src/vktrace_extensions/vktracevulkan/vkreplay/vkreplay_vkdisplay.cpp
@@ -108,6 +108,8 @@
     VkDeviceQueueCreateInfo dqci = {};
     dqci.queueCount = 1;
     dqci.queueType = VK_QUEUE_UNIVERSAL;
+    std::vector<float> queue_priorities (dqci.queueCount, 0.0);
+    dqci.pQueuePriorities = queue_priorities.data();
     // create the device enabling validation level 4
     const char * const * extNames = &m_extensions[0];
     VkDeviceCreateInfo info = {};
diff --git a/vktrace/vktrace_generate.py b/vktrace/vktrace_generate.py
index 3eac580..907407c 100755
--- a/vktrace/vktrace_generate.py
+++ b/vktrace/vktrace_generate.py
@@ -583,6 +583,11 @@
         pid_enum.append('{')
         pid_enum.append('    vktrace_add_buffer_to_trace_packet(pHeader, (void**)ppStruct, sizeof(VkDeviceCreateInfo), pInStruct);')
         pid_enum.append('    vktrace_add_buffer_to_trace_packet(pHeader, (void**)&(*ppStruct)->pRequestedQueues, pInStruct->requestedQueueCount*sizeof(VkDeviceQueueCreateInfo), pInStruct->pRequestedQueues);')
+        pid_enum.append('    for (uint32_t i = 0; i < pInStruct->requestedQueueCount; i++) {')
+        pid_enum.append('        vktrace_add_buffer_to_trace_packet(pHeader, (void**)&(*ppStruct)->pRequestedQueues[i].pQueuePriorities,')
+        pid_enum.append('                                   pInStruct->pRequestedQueues[i].queueCount*sizeof(float),')
+        pid_enum.append('                                   pInStruct->pRequestedQueues[i].pQueuePriorities);')
+        pid_enum.append('    }')
         pid_enum.append('    vktrace_finalize_buffer_address(pHeader, (void**)&(*ppStruct)->pRequestedQueues);')
         # TODO138 : This is an initial pass at getting the extension/layer arrays correct, needs to be validated.
         pid_enum.append('    uint32_t i, siz = 0;')