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

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

Issue 10440019: Add support for GL_CHROMIUM_pixel_transfer_buffer_object. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 7 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/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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698