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) 80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include <vector> 90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_utils.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 FramebufferManager; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Renderbuffer; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RenderbufferManager; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Texture; 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TextureRef; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureManager; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Info about a particular Framebuffer. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Attachment : public base::RefCounted<Attachment> { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual GLsizei width() const = 0; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual GLsizei height() const = 0; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual GLenum internal_format() const = 0; 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual GLenum texture_type() const = 0; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual GLsizei samples() const = 0; 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual GLuint object_name() const = 0; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool cleared() const = 0; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetCleared( 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderbufferManager* renderbuffer_manager, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TextureManager* texture_manager, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool cleared) = 0; 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool IsTexture(TextureRef* texture) const = 0; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsRenderbuffer( 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Renderbuffer* renderbuffer) const = 0; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CanRenderTo() const = 0; 478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void DetachFromFramebuffer(Framebuffer* framebuffer) const = 0; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ValidForAttachmentType( 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum attachment_type, uint32 max_color_attachments) = 0; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AddToSignature( 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TextureManager* texture_manager, std::string* signature) const = 0; 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnWillRenderTo() const = 0; 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnDidRenderTo() const = 0; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCounted<Attachment>; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~Attachment() {} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Framebuffer(FramebufferManager* manager, GLuint service_id); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint service_id() const { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return service_id_; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasUnclearedAttachment(GLenum attachment) const; 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool HasUnclearedColorAttachments() const; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAttachmentAsCleared( 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderbufferManager* renderbuffer_manager, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TextureManager* texture_manager, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum attachment, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool cleared); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attaches a renderbuffer to a particlar attachment. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pass null to detach. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AttachRenderbuffer( 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum attachment, Renderbuffer* renderbuffer); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attaches a texture to a particlar attachment. Pass null to detach. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AttachTexture( 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GLenum attachment, TextureRef* texture_ref, GLenum target, 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GLint level, GLsizei samples); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unbinds the given renderbuffer if it is bound. 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnbindRenderbuffer( 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum target, Renderbuffer* renderbuffer); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unbinds the given texture if it is bound. 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnbindTexture( 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GLenum target, TextureRef* texture_ref); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Attachment* GetAttachment(GLenum attachment) const; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsDeleted() const { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return deleted_; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsValid() { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_been_bound_ = true; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsValid() const { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_been_bound_ && !IsDeleted(); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasDepthAttachment() const; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasStencilAttachment() const; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum GetColorAttachmentFormat() const; 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If the color attachment is a texture, returns its type; otherwise, 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // returns 0. 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GLenum GetColorAttachmentTextureType() const; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify all the rules in OpenGL ES 2.0.25 4.4.5 are followed. 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns GL_FRAMEBUFFER_COMPLETE if there are no reasons we know we can't 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // use this combination of attachments. Otherwise returns the value 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that glCheckFramebufferStatus should return for this set of attachments. 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that receiving GL_FRAMEBUFFER_COMPLETE from this function does 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not mean the real OpenGL will consider it framebuffer complete. It just 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // means it passed our tests. 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum IsPossiblyComplete() const; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Implements optimized glGetFramebufferStatus. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum GetStatus(TextureManager* texture_manager, GLenum target) const; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check all attachments are cleared 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsCleared() const; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum GetDrawBuffer(GLenum draw_buffer) const; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetDrawBuffers(GLsizei n, const GLenum* bufs); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If a color buffer is attached to GL_COLOR_ATTACHMENTi, enable that 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // draw buffer for glClear(). 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void PrepareDrawBuffersForClear() const; 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Restore draw buffers states that have been changed in 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // PrepareDrawBuffersForClear(). 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void RestoreDrawBuffersAfterClear() const; 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Return true if any draw buffers has an alpha channel. 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool HasAlphaMRT() const; 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void ClearFramebufferCompleteComboMap(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool AllowFramebufferComboCompleteMapForTesting() { 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return allow_framebuffer_combo_complete_map_; 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void OnTextureRefDetached(TextureRef* texture); 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnWillRenderTo() const; 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnDidRenderTo() const; 1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class FramebufferManager; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCounted<Framebuffer>; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~Framebuffer(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsDeleted(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAttachmentsAsCleared( 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderbufferManager* renderbuffer_manager, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TextureManager* texture_manager, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool cleared); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsComplete(unsigned state_id) { 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) framebuffer_complete_state_count_id_ = state_id; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned framebuffer_complete_state_count_id() const { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return framebuffer_complete_state_count_id_; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Helper function for PrepareDrawBuffersForClear() and 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // RestoreDrawBuffersAfterClear(). 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void ChangeDrawBuffersHelper(bool recover) const; 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The managers that owns this. 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FramebufferManager* manager_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool deleted_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Service side framebuffer id. 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint service_id_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether this framebuffer has ever been bound. 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_been_bound_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // state count when this framebuffer was last checked for completeness. 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned framebuffer_complete_state_count_id_; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A map of attachments. 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<GLenum, scoped_refptr<Attachment> > AttachmentMap; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AttachmentMap attachments_; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A map of successful frame buffer combos. If it's in the map 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it should be FRAMEBUFFER_COMPLETE. 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<std::string, bool> FramebufferComboCompleteMap; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static FramebufferComboCompleteMap* framebuffer_combo_complete_map_; 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool allow_framebuffer_combo_complete_map_; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<GLenum[]> draw_buffers_; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Framebuffer); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)struct DecoderFramebufferState { 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DecoderFramebufferState(); 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ~DecoderFramebufferState(); 2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // State saved for clearing so we can clear render buffers and then 2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // restore to these values. 2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool clear_state_dirty; 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The currently bound framebuffers 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<Framebuffer> bound_read_framebuffer; 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<Framebuffer> bound_draw_framebuffer; 2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class keeps track of the frambebuffers and their attached renderbuffers 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// so we can correctly clear them. 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT FramebufferManager { 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) class GPU_EXPORT TextureDetachObserver { 2268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public: 2278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TextureDetachObserver(); 2288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual ~TextureDetachObserver(); 2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void OnTextureRefDetachedFromFramebuffer(TextureRef* texture) = 0; 2318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) private: 2338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TextureDetachObserver); 2348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FramebufferManager(uint32 max_draw_buffers, uint32 max_color_attachments); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~FramebufferManager(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must call before destruction. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Destroy(bool have_context); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a Framebuffer for the given framebuffer. 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CreateFramebuffer(GLuint client_id, GLuint service_id); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the framebuffer info for the given framebuffer. 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Framebuffer* GetFramebuffer(GLuint client_id); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes a framebuffer info for the given framebuffer. 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveFramebuffer(GLuint client_id); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets a client id for a given service id. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetClientId(GLuint service_id, GLuint* client_id) const; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MarkAttachmentsAsCleared( 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Framebuffer* framebuffer, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderbufferManager* renderbuffer_manager, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TextureManager* texture_manager); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsComplete(Framebuffer* framebuffer); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsComplete(Framebuffer* framebuffer); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncFramebufferStateChangeCount() { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // make sure this is never 0. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) framebuffer_state_change_count_ = 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (framebuffer_state_change_count_ + 1) | 0x80000000U; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void AddObserver(TextureDetachObserver* observer) { 2700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) texture_detach_observers_.push_back(observer); 2718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void RemoveObserver(TextureDetachObserver* observer) { 2740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) texture_detach_observers_.erase( 2750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) std::remove(texture_detach_observers_.begin(), 2760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) texture_detach_observers_.end(), 2770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) observer), 2780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) texture_detach_observers_.end()); 2798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class Framebuffer; 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartTracking(Framebuffer* framebuffer); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StopTracking(Framebuffer* framebuffer); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void OnTextureRefDetached(TextureRef* texture); 2888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Info for each framebuffer in the system. 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<GLuint, scoped_refptr<Framebuffer> > 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FramebufferMap; 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FramebufferMap framebuffers_; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Incremented anytime anything changes that might effect framebuffer 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned framebuffer_state_change_count_; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Counts the number of Framebuffer allocated with 'this' as its manager. 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allows to check no Framebuffer will outlive this. 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int framebuffer_count_; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool have_context_; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 max_draw_buffers_; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 max_color_attachments_; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) typedef std::vector<TextureDetachObserver*> TextureDetachObserverVector; 3080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) TextureDetachObserverVector texture_detach_observers_; 3098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FramebufferManager); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_ 317