// 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/Color.hpp"
#include "Device/Config.hpp"
#include "System/Types.hpp"
#include "Vulkan/VkFormat.h"

namespace vk
{
	class Image;
}

namespace sw
{
	struct Mipmap
	{
		const void *buffer;

		short4 uHalf;
		short4 vHalf;
		short4 wHalf;
		int4 width;
		int4 height;
		int4 depth;
		short4 onePitchP;
		int4 pitchP;
		int4 sliceP;
		int4 samplePitchP;
		int4 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_LAYER,      // Array 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;
		bool unnormalizedCoordinates;
		bool largeTexture;

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

#endif   // sw_Sampler_hpp
