framebuffer_manager.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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_FRAMEBUFFER_MANAGER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_utils.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FramebufferManager; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Renderbuffer; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RenderbufferManager; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Texture; 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TextureRef; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureManager; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Info about a particular Framebuffer. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Attachment : public base::RefCounted<Attachment> { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual GLsizei width() const = 0; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual GLsizei height() const = 0; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual GLenum internal_format() const = 0; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual GLsizei samples() const = 0; 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual GLuint object_name() const = 0; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool cleared() const = 0; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetCleared( 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderbufferManager* renderbuffer_manager, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TextureManager* texture_manager, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool cleared) = 0; 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool IsTexture(TextureRef* texture) const = 0; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsRenderbuffer( 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Renderbuffer* renderbuffer) const = 0; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CanRenderTo() const = 0; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DetachFromFramebuffer() const = 0; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ValidForAttachmentType( 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum attachment_type, uint32 max_color_attachments) = 0; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AddToSignature( 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TextureManager* texture_manager, std::string* signature) const = 0; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCounted<Attachment>; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~Attachment() {} 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Framebuffer(FramebufferManager* manager, GLuint service_id); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint service_id() const { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return service_id_; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasUnclearedAttachment(GLenum attachment) const; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAttachmentAsCleared( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderbufferManager* renderbuffer_manager, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TextureManager* texture_manager, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum attachment, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool cleared); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attaches a renderbuffer to a particlar attachment. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pass null to detach. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AttachRenderbuffer( 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum attachment, Renderbuffer* renderbuffer); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attaches a texture to a particlar attachment. Pass null to detach. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AttachTexture( 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GLenum attachment, TextureRef* texture_ref, GLenum target, 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GLint level, GLsizei samples); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unbinds the given renderbuffer if it is bound. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnbindRenderbuffer( 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum target, Renderbuffer* renderbuffer); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unbinds the given texture if it is bound. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnbindTexture( 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GLenum target, TextureRef* texture_ref); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Attachment* GetAttachment(GLenum attachment) const; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsDeleted() const { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return deleted_; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsValid() { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_been_bound_ = true; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsValid() const { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_been_bound_ && !IsDeleted(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasDepthAttachment() const; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasStencilAttachment() const; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum GetColorAttachmentFormat() const; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify all the rules in OpenGL ES 2.0.25 4.4.5 are followed. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns GL_FRAMEBUFFER_COMPLETE if there are no reasons we know we can't 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // use this combination of attachments. Otherwise returns the value 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that glCheckFramebufferStatus should return for this set of attachments. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that receiving GL_FRAMEBUFFER_COMPLETE from this function does 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not mean the real OpenGL will consider it framebuffer complete. It just 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // means it passed our tests. 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum IsPossiblyComplete() const; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Implements optimized glGetFramebufferStatus. 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum GetStatus(TextureManager* texture_manager, GLenum target) const; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check all attachments are cleared 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsCleared() const; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum GetDrawBuffer(GLenum draw_buffer) const; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetDrawBuffers(GLsizei n, const GLenum* bufs); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Return true if any draw buffers has an alpha channel. 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool HasAlphaMRT() const; 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void ClearFramebufferCompleteComboMap(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool AllowFramebufferComboCompleteMapForTesting() { 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return allow_framebuffer_combo_complete_map_; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class FramebufferManager; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCounted<Framebuffer>; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~Framebuffer(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsDeleted(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAttachmentsAsCleared( 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderbufferManager* renderbuffer_manager, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TextureManager* texture_manager, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool cleared); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsComplete(unsigned state_id) { 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) framebuffer_complete_state_count_id_ = state_id; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned framebuffer_complete_state_count_id() const { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return framebuffer_complete_state_count_id_; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The managers that owns this. 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FramebufferManager* manager_; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool deleted_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Service side framebuffer id. 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint service_id_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether this framebuffer has ever been bound. 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_been_bound_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // state count when this framebuffer was last checked for completeness. 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned framebuffer_complete_state_count_id_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A map of attachments. 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<GLenum, scoped_refptr<Attachment> > AttachmentMap; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AttachmentMap attachments_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A map of successful frame buffer combos. If it's in the map 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it should be FRAMEBUFFER_COMPLETE. 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<std::string, bool> FramebufferComboCompleteMap; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static FramebufferComboCompleteMap* framebuffer_combo_complete_map_; 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool allow_framebuffer_combo_complete_map_; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<GLenum[]> draw_buffers_; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Framebuffer); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)struct DecoderFramebufferState { 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DecoderFramebufferState(); 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ~DecoderFramebufferState(); 1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // State saved for clearing so we can clear render buffers and then 1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // restore to these values. 1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool clear_state_dirty; 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The currently bound framebuffers 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<Framebuffer> bound_read_framebuffer; 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<Framebuffer> bound_draw_framebuffer; 1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class keeps track of the frambebuffers and their attached renderbuffers 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// so we can correctly clear them. 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT FramebufferManager { 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FramebufferManager(uint32 max_draw_buffers, uint32 max_color_attachments); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~FramebufferManager(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must call before destruction. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Destroy(bool have_context); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a Framebuffer for the given framebuffer. 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CreateFramebuffer(GLuint client_id, GLuint service_id); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the framebuffer info for the given framebuffer. 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Framebuffer* GetFramebuffer(GLuint client_id); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes a framebuffer info for the given framebuffer. 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveFramebuffer(GLuint client_id); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets a client id for a given service id. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetClientId(GLuint service_id, GLuint* client_id) const; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MarkAttachmentsAsCleared( 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Framebuffer* framebuffer, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderbufferManager* renderbuffer_manager, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TextureManager* texture_manager); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsComplete(Framebuffer* framebuffer); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsComplete(Framebuffer* framebuffer); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncFramebufferStateChangeCount() { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // make sure this is never 0. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) framebuffer_state_change_count_ = 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (framebuffer_state_change_count_ + 1) | 0x80000000U; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class Framebuffer; 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartTracking(Framebuffer* framebuffer); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StopTracking(Framebuffer* framebuffer); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Info for each framebuffer in the system. 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<GLuint, scoped_refptr<Framebuffer> > 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FramebufferMap; 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FramebufferMap framebuffers_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Incremented anytime anything changes that might effect framebuffer 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned framebuffer_state_change_count_; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Counts the number of Framebuffer allocated with 'this' as its manager. 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allows to check no Framebuffer will outlive this. 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int framebuffer_count_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool have_context_; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 max_draw_buffers_; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 max_color_attachments_; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FramebufferManager); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_ 264