blob: 38b3c76dce639fe514f2c757670b850ea8a19f4d [file] [log] [blame]
gman@chromium.org84afefa2011-10-19 21:45:531// Copyright (c) 2011 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.orgfad1fee2011-12-23 01:06:4514static uint32 BytesPerPixel(GLenum format) {
15 switch (format) {
16 case GL_STENCIL_INDEX8:
17 return 1;
18 case GL_RGBA4:
19 case GL_RGB565:
20 case GL_RGB5_A1:
21 case GL_DEPTH_COMPONENT16:
22 return 2;
23 case GL_DEPTH24_STENCIL8:
24 case GL_RGB8_OES:
25 case GL_RGBA8_OES:
26 case GL_DEPTH_COMPONENT24:
27 return 4;
28 default:
29 return 0;
30 }
31}
32
gman@chromium.org84afefa2011-10-19 21:45:5333RenderbufferManager::RenderbufferManager(
34 GLint max_renderbuffer_size, GLint max_samples)
35 : max_renderbuffer_size_(max_renderbuffer_size),
gman@chromium.org0d6bfdc2011-11-02 01:32:2036 max_samples_(max_samples),
gman@chromium.orgfad1fee2011-12-23 01:06:4537 num_uncleared_renderbuffers_(0),
38 mem_represented_(0) {
39 UpdateMemRepresented();
gman@chromium.org5094b0f2010-11-09 19:45:2440}
erg@google.combbf94a32010-10-13 17:44:1541
gman@chromium.orgd304cbd2010-07-01 22:41:1642RenderbufferManager::~RenderbufferManager() {
43 DCHECK(renderbuffer_infos_.empty());
44}
45
gman@chromium.orgfad1fee2011-12-23 01:06:4546uint32 RenderbufferManager::RenderbufferInfo::EstimatedSize() {
47 return width_ * height_ * samples_ * BytesPerPixel(internal_format_);
48}
49
50void RenderbufferManager::UpdateMemRepresented() {
51 TRACE_COUNTER_ID1(
52 "RenderbufferManager", "RenderbufferMemory", this, mem_represented_);
53}
54
gman@chromium.orgd304cbd2010-07-01 22:41:1655void RenderbufferManager::Destroy(bool have_context) {
56 while (!renderbuffer_infos_.empty()) {
gman@chromium.orgfad1fee2011-12-23 01:06:4557 RenderbufferInfo* info = renderbuffer_infos_.begin()->second;
58 mem_represented_ -= info->EstimatedSize();
gman@chromium.orgd304cbd2010-07-01 22:41:1659 if (have_context) {
gman@chromium.orgd304cbd2010-07-01 22:41:1660 if (!info->IsDeleted()) {
61 GLuint service_id = info->service_id();
62 glDeleteRenderbuffersEXT(1, &service_id);
63 info->MarkAsDeleted();
64 }
65 }
66 renderbuffer_infos_.erase(renderbuffer_infos_.begin());
67 }
gman@chromium.orgfad1fee2011-12-23 01:06:4568 DCHECK_EQ(0u, mem_represented_);
69 UpdateMemRepresented();
gman@chromium.orgd304cbd2010-07-01 22:41:1670}
71
gman@chromium.org0d6bfdc2011-11-02 01:32:2072void RenderbufferManager::SetInfo(
73 RenderbufferInfo* renderbuffer,
74 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {
75 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.org0d6bfdc2011-11-02 01:32:20101 RenderbufferInfo::Ref info(new RenderbufferInfo(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;
120 if (!info->cleared()) {
121 --num_uncleared_renderbuffers_;
122 }
gman@chromium.orgfad1fee2011-12-23 01:06:45123 mem_represented_ -= info->EstimatedSize();
124 UpdateMemRepresented();
gman@chromium.org0d6bfdc2011-11-02 01:32:20125 info->MarkAsDeleted();
gman@chromium.orgae51d192010-04-27 00:48:03126 renderbuffer_infos_.erase(it);
gman@chromium.orga25fa872010-03-25 02:57:58127 }
128}
129
gman@chromium.org6b8cf1a2010-05-06 16:13:58130bool RenderbufferManager::GetClientId(
131 GLuint service_id, GLuint* client_id) const {
132 // This doesn't need to be fast. It's only used during slow queries.
133 for (RenderbufferInfoMap::const_iterator it = renderbuffer_infos_.begin();
134 it != renderbuffer_infos_.end(); ++it) {
135 if (it->second->service_id() == service_id) {
136 *client_id = it->first;
137 return true;
138 }
139 }
140 return false;
141}
142
gman@chromium.orga25fa872010-03-25 02:57:58143} // namespace gles2
144} // namespace gpu
145
146