// 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_TextureStage_hpp
#define sw_TextureStage_hpp

#include "System/Types.hpp"
#include "System/Math.hpp"
#include "Device/Color.hpp"

namespace sw
{
	class Sampler;
	class PixelRoutine;
	class Context;

	class TextureStage
	{
		friend class Context;   // FIXME

	public:
		enum StageOperation
		{
			STAGE_DISABLE,
			STAGE_SELECTARG1,
			STAGE_SELECTARG2,
			STAGE_SELECTARG3,
			STAGE_MODULATE,
			STAGE_MODULATE2X,
			STAGE_MODULATE4X,
			STAGE_ADD,
			STAGE_ADDSIGNED,
			STAGE_ADDSIGNED2X,
			STAGE_SUBTRACT,
			STAGE_ADDSMOOTH,
			STAGE_MULTIPLYADD,
			STAGE_LERP,
			STAGE_DOT3,
			STAGE_BLENDCURRENTALPHA,
			STAGE_BLENDDIFFUSEALPHA,
			STAGE_BLENDFACTORALPHA,
			STAGE_BLENDTEXTUREALPHA,
			STAGE_BLENDTEXTUREALPHAPM,
			STAGE_PREMODULATE,
			STAGE_MODULATEALPHA_ADDCOLOR,
			STAGE_MODULATECOLOR_ADDALPHA,
			STAGE_MODULATEINVALPHA_ADDCOLOR,
			STAGE_MODULATEINVCOLOR_ADDALPHA,
			STAGE_BUMPENVMAP,
			STAGE_BUMPENVMAPLUMINANCE,

			STAGE_LAST = STAGE_BUMPENVMAPLUMINANCE
		};

		enum SourceArgument
		{
			SOURCE_TEXTURE,
			SOURCE_CONSTANT,
			SOURCE_CURRENT,
			SOURCE_DIFFUSE,
			SOURCE_SPECULAR,
			SOURCE_TEMP,
			SOURCE_TFACTOR,

			SOURCE_LAST = SOURCE_TFACTOR
		};

		enum DestinationArgument
		{
			DESTINATION_CURRENT,
			DESTINATION_TEMP,

			DESTINATION_LAST = DESTINATION_TEMP
		};

		enum ArgumentModifier
		{
			MODIFIER_COLOR,
			MODIFIER_INVCOLOR,
			MODIFIER_ALPHA,
			MODIFIER_INVALPHA,

			MODIFIER_LAST = MODIFIER_INVALPHA
		};

		struct State
		{
			State();

			unsigned int stageOperation			: BITS(STAGE_LAST);
			unsigned int firstArgument			: BITS(SOURCE_LAST);
			unsigned int secondArgument			: BITS(SOURCE_LAST);
			unsigned int thirdArgument			: BITS(SOURCE_LAST);
			unsigned int stageOperationAlpha	: BITS(STAGE_LAST);
			unsigned int firstArgumentAlpha		: BITS(SOURCE_LAST);
			unsigned int secondArgumentAlpha	: BITS(SOURCE_LAST);
			unsigned int thirdArgumentAlpha		: BITS(SOURCE_LAST);
			unsigned int firstModifier			: BITS(MODIFIER_LAST);
			unsigned int secondModifier			: BITS(MODIFIER_LAST);
			unsigned int thirdModifier			: BITS(MODIFIER_LAST);
			unsigned int firstModifierAlpha		: BITS(MODIFIER_LAST);
			unsigned int secondModifierAlpha	: BITS(MODIFIER_LAST);
			unsigned int thirdModifierAlpha		: BITS(MODIFIER_LAST);
			unsigned int destinationArgument	: BITS(DESTINATION_LAST);
			unsigned int texCoordIndex			: BITS(7);

			unsigned int cantUnderflow			: 1;
			unsigned int usesTexture			: 1;
		};

		struct Uniforms
		{
			word4 constantColor4[4];
			float4 bumpmapMatrix4F[2][2];
			word4 bumpmapMatrix4W[2][2];
			word4 luminanceScale4;
			word4 luminanceOffset4;
		};

		TextureStage();

		~TextureStage();

		void init(int stage, const Sampler *sampler, const TextureStage *previousStage);

		State textureStageState() const;

		void setConstantColor(const Color<float> &constantColor);
		void setBumpmapMatrix(int element, float value);
		void setLuminanceScale(float value);
		void setLuminanceOffset(float value);

		void setTexCoordIndex(unsigned int texCoordIndex);
		void setStageOperation(StageOperation stageOperation);
		void setFirstArgument(SourceArgument firstArgument);
		void setSecondArgument(SourceArgument secondArgument);
		void setThirdArgument(SourceArgument thirdArgument);
		void setStageOperationAlpha(StageOperation stageOperationAlpha);
		void setFirstArgumentAlpha(SourceArgument firstArgumentAlpha);
		void setSecondArgumentAlpha(SourceArgument secondArgumentAlpha);
		void setThirdArgumentAlpha(SourceArgument thirdArgumentAlpha);
		void setFirstModifier(ArgumentModifier firstModifier);
		void setSecondModifier(ArgumentModifier secondModifier);
		void setThirdModifier(ArgumentModifier thirdModifier);
		void setFirstModifierAlpha(ArgumentModifier firstModifierAlpha);
		void setSecondModifierAlpha(ArgumentModifier secondModifierAlpha);
		void setThirdModifierAlpha(ArgumentModifier thirdModifierAlpha);
		void setDestinationArgument(DestinationArgument destinationArgument);

		Uniforms uniforms;   // FIXME: Private

	private:
		bool usesColor(SourceArgument source) const;
		bool usesAlpha(SourceArgument source) const;
		bool uses(SourceArgument source) const;
		bool usesCurrent() const;
		bool usesDiffuse() const;
		bool usesSpecular() const;
		bool usesTexture() const;
		bool isStageDisabled() const;
		bool writesCurrent() const;

		int stage;

		StageOperation stageOperation;
		SourceArgument firstArgument;
		SourceArgument secondArgument;
		SourceArgument thirdArgument;
		StageOperation stageOperationAlpha;
		SourceArgument firstArgumentAlpha;
		SourceArgument secondArgumentAlpha;
		SourceArgument thirdArgumentAlpha;
		ArgumentModifier firstModifier;
		ArgumentModifier secondModifier;
		ArgumentModifier thirdModifier;
		ArgumentModifier firstModifierAlpha;
		ArgumentModifier secondModifierAlpha;
		ArgumentModifier thirdModifierAlpha;
		DestinationArgument destinationArgument;

		int texCoordIndex;
		const Sampler *sampler;
		const TextureStage *previousStage;
	};
}

#endif  // sw_TextureStage_hpp
