blob: 06d732f4c696a83e6b6b9b9ae91b62fbe80a4d1b [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"
10
11namespace gpu {
12namespace gles2 {
13
gman@chromium.org84afefa2011-10-19 21:45:5314RenderbufferManager::RenderbufferManager(
15 GLint max_renderbuffer_size, GLint max_samples)
16 : max_renderbuffer_size_(max_renderbuffer_size),
gman@chromium.org0d6bfdc2011-11-02 01:32:2017 max_samples_(max_samples),
gman@chromium.orgfad1fee2011-12-23 01:06:4518 num_uncleared_renderbuffers_(0),
gman@chromium.org80e4cfa02012-04-06 22:08:4519 mem_represented_(0),
20 renderbuffer_info_count_(0),
21 have_context_(true) {
gman@chromium.orgfad1fee2011-12-23 01:06:4522 UpdateMemRepresented();
gman@chromium.org5094b0f2010-11-09 19:45:2423}
erg@google.combbf94a32010-10-13 17:44:1524
gman@chromium.orgd304cbd2010-07-01 22:41:1625RenderbufferManager::~RenderbufferManager() {
26 DCHECK(renderbuffer_infos_.empty());
gman@chromium.org80e4cfa02012-04-06 22:08:4527 // If this triggers, that means something is keeping a reference to
28 // a RenderbufferInfo belonging to this.
29 CHECK_EQ(renderbuffer_info_count_, 0u);
gman@chromium.orgd304cbd2010-07-01 22:41:1630}
31
gman@chromium.orge39f7292012-01-04 20:06:4732size_t RenderbufferManager::RenderbufferInfo::EstimatedSize() {
33 return width_ * height_ * samples_ *
34 GLES2Util::RenderbufferBytesPerPixel(internal_format_);
gman@chromium.orgfad1fee2011-12-23 01:06:4535}
36
gman@chromium.org3b675462012-01-19 05:20:5637RenderbufferManager::RenderbufferInfo::~RenderbufferInfo() {
38 if (manager_) {
gman@chromium.org80e4cfa02012-04-06 22:08:4539 if (manager_->have_context_) {
40 GLuint id = service_id();
41 glDeleteRenderbuffersEXT(1, &id);
42 }
gman@chromium.org3b675462012-01-19 05:20:5643 manager_->StopTracking(this);
44 manager_ = NULL;
45 }
46}
47
gman@chromium.orgfad1fee2011-12-23 01:06:4548void RenderbufferManager::UpdateMemRepresented() {
49 TRACE_COUNTER_ID1(
50 "RenderbufferManager", "RenderbufferMemory", this, mem_represented_);
51}
52
gman@chromium.orgd304cbd2010-07-01 22:41:1653void RenderbufferManager::Destroy(bool have_context) {
gman@chromium.org80e4cfa02012-04-06 22:08:4554 have_context_ = have_context;
55 renderbuffer_infos_.clear();
gman@chromium.orgfad1fee2011-12-23 01:06:4556 DCHECK_EQ(0u, mem_represented_);
57 UpdateMemRepresented();
gman@chromium.orgd304cbd2010-07-01 22:41:1658}
59
gman@chromium.org80e4cfa02012-04-06 22:08:4560void RenderbufferManager::StartTracking(RenderbufferInfo* /* renderbuffer */) {
61 ++renderbuffer_info_count_;
62}
63
gman@chromium.org3b675462012-01-19 05:20:5664void RenderbufferManager::StopTracking(RenderbufferInfo* renderbuffer) {
gman@chromium.org80e4cfa02012-04-06 22:08:4565 --renderbuffer_info_count_;
gman@chromium.org3b675462012-01-19 05:20:5666 if (!renderbuffer->cleared()) {
67 --num_uncleared_renderbuffers_;
68 }
69 mem_represented_ -= renderbuffer->EstimatedSize();
70}
71
gman@chromium.org0d6bfdc2011-11-02 01:32:2072void RenderbufferManager::SetInfo(
gman@chromium.org3b675462012-01-19 05:20:5673 RenderbufferInfo* renderbuffer,
74 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {
gman@chromium.org0d6bfdc2011-11-02 01:32:2075 DCHECK(renderbuffer);
76 if (!renderbuffer->cleared()) {
77 --num_uncleared_renderbuffers_;
78 }
gman@chromium.orgfad1fee2011-12-23 01:06:4579 mem_represented_ -= renderbuffer->EstimatedSize();
gman@chromium.org0d6bfdc2011-11-02 01:32:2080 renderbuffer->SetInfo(samples, internalformat, width, height);
gman@chromium.orgfad1fee2011-12-23 01:06:4581 mem_represented_ += renderbuffer->EstimatedSize();
82 UpdateMemRepresented();
gman@chromium.org0d6bfdc2011-11-02 01:32:2083 if (!renderbuffer->cleared()) {
84 ++num_uncleared_renderbuffers_;
85 }
86}
87
88void RenderbufferManager::SetCleared(RenderbufferInfo* renderbuffer) {
89 DCHECK(renderbuffer);
90 if (!renderbuffer->cleared()) {
91 --num_uncleared_renderbuffers_;
92 }
93 renderbuffer->set_cleared();
94 if (!renderbuffer->cleared()) {
95 ++num_uncleared_renderbuffers_;
96 }
97}
98
gman@chromium.orgae51d192010-04-27 00:48:0399void RenderbufferManager::CreateRenderbufferInfo(
100 GLuint client_id, GLuint service_id) {
gman@chromium.org3b675462012-01-19 05:20:56101 RenderbufferInfo::Ref info(new RenderbufferInfo(this, service_id));
gman@chromium.orga25fa872010-03-25 02:57:58102 std::pair<RenderbufferInfoMap::iterator, bool> result =
gman@chromium.org0d6bfdc2011-11-02 01:32:20103 renderbuffer_infos_.insert(std::make_pair(client_id, info));
gman@chromium.orga25fa872010-03-25 02:57:58104 DCHECK(result.second);
gman@chromium.org0d6bfdc2011-11-02 01:32:20105 if (!info->cleared()) {
106 ++num_uncleared_renderbuffers_;
107 }
gman@chromium.orga25fa872010-03-25 02:57:58108}
109
110RenderbufferManager::RenderbufferInfo* RenderbufferManager::GetRenderbufferInfo(
gman@chromium.orgae51d192010-04-27 00:48:03111 GLuint client_id) {
112 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id);
gman@chromium.orga25fa872010-03-25 02:57:58113 return it != renderbuffer_infos_.end() ? it->second : NULL;
114}
115
gman@chromium.orgae51d192010-04-27 00:48:03116void RenderbufferManager::RemoveRenderbufferInfo(GLuint client_id) {
117 RenderbufferInfoMap::iterator it = renderbuffer_infos_.find(client_id);
gman@chromium.orga25fa872010-03-25 02:57:58118 if (it != renderbuffer_infos_.end()) {
gman@chromium.org0d6bfdc2011-11-02 01:32:20119 RenderbufferInfo* info = it->second;
gman@chromium.org0d6bfdc2011-11-02 01:32:20120 info->MarkAsDeleted();
gman@chromium.orgae51d192010-04-27 00:48:03121 renderbuffer_infos_.erase(it);
gman@chromium.orga25fa872010-03-25 02:57:58122 }
123}
124
gman@chromium.org6b8cf1a2010-05-06 16:13:58125bool RenderbufferManager::GetClientId(
126 GLuint service_id, GLuint* client_id) const {
127 // This doesn't need to be fast. It's only used during slow queries.
128 for (RenderbufferInfoMap::const_iterator it = renderbuffer_infos_.begin();
129 it != renderbuffer_infos_.end(); ++it) {
130 if (it->second->service_id() == service_id) {
131 *client_id = it->first;
132 return true;
133 }
134 }
135 return false;
136}
137
gman@chromium.orga25fa872010-03-25 02:57:58138} // namespace gles2
139} // namespace gpu
140
141