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"
2066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
21708c24b3cd03b68aa98b29a9099d6a9ce96eca16Nicolas Capens#include "SamplerCore.hpp"
22708c24b3cd03b68aa98b29a9099d6a9ce96eca16Nicolas Capens#include "Renderer/Stream.hpp"
23708c24b3cd03b68aa98b29a9099d6a9ce96eca16Nicolas Capens#include "Common/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;
59877ddfc51400030afd2804a23b132ed87a2f8d2fAlexis Hetu		Int4 vertexID;
607551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
6166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::DestinationParameter Dst;
6266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::SourceParameter Src;
6366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::Control Control;
6466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::Usage Usage;
6566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
66877ddfc51400030afd2804a23b132ed87a2f8d2fAlexis Hetu		void pipeline(UInt &index) override;
67877ddfc51400030afd2804a23b132ed87a2f8d2fAlexis Hetu		void program(UInt &index);
68b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void passThrough();
6966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
70c2534f4bc37baf48d9910d3691352ff83e3bea49Nicolas Capens		Vector4f fetchRegister(const Src &src, unsigned int offset = 0);
71b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		Vector4f readConstant(const Src &src, unsigned int offset = 0);
722c2a7b29cd53cb7b06ef1b1e2177a8c90e6e0128Alexis Hetu		RValue<Pointer<Byte>> uniformAddress(int bufferIndex, unsigned int index);
732c2a7b29cd53cb7b06ef1b1e2177a8c90e6e0128Alexis Hetu		RValue<Pointer<Byte>> uniformAddress(int bufferIndex, unsigned int index, Int& offset);
742c2a7b29cd53cb7b06ef1b1e2177a8c90e6e0128Alexis Hetu		Int relativeAddress(const Shader::Parameter &var, int bufferIndex = -1);
75b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		Int4 enableMask(const Shader::Instruction *instruction);
7666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
77b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X2(Vector4f &dst, Vector4f &src0, Src &src1);
78b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X3(Vector4f &dst, Vector4f &src0, Src &src1);
79b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X4(Vector4f &dst, Vector4f &src0, Src &src1);
80b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M4X3(Vector4f &dst, Vector4f &src0, Src &src1);
81b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M4X4(Vector4f &dst, Vector4f &src0, Src &src1);
82b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAK();
83b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAKC(Vector4f &src0, Vector4f &src1, Control);
84b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAKP(const Src &predicateRegister);
85b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAK(Int4 &condition);
86b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CONTINUE();
8766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		void TEST();
88b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALL(int labelIndex, int callSiteIndex);
89b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZ(int labelIndex, int callSiteIndex, const Src &src);
90b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZb(int labelIndex, int callSiteIndex, const Src &boolRegister);
91b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZp(int labelIndex, int callSiteIndex, const Src &predicateRegister);
92b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ELSE();
93b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDIF();
94b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDLOOP();
95b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDREP();
96b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDWHILE();
979aa83a93a06e1cf09547716d92f3ca82010dcf43Alexis Hetu		void ENDSWITCH();
98b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IF(const Src &src);
99b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFb(const Src &boolRegister);
100b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFp(const Src &predicateRegister);
101b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFC(Vector4f &src0, Vector4f &src1, Control);
102b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IF(Int4 &condition);
10366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		void LABEL(int labelIndex);
104b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void LOOP(const Src &integerRegister);
105b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void REP(const Src &integerRegister);
106b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void WHILE(const Src &temporaryRegister);
1079aa83a93a06e1cf09547716d92f3ca82010dcf43Alexis Hetu		void SWITCH();
108b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void RET();
109b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void LEAVE();
110b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEX(Vector4f &dst, Vector4f &src, const Src&);
111a0b5783f31ffec2eef21548ce04cbc447d22148cNicolas Capens		void TEXOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &offset);
112a0b5783f31ffec2eef21548ce04cbc447d22148cNicolas Capens		void TEXLOD(Vector4f &dst, Vector4f &src, const Src&, Float4 &lod);
113a0b5783f31ffec2eef21548ce04cbc447d22148cNicolas Capens		void TEXLODOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &offset, Float4 &lod);
114a0b5783f31ffec2eef21548ce04cbc447d22148cNicolas Capens		void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Float4 &lod);
115a0b5783f31ffec2eef21548ce04cbc447d22148cNicolas Capens		void TEXELFETCHOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &offset, Float4 &lod);
116a0b5783f31ffec2eef21548ce04cbc447d22148cNicolas Capens		void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &dsx, Vector4f &dsy);
117a0b5783f31ffec2eef21548ce04cbc447d22148cNicolas Capens		void TEXGRADOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &dsx, Vector4f &dsy, Vector4f &offset);
118b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXSIZE(Vector4f &dst, Float4 &lod, const Src&);
11966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
120a0b5783f31ffec2eef21548ce04cbc447d22148cNicolas Capens		Vector4f sampleTexture(const Src &s, Vector4f &uvwq, Float4 &lod, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerFunction function);
121a0b5783f31ffec2eef21548ce04cbc447d22148cNicolas Capens		Vector4f sampleTexture(int sampler, Vector4f &uvwq, Float4 &lod, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerFunction function);
12266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
12366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int ifDepth;
12466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int loopRepDepth;
12566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int currentLabel;
12666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		bool whileTest;
12766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
128c8b67a48e64ca05fbecfcd9990d16e1cb68a9578Nicolas Capens		BasicBlock *ifFalseBlock[24 + 24];
129c8b67a48e64ca05fbecfcd9990d16e1cb68a9578Nicolas Capens		BasicBlock *loopRepTestBlock[4];
130c8b67a48e64ca05fbecfcd9990d16e1cb68a9578Nicolas Capens		BasicBlock *loopRepEndBlock[4];
131c8b67a48e64ca05fbecfcd9990d16e1cb68a9578Nicolas Capens		BasicBlock *labelBlock[2048];
132c8b67a48e64ca05fbecfcd9990d16e1cb68a9578Nicolas Capens		std::vector<BasicBlock*> callRetBlock[2048];
133c8b67a48e64ca05fbecfcd9990d16e1cb68a9578Nicolas Capens		BasicBlock *returnBlock;
13466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		bool isConditionalIf[24 + 24];
13566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	};
13666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman}
13766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
13866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#endif   // sw_VertexProgram_hpp
139