| OLD | NEW |
| 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 Loading... |
| 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 |
| OLD | NEW |