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;')