// 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