• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
program()33   unsigned program() const { return program_; }
initialized()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:
ProgramBinding()57   ProgramBinding() {}
58 
Initialize(ContextProvider * context_provider,TexCoordPrecision precision,SamplerType sampler)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 
vertex_shader()91   const VertexShader& vertex_shader() const { return vertex_shader_; }
fragment_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