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 |