#ifndef _VKTSPARSERESOURCESSHADERINTRINSICSSTORAGE_HPP
#define _VKTSPARSERESOURCESSHADERINTRINSICSSTORAGE_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  vktSparseResourcesShaderIntrinsicsStorage.hpp
 * \brief Sparse Resources Shader Intrinsics for storage images
 *//*--------------------------------------------------------------------*/

#include "vktSparseResourcesShaderIntrinsicsBase.hpp"

namespace vkt
{
namespace sparse
{

class SparseShaderIntrinsicsCaseStorage : public SparseShaderIntrinsicsCaseBase
{
public:
	SparseShaderIntrinsicsCaseStorage						(tcu::TestContext&		testCtx,
															 const std::string&		name,
															 const SpirVFunction	function,
															 const ImageType		imageType,
															 const tcu::UVec3&		imageSize,
															 const vk::VkFormat		format)
		: SparseShaderIntrinsicsCaseBase(testCtx, name, function, imageType, imageSize, format) {}

	void				initPrograms						(vk::SourceCollections&	programCollection) const;

	virtual std::string	getSparseImageTypeName				(void) const = 0;
	virtual std::string	getUniformConstSparseImageTypeName	(void) const = 0;

	virtual std::string	sparseImageOpString					(const std::string&		resultVariable,
															 const std::string&		resultType,
															 const std::string&		image,
															 const std::string&		coord,
															 const std::string&		mipLevel) const = 0;
};

class SparseCaseOpImageSparseFetch : public SparseShaderIntrinsicsCaseStorage
{
public:
	SparseCaseOpImageSparseFetch						(tcu::TestContext&		testCtx,
														 const std::string&		name,
														 const SpirVFunction	function,
														 const ImageType		imageType,
														 const tcu::UVec3&		imageSize,
														 const vk::VkFormat		format)
		: SparseShaderIntrinsicsCaseStorage (testCtx, name, function, imageType, imageSize, format) {}

	TestInstance*	createInstance						(Context&				context) const;

	std::string		getSparseImageTypeName				(void) const;
	std::string		getUniformConstSparseImageTypeName	(void) const;

	std::string		sparseImageOpString					(const std::string&		resultVariable,
														 const std::string&		resultType,
														 const std::string&		image,
														 const std::string&		coord,
														 const std::string&		mipLevel) const;
};

class SparseCaseOpImageSparseRead : public SparseShaderIntrinsicsCaseStorage
{
public:
	SparseCaseOpImageSparseRead							(tcu::TestContext&		testCtx,
														 const std::string&		name,
														 const SpirVFunction	function,
														 const ImageType		imageType,
														 const tcu::UVec3&		imageSize,
														 const vk::VkFormat		format)
		: SparseShaderIntrinsicsCaseStorage (testCtx, name, function, imageType, imageSize, format) {}

	TestInstance*	createInstance						(Context&				context) const;

	std::string		getSparseImageTypeName				(void) const;
	std::string		getUniformConstSparseImageTypeName	(void) const;

	std::string		sparseImageOpString					(const std::string&		resultVariable,
														 const std::string&		resultType,
														 const std::string&		image,
														 const std::string&		coord,
														 const std::string&		mipLevel) const;
};

} // sparse
} // vkt

#endif // _VKTSPARSERESOURCESSHADERINTRINSICSSTORAGE_HPP
