VertexProgram.hpp revision 0bac285a78df6a6d7a6b68784748b92805420ffb
10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman//
30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License.
50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at
666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman//
70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman//
90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software
100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and
130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License.
1466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
1566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#ifndef sw_VertexProgram_hpp
1666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#define sw_VertexProgram_hpp
1766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
1866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include "VertexRoutine.hpp"
1966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include "ShaderCore.hpp"
20c2534f4bc37baf48d9910d3691352ff83e3bea49Nicolas Capens#include "SamplerCore.hpp"
2166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
2266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include "Stream.hpp"
2366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include "Types.hpp"
2466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
2566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumannamespace sw
2666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman{
2766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	struct Stream;
2866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	class VertexShader;
2966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
3066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	class VertexProgram : public VertexRoutine, public ShaderCore
3166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	{
3266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	public:
3366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		VertexProgram(const VertexProcessor::State &state, const VertexShader *vertexShader);
3466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
3566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		virtual ~VertexProgram();
3666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
3766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	private:
387551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		const VertexShader *const shader;
397551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
407551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		RegisterArray<4096> r;   // Temporary registers
417551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Vector4f a0;
427551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Array<Int, 4> aL;
437551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Vector4f p0;
447551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
457551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Array<Int, 4> increment;
467551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Array<Int, 4> iteration;
477551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
487551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int loopDepth;
497551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int stackIndex;   // FIXME: Inc/decrement callStack
507551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Array<UInt, 16> callStack;
517551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
527551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int enableIndex;
537551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Array<Int4, 1 + 24> enableStack;
547551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int4 enableBreak;
557551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int4 enableContinue;
567551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int4 enableLeave;
577551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
587551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int instanceID;
597551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
6066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::DestinationParameter Dst;
6166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::SourceParameter Src;
6266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::Control Control;
6366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::Usage Usage;
6466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
65b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void pipeline() override;
66b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void program();
67b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void passThrough();
6866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
69c2534f4bc37baf48d9910d3691352ff83e3bea49Nicolas Capens		Vector4f fetchRegister(const Src &src, unsigned int offset = 0);
70b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		Vector4f readConstant(const Src &src, unsigned int offset = 0);
712c2a7b29cd53cb7b06ef1b1e2177a8c90e6e0128Alexis Hetu		RValue<Pointer<Byte>> uniformAddress(int bufferIndex, unsigned int index);
722c2a7b29cd53cb7b06ef1b1e2177a8c90e6e0128Alexis Hetu		RValue<Pointer<Byte>> uniformAddress(int bufferIndex, unsigned int index, Int& offset);
732c2a7b29cd53cb7b06ef1b1e2177a8c90e6e0128Alexis Hetu		Int relativeAddress(const Shader::Parameter &var, int bufferIndex = -1);
74b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		Int4 enableMask(const Shader::Instruction *instruction);
7566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
76b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X2(Vector4f &dst, Vector4f &src0, Src &src1);
77b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X3(Vector4f &dst, Vector4f &src0, Src &src1);
78b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X4(Vector4f &dst, Vector4f &src0, Src &src1);
79b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M4X3(Vector4f &dst, Vector4f &src0, Src &src1);
80b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M4X4(Vector4f &dst, Vector4f &src0, Src &src1);
81b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAK();
82b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAKC(Vector4f &src0, Vector4f &src1, Control);
83b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAKP(const Src &predicateRegister);
84b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAK(Int4 &condition);
85b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CONTINUE();
8666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		void TEST();
87b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALL(int labelIndex, int callSiteIndex);
88b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZ(int labelIndex, int callSiteIndex, const Src &src);
89b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZb(int labelIndex, int callSiteIndex, const Src &boolRegister);
90b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZp(int labelIndex, int callSiteIndex, const Src &predicateRegister);
91b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ELSE();
92b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDIF();
93b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDLOOP();
94b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDREP();
95b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDWHILE();
96b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IF(const Src &src);
97b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFb(const Src &boolRegister);
98b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFp(const Src &predicateRegister);
99b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFC(Vector4f &src0, Vector4f &src1, Control);
100b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IF(Int4 &condition);
10166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		void LABEL(int labelIndex);
102b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void LOOP(const Src &integerRegister);
103b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void REP(const Src &integerRegister);
104b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void WHILE(const Src &temporaryRegister);
105b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void RET();
106b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void LEAVE();
107b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXLDL(Vector4f &dst, Vector4f &src, const Src&);
108b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEX(Vector4f &dst, Vector4f &src, const Src&);
109b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
110b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXLDL(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
111b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
112b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
113b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
114b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3, Vector4f &src4);
115b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXSIZE(Vector4f &dst, Float4 &lod, const Src&);
11666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
117c2534f4bc37baf48d9910d3691352ff83e3bea49Nicolas Capens		void sampleTexture(Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q, SamplerMethod method);
11866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
1190b65c5e3903233839197fd689895ba57b7f61a5bAlexis Hetu		SamplerCore *sampler[VERTEX_TEXTURE_IMAGE_UNITS];
12066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
12166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int ifDepth;
12266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int loopRepDepth;
12366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int breakDepth;
12466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int currentLabel;
12566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		bool whileTest;
12666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
12766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		// FIXME: Get rid of llvm::
12866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *ifFalseBlock[24 + 24];
12966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *loopRepTestBlock[4];
13066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *loopRepEndBlock[4];
13166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *labelBlock[2048];
13266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		std::vector<llvm::BasicBlock*> callRetBlock[2048];
13366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *returnBlock;
13466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		bool isConditionalIf[24 + 24];
13566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	};
13666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman}
13766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
13866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#endif   // sw_VertexProgram_hpp
139