Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Side by Side Diff: gpu/command_buffer/service/texture_definition.cc

Issue 12717013: Add reference-counting for mailbox textures. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add optional 'pool' reference while textures are in mailbox Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/texture_definition.h" 5 #include "gpu/command_buffer/service/texture_definition.h"
6 #include "gpu/command_buffer/service/gl_utils.h"
6 7
7 namespace gpu { 8 namespace gpu {
8 namespace gles2 { 9 namespace gles2 {
9 10
11 namespace {
12
13 static const TextureDefinition::LevelInfo kEmptyLevel2D =
14 TextureDefinition::LevelInfo(GL_TEXTURE_2D,
15 GL_RGBA,
16 0,
17 0,
18 1,
19 0,
20 GL_RGBA,
21 GL_UNSIGNED_BYTE,
22 true);
23
24 static const TextureDefinition::LevelInfos kEmpty2DLevelInfos =
25 TextureDefinition::LevelInfos(
26 1,
27 std::vector<TextureDefinition::LevelInfo>(1, kEmptyLevel2D));
28
29 } // anonymous namespace
30
31 TextureDefinition TextureDefinition::kEmptyTexture2D =
32 TextureDefinition(GL_TEXTURE_2D,
33 0,
34 GL_LINEAR,
35 GL_LINEAR,
36 GL_CLAMP_TO_EDGE,
37 GL_CLAMP_TO_EDGE,
38 GL_NONE,
39 true,
40 kEmpty2DLevelInfos);
41
42 // TODO: Remove before checkin... just for testing
43 std::set<GLuint> TextureDefinition::shared_texture_ids_;
44
45 void TextureDefinition::Client::StartUsingSharedTexture(
46 TextureDefinition* definition) const {
47 DCHECK(definition->active_clients_.find(this) ==
48 definition->active_clients_.end());
49 definition->active_clients_.insert(this);
50 if (definition->client_transferred_from_) {
51 bool deleted = definition->client_transferred_from_
52 ->StopUsingSharedTexture(definition, false);
53 DCHECK(!deleted);
54 definition->client_transferred_from_ = NULL;
55 }
56 }
57
58 bool TextureDefinition::Client::StopUsingSharedTexture(
59 TextureDefinition* definition,
60 bool delete_texture) const {
61 size_t num_erased = definition->active_clients_.erase(this);
62 DCHECK(num_erased);
63
64 if (definition->active_clients_.empty()) {
65 definition->ReleaseServiceId(delete_texture);
66 delete definition;
67 return true;
68 }
69
70 return false;
71 }
72
73 void TextureDefinition::Client::StartSharedTextureTransfer(
74 TextureDefinition* definition) const {
75 definition->client_transferred_from_ = this;
76 }
77
10 TextureDefinition::LevelInfo::LevelInfo(GLenum target, 78 TextureDefinition::LevelInfo::LevelInfo(GLenum target,
11 GLenum internal_format, 79 GLenum internal_format,
12 GLsizei width, 80 GLsizei width,
13 GLsizei height, 81 GLsizei height,
14 GLsizei depth, 82 GLsizei depth,
15 GLint border, 83 GLint border,
16 GLenum format, 84 GLenum format,
17 GLenum type, 85 GLenum type,
18 bool cleared) 86 bool cleared)
19 : target(target), 87 : target(target),
(...skipping 29 matching lines...) Expand all
49 bool immutable, 117 bool immutable,
50 const LevelInfos& level_infos) 118 const LevelInfos& level_infos)
51 : target_(target), 119 : target_(target),
52 service_id_(service_id), 120 service_id_(service_id),
53 min_filter_(min_filter), 121 min_filter_(min_filter),
54 mag_filter_(mag_filter), 122 mag_filter_(mag_filter),
55 wrap_s_(wrap_s), 123 wrap_s_(wrap_s),
56 wrap_t_(wrap_t), 124 wrap_t_(wrap_t),
57 usage_(usage), 125 usage_(usage),
58 immutable_(immutable), 126 immutable_(immutable),
59 level_infos_(level_infos) { 127 level_infos_(level_infos),
128 client_transferred_from_(NULL) {
129 DCHECK(shared_texture_ids_.find(service_id) == shared_texture_ids_.end());
130 if (service_id)
131 shared_texture_ids_.insert(service_id);
60 } 132 }
61 133
62 TextureDefinition::~TextureDefinition() { 134 TextureDefinition::~TextureDefinition() {
135 FOR_EACH_OBSERVER(Observer, observers_, OnDestroySharedTexture(this));
63 DCHECK_EQ(0U, service_id_) << "TextureDefinition leaked texture."; 136 DCHECK_EQ(0U, service_id_) << "TextureDefinition leaked texture.";
64 } 137 }
65 138
66 GLuint TextureDefinition::ReleaseServiceId() { 139 GLuint TextureDefinition::ReleaseServiceId(bool delete_texture) {
140 if (service_id_)
141 shared_texture_ids_.erase(service_id_);
142
67 GLuint service_id = service_id_; 143 GLuint service_id = service_id_;
144 if (delete_texture)
145 glDeleteTextures(1, &service_id);
68 service_id_ = 0; 146 service_id_ = 0;
69 return service_id; 147 return service_id;
70 } 148 }
71 149
150 void TextureDefinition::AddObserver(Observer* observer) {
151 observers_.AddObserver(observer);
152 }
153
154 void TextureDefinition::RemoveObserver(Observer* observer) {
155 observers_.RemoveObserver(observer);
156 }
157
72 } // namespace gles2 158 } // namespace gles2
73 } // namespace gpu 159 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/texture_definition.h ('k') | gpu/command_buffer/service/texture_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698