1 // Copyright 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CC_OUTPUT_PROGRAM_BINDING_H_ 6 #define CC_OUTPUT_PROGRAM_BINDING_H_ 7 8 #include <string> 9 10 #include "base/logging.h" 11 #include "cc/output/context_provider.h" 12 #include "cc/output/shader.h" 13 14 namespace gpu { 15 namespace gles2 { 16 class GLES2Interface; 17 } 18 } 19 20 namespace cc { 21 22 class ProgramBindingBase { 23 public: 24 ProgramBindingBase(); 25 ~ProgramBindingBase(); 26 27 bool Init(gpu::gles2::GLES2Interface* context, 28 const std::string& vertex_shader, 29 const std::string& fragment_shader); 30 bool Link(gpu::gles2::GLES2Interface* context); 31 void Cleanup(gpu::gles2::GLES2Interface* context); 32 33 unsigned program() const { return program_; } 34 bool initialized() const { return initialized_; } 35 36 protected: 37 unsigned LoadShader(gpu::gles2::GLES2Interface* context, 38 unsigned type, 39 const std::string& shader_source); 40 unsigned CreateShaderProgram(gpu::gles2::GLES2Interface* context, 41 unsigned vertex_shader, 42 unsigned fragment_shader); 43 void CleanupShaders(gpu::gles2::GLES2Interface* context); 44 45 unsigned program_; 46 unsigned vertex_shader_id_; 47 unsigned fragment_shader_id_; 48 bool initialized_; 49 50 private: 51 DISALLOW_COPY_AND_ASSIGN(ProgramBindingBase); 52 }; 53 54 template <class VertexShader, class FragmentShader> 55 class ProgramBinding : public ProgramBindingBase { 56 public: 57 ProgramBinding() {} 58 59 void Initialize(ContextProvider* context_provider, 60 TexCoordPrecision precision, 61 SamplerType sampler) { 62 DCHECK(context_provider); 63 DCHECK(!initialized_); 64 65 if (context_provider->IsContextLost()) 66 return; 67 68 if (!ProgramBindingBase::Init( 69 context_provider->ContextGL(), 70 vertex_shader_.GetShaderString(), 71 fragment_shader_.GetShaderString(precision, sampler))) { 72 DCHECK(context_provider->IsContextLost()); 73 return; 74 } 75 76 int base_uniform_index = 0; 77 vertex_shader_.Init(context_provider->ContextGL(), 78 program_, &base_uniform_index); 79 fragment_shader_.Init(context_provider->ContextGL(), 80 program_, &base_uniform_index); 81 82 // Link after binding uniforms 83 if (!Link(context_provider->ContextGL())) { 84 DCHECK(context_provider->IsContextLost()); 85 return; 86 } 87 88 initialized_ = true; 89 } 90 91 const VertexShader& vertex_shader() const { return vertex_shader_; } 92 const FragmentShader& fragment_shader() const { return fragment_shader_; } 93 94 private: 95 VertexShader vertex_shader_; 96 FragmentShader fragment_shader_; 97 98 DISALLOW_COPY_AND_ASSIGN(ProgramBinding); 99 }; 100 101 } // namespace cc 102 103 #endif // CC_OUTPUT_PROGRAM_BINDING_H_ 104