renderbuffer_manager.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/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"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MemoryTracker;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MemoryTypeTracker;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class keeps track of the renderbuffers and whether or not they have
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// been cleared.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GPU_EXPORT RenderbufferManager {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Info about Renderbuffers currently in the system.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class GPU_EXPORT RenderbufferInfo
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : public base::RefCounted<RenderbufferInfo> {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef scoped_refptr<RenderbufferInfo> Ref;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderbufferInfo(RenderbufferManager* manager, GLuint service_id)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : manager_(manager),
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          deleted_(false),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          service_id_(service_id),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cleared_(true),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          has_been_bound_(false),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          samples_(0),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          internal_format_(GL_RGBA4),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          width_(0),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          height_(0) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->StartTracking(this);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint service_id() const {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return service_id_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool cleared() const {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cleared_;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum internal_format() const {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return internal_format_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei samples() const {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return samples_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width() const {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return width_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei height() const {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return height_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsDeleted() const {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return deleted_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void MarkAsValid() {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_been_bound_ = true;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsValid() const {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return has_been_bound_ && !IsDeleted();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t EstimatedSize();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddToSignature(std::string* signature) const;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class RenderbufferManager;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class base::RefCounted<RenderbufferInfo>;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~RenderbufferInfo();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_cleared() {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cleared_ = true;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void SetInfo(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      samples_ = samples;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal_format_ = internalformat;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width_ = width;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      height_ = height;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cleared_ = false;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void MarkAsDeleted() {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deleted_ = true;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // RenderbufferManager that owns this RenderbufferInfo.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderbufferManager* manager_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool deleted_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Service side renderbuffer id.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint service_id_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether this renderbuffer has been cleared
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool cleared_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether this renderbuffer has ever been bound.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_been_bound_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Number of samples (for multi-sampled renderbuffers)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei samples_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Renderbuffer internalformat set through RenderbufferStorage().
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum internal_format_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dimensions of renderbuffer.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei height_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderbufferManager(MemoryTracker* memory_tracker,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      GLint max_renderbuffer_size,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      GLint max_samples);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~RenderbufferManager();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_renderbuffer_size() const {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_renderbuffer_size_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_samples() const {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_samples_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HaveUnclearedRenderbuffers() const {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num_uncleared_renderbuffers_ != 0;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetInfo(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderbufferInfo* renderbuffer,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCleared(RenderbufferInfo* renderbuffer);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must call before destruction.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy(bool have_context);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a RenderbufferInfo for the given renderbuffer.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateRenderbufferInfo(GLuint client_id, GLuint service_id);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the renderbuffer info for the given renderbuffer.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderbufferInfo* GetRenderbufferInfo(GLuint client_id);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a renderbuffer info for the given renderbuffer.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveRenderbufferInfo(GLuint client_id);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets a client id for a given service id.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetClientId(GLuint service_id, GLuint* client_id) const;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t mem_represented() const {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return mem_represented_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateMemRepresented();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartTracking(RenderbufferInfo* renderbuffer);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StopTracking(RenderbufferInfo* renderbuffer);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MemoryTypeTracker> renderbuffer_memory_tracker_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_renderbuffer_size_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_samples_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_uncleared_renderbuffers_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t mem_represented_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Counts the number of RenderbufferInfo allocated with 'this' as its manager.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows to check no RenderbufferInfo will outlive this.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned renderbuffer_info_count_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_context_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Info for each renderbuffer in the system.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::hash_map<GLuint, RenderbufferInfo::Ref> RenderbufferInfoMap;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderbufferInfoMap renderbuffer_infos_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderbufferManager);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_
207