part of multiple commits to implement bug #13632.
bug 13632
header version 82
svn version: 30446
This patch converts:
vkCmdBindVertexBuffer -> vkCmdBindVertexBuffers
vkQueueAddMemReference -> vkQueueAddMemReferences
vkQueueRemoveMemReference -> vkQueueRemoveMemReferences
struct demo *demo,
int num_refs, VkGpuMemory *mem)
{
- for (int i = 0; i < num_refs; i++) {
- vkQueueAddMemReference(demo->queue, mem[i]);
- }
+ vkQueueAddMemReferences(demo->queue, num_refs, mem);
}
static void demo_remove_mem_refs(
struct demo *demo,
int num_refs, VkGpuMemory *mem)
{
- for (int i = 0; i < num_refs; i++) {
- vkQueueRemoveMemReference(demo->queue, mem[i]);
- }
+ vkQueueRemoveMemReferences(demo->queue, num_refs, mem);
}
static void demo_set_image_layout(
struct demo *demo,
int num_refs, VkGpuMemory *mem)
{
- for (int i = 0; i < num_refs; i++) {
- vkQueueAddMemReference(demo->queue, mem[i]);
- }
+ vkQueueAddMemReferences(demo->queue, num_refs, mem);
}
static void demo_remove_mem_refs(
struct demo *demo,
int num_refs, VkGpuMemory *mem)
{
- for (int i = 0; i < num_refs; i++) {
- vkQueueRemoveMemReference(demo->queue, mem[i]);
- }
+ vkQueueRemoveMemReferences(demo->queue, num_refs, mem);
}
static void demo_set_image_layout(
vkCmdBindDynamicStateObject(demo->cmd, VK_STATE_BIND_DEPTH_STENCIL,
demo->depth_stencil);
-
- vkCmdBindVertexBuffer(demo->cmd, demo->vertices.buf, 0, VERTEX_BUFFER_BIND_ID);
+ VkGpuSize offsets[1] = {0};
+ vkCmdBindVertexBuffers(demo->cmd, VERTEX_BUFFER_BIND_ID, 1, &demo->vertices.buf, offsets);
vkCmdBeginRenderPass(demo->cmd, &rp_begin);
clear_range.aspect = VK_IMAGE_ASPECT_COLOR;
NULLDRV_LOG_FUNC;
}
-ICD_EXPORT void VKAPI vkCmdBindVertexBuffer(
- VkCmdBuffer cmdBuffer,
- VkBuffer buffer,
- VkGpuSize offset,
- uint32_t binding)
+ICD_EXPORT void VKAPI vkCmdBindVertexBuffers(
+ VkCmdBuffer cmdBuffer,
+ uint32_t startBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkGpuSize* pOffsets)
{
NULLDRV_LOG_FUNC;
}
return VK_SUCCESS;
}
-ICD_EXPORT VkResult VKAPI vkQueueAddMemReference(
- VkQueue queue,
- VkGpuMemory mem)
+ICD_EXPORT VkResult VKAPI vkQueueAddMemReferences(
+ VkQueue queue,
+ uint32_t count,
+ const VkGpuMemory* pMems)
{
NULLDRV_LOG_FUNC;
return VK_SUCCESS;
}
-ICD_EXPORT VkResult VKAPI vkQueueRemoveMemReference(
- VkQueue queue,
- VkGpuMemory mem)
+ICD_EXPORT VkResult VKAPI vkQueueRemoveMemReferences(
+ VkQueue queue,
+ uint32_t count,
+ const VkGpuMemory* pMems)
{
NULLDRV_LOG_FUNC;
return VK_SUCCESS;
PFN_vkEnumerateLayers EnumerateLayers;
PFN_vkGetDeviceQueue GetDeviceQueue;
PFN_vkQueueSubmit QueueSubmit;
- PFN_vkQueueAddMemReference QueueAddMemReference;
- PFN_vkQueueRemoveMemReference QueueRemoveMemReference;
+ PFN_vkQueueAddMemReferences QueueAddMemReferences;
+ PFN_vkQueueRemoveMemReferences QueueRemoveMemReferences;
PFN_vkQueueWaitIdle QueueWaitIdle;
PFN_vkDeviceWaitIdle DeviceWaitIdle;
PFN_vkAllocMemory AllocMemory;
PFN_vkCmdBindPipeline CmdBindPipeline;
PFN_vkCmdBindDynamicStateObject CmdBindDynamicStateObject;
PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets;
- PFN_vkCmdBindVertexBuffer CmdBindVertexBuffer;
+ PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers;
PFN_vkCmdBindIndexBuffer CmdBindIndexBuffer;
PFN_vkCmdDraw CmdDraw;
PFN_vkCmdDrawIndexed CmdDrawIndexed;
typedef VkResult (VKAPI *PFN_vkEnumerateLayers)(VkPhysicalGpu gpu, size_t maxLayerCount, size_t maxStringSize, size_t* pOutLayerCount, char* const* pOutLayers, void* pReserved);
typedef VkResult (VKAPI *PFN_vkGetDeviceQueue)(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue);
typedef VkResult (VKAPI *PFN_vkQueueSubmit)(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence);
-typedef VkResult (VKAPI *PFN_vkQueueAddMemReference)(VkQueue queue, VkGpuMemory mem);
-typedef VkResult (VKAPI *PFN_vkQueueRemoveMemReference)(VkQueue queue, VkGpuMemory mem);
+typedef VkResult (VKAPI *PFN_vkQueueAddMemReferences)(VkQueue queue, uint32_t count, const VkGpuMemory* pMems);
+typedef VkResult (VKAPI *PFN_vkQueueRemoveMemReferences)(VkQueue queue, uint32_t count, const VkGpuMemory* pMems);
typedef VkResult (VKAPI *PFN_vkQueueWaitIdle)(VkQueue queue);
typedef VkResult (VKAPI *PFN_vkDeviceWaitIdle)(VkDevice device);
typedef VkResult (VKAPI *PFN_vkAllocMemory)(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkGpuMemory* pMem);
typedef void (VKAPI *PFN_vkCmdBindDynamicStateObject)(VkCmdBuffer cmdBuffer, VkStateBindPoint stateBindPoint, VkDynamicStateObject state);
typedef void (VKAPI *PFN_vkCmdBindDescriptorSets)(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkDescriptorSetLayoutChain layoutChain, uint32_t layoutChainSlot, uint32_t count, const VkDescriptorSet* pDescriptorSets, const uint32_t* pUserData);
typedef void (VKAPI *PFN_vkCmdBindIndexBuffer)(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkGpuSize offset, VkIndexType indexType);
-typedef void (VKAPI *PFN_vkCmdBindVertexBuffer)(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkGpuSize offset, uint32_t binding);
+typedef void (VKAPI *PFN_vkCmdBindVertexBuffers)(VkCmdBuffer cmdBuffer, uint32_t startBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkGpuSize* pOffsets);
typedef void (VKAPI *PFN_vkCmdDraw)(VkCmdBuffer cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount);
typedef void (VKAPI *PFN_vkCmdDrawIndexed)(VkCmdBuffer cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount);
typedef void (VKAPI *PFN_vkCmdDrawIndirect)(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkGpuSize offset, uint32_t count, uint32_t stride);
const VkCmdBuffer* pCmdBuffers,
VkFence fence);
-VkResult VKAPI vkQueueAddMemReference(
+VkResult VKAPI vkQueueAddMemReferences(
VkQueue queue,
- VkGpuMemory mem);
+ uint32_t count,
+ const VkGpuMemory* pMems);
-VkResult VKAPI vkQueueRemoveMemReference(
+VkResult VKAPI vkQueueRemoveMemReferences(
VkQueue queue,
- VkGpuMemory mem);
+ uint32_t count,
+ const VkGpuMemory* pMems);
VkResult VKAPI vkQueueWaitIdle(
VkQueue queue);
VkGpuSize offset,
VkIndexType indexType);
-void VKAPI vkCmdBindVertexBuffer(
+void VKAPI vkCmdBindVertexBuffers(
VkCmdBuffer cmdBuffer,
- VkBuffer buffer,
- VkGpuSize offset,
- uint32_t binding);
+ uint32_t startBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkGpuSize* pOffsets);
void VKAPI vkCmdDraw(
VkCmdBuffer cmdBuffer,
nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
}
-VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkGpuSize offset, uint32_t binding)
+VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
+ VkCmdBuffer cmdBuffer,
+ uint32_t startBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkGpuSize* pOffsets)
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
if (pCB) {
+ /* TODO: Need to track all the vertex buffers, not just last one */
updateCBTracking(cmdBuffer);
addCmd(pCB, CMD_BINDVERTEXBUFFER);
- pCB->lastVtxBinding = binding;
+ pCB->lastVtxBinding = startBinding + bindingCount -1;
validateVBBinding(cmdBuffer);
- }
- else {
+ } else {
char str[1024];
sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
}
- nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
+ nextTable.CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
}
VK_LAYER_EXPORT void VKAPI vkCmdDraw(VkCmdBuffer cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
return (void*) vkCmdBindDynamicStateObject;
if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
return (void*) vkCmdBindDescriptorSets;
- if (!strcmp(funcName, "vkCmdBindVertexBuffer"))
- return (void*) vkCmdBindVertexBuffer;
+ if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
+ return (void*) vkCmdBindVertexBuffers;
if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
return (void*) vkCmdBindIndexBuffer;
if (!strcmp(funcName, "vkCmdDraw"))
nextTable.CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, layoutChain, layoutChainSlot, count, pDescriptorSets, pUserData);
}
-VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkGpuSize offset, uint32_t binding)
+VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
+ VkCmdBuffer cmdBuffer,
+ uint32_t startBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers
+ const VkGpuSize* pOffsets)
{
loader_platform_thread_lock_mutex(&objLock);
ll_increment_use_count((void*)cmdBuffer, VK_OBJECT_TYPE_CMD_BUFFER);
loader_platform_thread_unlock_mutex(&objLock);
- nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
+ nextTable.CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
}
VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkGpuSize offset, VkIndexType indexType)
return result;
}
-VK_LAYER_EXPORT VkResult VKAPI vkQueueAddMemReference(VkQueue queue, VkGpuMemory mem)
+VK_LAYER_EXPORT VkResult VKAPI vkQueueAddMemReferences(VkQueue queue, uint32_t count, const VkGpuMemory* pMems)
{
- VkResult result = nextTable.QueueAddMemReference(queue, mem);
+ VkResult result = nextTable.QueueAddMemReferences(queue, count, pMems);
if (result == VK_SUCCESS) {
loader_platform_thread_lock_mutex(&globalLock);
char str[1024];
sprintf(str, "Unknown Queue %p", queue);
layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_INVALID_QUEUE, "MEM", str);
- }
- else {
- if (checkMemRef(queue, mem) == VK_TRUE) {
- // Alread in list, just warn
- char str[1024];
- sprintf(str, "Request to add a memory reference (%p) to Queue %p -- ref is already present in the queue's reference list", mem, queue);
- layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_REF, "MEM", str);
- }
- else {
- // Add to queue's memory reference list
- pQueueInfo->pMemRefList.push_front(mem);
+ } else {
+ for (int i = 0; i < count; i++) {
+ if (checkMemRef(queue, pMems[i]) == VK_TRUE) {
+ // Alread in list, just warn
+ char str[1024];
+ sprintf(str, "Request to add a memory reference (%p) to Queue %p -- ref is already present in the queue's reference list", pMems[i], queue);
+ layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, pMems[i], 0, MEMTRACK_INVALID_MEM_REF, "MEM", str);
+ } else {
+ // Add to queue's memory reference list
+ pQueueInfo->pMemRefList.push_front(pMems[i]);
+ }
}
}
loader_platform_thread_unlock_mutex(&globalLock);
return result;
}
-VK_LAYER_EXPORT VkResult VKAPI vkQueueRemoveMemReference(VkQueue queue, VkGpuMemory mem)
+VK_LAYER_EXPORT VkResult VKAPI vkQueueRemoveMemReferences(VkQueue queue, uint32_t count, const VkGpuMemory* pMems)
{
// TODO : Decrement ref count for this memory reference on this queue. Remove if ref count is zero.
- VkResult result = nextTable.QueueRemoveMemReference(queue, mem);
+ VkResult result = nextTable.QueueRemoveMemReferences(queue, count, pMems);
if (result == VK_SUCCESS) {
loader_platform_thread_lock_mutex(&globalLock);
char str[1024];
sprintf(str, "Unknown Queue %p", queue);
layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_INVALID_QUEUE, "MEM", str);
- }
- else {
- for (list<VkGpuMemory>::iterator it = pQueueInfo->pMemRefList.begin(); it != pQueueInfo->pMemRefList.end(); ++it) {
- if ((*it) == mem) {
- it = pQueueInfo->pMemRefList.erase(it);
+ } else {
+ for (int i = 0; i < count; i++) {
+ for (list<VkGpuMemory>::iterator it = pQueueInfo->pMemRefList.begin(); it != pQueueInfo->pMemRefList.end(); ++it) {
+ if ((*it) == pMems[i]) {
+ it = pQueueInfo->pMemRefList.erase(it);
+ }
}
}
}
nextTable.CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, layoutChain, layoutChainSlot, count, pDescriptorSets, pUserData);
}
-VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkGpuSize offset, uint32_t binding)
+VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
+ VkCmdBuffer cmdBuffer,
+ uint32_t startBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkGpuSize* pOffsets)
{
- nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
+ nextTable.CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
}
VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkGpuSize offset, VkIndexType indexType)
return (void*) vkCmdBindDynamicStateObject;
if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
return (void*) vkCmdBindDescriptorSets;
- if (!strcmp(funcName, "vkCmdBindVertexBuffer"))
- return (void*) vkCmdBindVertexBuffer;
+ if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
+ return (void*) vkCmdBindVertexBuffers;
if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
return (void*) vkCmdBindIndexBuffer;
if (!strcmp(funcName, "vkCmdDrawIndirect"))
return (void*) vkDbgUnregisterMsgCallback;
if (!strcmp(funcName, "vkGetDeviceQueue"))
return (void*) vkGetDeviceQueue;
- if (!strcmp(funcName, "vkQueueAddMemReference"))
- return (void*) vkQueueAddMemReference;
- if (!strcmp(funcName, "vkQueueRemoveMemReference"))
- return (void*) vkQueueRemoveMemReference;
+ if (!strcmp(funcName, "vkQueueAddMemReferences"))
+ return (void*) vkQueueAddMemReferences;
+ if (!strcmp(funcName, "vkQueueRemoveMemReferences"))
+ return (void*) vkQueueRemoveMemReferences;
#if !defined(WIN32)
if (!strcmp(funcName, "vkWsiX11CreatePresentableImage"))
return (void*) vkWsiX11CreatePresentableImage;
return result;
}
-VK_LAYER_EXPORT VkResult VKAPI vkQueueAddMemReference(VkQueue queue, VkGpuMemory mem)
+VK_LAYER_EXPORT VkResult VKAPI vkQueueAddMemReferences(VkQueue queue, uint32_t count, const VkGpuMemory* pMems)
{
- VkResult result = nextTable.QueueAddMemReference(queue, mem);
+ VkResult result = nextTable.QueueAddMemReferences(queue, count, pMems);
return result;
}
-VK_LAYER_EXPORT VkResult VKAPI vkQueueRemoveMemReference(VkQueue queue, VkGpuMemory mem)
+VK_LAYER_EXPORT VkResult VKAPI vkQueueRemoveMemReferences(VkQueue queue, uint32_t count, const VkGpuMemory* pMems)
{
- VkResult result = nextTable.QueueRemoveMemReference(queue, mem);
+ VkResult result = nextTable.QueueRemoveMemReferences(queue, count, pMems);
return result;
}
VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(VkQueue queue)
nextTable.CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, layoutChain, layoutChainSlot, count, pDescriptorSets, pUserData);
}
-VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkGpuSize offset, uint32_t binding)
+VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
+ VkCmdBuffer cmdBuffer,
+ uint32_t startBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkGpuSize* pOffsets)
{
-
- nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
+ nextTable.CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
}
VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkGpuSize offset, VkIndexType indexType)
destroy_line = ''
funcs = []
# Special cases for API funcs that don't use an object as first arg
- if True in [no_use_proto in proto.name for no_use_proto in ['GlobalOption', 'CreateInstance', 'QueueSubmit', 'QueueAddMemReference', 'QueueRemoveMemReference', 'QueueWaitIdle', 'GetGlobalExtensionInfo', 'CreateDevice', 'GetGpuInfo', 'QueueSignalSemaphore', 'QueueWaitSemaphore', 'WsiX11QueuePresent']]:
+ if True in [no_use_proto in proto.name for no_use_proto in ['GlobalOption', 'CreateInstance', 'QueueSubmit', 'QueueAddMemReferences', 'QueueRemoveMemReferences', 'QueueWaitIdle', 'GetGlobalExtensionInfo', 'CreateDevice', 'GetGpuInfo', 'QueueSignalSemaphore', 'QueueWaitSemaphore', 'WsiX11QueuePresent']]:
using_line = ''
else:
using_line = ' loader_platform_thread_lock_mutex(&objLock);\n'
Param("const VkCmdBuffer*", "pCmdBuffers"),
Param("VkFence", "fence")]),
- Proto("VkResult", "QueueAddMemReference",
+ Proto("VkResult", "QueueAddMemReferences",
[Param("VkQueue", "queue"),
- Param("VkGpuMemory", "mem")]),
+ Param("uint32_t", "count"),
+ Param("const VkGpuMemory*", "pMems")]),
- Proto("VkResult", "QueueRemoveMemReference",
+ Proto("VkResult", "QueueRemoveMemReferences",
[Param("VkQueue", "queue"),
- Param("VkGpuMemory", "mem")]),
+ Param("uint32_t", "count"),
+ Param("const VkGpuMemory*", "pMems")]),
Proto("VkResult", "QueueWaitIdle",
[Param("VkQueue", "queue")]),
Param("const VkDescriptorSet*", "pDescriptorSets"),
Param("const uint32_t*", "pUserData")]),
- Proto("void", "CmdBindVertexBuffer",
+ Proto("void", "CmdBindVertexBuffers",
[Param("VkCmdBuffer", "cmdBuffer"),
- Param("VkBuffer", "buffer"),
- Param("VkGpuSize", "offset"),
- Param("uint32_t", "binding")]),
+ Param("uint32_t", "startBinding"),
+ Param("uint32_t", "bindingCount"),
+ Param("const VkBuffer*", "pBuffers"),
+ Param("const VkGpuSize*", "pOffsets")]),
Proto("void", "CmdBindIndexBuffer",
[Param("VkCmdBuffer", "cmdBuffer"),