1 // Copyright (c) 2017 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 GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_GLES_H_
6 #define GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_GLES_H_
7 
8 #include <unordered_map>
9 
10 #include "base/containers/flat_map.h"
11 #include "base/macros.h"
12 #include "base/optional.h"
13 #include "gpu/command_buffer/client/client_font_manager.h"
14 #include "gpu/command_buffer/client/gles2_interface.h"
15 #include "gpu/command_buffer/client/raster_interface.h"
16 #include "gpu/command_buffer/common/capabilities.h"
17 #include "gpu/raster_export.h"
18 #include "third_party/skia/include/core/SkColorSpace.h"
19 
20 namespace gpu {
21 
22 class ContextSupport;
23 class GLHelper;
24 
25 namespace raster {
26 
27 // An implementation of RasterInterface on top of GLES2Interface.
28 class RASTER_EXPORT RasterImplementationGLES : public RasterInterface {
29  public:
30   explicit RasterImplementationGLES(gles2::GLES2Interface* gl,
31                                     ContextSupport* context_support);
32   ~RasterImplementationGLES() override;
33 
34   // Command buffer Flush / Finish.
35   void Finish() override;
36   void Flush() override;
37   void ShallowFlushCHROMIUM() override;
38   void OrderingBarrierCHROMIUM() override;
39 
40   // Command buffer state.
41   GLenum GetError() override;
42   GLenum GetGraphicsResetStatusKHR() override;
43   void LoseContextCHROMIUM(GLenum current, GLenum other) override;
44 
45   // Queries:
46   // - GL_COMMANDS_ISSUED_CHROMIUM
47   // - GL_COMMANDS_ISSUED_TIMESTAMP_CHROMIUM
48   // - GL_COMMANDS_COMPLETED_CHROMIUM
49   void GenQueriesEXT(GLsizei n, GLuint* queries) override;
50   void DeleteQueriesEXT(GLsizei n, const GLuint* queries) override;
51   void BeginQueryEXT(GLenum target, GLuint id) override;
52   void EndQueryEXT(GLenum target) override;
53   void QueryCounterEXT(GLuint id, GLenum target) override;
54   void GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) override;
55   void GetQueryObjectui64vEXT(GLuint id,
56                               GLenum pname,
57                               GLuint64* params) override;
58 
59   // Texture copying.
60   void CopySubTexture(const gpu::Mailbox& source_mailbox,
61                       const gpu::Mailbox& dest_mailbox,
62                       GLenum dest_target,
63                       GLint xoffset,
64                       GLint yoffset,
65                       GLint x,
66                       GLint y,
67                       GLsizei width,
68                       GLsizei height,
69                       GLboolean unpack_flip_y,
70                       GLboolean unpack_premultiply_alpha) override;
71 
72   void WritePixels(const gpu::Mailbox& dest_mailbox,
73                    int dst_x_offset,
74                    int dst_y_offset,
75                    GLenum texture_target,
76                    const SkImageInfo& src_info,
77                    const void* src_pixels) override;
78 
79   // OOP-Raster
80   void BeginRasterCHROMIUM(GLuint sk_color,
81                            GLuint msaa_sample_count,
82                            GLboolean can_use_lcd_text,
83                            const gfx::ColorSpace& color_space,
84                            const GLbyte* mailbox) override;
85   void RasterCHROMIUM(const cc::DisplayItemList* list,
86                       cc::ImageProvider* provider,
87                       const gfx::Size& content_size,
88                       const gfx::Rect& full_raster_rect,
89                       const gfx::Rect& playback_rect,
90                       const gfx::Vector2dF& post_translate,
91                       GLfloat post_scale,
92                       bool requires_clear,
93                       size_t* max_op_size_hint) override;
94   void EndRasterCHROMIUM() override;
95 
96   // Image decode acceleration.
97   SyncToken ScheduleImageDecode(base::span<const uint8_t> encoded_data,
98                                 const gfx::Size& output_size,
99                                 uint32_t transfer_cache_entry_id,
100                                 const gfx::ColorSpace& target_color_space,
101                                 bool needs_mips) override;
102 
103   void ReadbackARGBPixelsAsync(
104       const gpu::Mailbox& source_mailbox,
105       GLenum source_target,
106       const gfx::Size& dst_size,
107       unsigned char* out,
108       GLenum format,
109       base::OnceCallback<void(bool)> callback) override;
110 
111   void ReadbackYUVPixelsAsync(
112       const gpu::Mailbox& source_mailbox,
113       GLenum source_target,
114       const gfx::Size& source_size,
115       const gfx::Rect& output_rect,
116       bool vertically_flip_texture,
117       int y_plane_row_stride_bytes,
118       unsigned char* y_plane_data,
119       int u_plane_row_stride_bytes,
120       unsigned char* u_plane_data,
121       int v_plane_row_stride_bytes,
122       unsigned char* v_plane_data,
123       const gfx::Point& paste_location,
124       base::OnceCallback<void()> release_mailbox,
125       base::OnceCallback<void(bool)> readback_done) override;
126 
127   // Raster via GrContext.
128   GLuint CreateAndConsumeForGpuRaster(const gpu::Mailbox& mailbox) override;
129   void DeleteGpuRasterTexture(GLuint texture) override;
130   void BeginGpuRaster() override;
131   void EndGpuRaster() override;
132   void BeginSharedImageAccessDirectCHROMIUM(GLuint texture,
133                                             GLenum mode) override;
134   void EndSharedImageAccessDirectCHROMIUM(GLuint texture) override;
135 
136   void InitializeDiscardableTextureCHROMIUM(GLuint texture) override;
137   void UnlockDiscardableTextureCHROMIUM(GLuint texture) override;
138   bool LockDiscardableTextureCHROMIUM(GLuint texture) override;
139 
140   void TraceBeginCHROMIUM(const char* category_name,
141                           const char* trace_name) override;
142   void TraceEndCHROMIUM() override;
143 
144   void SetActiveURLCHROMIUM(const char* url) override;
145 
146   // InterfaceBase implementation.
147   void GenSyncTokenCHROMIUM(GLbyte* sync_token) override;
148   void GenUnverifiedSyncTokenCHROMIUM(GLbyte* sync_token) override;
149   void VerifySyncTokensCHROMIUM(GLbyte** sync_tokens, GLsizei count) override;
150   void WaitSyncTokenCHROMIUM(const GLbyte* sync_token) override;
151 
152  private:
153   GLHelper* GetGLHelper();
154   void OnReadARGBPixelsAsync(GLuint texture_id,
155                              base::OnceCallback<void(bool)> callback,
156                              bool success);
157   void OnReadYUVPixelsAsync(GLuint copy_texture_id,
158                             base::OnceCallback<void()> on_release_mailbox,
159                             base::OnceCallback<void(bool)> readback_done,
160                             bool success);
161   void OnReleaseMailbox(GLuint shared_texture_id,
162                         base::OnceCallback<void()> release_mailbox);
163 
164   gles2::GLES2Interface* gl_;
165   ContextSupport* context_support_;
166   std::unique_ptr<GLHelper> gl_helper_;
167   base::WeakPtrFactory<RasterImplementationGLES> weak_ptr_factory_{this};
168 
169   DISALLOW_COPY_AND_ASSIGN(RasterImplementationGLES);
170 };
171 
172 }  // namespace raster
173 }  // namespace gpu
174 
175 #endif  // GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_GLES_H_
176