#ifndef ProgramBinding_h
#define ProgramBinding_h
#if USE(ACCELERATED_COMPOSITING)
#include "PlatformString.h"
namespace WebCore {
class GraphicsContext3D;
class ProgramBindingBase {
public:
explicit ProgramBindingBase(GraphicsContext3D*);
~ProgramBindingBase();
bool init(const String& vertexShader, const String& fragmentShader);
unsigned program() const { return m_program; }
bool initialized() const { return m_initialized; }
protected:
unsigned loadShader(unsigned type, const String& shaderSource);
unsigned createShaderProgram(const String& vertexShaderSource, const String& fragmentShaderSource);
GraphicsContext3D* m_context;
unsigned m_program;
bool m_initialized;
};
template<class VertexShader, class FragmentShader>
class ProgramBinding : public ProgramBindingBase {
public:
explicit ProgramBinding(GraphicsContext3D* context)
: ProgramBindingBase(context)
{
if (!ProgramBindingBase::init(m_vertexShader.getShaderString(), m_fragmentShader.getShaderString()))
return;
if (!m_vertexShader.init(m_context, m_program))
return;
if (!m_fragmentShader.init(m_context, m_program))
return;
m_initialized = true;
}
const VertexShader& vertexShader() const { return m_vertexShader; }
const FragmentShader& fragmentShader() const { return m_fragmentShader; }
private:
VertexShader m_vertexShader;
FragmentShader m_fragmentShader;
};
}
#endif // USE(ACCELERATED_COMPOSITING)
#endif