|  | // 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; | 
|  | Routine *routine(const State &state); | 
|  |  | 
|  | void setRoutineCacheSize(int cacheSize); | 
|  |  | 
|  | private: | 
|  | Context *const context; | 
|  |  | 
|  | RoutineCache<State> *routineCache; | 
|  | }; | 
|  | } | 
|  |  | 
|  | #endif   // sw_SetupProcessor_hpp |