tcu::TestStatus iterate (void);
private:
- const Unique<VkDevice> m_device;
- const DeviceDriver m_deviceInterface;
- const VkQueue m_queue;
- const de::UniquePtr<vk::Allocator> m_allocator;
const ComputeShaderSpec& m_shaderSpec;
const ComputeTestFeatures m_features;
};
SpvAsmComputeShaderInstance::SpvAsmComputeShaderInstance (Context& ctx, const ComputeShaderSpec& spec, const ComputeTestFeatures features)
: TestInstance (ctx)
- , m_device (createDeviceWithExtensions(ctx, ctx.getUniversalQueueFamilyIndex(), ctx.getDeviceExtensions(), spec.extensions))
- , m_deviceInterface (ctx.getInstanceInterface(), *m_device)
- , m_queue (getDeviceQueue(m_deviceInterface, *m_device, ctx.getUniversalQueueFamilyIndex(), 0))
- , m_allocator (createAllocator(ctx.getInstanceInterface(), ctx.getPhysicalDevice(), m_deviceInterface, *m_device))
, m_shaderSpec (spec)
, m_features (features)
{
tcu::TestStatus SpvAsmComputeShaderInstance::iterate (void)
{
const VkPhysicalDeviceFeatures& features = m_context.getDeviceFeatures();
- const DeviceInterface& vkdi = m_deviceInterface;
- const VkDevice& device = *m_device;
- Allocator& allocator = *m_allocator;
if ((m_features == COMPUTE_TEST_USES_INT16 || m_features == COMPUTE_TEST_USES_INT16_INT64) && !features.shaderInt16)
{
}
}
+ // defer device and resource creation until after feature checks
+ const Unique<VkDevice> vkDevice (createDeviceWithExtensions(m_context, m_context.getUniversalQueueFamilyIndex(), m_context.getDeviceExtensions(), m_shaderSpec.extensions));
+ const VkDevice& device = *vkDevice;
+ const DeviceDriver vkDeviceInterface (m_context.getInstanceInterface(), device);
+ const DeviceInterface& vkdi = vkDeviceInterface;
+ const de::UniquePtr<vk::Allocator> vkAllocator (createAllocator(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), vkDeviceInterface, device));
+ Allocator& allocator = *vkAllocator;
+ const VkQueue queue (getDeviceQueue(vkDeviceInterface, device, m_context.getUniversalQueueFamilyIndex(), 0));
+
vector<AllocationSp> inputAllocs;
vector<AllocationSp> outputAllocs;
vector<BufferHandleSp> inputBuffers;
(const VkSemaphore*)DE_NULL,
};
- VK_CHECK(vkdi.queueSubmit(m_queue, 1, &submitInfo, *cmdCompleteFence));
+ VK_CHECK(vkdi.queueSubmit(queue, 1, &submitInfo, *cmdCompleteFence));
VK_CHECK(vkdi.waitForFences(device, 1, &cmdCompleteFence.get(), 0u, infiniteTimeout)); // \note: timeout is failure
// Check output.
const VkPhysicalDevice vkPhysicalDevice = context.getPhysicalDevice();
const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
// Create a dedicated logic device with required extensions enabled for this test case.
- const Unique<VkDevice> vkDevice (createDeviceWithExtensions(context, queueFamilyIndex, context.getDeviceExtensions(), instance.requiredDeviceExtensions));
- const DeviceDriver vk (vkInstance, *vkDevice);
- const VkQueue queue = getDeviceQueue(vk, *vkDevice, queueFamilyIndex, 0);
const tcu::UVec2 renderSize (256, 256);
- vector<ModuleHandleSp> modules;
- map<VkShaderStageFlagBits, VkShaderModule> moduleByStage;
const int testSpecificSeed = 31354125;
const int seed = context.getTestContext().getCommandLine().getBaseSeed() ^ testSpecificSeed;
bool supportsGeometry = false;
const deUint32 numResources = static_cast<deUint32>(instance.resources.inputs.size() + instance.resources.outputs.size());
const bool needInterface = !instance.interfaces.empty();
const VkPhysicalDeviceFeatures& features = context.getDeviceFeatures();
- const de::UniquePtr<Allocator> allocatorUptr (createAllocator(vkInstance, vkPhysicalDevice, vk, *vkDevice));
- Allocator& allocator = *allocatorUptr;
+
supportsGeometry = features.geometryShader == VK_TRUE;
supportsTessellation = features.tessellationShader == VK_TRUE;
TCU_THROW(NotSupportedError, "Requested 16bit storage features not supported");
}
+ // defer device and other resource creation until after feature checks
+ const Unique<VkDevice> vkDevice (createDeviceWithExtensions(context, queueFamilyIndex, context.getDeviceExtensions(), instance.requiredDeviceExtensions));
+ const DeviceDriver vk (vkInstance, *vkDevice);
+ const VkQueue queue = getDeviceQueue(vk, *vkDevice, queueFamilyIndex, 0);
+ const de::UniquePtr<Allocator> allocatorUptr (createAllocator(vkInstance, vkPhysicalDevice, vk, *vkDevice));
+ Allocator& allocator = *allocatorUptr;
+ vector<ModuleHandleSp> modules;
+ map<VkShaderStageFlagBits, VkShaderModule> moduleByStage;
+
de::Random(seed).shuffle(instance.inputColors, instance.inputColors+4);
de::Random(seed).shuffle(instance.outputColors, instance.outputColors+4);
const Vec4 vertexData[] =