// Copyright 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CC_OUTPUT_PROGRAM_BINDING_H_ #define CC_OUTPUT_PROGRAM_BINDING_H_ #include #include "base/logging.h" #include "cc/output/shader.h" namespace WebKit { class WebGraphicsContext3D; } namespace cc { class ProgramBindingBase { public: ProgramBindingBase(); ~ProgramBindingBase(); void Init(WebKit::WebGraphicsContext3D* context, const std::string& vertex_shader, const std::string& fragment_shader); void Link(WebKit::WebGraphicsContext3D* context); void Cleanup(WebKit::WebGraphicsContext3D* context); unsigned program() const { return program_; } bool initialized() const { return initialized_; } protected: unsigned LoadShader(WebKit::WebGraphicsContext3D* context, unsigned type, const std::string& shader_source); unsigned CreateShaderProgram(WebKit::WebGraphicsContext3D* context, unsigned vertex_shader, unsigned fragment_shader); void CleanupShaders(WebKit::WebGraphicsContext3D* context); bool IsContextLost(WebKit::WebGraphicsContext3D* context); unsigned program_; unsigned vertex_shader_id_; unsigned fragment_shader_id_; bool initialized_; private: DISALLOW_COPY_AND_ASSIGN(ProgramBindingBase); }; template class ProgramBinding : public ProgramBindingBase { public: explicit ProgramBinding(WebKit::WebGraphicsContext3D* context, TexCoordPrecision precision) { ProgramBindingBase::Init( context, vertex_shader_.GetShaderString(), fragment_shader_.GetShaderString(precision)); } void Initialize(WebKit::WebGraphicsContext3D* context, bool using_bind_uniform) { DCHECK(context); DCHECK(!initialized_); if (IsContextLost(context)) return; // Need to bind uniforms before linking if (!using_bind_uniform) Link(context); int base_uniform_index = 0; vertex_shader_.Init( context, program_, using_bind_uniform, &base_uniform_index); fragment_shader_.Init( context, program_, using_bind_uniform, &base_uniform_index); // Link after binding uniforms if (using_bind_uniform) Link(context); initialized_ = true; } const VertexShader& vertex_shader() const { return vertex_shader_; } const FragmentShader& fragment_shader() const { return fragment_shader_; } private: VertexShader vertex_shader_; FragmentShader fragment_shader_; DISALLOW_COPY_AND_ASSIGN(ProgramBinding); }; } // namespace cc #endif // CC_OUTPUT_PROGRAM_BINDING_H_