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

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

Issue 8341128: Defer clearing textures and renderbuffers (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix one more unit test Created 9 years, 1 month 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/renderbuffer_manager.h" 5 #include "gpu/command_buffer/service/renderbuffer_manager.h"
6 #include "base/logging.h" 6 #include "base/logging.h"
7 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 7 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
8 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 8 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
9 9
10 namespace gpu { 10 namespace gpu {
11 namespace gles2 { 11 namespace gles2 {
12 12
13 RenderbufferManager::RenderbufferManager( 13 RenderbufferManager::RenderbufferManager(
14 GLint max_renderbuffer_size, GLint max_samples) 14 GLint max_renderbuffer_size, GLint max_samples)
15 : max_renderbuffer_size_(max_renderbuffer_size), 15 : max_renderbuffer_size_(max_renderbuffer_size),
16 max_samples_(max_samples) { 16 max_samples_(max_samples),
17 num_uncleared_renderbuffers_(0) {
17 } 18 }
18 19
19 RenderbufferManager::~RenderbufferManager() { 20 RenderbufferManager::~RenderbufferManager() {
20 DCHECK(renderbuffer_infos_.empty()); 21 DCHECK(renderbuffer_infos_.empty());
21 } 22 }
22 23
23 void RenderbufferManager::Destroy(bool have_context) { 24 void RenderbufferManager::Destroy(bool have_context) {
24 while (!renderbuffer_infos_.empty()) { 25 while (!renderbuffer_infos_.empty()) {
25 if (have_context) { 26 if (have_context) {
26 RenderbufferInfo* info = renderbuffer_infos_.begin()->second; 27 RenderbufferInfo* info = renderbuffer_infos_.begin()->second;
27 if (!info->IsDeleted()) { 28 if (!info->IsDeleted()) {
28 GLuint service_id = info->service_id(); 29 GLuint service_id = info->service_id();
29 glDeleteRenderbuffersEXT(1, &service_id); 30 glDeleteRenderbuffersEXT(1, &service_id);
30 info->MarkAsDeleted(); 31 info->MarkAsDeleted();
31 } 32 }
32 } 33 }
33 renderbuffer_infos_.erase(renderbuffer_infos_.begin()); 34 renderbuffer_infos_.erase(renderbuffer_infos_.begin());
34 } 35 }
35 } 36 }
36 37
38 void RenderbufferManager::SetInfo(
39 RenderbufferInfo* renderbuffer,
40 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {
41 DCHECK(renderbuffer);
42 if (!renderbuffer->cleared()) {
43 --num_uncleared_renderbuffers_;
44 }
45 renderbuffer->SetInfo(samples, internalformat, width, height);
46 if (!renderbuffer->cleared()) {
47 ++num_uncleared_renderbuffers_;
48 }
49 }
50
51 void RenderbufferManager::SetCleared(RenderbufferInfo* renderbuffer) {
52 DCHECK(renderbuffer);
53 if (!renderbuffer->cleared()) {
54 --num_uncleared_renderbuffers_;
55 }
56 renderbuffer->set_cleared();
57 if (!renderbuffer->cleared()) {
58 ++num_uncleared_renderbuffers_;
59 }
60 }
61
37 void RenderbufferManager::CreateRenderbufferInfo( 62 void RenderbufferManager::CreateRenderbufferInfo(
38 GLuint client_id, GLuint service_id) { 63 GLuint client_id, GLuint service_id) {
64 RenderbufferInfo::Ref info(new RenderbufferInfo(service_id));
39 std::pair<RenderbufferInfoMap::iterator, bool> result = 65 std::pair<RenderbufferInfoMap::iterator, bool> result =
40 renderbuffer_infos_.insert( 66 renderbuffer_infos_.insert(std::make_pair(client_id, info));
41 std::make_pair(
42 client_id,
43 RenderbufferInfo::Ref(new RenderbufferInfo(service_id))));
44 DCHECK(result.second); 67 DCHECK(result.second);
68 if (!info->cleared()) {
69 ++num_uncleared_renderbuffers_;
70 }
45 } 71 }
46 72
47 RenderbufferManager::RenderbufferInfo* RenderbufferManager::GetRenderbufferInfo( 73 RenderbufferManager::RenderbufferInfo* RenderbufferManager::GetRenderbufferInfo(
48 GLuint client_id) { 74 GLuint client_id) {
49 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id); 75 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id);
50 return it != renderbuffer_infos_.end() ? it->second : NULL; 76 return it != renderbuffer_infos_.end() ? it->second : NULL;
51 } 77 }
52 78
53 void RenderbufferManager::RemoveRenderbufferInfo(GLuint client_id) { 79 void RenderbufferManager::RemoveRenderbufferInfo(GLuint client_id) {
54 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id); 80 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id);
55 if (it != renderbuffer_infos_.end()) { 81 if (it != renderbuffer_infos_.end()) {
56 it->second->MarkAsDeleted(); 82 RenderbufferInfo* info = it->second;
83 if (!info->cleared()) {
84 --num_uncleared_renderbuffers_;
85 }
86 info->MarkAsDeleted();
57 renderbuffer_infos_.erase(it); 87 renderbuffer_infos_.erase(it);
58 } 88 }
59 } 89 }
60 90
61 bool RenderbufferManager::GetClientId( 91 bool RenderbufferManager::GetClientId(
62 GLuint service_id, GLuint* client_id) const { 92 GLuint service_id, GLuint* client_id) const {
63 // This doesn't need to be fast. It's only used during slow queries. 93 // This doesn't need to be fast. It's only used during slow queries.
64 for (RenderbufferInfoMap::const_iterator it = renderbuffer_infos_.begin(); 94 for (RenderbufferInfoMap::const_iterator it = renderbuffer_infos_.begin();
65 it != renderbuffer_infos_.end(); ++it) { 95 it != renderbuffer_infos_.end(); ++it) {
66 if (it->second->service_id() == service_id) { 96 if (it->second->service_id() == service_id) {
67 *client_id = it->first; 97 *client_id = it->first;
68 return true; 98 return true;
69 } 99 }
70 } 100 }
71 return false; 101 return false;
72 } 102 }
73 103
74 } // namespace gles2 104 } // namespace gles2
75 } // namespace gpu 105 } // namespace gpu
76 106
77 107
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/renderbuffer_manager.h ('k') | gpu/command_buffer/service/renderbuffer_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698