blob: ac67b9e1d077b02d8629b789e7affca94b8a6049 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SKIA_OUTPUT_DEVICE_GL_H_
#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SKIA_OUTPUT_DEVICE_GL_H_
#include <memory>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "components/viz/service/display_embedder/skia_output_device.h"
namespace gl {
class GLImage;
class GLSurface;
} // namespace gl
namespace gpu {
class MailboxManager;
class SharedContextState;
class SharedImageRepresentationFactory;
namespace gles2 {
class FeatureInfo;
} // namespace gles2
} // namespace gpu
namespace viz {
class SkiaOutputDeviceGL final : public SkiaOutputDevice {
public:
SkiaOutputDeviceGL(
gpu::MailboxManager* mailbox_manager,
gpu::SharedImageRepresentationFactory*
shared_image_representation_factory,
gpu::SharedContextState* context_state,
scoped_refptr<gl::GLSurface> gl_surface,
scoped_refptr<gpu::gles2::FeatureInfo> feature_info,
gpu::MemoryTracker* memory_tracker,
DidSwapBufferCompleteCallback did_swap_buffer_complete_callback);
~SkiaOutputDeviceGL() override;
// SkiaOutputDevice implementation:
bool Reshape(const gfx::Size& size,
float device_scale_factor,
const gfx::ColorSpace& color_space,
gfx::BufferFormat format,
gfx::OverlayTransform transform) override;
void SwapBuffers(BufferPresentedCallback feedback,
OutputSurfaceFrame frame) override;
void PostSubBuffer(const gfx::Rect& rect,
BufferPresentedCallback feedback,
OutputSurfaceFrame frame) override;
void CommitOverlayPlanes(BufferPresentedCallback feedback,
OutputSurfaceFrame frame) override;
bool SetDrawRectangle(const gfx::Rect& draw_rectangle) override;
void SetGpuVSyncEnabled(bool enabled) override;
void SetEnableDCLayers(bool enable) override;
void ScheduleOverlays(SkiaOutputSurface::OverlayList overlays) override;
void EnsureBackbuffer() override;
void DiscardBackbuffer() override;
SkSurface* BeginPaint(
std::vector<GrBackendSemaphore>* end_semaphores) override;
void EndPaint() override;
private:
class OverlayData;
// Use instead of calling FinishSwapBuffers() directly. On Windows this cleans
// up old entries in |overlays_|.
void DoFinishSwapBuffers(const gfx::Size& size,
OutputSurfaceFrame frame,
gfx::SwapCompletionResult result);
// Used as callback for SwapBuffersAsync and PostSubBufferAsync to finish
// operation
void DoFinishSwapBuffersAsync(const gfx::Size& size,
OutputSurfaceFrame frame,
gfx::SwapCompletionResult result);
scoped_refptr<gl::GLImage> GetGLImageForMailbox(const gpu::Mailbox& mailbox);
gpu::MailboxManager* const mailbox_manager_;
gpu::SharedImageRepresentationFactory* const
shared_image_representation_factory_;
gpu::SharedContextState* const context_state_;
scoped_refptr<gl::GLSurface> gl_surface_;
const bool supports_async_swap_;
sk_sp<SkSurface> sk_surface_;
// Mailboxes of overlays scheduled in the current frame.
base::flat_set<gpu::Mailbox> scheduled_overlay_mailboxes_;
// Holds references to overlay textures so they aren't destroyed while in use.
base::flat_map<gpu::Mailbox, OverlayData> overlays_;
uint64_t backbuffer_estimated_size_ = 0;
base::WeakPtrFactory<SkiaOutputDeviceGL> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(SkiaOutputDeviceGL);
};
} // namespace viz
#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SKIA_OUTPUT_DEVICE_GL_H_