15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_utils.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/memory_tracking.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RenderbufferManager;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Info about a Renderbuffer.
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT Renderbuffer
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public base::RefCounted<Renderbuffer> {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Renderbuffer(RenderbufferManager* manager,
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GLuint client_id,
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GLuint service_id);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint service_id() const {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return service_id_;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint client_id() const {
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return client_id_;
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool cleared() const {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return cleared_;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum internal_format() const {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return internal_format_;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei samples() const {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return samples_;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei width() const {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return width_;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei height() const {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return height_;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsDeleted() const {
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return client_id_ == 0;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkAsValid() {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    has_been_bound_ = true;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsValid() const {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return has_been_bound_ && !IsDeleted();
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t EstimatedSize();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddToSignature(std::string* signature) const;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class RenderbufferManager;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class base::RefCounted<Renderbuffer>;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~Renderbuffer();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_cleared(bool cleared) {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cleared_ = cleared;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetInfo(
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    samples_ = samples;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    internal_format_ = internalformat;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    width_ = width;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    height_ = height;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cleared_ = false;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkAsDeleted() {
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    client_id_ = 0;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RenderbufferManager that owns this Renderbuffer.
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderbufferManager* manager_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Client side renderbuffer id.
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint client_id_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Service side renderbuffer id.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint service_id_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether this renderbuffer has been cleared
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool cleared_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether this renderbuffer has ever been bound.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_been_bound_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Number of samples (for multi-sampled renderbuffers)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei samples_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Renderbuffer internalformat set through RenderbufferStorage().
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum internal_format_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dimensions of renderbuffer.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei width_;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei height_;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class keeps track of the renderbuffers and whether or not they have
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// been cleared.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT RenderbufferManager {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderbufferManager(MemoryTracker* memory_tracker,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      GLint max_renderbuffer_size,
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      GLint max_samples,
13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      bool depth24_supported);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~RenderbufferManager();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_renderbuffer_size() const {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_renderbuffer_size_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_samples() const {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_samples_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HaveUnclearedRenderbuffers() const {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num_uncleared_renderbuffers_ != 0;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetInfo(
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Renderbuffer* renderbuffer,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetCleared(Renderbuffer* renderbuffer, bool cleared);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must call before destruction.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy(bool have_context);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a Renderbuffer for the given renderbuffer ids.
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateRenderbuffer(GLuint client_id, GLuint service_id);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets the renderbuffer for the given renderbuffer id.
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Renderbuffer* GetRenderbuffer(GLuint client_id);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Removes a renderbuffer for the given renderbuffer id.
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveRenderbuffer(GLuint client_id);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t mem_represented() const {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return memory_tracker_->GetMemRepresented();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool ComputeEstimatedRenderbufferSize(int width,
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                        int height,
16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                        int samples,
17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                        int internal_format,
17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                        uint32* size) const;
17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  GLenum InternalRenderbufferFormatToImplFormat(GLenum impl_format) const;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class Renderbuffer;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartTracking(Renderbuffer* renderbuffer);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopTracking(Renderbuffer* renderbuffer);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<MemoryTypeTracker> memory_tracker_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_renderbuffer_size_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_samples_;
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool depth24_supported_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_uncleared_renderbuffers_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Counts the number of Renderbuffer allocated with 'this' as its manager.
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allows to check no Renderbuffer will outlive this.
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned renderbuffer_count_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_context_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Info for each renderbuffer in the system.
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_map<GLuint, scoped_refptr<Renderbuffer> > RenderbufferMap;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderbufferMap renderbuffers_;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderbufferManager);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_
205