| // 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_SetupProcessor_hpp | 
 | #define sw_SetupProcessor_hpp | 
 |  | 
 | #include "Context.hpp" | 
 | #include "RoutineCache.hpp" | 
 | #include "Shader/VertexShader.hpp" | 
 | #include "Shader/PixelShader.hpp" | 
 | #include "Common/Types.hpp" | 
 |  | 
 | namespace sw | 
 | { | 
 | 	struct Primitive; | 
 | 	struct Triangle; | 
 | 	struct Polygon; | 
 | 	struct Vertex; | 
 | 	struct DrawCall; | 
 | 	struct DrawData; | 
 |  | 
 | 	class SetupProcessor | 
 | 	{ | 
 | 	public: | 
 | 		struct States | 
 | 		{ | 
 | 			unsigned int computeHash(); | 
 |  | 
 | 			bool isDrawPoint               : 1; | 
 | 			bool isDrawLine                : 1; | 
 | 			bool isDrawTriangle            : 1; | 
 | 			bool isDrawSolidTriangle       : 1; | 
 | 			bool interpolateZ              : 1; | 
 | 			bool interpolateW              : 1; | 
 | 			bool perspective               : 1; | 
 | 			bool pointSprite               : 1; | 
 | 			unsigned int positionRegister  : BITS(VERTEX_OUTPUT_LAST); | 
 | 			unsigned int pointSizeRegister : BITS(VERTEX_OUTPUT_LAST); | 
 | 			CullMode cullMode              : BITS(CULL_LAST); | 
 | 			bool twoSidedStencil           : 1; | 
 | 			bool slopeDepthBias            : 1; | 
 | 			bool vFace                     : 1; | 
 | 			unsigned int multiSample       : 3;   // 1, 2 or 4 | 
 | 			bool rasterizerDiscard         : 1; | 
 |  | 
 | 			struct Gradient | 
 | 			{ | 
 | 				unsigned char attribute : BITS(VERTEX_OUTPUT_LAST); | 
 | 				bool flat               : 1; | 
 | 				bool wrap               : 1; | 
 | 			}; | 
 |  | 
 | 			union | 
 | 			{ | 
 | 				struct | 
 | 				{ | 
 | 					Gradient color[2][4]; | 
 | 					Gradient texture[8][4]; | 
 | 					Gradient fog; | 
 | 				}; | 
 |  | 
 | 				Gradient gradient[MAX_FRAGMENT_INPUTS][4]; | 
 | 			}; | 
 | 		}; | 
 |  | 
 | 		struct State : States | 
 | 		{ | 
 | 			State(int i = 0); | 
 |  | 
 | 			bool operator==(const State &states) const; | 
 |  | 
 | 			unsigned int hash; | 
 | 		}; | 
 |  | 
 | 		typedef bool (*RoutinePointer)(Primitive *primitive, const Triangle *triangle, const Polygon *polygon, const DrawData *draw); | 
 |  | 
 | 		SetupProcessor(Context *context); | 
 |  | 
 | 		~SetupProcessor(); | 
 |  | 
 | 	protected: | 
 | 		State update() const; | 
 | 		std::shared_ptr<Routine> routine(const State &state); | 
 |  | 
 | 		void setRoutineCacheSize(int cacheSize); | 
 |  | 
 | 	private: | 
 | 		Context *const context; | 
 |  | 
 | 		RoutineCache<State> *routineCache; | 
 | 	}; | 
 | } | 
 |  | 
 | #endif   // sw_SetupProcessor_hpp |