ShaderRenderCaseInstance::ShaderRenderCaseInstance (Context& context)
: vkt::TestInstance (context)
- , m_memAlloc (context.getDefaultAllocator())
+ , m_imageBackingMode (IMAGE_BACKING_MODE_REGULAR)
+ , m_sparseContext (createSparseContext())
+ , m_memAlloc (getAllocator())
, m_clearColor (DEFAULT_CLEAR_COLOR)
, m_isVertexCase (false)
, m_vertexShaderName ("vert")
, m_evaluator (DE_NULL)
, m_uniformSetup (DE_NULL)
, m_attribFunc (DE_NULL)
- , m_sparseContext (createSparseContext())
, m_sampleCount (VK_SAMPLE_COUNT_1_BIT)
{
}
const AttributeSetupFunc attribFunc,
const ImageBackingMode imageBackingMode)
: vkt::TestInstance (context)
- , m_memAlloc (context.getDefaultAllocator())
+ , m_imageBackingMode (imageBackingMode)
+ , m_sparseContext (createSparseContext())
+ , m_memAlloc (getAllocator())
, m_clearColor (DEFAULT_CLEAR_COLOR)
, m_isVertexCase (isVertexCase)
, m_vertexShaderName ("vert")
, m_fragmentShaderName ("frag")
, m_renderSize (128, 128)
, m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
- , m_imageBackingMode (imageBackingMode)
, m_evaluator (&evaluator)
, m_uniformSetup (&uniformSetup)
, m_attribFunc (attribFunc)
- , m_sparseContext (createSparseContext())
, m_sampleCount (VK_SAMPLE_COUNT_1_BIT)
{
}
const AttributeSetupFunc attribFunc,
const ImageBackingMode imageBackingMode)
: vkt::TestInstance (context)
- , m_memAlloc (context.getDefaultAllocator())
+ , m_imageBackingMode (imageBackingMode)
+ , m_sparseContext (createSparseContext())
+ , m_memAlloc (getAllocator())
, m_clearColor (DEFAULT_CLEAR_COLOR)
, m_isVertexCase (isVertexCase)
, m_vertexShaderName ("vert")
, m_fragmentShaderName ("frag")
, m_renderSize (128, 128)
, m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
- , m_imageBackingMode (imageBackingMode)
, m_evaluator (evaluator)
, m_uniformSetup (uniformSetup)
, m_attribFunc (attribFunc)
- , m_sparseContext (createSparseContext())
, m_sampleCount (VK_SAMPLE_COUNT_1_BIT)
{
}
TCU_THROW(NotSupportedError, "No matching queue found");
}
-ShaderRenderCaseInstance::SparseContext* ShaderRenderCaseInstance::createSparseContext (void) const
+
+ShaderRenderCaseInstance::SparseContext::SparseContext (vkt::Context& context)
+ : m_context (context)
+ , m_queueFamilyIndex (findQueueFamilyIndexWithCaps(context.getInstanceInterface(), context.getPhysicalDevice(), VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_SPARSE_BINDING_BIT))
+ , m_device (createDevice())
+ , m_deviceInterface (context.getInstanceInterface(), *m_device)
+ , m_allocator (createAllocator())
{
- if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
- {
- const InstanceInterface& vk = getInstanceInterface();
- const VkPhysicalDevice physicalDevice = getPhysicalDevice();
- const VkPhysicalDeviceFeatures deviceFeatures = getPhysicalDeviceFeatures(vk, physicalDevice);
+ m_deviceInterface.getDeviceQueue(*m_device, m_queueFamilyIndex, 0, &m_queue);
+}
- const deUint32 queueIndex = findQueueFamilyIndexWithCaps(vk, physicalDevice, VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_SPARSE_BINDING_BIT);
+Move<VkDevice> ShaderRenderCaseInstance::SparseContext::createDevice () const
+{
+ const InstanceInterface& vk = m_context.getInstanceInterface();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const VkPhysicalDeviceFeatures deviceFeatures = getPhysicalDeviceFeatures(vk, physicalDevice);
- VkDeviceQueueCreateInfo queueInfo;
- VkDeviceCreateInfo deviceInfo;
- const float queuePriority = 1.0f;
+ VkDeviceQueueCreateInfo queueInfo;
+ VkDeviceCreateInfo deviceInfo;
+ const float queuePriority = 1.0f;
- deMemset(&queueInfo, 0, sizeof(queueInfo));
- deMemset(&deviceInfo, 0, sizeof(deviceInfo));
+ deMemset(&queueInfo, 0, sizeof(queueInfo));
+ deMemset(&deviceInfo, 0, sizeof(deviceInfo));
- queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
- queueInfo.pNext = DE_NULL;
- queueInfo.flags = (VkDeviceQueueCreateFlags)0u;
- queueInfo.queueFamilyIndex = queueIndex;
- queueInfo.queueCount = 1u;
- queueInfo.pQueuePriorities = &queuePriority;
+ queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+ queueInfo.pNext = DE_NULL;
+ queueInfo.flags = (VkDeviceQueueCreateFlags)0u;
+ queueInfo.queueFamilyIndex = m_queueFamilyIndex;
+ queueInfo.queueCount = 1u;
+ queueInfo.pQueuePriorities = &queuePriority;
- deviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
- deviceInfo.pNext = DE_NULL;
- deviceInfo.queueCreateInfoCount = 1u;
- deviceInfo.pQueueCreateInfos = &queueInfo;
- deviceInfo.enabledExtensionCount = 0u;
- deviceInfo.ppEnabledExtensionNames = DE_NULL;
- deviceInfo.enabledLayerCount = 0u;
- deviceInfo.ppEnabledLayerNames = DE_NULL;
- deviceInfo.pEnabledFeatures = &deviceFeatures;
+ deviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
+ deviceInfo.pNext = DE_NULL;
+ deviceInfo.queueCreateInfoCount = 1u;
+ deviceInfo.pQueueCreateInfos = &queueInfo;
+ deviceInfo.enabledExtensionCount = 0u;
+ deviceInfo.ppEnabledExtensionNames = DE_NULL;
+ deviceInfo.enabledLayerCount = 0u;
+ deviceInfo.ppEnabledLayerNames = DE_NULL;
+ deviceInfo.pEnabledFeatures = &deviceFeatures;
- Move<VkDevice> device = createDevice(vk, physicalDevice, &deviceInfo);
+ return vk::createDevice(vk, physicalDevice, &deviceInfo);
+}
+
+vk::Allocator* ShaderRenderCaseInstance::SparseContext::createAllocator () const
+{
+ const VkPhysicalDeviceMemoryProperties memoryProperties = getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
+ return new SimpleAllocator(m_deviceInterface, *m_device, memoryProperties);
+}
- return new SparseContext(device, queueIndex, vk);
+ShaderRenderCaseInstance::SparseContext* ShaderRenderCaseInstance::createSparseContext (void) const
+{
+ if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
+ {
+ return new SparseContext(m_context);
}
return DE_NULL;
}
+vk::Allocator& ShaderRenderCaseInstance::getAllocator (void) const
+{
+ if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
+ {
+ return *m_sparseContext->m_allocator;
+ }
+
+ return m_context.getDefaultAllocator();
+}
+
ShaderRenderCaseInstance::~ShaderRenderCaseInstance (void)
{
}
deUint32 ShaderRenderCaseInstance::getUniversalQueueFamilyIndex (void) const
{
if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
- return m_sparseContext->m_universalQueueFamilyIndex;
+ return m_sparseContext->m_queueFamilyIndex;
return m_context.getUniversalQueueFamilyIndex();
}
const bool isShadowSampler = refSampler.compare != tcu::Sampler::COMPAREMODE_NONE;
const VkImageAspectFlags aspectMask = isShadowSampler ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
- const Unique<VkSemaphore> imageMemoryBindSemaphore(makeSemaphore(vk, vkDevice));
+ const Unique<VkSemaphore> imageMemoryBindSemaphore(makeSemaphore(vk, vkDevice));
deUint32 bufferSize = 0u;
std::vector<deUint32> offsetMultiples;
offsetMultiples.push_back(4u);
descriptorSetLayout = m_descriptorSetLayoutBuilder->build(vk, vkDevice);
if (!m_uniformInfos.empty())
{
- descriptorPool = m_descriptorPoolBuilder->build(vk, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ descriptorPool = m_descriptorPoolBuilder->build(vk, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
const VkDescriptorSetAllocateInfo allocInfo =
{
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
bool isMultiSampling (void) const;
+ ImageBackingMode m_imageBackingMode;
+private:
+
+ struct SparseContext
+ {
+ SparseContext (vkt::Context& context);
+
+ vkt::Context& m_context;
+ const deUint32 m_queueFamilyIndex;
+ vk::Unique<vk::VkDevice> m_device;
+ vk::DeviceDriver m_deviceInterface;
+ vk::VkQueue m_queue;
+ const de::UniquePtr<vk::Allocator> m_allocator;
+ private:
+ vk::Move<vk::VkDevice> createDevice (void) const;
+ vk::Allocator* createAllocator (void) const;
+
+ };
+
+ de::UniquePtr<SparseContext> m_sparseContext;
+protected:
vk::Allocator& m_memAlloc;
const tcu::Vec4 m_clearColor;
const bool m_isVertexCase;
std::string m_fragmentShaderName;
tcu::UVec2 m_renderSize;
vk::VkFormat m_colorFormat;
- ImageBackingMode m_imageBackingMode;
private:
typedef std::vector<tcu::ConstPixelBufferAccess> TextureLayerData;
const ShaderEvaluator* m_evaluator;
const UniformSetup* m_uniformSetup;
const AttributeSetupFunc m_attribFunc;
-
- struct SparseContext
- {
- SparseContext (vk::Move<vk::VkDevice>& device, const deUint32 universalQueueFamilyIndex, const vk::InstanceInterface& interface)
- : m_device (device)
- , m_universalQueueFamilyIndex (universalQueueFamilyIndex)
- , m_deviceInterface (interface, *m_device)
- {
- m_deviceInterface.getDeviceQueue(*m_device, m_universalQueueFamilyIndex, 0, &m_queue);
- }
-
- vk::Unique<vk::VkDevice> m_device;
- const deUint32 m_universalQueueFamilyIndex;
- vk::DeviceDriver m_deviceInterface;
- vk::VkQueue m_queue;
- };
-
- de::UniquePtr<SparseContext> m_sparseContext;
de::MovePtr<QuadGrid> m_quadGrid;
tcu::TextureLevel m_resultImage;
vk::VkQueue getUniversalQueue (void) const;
vk::VkPhysicalDevice getPhysicalDevice (void) const;
const vk::InstanceInterface& getInstanceInterface (void) const;
- SparseContext* createSparseContext (void) const;
+ SparseContext* createSparseContext (void) const;
+ vk::Allocator& getAllocator (void) const;
};
template<typename T>