diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index 7a8462d..ba70fc0 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -99,7 +99,17 @@
 		this->registerIndex = registerIndex;
 	}
 
-	OutputASM::OutputASM(TParseContext &context, es2::Shader *shaderObject) : TIntermTraverser(true, true, true), mContext(context), shaderObject(shaderObject)
+	sw::PixelShader *Shader::getPixelShader() const
+	{
+		return 0;
+	}
+
+	sw::VertexShader *Shader::getVertexShader() const
+	{
+		return 0;
+	}
+
+	OutputASM::OutputASM(TParseContext &context, Shader *shaderObject) : TIntermTraverser(true, true, true), mContext(context), shaderObject(shaderObject)
 	{
 		shader = 0;
 		pixelShader = 0;
@@ -2047,10 +2057,10 @@
 		{
 			const TType &type = varying->getType();
 			const char *name = varying->getAsSymbolNode()->getSymbol().c_str();
-			es2::VaryingList &activeVaryings = shaderObject->varyings;
+			VaryingList &activeVaryings = shaderObject->varyings;
 			
 			// Check if this varying has been declared before without having a register assigned
-			for(es2::VaryingList::iterator v = activeVaryings.begin(); v != activeVaryings.end(); v++)
+			for(VaryingList::iterator v = activeVaryings.begin(); v != activeVaryings.end(); v++)
 			{
 				if(v->name == name)
 				{
@@ -2064,7 +2074,7 @@
 				}
 			}
 			
-			activeVaryings.push_back(es2::Varying(glVariableType(type), name, varying->getArraySize(), reg, 0));
+			activeVaryings.push_back(sh::Varying(glVariableType(type), name, varying->getArraySize(), reg, 0));
 		}
 	}
 
diff --git a/src/OpenGL/compiler/OutputASM.h b/src/OpenGL/compiler/OutputASM.h
index 0252421..54af409 100644
--- a/src/OpenGL/compiler/OutputASM.h
+++ b/src/OpenGL/compiler/OutputASM.h
@@ -57,6 +57,49 @@
 		int registerIndex;
 	};
 
+	typedef std::vector<Attribute> ActiveAttributes;
+
+	struct Varying
+	{
+		Varying(GLenum type, const std::string &name, int arraySize, int reg = -1, int col = -1)
+			: type(type), name(name), arraySize(arraySize), reg(reg), col(col)
+		{
+		}
+
+		bool isArray() const
+		{
+			return arraySize >= 1;
+		}
+
+		int size() const   // Unify with es2::Uniform?
+		{
+			return arraySize > 0 ? arraySize : 1;
+		}
+
+		GLenum type;
+		std::string name;
+		int arraySize;
+
+		int reg;    // First varying register, assigned during link
+		int col;    // First register element, assigned during link
+	};
+
+	typedef std::list<Varying> VaryingList;
+
+	class Shader
+	{
+		friend class OutputASM;
+	public:
+		virtual sw::Shader *getShader() const = 0;
+		virtual sw::PixelShader *getPixelShader() const;
+		virtual sw::VertexShader *getVertexShader() const;
+
+	protected:
+		VaryingList varyings;
+		ActiveUniforms activeUniforms;
+		ActiveAttributes activeAttributes;
+	};
+
 	struct Function
 	{
 		Function(int label, const char *name, TIntermSequence *arg, TIntermTyped *ret) : label(label), name(name), arg(arg), ret(ret)
@@ -74,14 +117,13 @@
 	};
 	
 	typedef sw::Shader::Instruction Instruction;
-	typedef std::vector<Attribute> ActiveAttributes;
 
 	class Temporary;
 
 	class OutputASM : public TIntermTraverser
 	{
 	public:
-		explicit OutputASM(TParseContext &context, es2::Shader *shaderObject);
+		explicit OutputASM(TParseContext &context, Shader *shaderObject);
 		~OutputASM();
 
 		void output();
@@ -145,7 +187,7 @@
 		static unsigned int loopCount(TIntermLoop *node);
 		static bool isSamplerRegister(TIntermTyped *operand);
 
-		es2::Shader *const shaderObject;
+		Shader *const shaderObject;
 		sw::Shader *shader;
 		sw::PixelShader *pixelShader;
 		sw::VertexShader *vertexShader;
diff --git a/src/OpenGL/compiler/TranslatorASM.cpp b/src/OpenGL/compiler/TranslatorASM.cpp
index 8749900..0cf13d4 100644
--- a/src/OpenGL/compiler/TranslatorASM.cpp
+++ b/src/OpenGL/compiler/TranslatorASM.cpp
@@ -13,7 +13,7 @@
 
 #include "InitializeParseContext.h"
 
-TranslatorASM::TranslatorASM(es2::Shader *shaderObject, ShShaderType type, ShShaderSpec spec) : TCompiler(type, spec), shaderObject(shaderObject)
+TranslatorASM::TranslatorASM(sh::Shader *shaderObject, ShShaderType type, ShShaderSpec spec) : TCompiler(type, spec), shaderObject(shaderObject)
 {
 }
 
diff --git a/src/OpenGL/compiler/TranslatorASM.h b/src/OpenGL/compiler/TranslatorASM.h
index 596c424..32739ec 100644
--- a/src/OpenGL/compiler/TranslatorASM.h
+++ b/src/OpenGL/compiler/TranslatorASM.h
@@ -14,10 +14,8 @@
 
 #include "ShHandle.h"
 #include "OutputASM.h"
-#include "Shader/PixelShader.hpp"
-#include "Shader/VertexShader.hpp"
 
-namespace es2
+namespace sh
 {
 	class Shader;
 }
@@ -25,13 +23,13 @@
 class TranslatorASM : public TCompiler
 {
 public:
-    TranslatorASM(es2::Shader *shaderObject, ShShaderType type, ShShaderSpec spec);
+    TranslatorASM(sh::Shader *shaderObject, ShShaderType type, ShShaderSpec spec);
 
 protected:
     virtual bool translate(TIntermNode* root);
 
 private:
-	es2::Shader *const shaderObject;
+	sh::Shader *const shaderObject;
 };
 
 #endif  // COMPILER_TRANSLATORASM_H_
diff --git a/src/OpenGL/libGL/Program.cpp b/src/OpenGL/libGL/Program.cpp
index 03042fa..71573d5 100644
--- a/src/OpenGL/libGL/Program.cpp
+++ b/src/OpenGL/libGL/Program.cpp
@@ -940,9 +940,9 @@
 
 	// Packs varyings into generic varying registers, using the algorithm from [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111
 	// Returns the number of used varying registers, or -1 if unsuccesful
-	int Program::packVaryings(const Varying *packing[][4])
+	int Program::packVaryings(const sh::Varying *packing[][4])
 	{
-		for(VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
+		for(sh::VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
 		{
 			int n = VariableRowCount(varying->type) * varying->size();
 			int m = VariableColumnCount(varying->type);
@@ -1087,11 +1087,11 @@
 
 	bool Program::linkVaryings()
 	{
-		for(VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
+		for(sh::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
 		{
 			bool matched = false;
 
-			for(VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
+			for(sh::VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
 			{
 				if(output->name == input->name)
 				{
@@ -1115,12 +1115,12 @@
 			}
 		}
 
-		VaryingList &psVaryings = fragmentShader->varyings;
-		VaryingList &vsVaryings = vertexShader->varyings;
+		sh::VaryingList &psVaryings = fragmentShader->varyings;
+		sh::VaryingList &vsVaryings = vertexShader->varyings;
 
-		for(VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
+		for(sh::VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
 		{
-			for(VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
+			for(sh::VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
 			{
 				if(output->name == input->name)
 				{
diff --git a/src/OpenGL/libGL/Program.h b/src/OpenGL/libGL/Program.h
index eae96bd..4afb55b 100644
--- a/src/OpenGL/libGL/Program.h
+++ b/src/OpenGL/libGL/Program.h
@@ -133,7 +133,7 @@
 	private:
 		void unlink();
 
-		int packVaryings(const Varying *packing[][4]);
+		int packVaryings(const sh::Varying *packing[][4]);
 		bool linkVaryings();
 
 		bool linkAttributes();
diff --git a/src/OpenGL/libGL/Shader.cpp b/src/OpenGL/libGL/Shader.cpp
index 335427a..fd09672 100644
--- a/src/OpenGL/libGL/Shader.cpp
+++ b/src/OpenGL/libGL/Shader.cpp
@@ -197,16 +197,6 @@
     return getShader() != 0;
 }
 
-sw::PixelShader *Shader::getPixelShader() const
-{
-	return 0;
-}
-
-sw::VertexShader *Shader::getVertexShader() const
-{
-	return 0;
-}
-
 void Shader::addRef()
 {
     mRefCount++;
@@ -279,7 +269,7 @@
 }
 
 // true if varying x has a higher priority in packing than y
-bool Shader::compareVarying(const Varying &x, const Varying &y)
+bool Shader::compareVarying(const sh::Varying &x, const sh::Varying &y)
 {
     if(x.type == y.type)
     {
diff --git a/src/OpenGL/libGL/Shader.h b/src/OpenGL/libGL/Shader.h
index 871450c..05535e3 100644
--- a/src/OpenGL/libGL/Shader.h
+++ b/src/OpenGL/libGL/Shader.h
@@ -34,37 +34,10 @@
 
 namespace es2
 {
-struct Varying
-{
-    Varying(GLenum type, const std::string &name, int arraySize, int reg = -1, int col = -1)
-        : type(type), name(name), arraySize(arraySize), reg(reg), col(col)
-    {
-    }
 
-	bool isArray() const
-	{
-		return arraySize >= 1;
-	}
-
-	int size() const   // Unify with es2::Uniform?
-	{
-		return arraySize > 0 ? arraySize : 1;
-	}
-
-    GLenum type;
-    std::string name;
-    int arraySize;
-
-    int reg;    // First varying register, assigned during link
-    int col;    // First register element, assigned during link
-};
-
-typedef std::list<Varying> VaryingList;
-
-class Shader
+class Shader : public sh::Shader
 {
     friend class Program;
-	friend class sh::OutputASM;
 
 public:
     Shader(ResourceManager *manager, GLuint handle);
@@ -84,10 +57,6 @@
     virtual void compile() = 0;
     bool isCompiled();
     
-	virtual sw::Shader *getShader() const = 0;
-	virtual sw::PixelShader *getPixelShader() const;
-	virtual sw::VertexShader *getVertexShader() const;
-
     void addRef();
     void release();
     unsigned int getRefCount() const;
@@ -102,15 +71,11 @@
 	void clear();
 
     static GLenum parseType(const std::string &type);
-    static bool compareVarying(const Varying &x, const Varying &y);
+    static bool compareVarying(const sh::Varying &x, const sh::Varying &y);
 
 	char *mSource;
 	char *mInfoLog;
 
-    VaryingList varyings;
-	sh::ActiveUniforms activeUniforms;
-	sh::ActiveAttributes activeAttributes;
-
 private:
 	const GLuint mHandle;
     unsigned int mRefCount;     // Number of program objects this shader is attached to
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index 03042fa..71573d5 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -940,9 +940,9 @@
 
 	// Packs varyings into generic varying registers, using the algorithm from [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111
 	// Returns the number of used varying registers, or -1 if unsuccesful
-	int Program::packVaryings(const Varying *packing[][4])
+	int Program::packVaryings(const sh::Varying *packing[][4])
 	{
-		for(VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
+		for(sh::VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
 		{
 			int n = VariableRowCount(varying->type) * varying->size();
 			int m = VariableColumnCount(varying->type);
@@ -1087,11 +1087,11 @@
 
 	bool Program::linkVaryings()
 	{
-		for(VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
+		for(sh::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
 		{
 			bool matched = false;
 
-			for(VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
+			for(sh::VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
 			{
 				if(output->name == input->name)
 				{
@@ -1115,12 +1115,12 @@
 			}
 		}
 
-		VaryingList &psVaryings = fragmentShader->varyings;
-		VaryingList &vsVaryings = vertexShader->varyings;
+		sh::VaryingList &psVaryings = fragmentShader->varyings;
+		sh::VaryingList &vsVaryings = vertexShader->varyings;
 
-		for(VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
+		for(sh::VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
 		{
-			for(VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
+			for(sh::VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
 			{
 				if(output->name == input->name)
 				{
diff --git a/src/OpenGL/libGLESv2/Program.h b/src/OpenGL/libGLESv2/Program.h
index dd87fb2..8fedcce 100644
--- a/src/OpenGL/libGLESv2/Program.h
+++ b/src/OpenGL/libGLESv2/Program.h
@@ -133,7 +133,7 @@
 	private:
 		void unlink();
 
-		int packVaryings(const Varying *packing[][4]);
+		int packVaryings(const sh::Varying *packing[][4]);
 		bool linkVaryings();
 
 		bool linkAttributes();
diff --git a/src/OpenGL/libGLESv2/Shader.cpp b/src/OpenGL/libGLESv2/Shader.cpp
index 335427a..fd09672 100644
--- a/src/OpenGL/libGLESv2/Shader.cpp
+++ b/src/OpenGL/libGLESv2/Shader.cpp
@@ -197,16 +197,6 @@
     return getShader() != 0;
 }
 
-sw::PixelShader *Shader::getPixelShader() const
-{
-	return 0;
-}
-
-sw::VertexShader *Shader::getVertexShader() const
-{
-	return 0;
-}
-
 void Shader::addRef()
 {
     mRefCount++;
@@ -279,7 +269,7 @@
 }
 
 // true if varying x has a higher priority in packing than y
-bool Shader::compareVarying(const Varying &x, const Varying &y)
+bool Shader::compareVarying(const sh::Varying &x, const sh::Varying &y)
 {
     if(x.type == y.type)
     {
diff --git a/src/OpenGL/libGLESv2/Shader.h b/src/OpenGL/libGLESv2/Shader.h
index 009d0dd..ce0ce9a 100644
--- a/src/OpenGL/libGLESv2/Shader.h
+++ b/src/OpenGL/libGLESv2/Shader.h
@@ -34,37 +34,10 @@
 
 namespace es2
 {
-struct Varying
-{
-    Varying(GLenum type, const std::string &name, int arraySize, int reg = -1, int col = -1)
-        : type(type), name(name), arraySize(arraySize), reg(reg), col(col)
-    {
-    }
 
-	bool isArray() const
-	{
-		return arraySize >= 1;
-	}
-
-	int size() const   // Unify with es2::Uniform?
-	{
-		return arraySize > 0 ? arraySize : 1;
-	}
-
-    GLenum type;
-    std::string name;
-    int arraySize;
-
-    int reg;    // First varying register, assigned during link
-    int col;    // First register element, assigned during link
-};
-
-typedef std::list<Varying> VaryingList;
-
-class Shader
+class Shader : public sh::Shader
 {
     friend class Program;
-	friend class sh::OutputASM;
 
 public:
     Shader(ResourceManager *manager, GLuint handle);
@@ -84,10 +57,6 @@
     virtual void compile() = 0;
     bool isCompiled();
     
-	virtual sw::Shader *getShader() const = 0;
-	virtual sw::PixelShader *getPixelShader() const;
-	virtual sw::VertexShader *getVertexShader() const;
-
     void addRef();
     void release();
     unsigned int getRefCount() const;
@@ -102,15 +71,11 @@
 	void clear();
 
     static GLenum parseType(const std::string &type);
-    static bool compareVarying(const Varying &x, const Varying &y);
+    static bool compareVarying(const sh::Varying &x, const sh::Varying &y);
 
 	char *mSource;
 	char *mInfoLog;
 
-    VaryingList varyings;
-	sh::ActiveUniforms activeUniforms;
-	sh::ActiveAttributes activeAttributes;
-
 private:
 	const GLuint mHandle;
     unsigned int mRefCount;     // Number of program objects this shader is attached to
diff --git a/src/Radiance/libRAD/Program.cpp b/src/Radiance/libRAD/Program.cpp
index 5639f97..18e8af1 100644
--- a/src/Radiance/libRAD/Program.cpp
+++ b/src/Radiance/libRAD/Program.cpp
@@ -940,9 +940,9 @@
 
 	// Packs varyings into generic varying registers, using the algorithm from [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111
 	// Returns the number of used varying registers, or -1 if unsuccesful
-	int Program::packVaryings(const Varying *packing[][4])
+	int Program::packVaryings(const sh::Varying *packing[][4])
 	{
-		for(VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
+		for(sh::VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
 		{
 			int n = VariableRowCount(varying->type) * varying->size();
 			int m = VariableColumnCount(varying->type);
@@ -1087,11 +1087,11 @@
 
 	bool Program::linkVaryings()
 	{
-		for(VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
+		for(sh::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
 		{
 			bool matched = false;
 
-			for(VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
+			for(sh::VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
 			{
 				if(output->name == input->name)
 				{
@@ -1115,12 +1115,12 @@
 			}
 		}
 
-		VaryingList &psVaryings = fragmentShader->varyings;
-		VaryingList &vsVaryings = vertexShader->varyings;
+		sh::VaryingList &psVaryings = fragmentShader->varyings;
+		sh::VaryingList &vsVaryings = vertexShader->varyings;
 
-		for(VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
+		for(sh::VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
 		{
-			for(VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
+			for(sh::VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
 			{
 				if(output->name == input->name)
 				{
diff --git a/src/Radiance/libRAD/Program.h b/src/Radiance/libRAD/Program.h
index cac95ba..e07f275 100644
--- a/src/Radiance/libRAD/Program.h
+++ b/src/Radiance/libRAD/Program.h
@@ -142,7 +142,7 @@
 	private:
 		void unlink();
 
-		int packVaryings(const Varying *packing[][4]);
+		int packVaryings(const sh::Varying *packing[][4]);
 		bool linkVaryings();
 
 		bool linkAttributes();
diff --git a/src/Radiance/libRAD/Shader.cpp b/src/Radiance/libRAD/Shader.cpp
index 13e3ab3..50ae334 100644
--- a/src/Radiance/libRAD/Shader.cpp
+++ b/src/Radiance/libRAD/Shader.cpp
@@ -197,16 +197,6 @@
     return getShader() != 0;
 }
 
-sw::PixelShader *Shader::getPixelShader() const
-{
-	return 0;
-}
-
-sw::VertexShader *Shader::getVertexShader() const
-{
-	return 0;
-}
-
 void Shader::addRef()
 {
     mRefCount++;
@@ -216,9 +206,9 @@
 {
     mRefCount--;
 
-	if(mRefCount == 0)
-	{
-		delete this;
+	if(mRefCount == 0)
+	{
+		delete this;
 	}
 }
 
@@ -279,7 +269,7 @@
 }
 
 // true if varying x has a higher priority in packing than y
-bool Shader::compareVarying(const Varying &x, const Varying &y)
+bool Shader::compareVarying(const sh::Varying &x, const sh::Varying &y)
 {
     if(x.type == y.type)
     {
diff --git a/src/Radiance/libRAD/Shader.h b/src/Radiance/libRAD/Shader.h
index 2824384..9f910ce 100644
--- a/src/Radiance/libRAD/Shader.h
+++ b/src/Radiance/libRAD/Shader.h
@@ -32,37 +32,10 @@
 
 namespace es2
 {
-struct Varying
-{
-    Varying(GLenum type, const std::string &name, int arraySize, int reg = -1, int col = -1)
-        : type(type), name(name), arraySize(arraySize), reg(reg), col(col)
-    {
-    }
 
-	bool isArray() const
-	{
-		return arraySize >= 1;
-	}
-
-	int size() const   // Unify with es2::Uniform?
-	{
-		return arraySize > 0 ? arraySize : 1;
-	}
-
-    GLenum type;
-    std::string name;
-    int arraySize;
-
-    int reg;    // First varying register, assigned during link
-    int col;    // First register element, assigned during link
-};
-
-typedef std::list<Varying> VaryingList;
-
-class Shader
+class Shader : public sh::Shader
 {
     friend class Program;
-	friend class sh::OutputASM;
 
 public:
     Shader(GLuint handle);
@@ -82,10 +55,6 @@
     virtual void compile() = 0;
     bool isCompiled();
     
-	virtual sw::Shader *getShader() const = 0;
-	virtual sw::PixelShader *getPixelShader() const;
-	virtual sw::VertexShader *getVertexShader() const;
-
     void addRef();
     void release();
     unsigned int getRefCount() const;
@@ -100,15 +69,11 @@
 	void clear();
 
     static GLenum parseType(const std::string &type);
-    static bool compareVarying(const Varying &x, const Varying &y);
+    static bool compareVarying(const sh::Varying &x, const sh::Varying &y);
 
 	char *mSource;
 	char *mInfoLog;
 
-    VaryingList varyings;
-	sh::ActiveUniforms activeUniforms;
-	sh::ActiveAttributes activeAttributes;
-
 private:
 	const GLuint mHandle;
     unsigned int mRefCount;     // Number of program objects this shader is attached to
diff --git a/src/Shader/VertexRoutine.cpp b/src/Shader/VertexRoutine.cpp
index 0e21eee..2b590f4 100644
--- a/src/Shader/VertexRoutine.cpp
+++ b/src/Shader/VertexRoutine.cpp
@@ -47,7 +47,7 @@
 			Pointer<Byte> vertexCache = cache + OFFSET(VertexCache,vertex);
 			Pointer<Byte> tagCache = cache + OFFSET(VertexCache,tag);
 
-			UInt count = *Pointer<UInt>(task+ OFFSET(VertexTask,count));
+			UInt count = *Pointer<UInt>(task + OFFSET(VertexTask,count));
 
 			Registers r(shader);
 			r.data = data;
