1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
// 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 ProgramBinding_h
#define ProgramBinding_h
#include <string>
#include "base/logging.h"
namespace WebKit {
class WebGraphicsContext3D;
}
namespace cc {
class ProgramBindingBase {
public:
ProgramBindingBase();
~ProgramBindingBase();
void init(WebKit::WebGraphicsContext3D*, const std::string& vertexShader, const std::string& fragmentShader);
void link(WebKit::WebGraphicsContext3D*);
void cleanup(WebKit::WebGraphicsContext3D*);
unsigned program() const { DCHECK(m_initialized); return m_program; }
bool initialized() const { return m_initialized; }
protected:
unsigned loadShader(WebKit::WebGraphicsContext3D*, unsigned type, const std::string& shaderSource);
unsigned createShaderProgram(WebKit::WebGraphicsContext3D*, unsigned vertexShader, unsigned fragmentShader);
void cleanupShaders(WebKit::WebGraphicsContext3D*);
unsigned m_program;
unsigned m_vertexShaderId;
unsigned m_fragmentShaderId;
bool m_initialized;
};
template<class VertexShader, class FragmentShader>
class ProgramBinding : public ProgramBindingBase {
public:
explicit ProgramBinding(WebKit::WebGraphicsContext3D* context)
{
ProgramBindingBase::init(context, m_vertexShader.getShaderString(), m_fragmentShader.getShaderString());
}
void initialize(WebKit::WebGraphicsContext3D* context, bool usingBindUniform)
{
DCHECK(context);
DCHECK(m_program);
DCHECK(!m_initialized);
// Need to bind uniforms before linking
if (!usingBindUniform)
link(context);
int baseUniformIndex = 0;
m_vertexShader.init(context, m_program, usingBindUniform, &baseUniformIndex);
m_fragmentShader.init(context, m_program, usingBindUniform, &baseUniformIndex);
// Link after binding uniforms
if (usingBindUniform)
link(context);
m_initialized = true;
}
const VertexShader& vertexShader() const { return m_vertexShader; }
const FragmentShader& fragmentShader() const { return m_fragmentShader; }
private:
VertexShader m_vertexShader;
FragmentShader m_fragmentShader;
};
} // namespace cc
#endif
|