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_VertexProcessor_hpp 16*03ce13f7SAndroid Build Coastguard Worker #define sw_VertexProcessor_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 "Vertex.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 DrawData; 29*03ce13f7SAndroid Build Coastguard Worker 30*03ce13f7SAndroid Build Coastguard Worker // Basic direct mapped vertex cache. 31*03ce13f7SAndroid Build Coastguard Worker struct VertexCache 32*03ce13f7SAndroid Build Coastguard Worker { 33*03ce13f7SAndroid Build Coastguard Worker static constexpr uint32_t SIZE = 64; // TODO: Variable size? 34*03ce13f7SAndroid Build Coastguard Worker static constexpr uint32_t TAG_MASK = SIZE - 1; // Size must be power of 2. 35*03ce13f7SAndroid Build Coastguard Worker 36*03ce13f7SAndroid Build Coastguard Worker void clear(); 37*03ce13f7SAndroid Build Coastguard Worker 38*03ce13f7SAndroid Build Coastguard Worker Vertex vertex[SIZE]; 39*03ce13f7SAndroid Build Coastguard Worker uint32_t tag[SIZE]; 40*03ce13f7SAndroid Build Coastguard Worker 41*03ce13f7SAndroid Build Coastguard Worker // Identifier of the draw call for the cache data. If this cache is 42*03ce13f7SAndroid Build Coastguard Worker // used with a different draw call, then the cache should be invalidated 43*03ce13f7SAndroid Build Coastguard Worker // before use. 44*03ce13f7SAndroid Build Coastguard Worker int drawCall = -1; 45*03ce13f7SAndroid Build Coastguard Worker }; 46*03ce13f7SAndroid Build Coastguard Worker 47*03ce13f7SAndroid Build Coastguard Worker struct VertexTask 48*03ce13f7SAndroid Build Coastguard Worker { 49*03ce13f7SAndroid Build Coastguard Worker unsigned int vertexCount; 50*03ce13f7SAndroid Build Coastguard Worker unsigned int primitiveStart; 51*03ce13f7SAndroid Build Coastguard Worker VertexCache vertexCache; 52*03ce13f7SAndroid Build Coastguard Worker }; 53*03ce13f7SAndroid Build Coastguard Worker 54*03ce13f7SAndroid Build Coastguard Worker using VertexRoutineFunction = FunctionT<void(const vk::Device *device, Vertex *output, unsigned int *batch, VertexTask *vertextask, DrawData *draw)>; 55*03ce13f7SAndroid Build Coastguard Worker 56*03ce13f7SAndroid Build Coastguard Worker class VertexProcessor 57*03ce13f7SAndroid Build Coastguard Worker { 58*03ce13f7SAndroid Build Coastguard Worker public: 59*03ce13f7SAndroid Build Coastguard Worker struct States : Memset<States> 60*03ce13f7SAndroid Build Coastguard Worker { Statessw::VertexProcessor::States61*03ce13f7SAndroid Build Coastguard Worker States() 62*03ce13f7SAndroid Build Coastguard Worker : Memset(this, 0) 63*03ce13f7SAndroid Build Coastguard Worker {} 64*03ce13f7SAndroid Build Coastguard Worker 65*03ce13f7SAndroid Build Coastguard Worker uint32_t computeHash(); 66*03ce13f7SAndroid Build Coastguard Worker 67*03ce13f7SAndroid Build Coastguard Worker uint64_t shaderID; 68*03ce13f7SAndroid Build Coastguard Worker uint32_t pipelineLayoutIdentifier; 69*03ce13f7SAndroid Build Coastguard Worker 70*03ce13f7SAndroid Build Coastguard Worker struct Input 71*03ce13f7SAndroid Build Coastguard Worker { operator boolsw::VertexProcessor::States::Input72*03ce13f7SAndroid Build Coastguard Worker operator bool() const // Returns true if stream contains data 73*03ce13f7SAndroid Build Coastguard Worker { 74*03ce13f7SAndroid Build Coastguard Worker return format != VK_FORMAT_UNDEFINED; 75*03ce13f7SAndroid Build Coastguard Worker } 76*03ce13f7SAndroid Build Coastguard Worker 77*03ce13f7SAndroid Build Coastguard Worker VkFormat format; // TODO(b/148016460): Could be restricted to VK_FORMAT_END_RANGE 78*03ce13f7SAndroid Build Coastguard Worker unsigned int attribType : BITS(SpirvShader::ATTRIBTYPE_LAST); 79*03ce13f7SAndroid Build Coastguard Worker }; 80*03ce13f7SAndroid Build Coastguard Worker 81*03ce13f7SAndroid Build Coastguard Worker Input input[MAX_INTERFACE_COMPONENTS / 4]; 82*03ce13f7SAndroid Build Coastguard Worker bool robustBufferAccess : 1; 83*03ce13f7SAndroid Build Coastguard Worker bool isPoint : 1; 84*03ce13f7SAndroid Build Coastguard Worker bool depthClipEnable : 1; 85*03ce13f7SAndroid Build Coastguard Worker bool depthClipNegativeOneToOne : 1; 86*03ce13f7SAndroid Build Coastguard Worker }; 87*03ce13f7SAndroid Build Coastguard Worker 88*03ce13f7SAndroid Build Coastguard Worker struct State : States 89*03ce13f7SAndroid Build Coastguard Worker { 90*03ce13f7SAndroid Build Coastguard Worker bool operator==(const State &state) const; 91*03ce13f7SAndroid Build Coastguard Worker 92*03ce13f7SAndroid Build Coastguard Worker uint32_t hash; 93*03ce13f7SAndroid Build Coastguard Worker }; 94*03ce13f7SAndroid Build Coastguard Worker 95*03ce13f7SAndroid Build Coastguard Worker using RoutineType = VertexRoutineFunction::RoutineType; 96*03ce13f7SAndroid Build Coastguard Worker 97*03ce13f7SAndroid Build Coastguard Worker VertexProcessor(); 98*03ce13f7SAndroid Build Coastguard Worker 99*03ce13f7SAndroid Build Coastguard Worker const State update(const vk::GraphicsState &pipelineState, const sw::SpirvShader *vertexShader, const vk::Inputs &inputs); 100*03ce13f7SAndroid Build Coastguard Worker RoutineType routine(const State &state, const vk::PipelineLayout *pipelineLayout, 101*03ce13f7SAndroid Build Coastguard Worker const SpirvShader *vertexShader, const vk::DescriptorSet::Bindings &descriptorSets); 102*03ce13f7SAndroid Build Coastguard Worker 103*03ce13f7SAndroid Build Coastguard Worker void setRoutineCacheSize(int cacheSize); 104*03ce13f7SAndroid Build Coastguard Worker 105*03ce13f7SAndroid Build Coastguard Worker private: 106*03ce13f7SAndroid Build Coastguard Worker using RoutineCacheType = RoutineCache<State, VertexRoutineFunction::CFunctionType>; 107*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<RoutineCacheType> routineCache; 108*03ce13f7SAndroid Build Coastguard Worker }; 109*03ce13f7SAndroid Build Coastguard Worker 110*03ce13f7SAndroid Build Coastguard Worker } // namespace sw 111*03ce13f7SAndroid Build Coastguard Worker 112*03ce13f7SAndroid Build Coastguard Worker namespace std { 113*03ce13f7SAndroid Build Coastguard Worker 114*03ce13f7SAndroid Build Coastguard Worker template<> 115*03ce13f7SAndroid Build Coastguard Worker struct hash<sw::VertexProcessor::State> 116*03ce13f7SAndroid Build Coastguard Worker { operator ()std::hash117*03ce13f7SAndroid Build Coastguard Worker uint64_t operator()(const sw::VertexProcessor::State &state) const 118*03ce13f7SAndroid Build Coastguard Worker { 119*03ce13f7SAndroid Build Coastguard Worker return state.hash; 120*03ce13f7SAndroid Build Coastguard Worker } 121*03ce13f7SAndroid Build Coastguard Worker }; 122*03ce13f7SAndroid Build Coastguard Worker 123*03ce13f7SAndroid Build Coastguard Worker } // namespace std 124*03ce13f7SAndroid Build Coastguard Worker 125*03ce13f7SAndroid Build Coastguard Worker #endif // sw_VertexProcessor_hpp 126