Home | History | Annotate | Download | only in scheduler
      1 // Copyright 2012 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_SCHEDULER_TEXTURE_UPLOADER_H_
      6 #define CC_SCHEDULER_TEXTURE_UPLOADER_H_
      7 
      8 #include <set>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "cc/base/cc_export.h"
     13 #include "cc/base/scoped_ptr_deque.h"
     14 #include "third_party/khronos/GLES2/gl2.h"
     15 
     16 namespace WebKit { class WebGraphicsContext3D; }
     17 
     18 namespace gfx {
     19 class Rect;
     20 class Size;
     21 class Vector2d;
     22 }
     23 
     24 namespace cc {
     25 
     26 class CC_EXPORT TextureUploader {
     27  public:
     28   static scoped_ptr<TextureUploader> Create(
     29       WebKit::WebGraphicsContext3D* context,
     30       bool use_map_tex_sub_image,
     31       bool use_shallow_flush) {
     32     return make_scoped_ptr(
     33         new TextureUploader(context, use_map_tex_sub_image, use_shallow_flush));
     34   }
     35   ~TextureUploader();
     36 
     37   size_t NumBlockingUploads();
     38   void MarkPendingUploadsAsNonBlocking();
     39   double EstimatedTexturesPerSecond();
     40 
     41   // Let content_rect be a rectangle, and let content_rect be a sub-rectangle of
     42   // content_rect, expressed in the same coordinate system as content_rect. Let
     43   // image be a buffer for content_rect. This function will copy the region
     44   // corresponding to source_rect to dest_offset in this sub-image.
     45   void Upload(const uint8* image,
     46               gfx::Rect content_rect,
     47               gfx::Rect source_rect,
     48               gfx::Vector2d dest_offset,
     49               GLenum format,
     50               gfx::Size size);
     51 
     52   void Flush();
     53   void ReleaseCachedQueries();
     54 
     55  private:
     56   class Query {
     57    public:
     58     static scoped_ptr<Query> Create(WebKit::WebGraphicsContext3D* context) {
     59       return make_scoped_ptr(new Query(context));
     60     }
     61 
     62     virtual ~Query();
     63 
     64     void Begin();
     65     void End();
     66     bool IsPending();
     67     unsigned Value();
     68     size_t TexturesUploaded();
     69     void mark_as_non_blocking() {
     70       is_non_blocking_ = true;
     71     }
     72     bool is_non_blocking() const {
     73       return is_non_blocking_;
     74     }
     75 
     76    private:
     77     explicit Query(WebKit::WebGraphicsContext3D* context);
     78 
     79     WebKit::WebGraphicsContext3D* context_;
     80     unsigned query_id_;
     81     unsigned value_;
     82     bool has_value_;
     83     bool is_non_blocking_;
     84 
     85     DISALLOW_COPY_AND_ASSIGN(Query);
     86   };
     87 
     88   TextureUploader(WebKit::WebGraphicsContext3D* context,
     89                   bool use_map_tex_sub_image,
     90                   bool use_shallow_flush);
     91 
     92   void BeginQuery();
     93   void EndQuery();
     94   void ProcessQueries();
     95 
     96   void UploadWithTexSubImage(const uint8* image,
     97                              gfx::Rect image_rect,
     98                              gfx::Rect source_rect,
     99                              gfx::Vector2d dest_offset,
    100                              GLenum format);
    101   void UploadWithMapTexSubImage(const uint8* image,
    102                                 gfx::Rect image_rect,
    103                                 gfx::Rect source_rect,
    104                                 gfx::Vector2d dest_offset,
    105                                 GLenum format);
    106 
    107   WebKit::WebGraphicsContext3D* context_;
    108   ScopedPtrDeque<Query> pending_queries_;
    109   ScopedPtrDeque<Query> available_queries_;
    110   std::multiset<double> textures_per_second_history_;
    111   size_t num_blocking_texture_uploads_;
    112 
    113   bool use_map_tex_sub_image_;
    114   size_t sub_image_size_;
    115   scoped_ptr<uint8[]> sub_image_;
    116 
    117   bool use_shallow_flush_;
    118   size_t num_texture_uploads_since_last_flush_;
    119 
    120   DISALLOW_COPY_AND_ASSIGN(TextureUploader);
    121 };
    122 
    123 }  // namespace cc
    124 
    125 #endif  // CC_SCHEDULER_TEXTURE_UPLOADER_H_
    126