 Chromium Code Reviews
 Chromium Code Reviews| 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/buffer_manager.h" | 5 #include "gpu/command_buffer/service/buffer_manager.h" | 
| 6 #include "base/debug/trace_event.h" | 6 #include "base/debug/trace_event.h" | 
| 7 #include "base/logging.h" | 7 #include "base/logging.h" | 
| 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 
| 9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 
| 10 | 10 | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 UpdateMemRepresented(); | 72 UpdateMemRepresented(); | 
| 73 } | 73 } | 
| 74 | 74 | 
| 75 BufferManager::BufferInfo::BufferInfo(BufferManager* manager, GLuint service_id) | 75 BufferManager::BufferInfo::BufferInfo(BufferManager* manager, GLuint service_id) | 
| 76 : manager_(manager), | 76 : manager_(manager), | 
| 77 deleted_(false), | 77 deleted_(false), | 
| 78 service_id_(service_id), | 78 service_id_(service_id), | 
| 79 target_(0), | 79 target_(0), | 
| 80 size_(0), | 80 size_(0), | 
| 81 usage_(GL_STATIC_DRAW), | 81 usage_(GL_STATIC_DRAW), | 
| 82 shadowed_(false) { | 82 shadowed_(false), | 
| 83 shm_id_(0), | |
| 84 shm_offset_(0) { | |
| 83 manager_->StartTracking(this); | 85 manager_->StartTracking(this); | 
| 84 } | 86 } | 
| 85 | 87 | 
| 86 BufferManager::BufferInfo::~BufferInfo() { | 88 BufferManager::BufferInfo::~BufferInfo() { | 
| 87 if (manager_) { | 89 if (manager_) { | 
| 88 if (manager_->have_context_) { | 90 if (manager_->have_context_) { | 
| 89 GLuint id = service_id(); | 91 GLuint id = service_id(); | 
| 90 glDeleteBuffersARB(1, &id); | 92 glDeleteBuffersARB(1, &id); | 
| 91 } | 93 } | 
| 92 manager_->StopTracking(this); | 94 manager_->StopTracking(this); | 
| 93 manager_ = NULL; | 95 manager_ = NULL; | 
| 94 } | 96 } | 
| 95 } | 97 } | 
| 96 | 98 | 
| 97 void BufferManager::BufferInfo::SetInfo( | 99 void BufferManager::BufferInfo::SetInfo( | 
| 98 GLsizeiptr size, GLenum usage, bool shadow) { | 100 GLsizeiptr size, GLenum usage, bool shadow) { | 
| 99 usage_ = usage; | 101 usage_ = usage; | 
| 100 if (size != size_ || shadow != shadowed_) { | 102 shm_id_ = 0; | 
| 103 shm_offset_ = 0; | |
| 104 if (size != size_ || shadow != shadowed_ || decoder_.get()) { | |
| 101 shadowed_ = shadow; | 105 shadowed_ = shadow; | 
| 102 size_ = size; | 106 size_ = size; | 
| 103 ClearCache(); | 107 ClearCache(); | 
| 104 if (shadowed_) { | 108 if (shadowed_) { | 
| 105 shadow_.reset(new int8[size]); | 109 shadow_.reset(new int8[size]); | 
| 106 memset(shadow_.get(), 0, size); | 110 memset(shadow_.get(), 0, size); | 
| 107 } | 111 } | 
| 112 decoder_.reset(); | |
| 108 } | 113 } | 
| 109 } | 114 } | 
| 110 | 115 | 
| 116 void BufferManager::BufferInfo::SetInfo( | |
| 117 GLsizeiptr size, GLenum usage, CommonDecoder* decoder, int32 shm_id, | |
| 118 uint32 shm_offset) { | |
| 119 usage_ = usage; | |
| 120 shm_id_ = shm_id; | |
| 121 shm_offset_ = shm_offset; | |
| 122 if (size != size_ || shadowed_ || decoder_.get() != decoder) { | |
| 123 size_ = size; | |
| 124 ClearCache(); | |
| 125 if (shadowed_) { | |
| 126 shadow_.reset(); | |
| 127 shadowed_ = false; | |
| 128 } | |
| 129 decoder_ = decoder->AsWeakPtr(); | |
| 130 } | |
| 131 } | |
| 132 | |
| 111 bool BufferManager::BufferInfo::SetRange( | 133 bool BufferManager::BufferInfo::SetRange( | 
| 112 GLintptr offset, GLsizeiptr size, const GLvoid * data) { | 134 GLintptr offset, GLsizeiptr size, const GLvoid * data) { | 
| 113 if (offset < 0 || offset + size < offset || offset + size > size_) { | 135 if (offset < 0 || offset + size < offset || offset + size > size_) { | 
| 114 return false; | 136 return false; | 
| 115 } | 137 } | 
| 116 if (shadowed_) { | 138 if (shadowed_) { | 
| 117 memcpy(shadow_.get() + offset, data, size); | 139 memcpy(shadow_.get() + offset, data, size); | 
| 118 ClearCache(); | 140 ClearCache(); | 
| 119 } | 141 } | 
| 142 if (decoder_) { | |
| 143 int8* shm_data = decoder_->GetSharedMemoryAs<int8*>( | |
| 
greggman
2012/05/24 20:56:00
I'm confused. Why would you need to copy memory in
 
reveman
2012/05/25 15:45:10
This is for when a client calls glBufferSubData, w
 | |
| 144 shm_id_, shm_offset_, size_); | |
| 145 if (shm_data) | |
| 146 memcpy(shm_data + offset, data, size); | |
| 147 } | |
| 120 return true; | 148 return true; | 
| 121 } | 149 } | 
| 122 | 150 | 
| 123 const void* BufferManager::BufferInfo::GetRange( | 151 const void* BufferManager::BufferInfo::GetRange( | 
| 124 GLintptr offset, GLsizeiptr size) const { | 152 GLintptr offset, GLsizeiptr size) const { | 
| 125 if (!shadowed_) { | |
| 126 return NULL; | |
| 127 } | |
| 128 if (offset < 0 || offset + size < offset || offset + size > size_) { | 153 if (offset < 0 || offset + size < offset || offset + size > size_) { | 
| 129 return NULL; | 154 return NULL; | 
| 130 } | 155 } | 
| 131 return shadow_.get() + offset; | 156 if (shadowed_) { | 
| 157 return shadow_.get() + offset; | |
| 158 } | |
| 159 if (decoder_) { | |
| 
greggman
2012/05/24 20:56:00
If this is a shared memory buffer should this go b
 
reveman
2012/05/25 15:45:10
Doesn't really matter as making a buffer a shm buf
 | |
| 160 int8* shm_data = decoder_->GetSharedMemoryAs<int8*>( | |
| 161 shm_id_, shm_offset_, size_); | |
| 162 if (!shm_data) | |
| 163 return NULL; | |
| 164 return shm_data + offset; | |
| 165 } | |
| 166 return NULL; | |
| 132 } | 167 } | 
| 133 | 168 | 
| 134 void BufferManager::BufferInfo::ClearCache() { | 169 void BufferManager::BufferInfo::ClearCache() { | 
| 135 range_set_.clear(); | 170 range_set_.clear(); | 
| 136 } | 171 } | 
| 137 | 172 | 
| 138 template <typename T> | 173 template <typename T> | 
| 139 GLuint GetMaxValue(const void* data, GLuint offset, GLsizei count) { | 174 GLuint GetMaxValue(const void* data, GLuint offset, GLsizei count) { | 
| 140 GLuint max_value = 0; | 175 GLuint max_value = 0; | 
| 141 const T* element = reinterpret_cast<const T*>( | 176 const T* element = reinterpret_cast<const T*>( | 
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 BufferManager::BufferInfo* info, GLsizeiptr size, GLenum usage) { | 256 BufferManager::BufferInfo* info, GLsizeiptr size, GLenum usage) { | 
| 222 DCHECK(info); | 257 DCHECK(info); | 
| 223 mem_represented_ -= info->size(); | 258 mem_represented_ -= info->size(); | 
| 224 info->SetInfo(size, | 259 info->SetInfo(size, | 
| 225 usage, | 260 usage, | 
| 226 info->target() == GL_ELEMENT_ARRAY_BUFFER || | 261 info->target() == GL_ELEMENT_ARRAY_BUFFER || | 
| 227 allow_buffers_on_multiple_targets_); | 262 allow_buffers_on_multiple_targets_); | 
| 228 mem_represented_ += info->size(); | 263 mem_represented_ += info->size(); | 
| 229 } | 264 } | 
| 230 | 265 | 
| 266 void BufferManager::SetInfo( | |
| 267 BufferManager::BufferInfo* info, GLsizeiptr size, GLenum usage, | |
| 268 CommonDecoder* decoder, int32 shm_id, uint32 shm_offset) { | |
| 269 DCHECK(info); | |
| 270 mem_represented_ -= info->size(); | |
| 271 info->SetInfo(size, usage, decoder, shm_id, shm_offset); | |
| 272 mem_represented_ += info->size(); | |
| 273 } | |
| 274 | |
| 231 bool BufferManager::SetTarget(BufferManager::BufferInfo* info, GLenum target) { | 275 bool BufferManager::SetTarget(BufferManager::BufferInfo* info, GLenum target) { | 
| 232 // Check that we are not trying to bind it to a different target. | 276 // Check that we are not trying to bind it to a different target. | 
| 233 if (info->target() != 0 && info->target() != target && | 277 if (info->target() != 0 && info->target() != target && | 
| 234 !allow_buffers_on_multiple_targets_) { | 278 !allow_buffers_on_multiple_targets_) { | 
| 235 return false; | 279 return false; | 
| 236 } | 280 } | 
| 237 if (info->target() == 0) { | 281 if (info->target() == 0) { | 
| 238 info->set_target(target); | 282 info->set_target(target); | 
| 239 } | 283 } | 
| 240 return true; | 284 return true; | 
| 241 } | 285 } | 
| 242 | 286 | 
| 243 } // namespace gles2 | 287 } // namespace gles2 | 
| 244 } // namespace gpu | 288 } // namespace gpu | 
| 245 | 289 | 
| 246 | 290 | 
| OLD | NEW |