}
}
+deInt32 getminUniformBufferOffsetAlignment (Context &ctx)
+{
+ VkPhysicalDeviceProperties properties;
+ ctx.getInstanceInterface().getPhysicalDeviceProperties(ctx.getPhysicalDevice(), &properties);
+ VkDeviceSize align = properties.limits.minUniformBufferOffsetAlignment;
+ DE_ASSERT(align == (VkDeviceSize)(deInt32)align);
+ return (deInt32)align;
+}
+
int getDataTypeArrayStride (glu::DataType type)
{
DE_ASSERT(!glu::isDataTypeMatrix(type));
vk::Unique<VkBuffer> indicesBuffer (createBuffer(m_context, sizeof(indices), vk::VK_BUFFER_USAGE_INDEX_BUFFER_BIT|vk::VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
de::UniquePtr<Allocation> indicesAlloc (allocateAndBindMemory(m_context, *indicesBuffer, MemoryRequirement::HostVisible));
+ int minUniformBufferOffsetAlignment = getminUniformBufferOffsetAlignment(m_context);
+
// Upload attrbiutes data
{
deMemcpy(positionsAlloc->getHostPtr(), positions, sizeof(positions));
std::map<int, int> offsets;
for (int blockNdx = 0; blockNdx < numBlocks; blockNdx++)
{
+ if (minUniformBufferOffsetAlignment > 0)
+ currentOffset = deAlign32(currentOffset, minUniformBufferOffsetAlignment);
offsets[blockNdx] = currentOffset;
currentOffset += m_layout.blocks[blockNdx].size;
}