typedef de::SharedPtr<Unique<VkFramebuffer> > VkFramebufferSp;
typedef de::SharedPtr<Unique<VkPipeline> > VkPipelineSp;
+constexpr VkDeviceSize kSizeofVec4 = static_cast<VkDeviceSize>(sizeof(tcu::Vec4));
+
struct TestParams
{
VkDescriptorType descriptorType;
deUint32 numCalls; // Number of draw or dispatch calls
};
+VkDeviceSize calcItemSize (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
+{
+ const auto minAlignment = getPhysicalDeviceProperties(vki, physicalDevice).limits.minStorageBufferOffsetAlignment;
+ return de::lcm(de::max(VkDeviceSize{1}, minAlignment), kSizeofVec4);
+}
+
void checkAllSupported (const Extensions& supportedExtensions, const vector<string>& requiredExtensions)
{
for (auto& requiredExtName : requiredExtensions)
VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkBufferCreateFlags flags
- 16u, // VkDeviceSize size;
+ kSizeofVec4, // VkDeviceSize size;
usageFlags, // VkBufferUsageFlags usage;
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1u, // deUint32 queueFamilyCount;
m_bufferAllocs.push_back(AllocationSp(m_allocator.allocate(getBufferMemoryRequirements(m_vkd, *m_device, **m_buffers[bufIdx]), MemoryRequirement::HostVisible).release()));
VK_CHECK(m_vkd.bindBufferMemory(*m_device, **m_buffers[bufIdx], m_bufferAllocs[bufIdx]->getMemory(), m_bufferAllocs[bufIdx]->getOffset()));
- deMemcpy(m_bufferAllocs[bufIdx]->getHostPtr(), &defaultTestColors[bufIdx], 16u);
+ deMemcpy(m_bufferAllocs[bufIdx]->getHostPtr(), &defaultTestColors[bufIdx], static_cast<size_t>(kSizeofVec4));
flushAlloc(m_vkd, *m_device, *m_bufferAllocs[bufIdx]);
}
}
{
**m_buffers[quadNdx], // VkBuffer buffer;
0u, // VkDeviceSize offset;
- 16u // VkDeviceSize range;
+ kSizeofVec4, // VkDeviceSize range;
};
VkWriteDescriptorSet writeDescriptorSet =
const Unique<VkDevice> m_device;
const DeviceDriver m_vkd;
const VkQueue m_queue;
+ const VkDeviceSize m_itemSize;
SimpleAllocator m_allocator;
Move<VkShaderModule> m_computeShaderModule;
vector<VkBufferSp> m_buffers;
, m_device (createDeviceWithPushDescriptor(context, m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
, m_vkd (m_vkp, m_instance, *m_device)
, m_queue (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
+ , m_itemSize (calcItemSize(m_vki, m_physicalDevice))
, m_allocator (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
{
}
VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkBufferCreateFlags flags
- 16u, // VkDeviceSize size;
+ kSizeofVec4, // VkDeviceSize size;
usageFlags, // VkBufferUsageFlags usage;
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1u, // deUint32 queueFamilyCount;
m_bufferAllocs.push_back(AllocationSp(m_allocator.allocate(getBufferMemoryRequirements(m_vkd, *m_device, **m_buffers[bufIdx]), MemoryRequirement::HostVisible).release()));
VK_CHECK(m_vkd.bindBufferMemory(*m_device, **m_buffers[bufIdx], m_bufferAllocs[bufIdx]->getMemory(), m_bufferAllocs[bufIdx]->getOffset()));
- deMemcpy(m_bufferAllocs[bufIdx]->getHostPtr(), &m_testColors[bufIdx], 16u);
+ deMemcpy(m_bufferAllocs[bufIdx]->getHostPtr(), &m_testColors[bufIdx], static_cast<size_t>(kSizeofVec4));
flushAlloc(m_vkd, *m_device, *m_bufferAllocs[bufIdx]);
}
}
VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkBufferCreateFlags flags
- 16u * m_params.numCalls, // VkDeviceSize size;
+ m_itemSize * m_params.numCalls, // VkDeviceSize size;
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, // VkBufferUsageFlags usage;
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1u, // deUint32 queueFamilyCount;
{
**m_buffers[dispatchNdx], // VkBuffer buffer;
0u, // VkDeviceSize offset;
- 16u // VkDeviceSize range;
+ kSizeofVec4, // VkDeviceSize range;
};
VkDescriptorBufferInfo descriptorBufferInfoOutput =
{
- *m_outputBuffer, // VkBuffer buffer;
- 16u * dispatchNdx, // VkDeviceSize offset;
- 16u // VkDeviceSize range;
+ *m_outputBuffer, // VkBuffer buffer;
+ m_itemSize * dispatchNdx, // VkDeviceSize offset;
+ kSizeofVec4, // VkDeviceSize range;
};
VkWriteDescriptorSet writeDescriptorSets[] =
invalidateAlloc(m_vkd, *m_device, *m_outputBufferAlloc);
// Verify result
- if (deMemCmp((void*)&m_testColors[0], m_outputBufferAlloc->getHostPtr(), (size_t)(16u * m_params.numCalls)))
+ auto bufferPtr = reinterpret_cast<const char*>(m_outputBufferAlloc->getHostPtr());
+ for (deUint32 i = 0; i < m_params.numCalls; ++i)
{
- return tcu::TestStatus::fail("Output mismatch");
+ if (deMemCmp(&m_testColors[i], bufferPtr + (i * m_itemSize), static_cast<size_t>(kSizeofVec4)) != 0)
+ TCU_FAIL("Output mismatch at output item " + de::toString(i));
}
+
return tcu::TestStatus::pass("Output matches expected values");
}
VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkBufferCreateFlags flags
- 16u, // VkDeviceSize size;
+ kSizeofVec4, // VkDeviceSize size;
usageFlags, // VkBufferUsageFlags usage;
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1u, // deUint32 queueFamilyCount;
m_bufferAllocs.push_back(AllocationSp(m_allocator.allocate(getBufferMemoryRequirements(m_vkd, *m_device, **m_buffers[bufIdx]), MemoryRequirement::HostVisible).release()));
VK_CHECK(m_vkd.bindBufferMemory(*m_device, **m_buffers[bufIdx], m_bufferAllocs[bufIdx]->getMemory(), m_bufferAllocs[bufIdx]->getOffset()));
- deMemcpy(m_bufferAllocs[bufIdx]->getHostPtr(), &defaultTestColors[bufIdx], 16u);
+ deMemcpy(m_bufferAllocs[bufIdx]->getHostPtr(), &defaultTestColors[bufIdx], static_cast<size_t>(kSizeofVec4));
flushAlloc(m_vkd, *m_device, *m_bufferAllocs[bufIdx]);
}
const Unique<VkDevice> m_device;
const DeviceDriver m_vkd;
const VkQueue m_queue;
+ const VkDeviceSize m_itemSize;
SimpleAllocator m_allocator;
vector<VkBufferSp> m_buffers;
vector<AllocationSp> m_bufferAllocs;
, m_device (createDeviceWithPushDescriptor(context, m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
, m_vkd (m_vkp, m_instance, *m_device)
, m_queue (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
+ , m_itemSize (calcItemSize(m_vki, m_physicalDevice))
, m_allocator (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
, m_bufferFormat (VK_FORMAT_R32G32B32A32_SFLOAT)
{
VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkBufferCreateFlags flags
- 16u, // VkDeviceSize size;
+ kSizeofVec4, // VkDeviceSize size;
usageFlags, // VkBufferUsageFlags usage;
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1u, // deUint32 queueFamilyCount;
m_bufferAllocs.push_back(AllocationSp(m_allocator.allocate(getBufferMemoryRequirements(m_vkd, *m_device, **m_buffers[bufIdx]), MemoryRequirement::HostVisible).release()));
VK_CHECK(m_vkd.bindBufferMemory(*m_device, **m_buffers[bufIdx], m_bufferAllocs[bufIdx]->getMemory(), m_bufferAllocs[bufIdx]->getOffset()));
- deMemcpy(m_bufferAllocs[bufIdx]->getHostPtr(), &defaultTestColors[bufIdx], 16u);
+ deMemcpy(m_bufferAllocs[bufIdx]->getHostPtr(), &defaultTestColors[bufIdx], static_cast<size_t>(kSizeofVec4));
flushAlloc(m_vkd, *m_device, *m_bufferAllocs[bufIdx]);
}
// Create output buffer
{
+ DE_ASSERT(m_params.numCalls <= 2u);
+
const VkBufferCreateInfo bufferCreateInfo =
{
VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkBufferCreateFlags flags
- 32u, // VkDeviceSize size;
+ m_itemSize * m_params.numCalls, // VkDeviceSize size;
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, // VkBufferUsageFlags usage;
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1u, // deUint32 queueFamilyCount;
const VkDescriptorBufferInfo descriptorBufferInfoOutput =
{
- *m_outputBuffer, // VkBuffer buffer;
- 16u * dispatchNdx, // VkDeviceSize offset;
- 16u // VkDeviceSize range;
+ *m_outputBuffer, // VkBuffer buffer;
+ m_itemSize * dispatchNdx, // VkDeviceSize offset;
+ kSizeofVec4, // VkDeviceSize range;
};
// Write output buffer descriptor set
tcu::TestStatus PushDescriptorTexelBufferComputeTestInstance::verifyOutput (void)
{
- const float ref[8] = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f };
+ const tcu::Vec4 ref[2] = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } };
invalidateAlloc(m_vkd, *m_device, *m_outputBufferAlloc);
// Verify result
- if (deMemCmp((void*)ref, m_outputBufferAlloc->getHostPtr(), (size_t)(16u * m_params.numCalls)))
- {
- const float* ptr = (float*)m_outputBufferAlloc->getHostPtr();
- std::string debugMsg = "Output buffer contents:\n";
+ DE_ASSERT(m_params.numCalls <= 2u);
- for (deUint32 i = 0; i < m_params.numCalls * 4; i++)
- debugMsg += de::toString(ptr[i]) + " vs " + de::toString(ref[i]) + "\n";
+ auto bufferPtr = reinterpret_cast<const char*>(m_outputBufferAlloc->getHostPtr());
+ for (deUint32 i = 0; i < m_params.numCalls; ++i)
+ {
+ tcu::Vec4 bufferColor;
+ deMemcpy(&bufferColor, bufferPtr + (i * m_itemSize), static_cast<size_t>(kSizeofVec4));
- m_context.getTestContext().getLog() << tcu::TestLog::Message << debugMsg << tcu::TestLog::EndMessage;
- return tcu::TestStatus::fail("Output mismatch");
+ if (bufferColor != ref[i])
+ {
+ std::ostringstream msg;
+ msg << "Output mismatch at item " << i << ": expected " << ref[i] << " but found " << bufferColor;
+ TCU_FAIL(msg.str());
+ }
}
+
return tcu::TestStatus::pass("Output matches expected values");
}
const VkImageLayout initialLayouts[] =
{
- VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
};
VkDescriptorImageInfo descriptorImageInfo =
{
- 0, // VkSampler sampler;
- **m_inputImageViews[quadNdx], // VkImageView imageView;
- VK_IMAGE_LAYOUT_GENERAL // VkImageLayout imageLayout;
+ 0, // VkSampler sampler;
+ **m_inputImageViews[quadNdx], // VkImageView imageView;
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL // VkImageLayout imageLayout;
};
VkWriteDescriptorSet writeDescriptorSet =