blob: 9d329109ebb3d4aa3185d1c4404ff7cf93ff14a4 [file] [log] [blame]
#ifndef _VKTSPARSERESOURCESBASE_HPP
#define _VKTSPARSERESOURCESBASE_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
* Copyright (c) 2016 The Khronos Group Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*//*!
* \file vktSparseResourcesBase.hpp
* \brief Sparse Resources Base Instance
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
#include "tcuTestCase.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktSparseResourcesTestsUtil.hpp"
#include "vkDefs.hpp"
#include "vkMemUtil.hpp"
#include "vkPlatform.hpp"
#include "vkRef.hpp"
#include "vkTypeUtil.hpp"
#include "deSharedPtr.hpp"
#include "deUniquePtr.hpp"
#include "deStringUtil.hpp"
#include <map>
#include <vector>
namespace vkt
{
namespace sparse
{
enum
{
NO_MATCH_FOUND = ~((deUint32)0)
};
struct Queue
{
vk::VkQueue queueHandle;
deUint32 queueFamilyIndex;
deUint32 queueIndex;
};
struct QueueRequirements
{
QueueRequirements(const vk::VkQueueFlags qFlags, const deUint32 qCount)
: queueFlags(qFlags)
, queueCount(qCount)
{}
vk::VkQueueFlags queueFlags;
deUint32 queueCount;
};
typedef std::vector<QueueRequirements> QueueRequirementsVec;
class SparseResourcesBaseInstance : public TestInstance
{
public:
SparseResourcesBaseInstance (Context &context);
protected:
typedef std::map<vk::VkQueueFlags, std::vector<Queue> > QueuesMap;
typedef std::vector<vk::VkQueueFamilyProperties> QueueFamilyPropertiesVec;
typedef vk::Move<vk::VkDevice> DevicePtr;
typedef de::SharedPtr< vk::Unique<vk::VkDeviceMemory> > DeviceMemoryUniquePtr;
void createDeviceSupportingQueues (const QueueRequirementsVec& queueRequirements);
const Queue& getQueue (const vk::VkQueueFlags queueFlags,
const deUint32 queueIndex);
deUint32 findMatchingMemoryType (const vk::InstanceInterface& instance,
const vk::VkPhysicalDevice physicalDevice,
const vk::VkMemoryRequirements& objectMemoryRequirements,
const vk::MemoryRequirement& memoryRequirement) const;
bool checkSparseSupportForImageType (const vk::InstanceInterface& instance,
const vk::VkPhysicalDevice physicalDevice,
const ImageType imageType) const;
bool checkSparseSupportForImageFormat (const vk::InstanceInterface& instance,
const vk::VkPhysicalDevice physicalDevice,
const vk::VkImageCreateInfo& imageInfo) const;
bool checkImageFormatFeatureSupport (const vk::InstanceInterface& instance,
const vk::VkPhysicalDevice physicalDevice,
const vk::VkFormat format,
const vk::VkFormatFeatureFlags featureFlags) const;
deUint32 getSparseAspectRequirementsIndex (const std::vector<vk::VkSparseImageMemoryRequirements>&requirements,
const vk::VkImageAspectFlags aspectFlags) const;
DevicePtr m_logicalDevice;
private:
deUint32 findMatchingQueueFamilyIndex (const QueueFamilyPropertiesVec& queueFamilyProperties,
const vk::VkQueueFlags queueFlags,
const deUint32 startIndex) const;
QueuesMap m_queues;
};
} // sparse
} // vkt
#endif // _VKTSPARSERESOURCESBASE_HPP