#ifndef _VKTSPARSERESOURCESSHADERINTRINSICSBASE_HPP
#define _VKTSPARSERESOURCESSHADERINTRINSICSBASE_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  vktSparseResourcesShaderIntrinsicsBase.hpp
 * \brief Sparse Resources Shader Intrinsics Base Classes
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "vktTestCase.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktSparseResourcesBase.hpp"
#include "vktSparseResourcesTestsUtil.hpp"

#include "vkDefs.hpp"
#include "vkRef.hpp"
#include "vkRefUtil.hpp"
#include "vkPlatform.hpp"
#include "vkPrograms.hpp"
#include "vkRefUtil.hpp"
#include "vkMemUtil.hpp"
#include "vkQueryUtil.hpp"
#include "vkBuilderUtil.hpp"
#include "vkTypeUtil.hpp"
#include "vkDebugReportUtil.hpp"
#include "tcuTextureUtil.hpp"

#include "deStringUtil.hpp"
#include "deUniquePtr.hpp"
#include "deSharedPtr.hpp"

#include <string>
#include <vector>

#include <deMath.h>

namespace vkt
{
namespace sparse
{

enum
{
	MEMORY_BLOCK_BOUND		= 0u,
	MEMORY_BLOCK_NOT_BOUND	= 1u,
	MEMORY_BLOCK_TYPE_COUNT	= 2u
};

enum
{
	MEMORY_BLOCK_BOUND_VALUE	 = 1u,
	MEMORY_BLOCK_NOT_BOUND_VALUE = 2u
};

enum
{
	BINDING_IMAGE_SPARSE	= 0u,
	BINDING_IMAGE_TEXELS	= 1u,
	BINDING_IMAGE_RESIDENCY	= 2u
};

enum SpirVFunction
{
	SPARSE_FETCH = 0u,
	SPARSE_READ,
	SPARSE_SAMPLE_EXPLICIT_LOD,
	SPARSE_SAMPLE_IMPLICIT_LOD,
	SPARSE_GATHER,
	SPARSE_SPIRV_FUNCTION_TYPE_LAST
};

std::string getOpTypeImageComponent	(const tcu::TextureFormat& format);

std::string getOpTypeImageSparse	(const ImageType			imageType,
									 const tcu::TextureFormat&	format,
									 const std::string&			componentType,
									 const bool					requiresSampler);

std::string getOpTypeImageResidency	(const ImageType imageType);

class SparseShaderIntrinsicsCaseBase : public TestCase
{
public:
	SparseShaderIntrinsicsCaseBase			(tcu::TestContext&			testCtx,
											 const std::string&			name,
											 const SpirVFunction		function,
											 const ImageType			imageType,
											 const tcu::UVec3&			imageSize,
											 const tcu::TextureFormat&	format)
		: TestCase(testCtx, name, "")
		, m_function(function)
		, m_imageType(imageType)
		, m_imageSize(imageSize)
		, m_format(format)
	{
	}

protected:
	const SpirVFunction			m_function;
	const ImageType				m_imageType;
	const tcu::UVec3			m_imageSize;
	const tcu::TextureFormat	m_format;
};

class SparseShaderIntrinsicsInstanceBase : public SparseResourcesBaseInstance
{
public:
	SparseShaderIntrinsicsInstanceBase		(Context&					context,
											 const SpirVFunction		function,
											 const ImageType			imageType,
											 const tcu::UVec3&			imageSize,
											 const tcu::TextureFormat&	format)
		: SparseResourcesBaseInstance(context)
		, m_function(function)
		, m_imageType(imageType)
		, m_imageSize(imageSize)
		, m_format(format)
		, m_residencyFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNSIGNED_INT32)
	{
	}

	tcu::TestStatus						iterate					(void);

	virtual vk::VkImageUsageFlags		imageSparseUsageFlags	(void) const = 0;
	virtual vk::VkImageUsageFlags		imageOutputUsageFlags	(void) const = 0;

	virtual vk::VkQueueFlags			getQueueFlags			(void) const = 0;

	virtual void						recordCommands			(vk::Allocator&					allocator,
																 const vk::VkCommandBuffer		commandBuffer,
																 const vk::VkImageCreateInfo&	imageSparseInfo,
																 const vk::VkImage				imageSparse,
																 const vk::VkImage				imageTexels,
																 const vk::VkImage				imageResidency) = 0;
protected:
	const SpirVFunction			m_function;
	const ImageType				m_imageType;
	const tcu::UVec3			m_imageSize;
	const tcu::TextureFormat	m_format;
	const tcu::TextureFormat	m_residencyFormat;

	typedef de::SharedPtr< vk::Unique<vk::VkPipeline> >			SharedVkPipeline;
	std::vector<SharedVkPipeline>								pipelines;

	typedef de::SharedPtr< vk::Unique<vk::VkImageView> >		SharedVkImageView;
	std::vector<SharedVkImageView>								imageSparseViews;
	std::vector<SharedVkImageView>								imageTexelsViews;
	std::vector<SharedVkImageView>								imageResidencyViews;

	vk::Move<vk::VkDescriptorPool>								descriptorPool;

	typedef de::SharedPtr< vk::Unique<vk::VkDescriptorSet> >	SharedVkDescriptorSet;
	std::vector<SharedVkDescriptorSet>							descriptorSets;
};

} // sparse
} // vkt

#endif // _VKTSPARSERESOURCESSHADERINTRINSICSBASE_HPP
