// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// 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.

#ifndef sw_Sampler_hpp
#define sw_Sampler_hpp

#include "Device/Config.hpp"
#include "System/Types.hpp"
#include "Vulkan/VkFormat.hpp"

namespace sw {

struct Mipmap
{
	const void *buffer;

	ushort4 uHalf;
	ushort4 vHalf;
	ushort4 wHalf;
	uint4 width;
	uint4 height;
	uint4 depth;
	short4 onePitchP;
	uint4 pitchP;
	uint4 sliceP;
	uint4 samplePitchP;
	uint4 sampleMax;
};

struct Texture
{
	Mipmap mipmap[MIPMAP_LEVELS];

	float4 widthWidthHeightHeight;
	float4 width;
	float4 height;
	float4 depth;
};

enum FilterType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
	FILTER_POINT,
	FILTER_GATHER,
	FILTER_MIN_POINT_MAG_LINEAR,
	FILTER_MIN_LINEAR_MAG_POINT,
	FILTER_LINEAR,
	FILTER_ANISOTROPIC,

	FILTER_LAST = FILTER_ANISOTROPIC
};

enum MipmapType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
	MIPMAP_NONE,
	MIPMAP_POINT,
	MIPMAP_LINEAR,

	MIPMAP_LAST = MIPMAP_LINEAR
};

enum AddressingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
	ADDRESSING_UNUSED,
	ADDRESSING_WRAP,
	ADDRESSING_CLAMP,
	ADDRESSING_MIRROR,
	ADDRESSING_MIRRORONCE,
	ADDRESSING_BORDER,    // Single color
	ADDRESSING_SEAMLESS,  // Border of pixels
	ADDRESSING_CUBEFACE,  // Cube face layer
	ADDRESSING_TEXELFETCH,

	ADDRESSING_LAST = ADDRESSING_TEXELFETCH
};

struct Sampler
{
	VkImageViewType textureType;
	vk::Format textureFormat;
	FilterType textureFilter;
	AddressingMode addressingModeU;
	AddressingMode addressingModeV;
	AddressingMode addressingModeW;
	MipmapType mipmapFilter;
	VkComponentMapping swizzle;
	int gatherComponent;
	bool highPrecisionFiltering;
	bool compareEnable;
	VkCompareOp compareOp;
	VkBorderColor border;
	VkClearColorValue customBorder;
	bool unnormalizedCoordinates;

	VkSamplerYcbcrModelConversion ycbcrModel;
	bool studioSwing;    // Narrow range
	bool swappedChroma;  // Cb/Cr components in reverse order

	float mipLodBias = 0.0f;
	float maxAnisotropy = 0.0f;
	float minLod = -1000.0f;
	float maxLod = 1000.0f;

	bool is1D() const
	{
		switch(textureType)
		{
		case VK_IMAGE_VIEW_TYPE_1D:
		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
			return true;
		case VK_IMAGE_VIEW_TYPE_2D:
		case VK_IMAGE_VIEW_TYPE_3D:
		case VK_IMAGE_VIEW_TYPE_CUBE:
		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
			return false;
		default:
			UNSUPPORTED("VkImageViewType %d", (int)textureType);
			return false;
		}
	}

	bool is2D() const
	{
		switch(textureType)
		{
		case VK_IMAGE_VIEW_TYPE_2D:
		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
			return true;
		case VK_IMAGE_VIEW_TYPE_1D:
		case VK_IMAGE_VIEW_TYPE_3D:
		case VK_IMAGE_VIEW_TYPE_CUBE:
		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
			return false;
		default:
			UNSUPPORTED("VkImageViewType %d", (int)textureType);
			return false;
		}
	}

	bool is3D() const
	{
		switch(textureType)
		{
		case VK_IMAGE_VIEW_TYPE_3D:
			return true;
		case VK_IMAGE_VIEW_TYPE_1D:
		case VK_IMAGE_VIEW_TYPE_2D:
		case VK_IMAGE_VIEW_TYPE_CUBE:
		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
			return false;
		default:
			UNSUPPORTED("VkImageViewType %d", (int)textureType);
			return false;
		}
	}

	bool isCube() const
	{
		switch(textureType)
		{
		case VK_IMAGE_VIEW_TYPE_CUBE:
		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
			return true;
		case VK_IMAGE_VIEW_TYPE_1D:
		case VK_IMAGE_VIEW_TYPE_2D:
		case VK_IMAGE_VIEW_TYPE_3D:
		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
			return false;
		default:
			UNSUPPORTED("VkImageViewType %d", (int)textureType);
			return false;
		}
	}

	bool isArrayed() const
	{
		switch(textureType)
		{
		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
			return true;
		case VK_IMAGE_VIEW_TYPE_1D:
		case VK_IMAGE_VIEW_TYPE_2D:
		case VK_IMAGE_VIEW_TYPE_3D:
		case VK_IMAGE_VIEW_TYPE_CUBE:
			return false;
		default:
			UNSUPPORTED("VkImageViewType %d", (int)textureType);
			return false;
		}
	}

	// Returns the number of coordinates required to sample the image,
	// not including any array coordinate, which is indicated by isArrayed().
	unsigned int dimensionality() const
	{
		switch(textureType)
		{
		case VK_IMAGE_VIEW_TYPE_1D:
		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
			return 1;
		case VK_IMAGE_VIEW_TYPE_2D:
		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
			return 2;
		case VK_IMAGE_VIEW_TYPE_3D:
		case VK_IMAGE_VIEW_TYPE_CUBE:
		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
			return 3;
		default:
			UNSUPPORTED("VkImageViewType %d", (int)textureType);
			return 0;
		}
	}
};

}  // namespace sw

#endif  // sw_Sampler_hpp
