1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2*03ce13f7SAndroid Build Coastguard Worker // 3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*03ce13f7SAndroid Build Coastguard Worker // 7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 8*03ce13f7SAndroid Build Coastguard Worker // 9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License. 14*03ce13f7SAndroid Build Coastguard Worker 15*03ce13f7SAndroid Build Coastguard Worker #ifndef sw_SetupProcessor_hpp 16*03ce13f7SAndroid Build Coastguard Worker #define sw_SetupProcessor_hpp 17*03ce13f7SAndroid Build Coastguard Worker 18*03ce13f7SAndroid Build Coastguard Worker #include "Context.hpp" 19*03ce13f7SAndroid Build Coastguard Worker #include "Memset.hpp" 20*03ce13f7SAndroid Build Coastguard Worker #include "RoutineCache.hpp" 21*03ce13f7SAndroid Build Coastguard Worker #include "System/Types.hpp" 22*03ce13f7SAndroid Build Coastguard Worker #include <Pipeline/SpirvShader.hpp> 23*03ce13f7SAndroid Build Coastguard Worker 24*03ce13f7SAndroid Build Coastguard Worker #include <memory> 25*03ce13f7SAndroid Build Coastguard Worker 26*03ce13f7SAndroid Build Coastguard Worker namespace sw { 27*03ce13f7SAndroid Build Coastguard Worker 28*03ce13f7SAndroid Build Coastguard Worker struct Primitive; 29*03ce13f7SAndroid Build Coastguard Worker struct Triangle; 30*03ce13f7SAndroid Build Coastguard Worker struct Polygon; 31*03ce13f7SAndroid Build Coastguard Worker struct DrawData; 32*03ce13f7SAndroid Build Coastguard Worker 33*03ce13f7SAndroid Build Coastguard Worker using SetupFunction = FunctionT<int(const vk::Device *device, Primitive *primitive, const Triangle *triangle, const Polygon *polygon, const DrawData *draw)>; 34*03ce13f7SAndroid Build Coastguard Worker 35*03ce13f7SAndroid Build Coastguard Worker class SetupProcessor 36*03ce13f7SAndroid Build Coastguard Worker { 37*03ce13f7SAndroid Build Coastguard Worker public: 38*03ce13f7SAndroid Build Coastguard Worker struct States : Memset<States> 39*03ce13f7SAndroid Build Coastguard Worker { Statessw::SetupProcessor::States40*03ce13f7SAndroid Build Coastguard Worker States() 41*03ce13f7SAndroid Build Coastguard Worker : Memset(this, 0) 42*03ce13f7SAndroid Build Coastguard Worker {} 43*03ce13f7SAndroid Build Coastguard Worker 44*03ce13f7SAndroid Build Coastguard Worker uint32_t computeHash(); 45*03ce13f7SAndroid Build Coastguard Worker 46*03ce13f7SAndroid Build Coastguard Worker bool isDrawPoint : 1; 47*03ce13f7SAndroid Build Coastguard Worker bool isDrawLine : 1; 48*03ce13f7SAndroid Build Coastguard Worker bool isDrawTriangle : 1; 49*03ce13f7SAndroid Build Coastguard Worker bool fixedPointDepthBuffer : 1; 50*03ce13f7SAndroid Build Coastguard Worker bool applyConstantDepthBias : 1; 51*03ce13f7SAndroid Build Coastguard Worker bool applySlopeDepthBias : 1; 52*03ce13f7SAndroid Build Coastguard Worker bool applyDepthBiasClamp : 1; 53*03ce13f7SAndroid Build Coastguard Worker bool interpolateZ : 1; 54*03ce13f7SAndroid Build Coastguard Worker bool interpolateW : 1; 55*03ce13f7SAndroid Build Coastguard Worker VkFrontFace frontFace : BITS(VK_FRONT_FACE_MAX_ENUM); 56*03ce13f7SAndroid Build Coastguard Worker VkCullModeFlags cullMode : BITS(VK_CULL_MODE_FLAG_BITS_MAX_ENUM); 57*03ce13f7SAndroid Build Coastguard Worker unsigned int multiSampleCount : 3; // 1, 2 or 4 58*03ce13f7SAndroid Build Coastguard Worker bool enableMultiSampling : 1; 59*03ce13f7SAndroid Build Coastguard Worker unsigned int numClipDistances : 4; // [0 - 8] 60*03ce13f7SAndroid Build Coastguard Worker unsigned int numCullDistances : 4; // [0 - 8] 61*03ce13f7SAndroid Build Coastguard Worker 62*03ce13f7SAndroid Build Coastguard Worker SpirvShader::InterfaceComponent gradient[MAX_INTERFACE_COMPONENTS]; 63*03ce13f7SAndroid Build Coastguard Worker }; 64*03ce13f7SAndroid Build Coastguard Worker 65*03ce13f7SAndroid Build Coastguard Worker struct State : States 66*03ce13f7SAndroid Build Coastguard Worker { 67*03ce13f7SAndroid Build Coastguard Worker bool operator==(const State &states) const; 68*03ce13f7SAndroid Build Coastguard Worker 69*03ce13f7SAndroid Build Coastguard Worker uint32_t hash; 70*03ce13f7SAndroid Build Coastguard Worker }; 71*03ce13f7SAndroid Build Coastguard Worker 72*03ce13f7SAndroid Build Coastguard Worker using RoutineType = SetupFunction::RoutineType; 73*03ce13f7SAndroid Build Coastguard Worker 74*03ce13f7SAndroid Build Coastguard Worker SetupProcessor(); 75*03ce13f7SAndroid Build Coastguard Worker 76*03ce13f7SAndroid Build Coastguard Worker State update(const vk::GraphicsState &pipelineState, const sw::SpirvShader *fragmentShader, const sw::SpirvShader *vertexShader, const vk::Attachments &attachments) const; 77*03ce13f7SAndroid Build Coastguard Worker RoutineType routine(const State &state); 78*03ce13f7SAndroid Build Coastguard Worker 79*03ce13f7SAndroid Build Coastguard Worker void setRoutineCacheSize(int cacheSize); 80*03ce13f7SAndroid Build Coastguard Worker 81*03ce13f7SAndroid Build Coastguard Worker private: 82*03ce13f7SAndroid Build Coastguard Worker using RoutineCacheType = RoutineCache<State, SetupFunction::CFunctionType>; 83*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<RoutineCacheType> routineCache; 84*03ce13f7SAndroid Build Coastguard Worker }; 85*03ce13f7SAndroid Build Coastguard Worker 86*03ce13f7SAndroid Build Coastguard Worker } // namespace sw 87*03ce13f7SAndroid Build Coastguard Worker 88*03ce13f7SAndroid Build Coastguard Worker namespace std { 89*03ce13f7SAndroid Build Coastguard Worker 90*03ce13f7SAndroid Build Coastguard Worker template<> 91*03ce13f7SAndroid Build Coastguard Worker struct hash<sw::SetupProcessor::State> 92*03ce13f7SAndroid Build Coastguard Worker { operator ()std::hash93*03ce13f7SAndroid Build Coastguard Worker uint64_t operator()(const sw::SetupProcessor::State &state) const 94*03ce13f7SAndroid Build Coastguard Worker { 95*03ce13f7SAndroid Build Coastguard Worker return state.hash; 96*03ce13f7SAndroid Build Coastguard Worker } 97*03ce13f7SAndroid Build Coastguard Worker }; 98*03ce13f7SAndroid Build Coastguard Worker 99*03ce13f7SAndroid Build Coastguard Worker } // namespace std 100*03ce13f7SAndroid Build Coastguard Worker 101*03ce13f7SAndroid Build Coastguard Worker #endif // sw_SetupProcessor_hpp 102