// 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_VertexShader_hpp
#define sw_VertexShader_hpp

#include "Shader.hpp"
#include "SpirvShader.hpp"
#include "Device/Config.hpp"

namespace sw
{
	class VertexShader : public Shader
	{
	public:
		explicit VertexShader(const VertexShader *vs = 0);
		explicit VertexShader(const unsigned long *token);

		virtual ~VertexShader();

		static int validate(const unsigned long *const token);   // Returns number of instructions if valid
		bool containsTextureSampling() const;

		void setInput(int inputIdx, const Semantic& semantic, SpirvShader::AttribType attribType = SpirvShader::ATTRIBTYPE_FLOAT);
		void setOutput(int outputIdx, int nbComponents, const Semantic& semantic);
		void setPositionRegister(int posReg);
		void setPointSizeRegister(int ptSizeReg);
		void declareInstanceId() { instanceIdDeclared = true; }
		void declareVertexId() { vertexIdDeclared = true; }

		const Semantic& getInput(int inputIdx) const;
		const Semantic& getOutput(int outputIdx, int component) const;
		SpirvShader::AttribType getAttribType(int inputIndex) const;
		int getPositionRegister() const { return positionRegister; }
		int getPointSizeRegister() const { return pointSizeRegister; }
		bool isInstanceIdDeclared() const { return instanceIdDeclared; }
		bool isVertexIdDeclared() const { return vertexIdDeclared; }

	private:
		void analyze();
		void analyzeInput();
		void analyzeOutput();
		void analyzeTextureSampling();

		Semantic input[MAX_VERTEX_INPUTS];
		Semantic output[MAX_VERTEX_OUTPUTS][4];

		SpirvShader::AttribType attribType[MAX_VERTEX_INPUTS];

		int positionRegister;
		int pointSizeRegister;

		bool instanceIdDeclared;
		bool vertexIdDeclared;
		bool textureSampling;
	};
}

#endif   // sw_VertexShader_hpp
