blob: 2f1d3c3c2f796f838bbe21980c587cf9396fa25c [file] [log] [blame]
gman@chromium.orge39f7292012-01-04 20:06:471// Copyright (c) 2012 The Chromium Authors. All rights reserved.
gman@chromium.orga25fa872010-03-25 02:57:582// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "gpu/command_buffer/service/renderbuffer_manager.h"
6#include "base/logging.h"
gman@chromium.orgfad1fee2011-12-23 01:06:457#include "base/debug/trace_event.h"
gman@chromium.orga25fa872010-03-25 02:57:588#include "gpu/command_buffer/common/gles2_cmd_utils.h"
9#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
ccameron@chromium.org00b192572012-07-28 04:00:2210#include "gpu/command_buffer/service/memory_tracking.h"
gman@chromium.orga25fa872010-03-25 02:57:5811
12namespace gpu {
13namespace gles2 {
14
gman@chromium.org84afefa2011-10-19 21:45:5315RenderbufferManager::RenderbufferManager(
ccameron@chromium.org00b192572012-07-28 04:00:2216 MemoryTracker* memory_tracker,
17 GLint max_renderbuffer_size,
18 GLint max_samples)
19 : renderbuffer_memory_tracker_(new MemoryTypeTracker(
20 memory_tracker,
21 "RenderbufferManager",
22 "RenderbufferMemory")),
23 max_renderbuffer_size_(max_renderbuffer_size),
gman@chromium.org0d6bfdc2011-11-02 01:32:2024 max_samples_(max_samples),
gman@chromium.orgfad1fee2011-12-23 01:06:4525 num_uncleared_renderbuffers_(0),
gman@chromium.org80e4cfa02012-04-06 22:08:4526 mem_represented_(0),
27 renderbuffer_info_count_(0),
28 have_context_(true) {
gman@chromium.orgfad1fee2011-12-23 01:06:4529 UpdateMemRepresented();
gman@chromium.org5094b0f2010-11-09 19:45:2430}
erg@google.combbf94a32010-10-13 17:44:1531
gman@chromium.orgd304cbd2010-07-01 22:41:1632RenderbufferManager::~RenderbufferManager() {
33 DCHECK(renderbuffer_infos_.empty());
gman@chromium.org80e4cfa02012-04-06 22:08:4534 // If this triggers, that means something is keeping a reference to
35 // a RenderbufferInfo belonging to this.
36 CHECK_EQ(renderbuffer_info_count_, 0u);
gman@chromium.org5bd6feee2012-04-18 02:40:0337
38 DCHECK_EQ(0, num_uncleared_renderbuffers_);
gman@chromium.orgd304cbd2010-07-01 22:41:1639}
40
gman@chromium.orge39f7292012-01-04 20:06:4741size_t RenderbufferManager::RenderbufferInfo::EstimatedSize() {
42 return width_ * height_ * samples_ *
43 GLES2Util::RenderbufferBytesPerPixel(internal_format_);
gman@chromium.orgfad1fee2011-12-23 01:06:4544}
45
gman@chromium.org3b675462012-01-19 05:20:5646RenderbufferManager::RenderbufferInfo::~RenderbufferInfo() {
47 if (manager_) {
gman@chromium.org80e4cfa02012-04-06 22:08:4548 if (manager_->have_context_) {
49 GLuint id = service_id();
50 glDeleteRenderbuffersEXT(1, &id);
51 }
gman@chromium.org3b675462012-01-19 05:20:5652 manager_->StopTracking(this);
53 manager_ = NULL;
54 }
55}
56
gman@chromium.orgfad1fee2011-12-23 01:06:4557void RenderbufferManager::UpdateMemRepresented() {
ccameron@chromium.org00b192572012-07-28 04:00:2258 renderbuffer_memory_tracker_->UpdateMemRepresented(mem_represented_);
gman@chromium.orgfad1fee2011-12-23 01:06:4559}
60
gman@chromium.orgd304cbd2010-07-01 22:41:1661void RenderbufferManager::Destroy(bool have_context) {
gman@chromium.org80e4cfa02012-04-06 22:08:4562 have_context_ = have_context;
63 renderbuffer_infos_.clear();
gman@chromium.orgfad1fee2011-12-23 01:06:4564 DCHECK_EQ(0u, mem_represented_);
65 UpdateMemRepresented();
gman@chromium.orgd304cbd2010-07-01 22:41:1666}
67
gman@chromium.org80e4cfa02012-04-06 22:08:4568void RenderbufferManager::StartTracking(RenderbufferInfo* /* renderbuffer */) {
69 ++renderbuffer_info_count_;
70}
71
gman@chromium.org3b675462012-01-19 05:20:5672void RenderbufferManager::StopTracking(RenderbufferInfo* renderbuffer) {
gman@chromium.org80e4cfa02012-04-06 22:08:4573 --renderbuffer_info_count_;
gman@chromium.org3b675462012-01-19 05:20:5674 if (!renderbuffer->cleared()) {
75 --num_uncleared_renderbuffers_;
76 }
77 mem_represented_ -= renderbuffer->EstimatedSize();
78}
79
gman@chromium.org0d6bfdc2011-11-02 01:32:2080void RenderbufferManager::SetInfo(
gman@chromium.org3b675462012-01-19 05:20:5681 RenderbufferInfo* renderbuffer,
82 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {
gman@chromium.org0d6bfdc2011-11-02 01:32:2083 DCHECK(renderbuffer);
84 if (!renderbuffer->cleared()) {
85 --num_uncleared_renderbuffers_;
86 }
gman@chromium.orgfad1fee2011-12-23 01:06:4587 mem_represented_ -= renderbuffer->EstimatedSize();
gman@chromium.org0d6bfdc2011-11-02 01:32:2088 renderbuffer->SetInfo(samples, internalformat, width, height);
gman@chromium.orgfad1fee2011-12-23 01:06:4589 mem_represented_ += renderbuffer->EstimatedSize();
90 UpdateMemRepresented();
gman@chromium.org0d6bfdc2011-11-02 01:32:2091 if (!renderbuffer->cleared()) {
92 ++num_uncleared_renderbuffers_;
93 }
94}
95
96void RenderbufferManager::SetCleared(RenderbufferInfo* renderbuffer) {
97 DCHECK(renderbuffer);
98 if (!renderbuffer->cleared()) {
99 --num_uncleared_renderbuffers_;
100 }
101 renderbuffer->set_cleared();
102 if (!renderbuffer->cleared()) {
103 ++num_uncleared_renderbuffers_;
104 }
105}
106
gman@chromium.orgae51d192010-04-27 00:48:03107void RenderbufferManager::CreateRenderbufferInfo(
108 GLuint client_id, GLuint service_id) {
gman@chromium.org3b675462012-01-19 05:20:56109 RenderbufferInfo::Ref info(new RenderbufferInfo(this, service_id));
gman@chromium.orga25fa872010-03-25 02:57:58110 std::pair<RenderbufferInfoMap::iterator, bool> result =
gman@chromium.org0d6bfdc2011-11-02 01:32:20111 renderbuffer_infos_.insert(std::make_pair(client_id, info));
gman@chromium.orga25fa872010-03-25 02:57:58112 DCHECK(result.second);
gman@chromium.org0d6bfdc2011-11-02 01:32:20113 if (!info->cleared()) {
114 ++num_uncleared_renderbuffers_;
115 }
gman@chromium.orga25fa872010-03-25 02:57:58116}
117
118RenderbufferManager::RenderbufferInfo* RenderbufferManager::GetRenderbufferInfo(
gman@chromium.orgae51d192010-04-27 00:48:03119 GLuint client_id) {
120 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id);
gman@chromium.orga25fa872010-03-25 02:57:58121 return it != renderbuffer_infos_.end() ? it->second : NULL;
122}
123
gman@chromium.orgae51d192010-04-27 00:48:03124void RenderbufferManager::RemoveRenderbufferInfo(GLuint client_id) {
125 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id);
gman@chromium.orga25fa872010-03-25 02:57:58126 if (it != renderbuffer_infos_.end()) {
gman@chromium.org0d6bfdc2011-11-02 01:32:20127 RenderbufferInfo* info = it->second;
gman@chromium.org0d6bfdc2011-11-02 01:32:20128 info->MarkAsDeleted();
gman@chromium.orgae51d192010-04-27 00:48:03129 renderbuffer_infos_.erase(it);
gman@chromium.orga25fa872010-03-25 02:57:58130 }
131}
132
gman@chromium.org6b8cf1a2010-05-06 16:13:58133bool RenderbufferManager::GetClientId(
134 GLuint service_id, GLuint* client_id) const {
135 // This doesn't need to be fast. It's only used during slow queries.
136 for (RenderbufferInfoMap::const_iterator it = renderbuffer_infos_.begin();
137 it != renderbuffer_infos_.end(); ++it) {
138 if (it->second->service_id() == service_id) {
139 *client_id = it->first;
140 return true;
141 }
142 }
143 return false;
144}
145
gman@chromium.orga25fa872010-03-25 02:57:58146} // namespace gles2
147} // namespace gpu
148
149