VertexProgram.hpp revision b4fb367887d4f257b20be509b8abd3ccb3a23a5a
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"
1766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
1866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include "Stream.hpp"
1966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include "Types.hpp"
2066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
2166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumannamespace sw
2266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman{
2366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	struct Stream;
2466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	class VertexShader;
2566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	class SamplerCore;
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:
3566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::DestinationParameter Dst;
3666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::SourceParameter Src;
3766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::Control Control;
3866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		typedef Shader::Usage Usage;
3966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
40b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void pipeline() override;
41b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void program();
42b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void passThrough();
4366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
44b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		Vector4f fetchRegisterF(const Src &src, unsigned int offset = 0);
45b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		Vector4f readConstant(const Src &src, unsigned int offset = 0);
46b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		Int relativeAddress(const Shader::Parameter &var);
47b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		Int4 enableMask(const Shader::Instruction *instruction);
4866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
49b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X2(Vector4f &dst, Vector4f &src0, Src &src1);
50b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X3(Vector4f &dst, Vector4f &src0, Src &src1);
51b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M3X4(Vector4f &dst, Vector4f &src0, Src &src1);
52b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M4X3(Vector4f &dst, Vector4f &src0, Src &src1);
53b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void M4X4(Vector4f &dst, Vector4f &src0, Src &src1);
54b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAK();
55b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAKC(Vector4f &src0, Vector4f &src1, Control);
56b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAKP(const Src &predicateRegister);
57b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void BREAK(Int4 &condition);
58b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CONTINUE();
5966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		void TEST();
60b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALL(int labelIndex, int callSiteIndex);
61b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZ(int labelIndex, int callSiteIndex, const Src &src);
62b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZb(int labelIndex, int callSiteIndex, const Src &boolRegister);
63b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void CALLNZp(int labelIndex, int callSiteIndex, const Src &predicateRegister);
64b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ELSE();
65b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDIF();
66b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDLOOP();
67b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDREP();
68b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void ENDWHILE();
69b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IF(const Src &src);
70b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFb(const Src &boolRegister);
71b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFp(const Src &predicateRegister);
72b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IFC(Vector4f &src0, Vector4f &src1, Control);
73b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void IF(Int4 &condition);
7466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		void LABEL(int labelIndex);
75b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void LOOP(const Src &integerRegister);
76b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void REP(const Src &integerRegister);
77b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void WHILE(const Src &temporaryRegister);
78b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void RET();
79b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void LEAVE();
80b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXLDL(Vector4f &dst, Vector4f &src, const Src&);
81b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEX(Vector4f &dst, Vector4f &src, const Src&);
82b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
83b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXLDL(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
84b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
85b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
86b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
87b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3, Vector4f &src4);
88b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void TEXSIZE(Vector4f &dst, Float4 &lod, const Src&);
8966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
90b4fb367887d4f257b20be509b8abd3ccb3a23a5aNicolas Capens		void sampleTexture(Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q);
9166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
920b65c5e3903233839197fd689895ba57b7f61a5bAlexis Hetu		SamplerCore *sampler[VERTEX_TEXTURE_IMAGE_UNITS];
9366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
9466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int ifDepth;
9566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int loopRepDepth;
9666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int breakDepth;
9766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		int currentLabel;
9866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		bool whileTest;
9966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
10066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		// FIXME: Get rid of llvm::
10166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *ifFalseBlock[24 + 24];
10266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *loopRepTestBlock[4];
10366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *loopRepEndBlock[4];
10466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *labelBlock[2048];
10566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		std::vector<llvm::BasicBlock*> callRetBlock[2048];
10666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		llvm::BasicBlock *returnBlock;
10766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman		bool isConditionalIf[24 + 24];
10866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman	};
10966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman}
11066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman
11166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#endif   // sw_VertexProgram_hpp
112