blob: aac13294fee95a8159d4a7712e3c5501a050d943 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_VIZ_COMMON_FRAME_SINKS_BLIT_REQUEST_H_
#define COMPONENTS_VIZ_COMMON_FRAME_SINKS_BLIT_REQUEST_H_
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "components/viz/common/frame_sinks/copy_output_result.h"
#include "components/viz/common/viz_common_export.h"
#include "gpu/command_buffer/common/sync_token.h"
#include "third_party/skia/include/core/SkImage.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
namespace gpu {
class ClientSharedImage;
}
namespace viz {
// `BlendBitmap` can be added to `BlitRequest`, and signifies that the caller
// would like to blend (SrcOver) the specified bitmap onto the results of the
// `CopyOutputRequest` that (transitively, via `BlitRequest`) contains this
// blend bitmap.
class VIZ_COMMON_EXPORT BlendBitmap {
public:
// |source_region| is expressed in |bitmap|'s coordinate system
// (i.e. 0,0 width x height rectangle). |destination_region| is expressed
// in the captured content's coordinate system. |bitmap| is the bitmap
// that will be blended over the CopyOutputRequest's output.
explicit BlendBitmap(const gfx::Rect& source_region,
const gfx::Rect& destination_region,
sk_sp<SkImage> image);
BlendBitmap(BlendBitmap&& other);
BlendBitmap& operator=(BlendBitmap&& other);
~BlendBitmap();
SkImage* image() const { return image_.get(); }
const gfx::Rect& source_region() const { return source_region_; }
const gfx::Rect& destination_region() const { return destination_region_; }
std::string ToString() const;
private:
// Region in the |image_| that will be blended over.
gfx::Rect source_region_;
// Region in the destination that will be blended onto.
gfx::Rect destination_region_;
// The image that will be blended.
sk_sp<SkImage> image_;
};
// Enum used to specify letteboxing behavior for a BlitRequest.
enum class LetterboxingBehavior {
// No letterboxing is needed - only the destination region will be written
// into by the handler of CopyOutputRequest.
kDoNotLetterbox,
// Letterboxing is needed - everything outside of the destination region
// will be filled with black by the handler of CopyOutputRequest.
kLetterbox
};
// Structure describing a blit operation that can be appended to
// `CopyOutputRequest` if the callers want to place the results of the operation
// in textures that they own.
class VIZ_COMMON_EXPORT BlitRequest {
public:
BlitRequest();
// `shared_image` must not be null
explicit BlitRequest(const gfx::Point& destination_region_offset,
LetterboxingBehavior letterboxing_behavior,
scoped_refptr<gpu::ClientSharedImage> shared_image,
const gpu::SyncToken& sync_token,
bool populates_gpu_memory_buffer);
BlitRequest(BlitRequest&& other);
BlitRequest& operator=(BlitRequest&& other);
~BlitRequest();
std::string ToString() const;
const gfx::Point& destination_region_offset() const {
return destination_region_offset_;
}
LetterboxingBehavior letterboxing_behavior() const {
return letterboxing_behavior_;
}
const scoped_refptr<gpu::ClientSharedImage>& shared_image() const {
return shared_image_;
}
const gpu::SyncToken& sync_token() const { return sync_token_; }
bool populates_gpu_memory_buffer() const {
return populates_gpu_memory_buffer_;
}
// Appends a new `BlendBitmap` request to this blit request.
// |source_region| is expressed in |image|'s coordinate system
// (i.e. 0,0 width x height rectangle). |destination_region| is expressed
// in the captured content's coordinate system. |image| is the image
// that will be blended over the CopyOutputRequest's output.
void AppendBlendBitmap(const gfx::Rect& source_region,
const gfx::Rect& destination_region,
sk_sp<SkImage> image) {
blend_bitmaps_.emplace_back(source_region, destination_region,
std::move(image));
}
const std::vector<BlendBitmap>& blend_bitmaps() const {
return blend_bitmaps_;
}
private:
// Offset from the origin of the image represented by the `shared_image_`.
// The results of the blit request will be placed at that offset in those
// images.
gfx::Point destination_region_offset_;
// Specifies the letterboxing behavior of this request.
LetterboxingBehavior letterboxing_behavior_;
// The image that will be populated. The texture can (but doesn't have to) be
// backed by a GpuMemoryBuffer.
scoped_refptr<gpu::ClientSharedImage> shared_image_;
// SyncToken to wait on before accessing `shared_image_`;
gpu::SyncToken sync_token_;
// True if `shared_image_` has been created from a `GpuMemoryBuffer`. In this
// case, the `CopyOutputResult` needs to be sent out only after it's safe to
// map the `GpuMemoryBuffer` to system memory.
bool populates_gpu_memory_buffer_;
// Collection of bitmaps that will be blended onto the texture.
// They will be blended in order (so if i < j, bitmap at offset i will
// be blended before bitmap at offset j), using SrcOver blend mode.
std::vector<BlendBitmap> blend_bitmaps_;
};
} // namespace viz
#endif // COMPONENTS_VIZ_COMMON_FRAME_SINKS_BLIT_REQUEST_H_