• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef sw_SetupProcessor_hpp
16 #define sw_SetupProcessor_hpp
17 
18 #include "Context.hpp"
19 #include "RoutineCache.hpp"
20 #include "Shader/VertexShader.hpp"
21 #include "Shader/PixelShader.hpp"
22 #include "Common/Types.hpp"
23 
24 namespace sw
25 {
26 	struct Primitive;
27 	struct Triangle;
28 	struct Polygon;
29 	struct Vertex;
30 	struct DrawCall;
31 	struct DrawData;
32 
33 	class SetupProcessor
34 	{
35 	public:
36 		struct States : Memset<States>
37 		{
Statessw::SetupProcessor::States38 			States() : Memset(this, 0) {}
39 
40 			uint32_t computeHash();
41 
42 			bool isDrawPoint               : 1;
43 			bool isDrawLine                : 1;
44 			bool isDrawTriangle            : 1;
45 			bool isDrawSolidTriangle       : 1;
46 			bool interpolateZ              : 1;
47 			bool interpolateW              : 1;
48 			bool perspective               : 1;
49 			bool pointSprite               : 1;
50 			unsigned int positionRegister  : BITS(VERTEX_OUTPUT_LAST);
51 			unsigned int pointSizeRegister : BITS(VERTEX_OUTPUT_LAST);
52 			CullMode cullMode              : BITS(CULL_LAST);
53 			bool twoSidedStencil           : 1;
54 			bool slopeDepthBias            : 1;
55 			bool vFace                     : 1;
56 			unsigned int multiSample       : 3;   // 1, 2 or 4
57 			bool rasterizerDiscard         : 1;
58 
59 			struct Gradient
60 			{
61 				unsigned char attribute : BITS(VERTEX_OUTPUT_LAST);
62 				bool flat               : 1;
63 				bool wrap               : 1;
64 			};
65 
66 			union
67 			{
68 				struct
69 				{
70 					Gradient color[2][4];
71 					Gradient texture[8][4];
72 					Gradient fog;
73 				};
74 
75 				Gradient gradient[MAX_FRAGMENT_INPUTS][4];
76 			};
77 		};
78 
79 		struct State : States
80 		{
81 			bool operator==(const State &states) const;
82 
83 			uint32_t hash;
84 		};
85 
86 		typedef bool (*RoutinePointer)(Primitive *primitive, const Triangle *triangle, const Polygon *polygon, const DrawData *draw);
87 
88 		SetupProcessor(Context *context);
89 
90 		~SetupProcessor();
91 
92 	protected:
93 		State update() const;
94 		std::shared_ptr<Routine> routine(const State &state);
95 
96 		void setRoutineCacheSize(int cacheSize);
97 
98 	private:
99 		Context *const context;
100 
101 		RoutineCache<State> *routineCache;
102 	};
103 }
104 
105 #endif   // sw_SetupProcessor_hpp
106