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

Unified Diff: gpu/command_buffer/service/indexed_buffer_binding_host.cc

Issue 1949303003: Improve indexed gl state related GL commands. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@tex
Patch Set: fix a DCHECK failure Created 4 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 side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/indexed_buffer_binding_host.cc
diff --git a/gpu/command_buffer/service/indexed_buffer_binding_host.cc b/gpu/command_buffer/service/indexed_buffer_binding_host.cc
index e093e1dd0c3e4cde3d6bd1bcce7118cd23ac18f7..fb5c11ba94c0fd9b79c5f8b574fca39422f15cba 100644
--- a/gpu/command_buffer/service/indexed_buffer_binding_host.cc
+++ b/gpu/command_buffer/service/indexed_buffer_binding_host.cc
@@ -28,6 +28,19 @@ IndexedBufferBindingHost::IndexedBufferBinding::IndexedBufferBinding(
IndexedBufferBindingHost::IndexedBufferBinding::~IndexedBufferBinding() {
}
+bool IndexedBufferBindingHost::IndexedBufferBinding::operator==(
+ const IndexedBufferBindingHost::IndexedBufferBinding& other) const {
+ if (type == kBindBufferNone && other.type == kBindBufferNone) {
+ // This should be the most common case so an early out.
+ return true;
+ }
+ return (type == other.type &&
+ buffer.get() == other.buffer.get() &&
+ offset == other.offset &&
+ size == other.size &&
+ effective_full_buffer_size == other.effective_full_buffer_size);
+}
+
void IndexedBufferBindingHost::IndexedBufferBinding::SetBindBufferBase(
Buffer* _buffer) {
if (!_buffer) {
@@ -65,7 +78,8 @@ void IndexedBufferBindingHost::IndexedBufferBinding::Reset() {
IndexedBufferBindingHost::IndexedBufferBindingHost(
uint32_t max_bindings, bool needs_emulation)
- : needs_emulation_(needs_emulation) {
+ : needs_emulation_(needs_emulation),
+ max_non_null_binding_index_plus_one_(0u) {
buffer_bindings_.resize(max_bindings);
}
@@ -79,6 +93,7 @@ void IndexedBufferBindingHost::DoBindBufferBase(
glBindBufferBase(target, index, service_id);
buffer_bindings_[index].SetBindBufferBase(buffer);
+ UpdateMaxNonNullBindingIndex(index);
}
void IndexedBufferBindingHost::DoBindBufferRange(
@@ -94,6 +109,7 @@ void IndexedBufferBindingHost::DoBindBufferRange(
}
buffer_bindings_[index].SetBindBufferRange(buffer, offset, size);
+ UpdateMaxNonNullBindingIndex(index);
}
// static
@@ -164,6 +180,7 @@ void IndexedBufferBindingHost::RemoveBoundBuffer(Buffer* buffer) {
for (size_t ii = 0; ii < buffer_bindings_.size(); ++ii) {
if (buffer_bindings_[ii].buffer.get() == buffer) {
buffer_bindings_[ii].Reset();
+ UpdateMaxNonNullBindingIndex(ii);
}
}
}
@@ -183,5 +200,49 @@ GLintptr IndexedBufferBindingHost::GetBufferStart(GLuint index) const {
return buffer_bindings_[index].offset;
}
+void IndexedBufferBindingHost::RestoreBindings(
+ IndexedBufferBindingHost* prev) {
+ size_t limit = max_non_null_binding_index_plus_one_;
+ if (prev && prev->max_non_null_binding_index_plus_one_ > limit) {
+ limit = prev->max_non_null_binding_index_plus_one_;
+ }
+ for (size_t ii = 0; ii < limit; ++ii) {
+ if (prev && buffer_bindings_[ii] == prev->buffer_bindings_[ii]) {
+ continue;
+ }
+ switch (buffer_bindings_[ii].type) {
+ case kBindBufferBase:
+ case kBindBufferNone:
+ DoBindBufferBase(
+ GL_UNIFORM_BUFFER, ii, buffer_bindings_[ii].buffer.get());
+ break;
+ case kBindBufferRange:
+ DoBindBufferRange(
+ GL_UNIFORM_BUFFER, ii, buffer_bindings_[ii].buffer.get(),
+ buffer_bindings_[ii].offset, buffer_bindings_[ii].size);
+ break;
+ }
+ }
+}
+
+void IndexedBufferBindingHost::UpdateMaxNonNullBindingIndex(
+ size_t changed_index) {
+ size_t plus_one = changed_index + 1;
+ DCHECK_LT(changed_index, buffer_bindings_.size());
+ if (buffer_bindings_[changed_index].buffer.get()) {
+ max_non_null_binding_index_plus_one_ =
+ std::max(max_non_null_binding_index_plus_one_, plus_one);
+ } else {
+ if (plus_one == max_non_null_binding_index_plus_one_) {
+ for (size_t ii = changed_index; ii > 0; --ii) {
+ if (buffer_bindings_[ii - 1].buffer.get()) {
+ max_non_null_binding_index_plus_one_ = ii;
+ break;
+ }
+ }
+ }
+ }
+}
+
} // namespace gles2
} // namespace gpu

Powered by Google App Engine
This is Rietveld 408576698