Home | History | Annotate | Download | only in surfaces
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CC_SURFACES_SURFACE_H_
      6 #define CC_SURFACES_SURFACE_H_
      7 
      8 #include "base/containers/hash_tables.h"
      9 #include "base/macros.h"
     10 #include "base/memory/scoped_ptr.h"
     11 #include "cc/resources/resource_provider.h"
     12 #include "cc/resources/return_callback.h"
     13 #include "cc/surfaces/surface_client.h"
     14 #include "cc/surfaces/surface_id.h"
     15 #include "cc/surfaces/surfaces_export.h"
     16 #include "ui/gfx/size.h"
     17 
     18 namespace cc {
     19 class CompositorFrame;
     20 class SurfaceManager;
     21 
     22 class CC_SURFACES_EXPORT Surface {
     23  public:
     24   Surface(SurfaceManager* manager,
     25           SurfaceClient* client,
     26           const gfx::Size& size);
     27   ~Surface();
     28 
     29   const gfx::Size& size() const { return size_; }
     30   SurfaceId surface_id() const { return surface_id_; }
     31 
     32   void QueueFrame(scoped_ptr<CompositorFrame> frame);
     33   // Returns the most recent frame that is eligible to be rendered.
     34   CompositorFrame* GetEligibleFrame();
     35 
     36   // Takes a reference to all of the current frame's resources for an external
     37   // consumer (e.g. a ResourceProvider). The caller to this should call
     38   // UnrefResources() when they are done with the resources.
     39   void RefCurrentFrameResources();
     40   void UnrefResources(const ReturnedResourceArray& resources);
     41 
     42   // Returns all resources that are currently not in use to the client.
     43   void ReturnUnusedResourcesToClient();
     44 
     45  private:
     46   void ReceiveResourcesFromClient(const TransferableResourceArray& resources);
     47 
     48   SurfaceManager* manager_;
     49   SurfaceClient* client_;
     50   gfx::Size size_;
     51   SurfaceId surface_id_;
     52   // TODO(jamesr): Support multiple frames in flight.
     53   scoped_ptr<CompositorFrame> current_frame_;
     54 
     55   struct ResourceRefs {
     56     ResourceRefs();
     57 
     58     int refs_received_from_child;
     59     int refs_holding_resource_alive;
     60   };
     61   // Keeps track of the number of users currently in flight for each resource
     62   // ID we've received from the client. When this counter hits zero for a
     63   // particular resource, that ID is available to return to the client.
     64   typedef base::hash_map<ResourceProvider::ResourceId, ResourceRefs>
     65       ResourceIdCountMap;
     66   ResourceIdCountMap resource_id_use_count_map_;
     67 
     68   ReturnedResourceArray resources_available_to_return_;
     69 
     70   DISALLOW_COPY_AND_ASSIGN(Surface);
     71 };
     72 
     73 }  // namespace cc
     74 
     75 #endif  // CC_SURFACES_SURFACE_H_
     76