// 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_Context_hpp
#define sw_Context_hpp

#include "Vulkan/VkConfig.h"
#include "Vulkan/VkDescriptorSet.hpp"
#include "Config.hpp"
#include "Stream.hpp"
#include "System/Types.hpp"

namespace vk
{
	class ImageView;
	class PipelineLayout;
}

namespace sw
{
	class SpirvShader;

	struct PushConstantStorage
	{
		unsigned char data[vk::MAX_PUSH_CONSTANT_SIZE];
	};

	struct BlendState
	{
		void init();

		bool alphaBlendEnable;
		VkBlendFactor sourceBlendFactor;
		VkBlendFactor destBlendFactor;
		VkBlendOp blendOperation;
		VkBlendFactor sourceBlendFactorAlpha;
		VkBlendFactor destBlendFactorAlpha;
		VkBlendOp blendOperationAlpha;
	};

	class Context
	{
	public:
		Context();

		void init();

		bool isDrawPoint() const;
		bool isDrawLine() const;
		bool isDrawTriangle() const;

		bool depthWriteActive() const;
		bool depthBufferActive() const;
		bool stencilActive() const;

		bool allTargetsColorClamp() const;

		void setBlendState(int index, BlendState state);
		BlendState getBlendState(int index) const;

		VkPrimitiveTopology topology;

		bool stencilEnable;
		VkStencilOpState frontStencil;
		VkStencilOpState backStencil;

		// Pixel processor states
		VkCullModeFlags cullMode;
		VkFrontFace frontFace;

		float depthBias;
		float slopeDepthBias;

		VkFormat renderTargetInternalFormat(int index) const;
		int colorWriteActive(int index) const;

		vk::DescriptorSet::Bindings descriptorSets = {};
		vk::DescriptorSet::DynamicOffsets descriptorDynamicOffsets = {};
		Stream input[MAX_INTERFACE_COMPONENTS / 4];

		vk::ImageView *renderTarget[RENDERTARGETS];
		vk::ImageView *depthBuffer;
		vk::ImageView *stencilBuffer;

		vk::PipelineLayout const *pipelineLayout;

		// Shaders
		const SpirvShader *pixelShader;
		const SpirvShader *vertexShader;

		bool occlusionEnabled;

		// Pixel processor states
		bool rasterizerDiscard;
		bool depthBoundsTestEnable;
		bool depthBufferEnable;
		VkCompareOp depthCompareMode;
		bool depthWriteEnable;

		float lineWidth;

		int colorWriteMask[RENDERTARGETS];   // RGBA
		unsigned int sampleMask;
		unsigned int multiSampleMask;
		int sampleCount;
		bool alphaToCoverage;

	private:
		bool colorWriteActive() const;
		bool colorUsed() const;

		bool alphaBlendActive(int index) const;
		VkBlendFactor sourceBlendFactor(int index) const;
		VkBlendFactor destBlendFactor(int index) const;
		VkBlendOp blendOperation(int index) const;

		VkBlendFactor sourceBlendFactorAlpha(int index) const;
		VkBlendFactor destBlendFactorAlpha(int index) const;
		VkBlendOp blendOperationAlpha(int index) const;

		BlendState blendState[RENDERTARGETS];
	};
}

#endif   // sw_Context_hpp
