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