VertexProgram.hpp revision c2534f4bc37baf48d9910d3691352ff83e3bea49
166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman// SwiftShader Software Renderer
266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman//
366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman// Copyright(c) 2005-2012 TransGaming Inc.
466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman//
566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman// All rights reserved. No part of this software may be copied, distributed, transmitted,
666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman// transcribed, stored in a retrieval system, translated into any human or computer
766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman// language by any means, or disclosed to third parties without the explicit written
866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman// or implied, including but not limited to any patent rights, are granted to you.
1066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman//
1166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
1266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#ifndef sw_VertexProgram_hpp
1366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#define sw_VertexProgram_hpp
1466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
1566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include "VertexRoutine.hpp"
1666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include "ShaderCore.hpp"
17c2534f4bc37baf48d9910d3691352ff83e3bea49Nicolas Capens#include "SamplerCore.hpp"
1866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
1966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include "Stream.hpp"
2066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include "Types.hpp"
2166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
2266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumannamespace sw
2366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman{
2466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	struct Stream;
2566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	class VertexShader;
2666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
2766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	class VertexProgram : public VertexRoutine, public ShaderCore
2866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	{
2966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	public:
3066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		VertexProgram(const VertexProcessor::State &state, const VertexShader *vertexShader);
3166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
3266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		virtual ~VertexProgram();
3366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
3466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	private:
357551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		const VertexShader *const shader;
367551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
377551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		RegisterArray<4096> r;   // Temporary registers
387551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Vector4f a0;
397551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Array<Int, 4> aL;
407551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Vector4f p0;
417551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
427551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Array<Int, 4> increment;
437551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Array<Int, 4> iteration;
447551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
457551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int loopDepth;
467551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int stackIndex;   // FIXME: Inc/decrement callStack
477551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Array<UInt, 16> callStack;
487551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
497551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int enableIndex;
507551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Array<Int4, 1 + 24> enableStack;
517551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int4 enableBreak;
527551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int4 enableContinue;
537551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int4 enableLeave;
547551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
557551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens		Int instanceID;
567551ac6868ec1dc3965a00ff0a2003adbb2018d5Nicolas Capens
5766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::DestinationParameter Dst;
5866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::SourceParameter Src;
5966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::Control Control;
6066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::Usage Usage;
6166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
62b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void pipeline() override;
63b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void program();
64b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void passThrough();
6566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
66c2534f4bc37baf48d9910d3691352ff83e3bea49Nicolas Capens		Vector4f fetchRegister(const Src &src, unsigned int offset = 0);
67b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		Vector4f readConstant(const Src &src, unsigned int offset = 0);
682c2a7b29cd53cb7b06ef1b1e2177a8c90e6e0128Alexis Hetu		RValue<Pointer<Byte>> uniformAddress(int bufferIndex, unsigned int index);
692c2a7b29cd53cb7b06ef1b1e2177a8c90e6e0128Alexis Hetu		RValue<Pointer<Byte>> uniformAddress(int bufferIndex, unsigned int index, Int& offset);
702c2a7b29cd53cb7b06ef1b1e2177a8c90e6e0128Alexis Hetu		Int relativeAddress(const Shader::Parameter &var, int bufferIndex = -1);
71b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		Int4 enableMask(const Shader::Instruction *instruction);
7266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
73b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X2(Vector4f &dst, Vector4f &src0, Src &src1);
74b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X3(Vector4f &dst, Vector4f &src0, Src &src1);
75b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X4(Vector4f &dst, Vector4f &src0, Src &src1);
76b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M4X3(Vector4f &dst, Vector4f &src0, Src &src1);
77b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M4X4(Vector4f &dst, Vector4f &src0, Src &src1);
78b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAK();
79b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAKC(Vector4f &src0, Vector4f &src1, Control);
80b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAKP(const Src &predicateRegister);
81b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAK(Int4 &condition);
82b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CONTINUE();
8366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		void TEST();
84b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALL(int labelIndex, int callSiteIndex);
85b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZ(int labelIndex, int callSiteIndex, const Src &src);
86b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZb(int labelIndex, int callSiteIndex, const Src &boolRegister);
87b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZp(int labelIndex, int callSiteIndex, const Src &predicateRegister);
88b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ELSE();
89b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDIF();
90b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDLOOP();
91b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDREP();
92b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDWHILE();
93b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IF(const Src &src);
94b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFb(const Src &boolRegister);
95b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFp(const Src &predicateRegister);
96b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFC(Vector4f &src0, Vector4f &src1, Control);
97b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IF(Int4 &condition);
9866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		void LABEL(int labelIndex);
99b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void LOOP(const Src &integerRegister);
100b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void REP(const Src &integerRegister);
101b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void WHILE(const Src &temporaryRegister);
102b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void RET();
103b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void LEAVE();
104b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXLDL(Vector4f &dst, Vector4f &src, const Src&);
105b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEX(Vector4f &dst, Vector4f &src, const Src&);
106b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
107b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXLDL(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
108b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
109b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
110b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
111b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3, Vector4f &src4);
112b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXSIZE(Vector4f &dst, Float4 &lod, const Src&);
11366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
114c2534f4bc37baf48d9910d3691352ff83e3bea49Nicolas Capens		void sampleTexture(Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q, SamplerMethod method);
11566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
1160b65c5e3903233839197fd689895ba57b7f61a5bAlexis Hetu		SamplerCore *sampler[VERTEX_TEXTURE_IMAGE_UNITS];
11766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
11866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int ifDepth;
11966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int loopRepDepth;
12066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int breakDepth;
12166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int currentLabel;
12266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		bool whileTest;
12366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
12466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		// FIXME: Get rid of llvm::
12566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *ifFalseBlock[24 + 24];
12666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *loopRepTestBlock[4];
12766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *loopRepEndBlock[4];
12866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *labelBlock[2048];
12966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		std::vector<llvm::BasicBlock*> callRetBlock[2048];
13066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *returnBlock;
13166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		bool isConditionalIf[24 + 24];
13266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	};
13366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman}
13466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
13566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#endif   // sw_VertexProgram_hpp
136