#ifndef ProgramBinding_h
#define ProgramBinding_h
#if USE(ACCELERATED_COMPOSITING)
#include "PlatformString.h"
#include "TraceEvent.h"
namespace WebCore {
class GraphicsContext3D;
class ProgramBindingBase {
public:
ProgramBindingBase();
~ProgramBindingBase();
void init(GraphicsContext3D*, const String& vertexShader, const String& fragmentShader);
void cleanup(GraphicsContext3D*);
unsigned program() const { ASSERT(m_initialized); return m_program; }
bool initialized() const { return m_initialized; }
protected:
unsigned loadShader(GraphicsContext3D*, unsigned type, const String& shaderSource);
unsigned createShaderProgram(GraphicsContext3D*, const String& vertexShaderSource, const String& fragmentShaderSource);
unsigned m_program;
bool m_initialized;
};
template<class VertexShader, class FragmentShader>
class ProgramBinding : public ProgramBindingBase {
public:
explicit ProgramBinding(GraphicsContext3D* context)
{
ProgramBindingBase::init(context, m_vertexShader.getShaderString(), m_fragmentShader.getShaderString());
}
void initialize(GraphicsContext3D* context)
{
ASSERT(context);
ASSERT(m_program);
ASSERT(!m_initialized);
m_vertexShader.init(context, m_program);
m_fragmentShader.init(context, m_program);
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