blob: 1f556734e804c4875eaa8b0117c1d5b37a34af81 (
plain)
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
// Copyright (c) 2010 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 GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_
#define GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_
#include <map>
#include "base/basictypes.h"
#include "base/ref_counted.h"
#include "base/scoped_ptr.h"
#include "gpu/command_buffer/service/gl_utils.h"
#include "gpu/command_buffer/service/renderbuffer_manager.h"
#include "gpu/command_buffer/service/texture_manager.h"
namespace gpu {
namespace gles2 {
// This class keeps track of the frambebuffers and their attached renderbuffers
// so we can correctly clear them.
class FramebufferManager {
public:
// Info about Framebuffers currently in the system.
class FramebufferInfo : public base::RefCounted<FramebufferInfo> {
public:
typedef scoped_refptr<FramebufferInfo> Ref;
class Attachment : public base::RefCounted<Attachment> {
public:
typedef scoped_refptr<Attachment> Ref;
virtual ~Attachment() { }
virtual GLsizei width() const = 0;
virtual GLsizei height() const = 0;
virtual GLenum internal_format() const = 0;
virtual GLsizei samples() const = 0;
virtual bool cleared() const = 0;
virtual void set_cleared() = 0;
};
explicit FramebufferInfo(GLuint service_id);
GLuint service_id() const {
return service_id_;
}
bool HasUnclearedAttachment(GLenum attachment) const;
// Attaches a renderbuffer to a particlar attachment.
// Pass null to detach.
void AttachRenderbuffer(
GLenum attachment, RenderbufferManager::RenderbufferInfo* renderbuffer);
// Attaches a texture to a particlar attachment. Pass null to detach.
void AttachTexture(
GLenum attachment, TextureManager::TextureInfo* texture, GLenum target,
GLint level);
void MarkAttachedRenderbuffersAsCleared();
const Attachment* GetAttachment(GLenum attachment) const;
bool IsDeleted() const {
return service_id_ == 0;
}
void MarkAsValid() {
has_been_bound_ = true;
}
bool IsValid() const {
return has_been_bound_ && !IsDeleted();
}
// We can't know if the frame buffer is complete since that is
// implementation dependent and we'd have to check after every glTexImage
// call but we can know in certain cases that it's NOT complete which we
// need to enforce the OpenGL ES 2.0 spec on top of DesktopGL.
bool IsNotComplete() const;
private:
friend class FramebufferManager;
friend class base::RefCounted<FramebufferInfo>;
~FramebufferInfo();
void MarkAsDeleted() {
service_id_ = 0;
attachments_.clear();
}
// Service side framebuffer id.
GLuint service_id_;
// Whether this framebuffer has ever been bound.
bool has_been_bound_;
// A map of attachments.
typedef std::map<GLenum, Attachment::Ref> AttachmentMap;
AttachmentMap attachments_;
DISALLOW_COPY_AND_ASSIGN(FramebufferInfo);
};
FramebufferManager();
~FramebufferManager();
// Must call before destruction.
void Destroy(bool have_context);
// Creates a FramebufferInfo for the given framebuffer.
void CreateFramebufferInfo(GLuint client_id, GLuint service_id);
// Gets the framebuffer info for the given framebuffer.
FramebufferInfo* GetFramebufferInfo(GLuint client_id);
// Removes a framebuffer info for the given framebuffer.
void RemoveFramebufferInfo(GLuint client_id);
// Gets a client id for a given service id.
bool GetClientId(GLuint service_id, GLuint* client_id) const;
private:
// Info for each framebuffer in the system.
// TODO(gman): Choose a faster container.
typedef std::map<GLuint, FramebufferInfo::Ref> FramebufferInfoMap;
FramebufferInfoMap framebuffer_infos_;
DISALLOW_COPY_AND_ASSIGN(FramebufferManager);
};
} // namespace gles2
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_
|