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