blob: f7518d6b5906919e209e2b9c701f7077d08f6d68 [file] [log] [blame]
Le Hoang Quyen703e9e32023-10-27 20:05:071// Copyright 2023 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "gpu/command_buffer/service/graphite_utils.h"
6
7#include "base/check.h"
Maggie Chen5d35a0142025-04-17 18:35:228#include "gpu/command_buffer/service/graphite_shared_context.h"
Le Hoang Quyen703e9e32023-10-27 20:05:079#include "third_party/skia/include/core/SkImage.h"
10#include "third_party/skia/include/core/SkPixmap.h"
11#include "third_party/skia/include/core/SkSurface.h"
12#include "third_party/skia/include/gpu/graphite/Context.h"
13#include "third_party/skia/include/gpu/graphite/GraphiteTypes.h"
14#include "third_party/skia/include/gpu/graphite/Surface.h"
15
16namespace gpu {
17namespace {
18
19struct ReadPixelsContext {
20 std::unique_ptr<const SkImage::AsyncReadResult> async_result;
21 bool finished = false;
22};
23
24void OnReadPixelsDone(
25 void* raw_ctx,
26 std::unique_ptr<const SkImage::AsyncReadResult> async_result) {
27 ReadPixelsContext* context = reinterpret_cast<ReadPixelsContext*>(raw_ctx);
28 context->async_result = std::move(async_result);
29 context->finished = true;
30}
31
32// Synchronously read pixels from a graphite image.
33template <typename T>
Maggie Chen5d35a0142025-04-17 18:35:2234bool GraphiteReadPixelsSyncImpl(GraphiteSharedContext* context,
Le Hoang Quyen703e9e32023-10-27 20:05:0735 skgpu::graphite::Recorder* recorder,
36 T* imageOrSurface,
37 const SkImageInfo& dst_info,
38 void* dst_pointer,
39 size_t dst_bytes_per_row,
40 int src_x,
41 int src_y) {
42 GraphiteFlush(context, recorder);
43
44 ReadPixelsContext read_context;
45 const SkIRect src_rect =
46 SkIRect::MakeXYWH(src_x, src_x, dst_info.width(), dst_info.height());
47
Maggie Chend9a3aa0e2025-06-14 07:01:3948 context->asyncRescaleAndReadPixelsAndSubmit(
Le Hoang Quyen703e9e32023-10-27 20:05:0749 imageOrSurface, dst_info, src_rect, SkImage::RescaleGamma::kSrc,
Maggie Chenfb6a98682025-05-12 19:59:5050 SkImage::RescaleMode::kRepeatedLinear, base::BindOnce(&OnReadPixelsDone),
51 &read_context);
Le Hoang Quyen703e9e32023-10-27 20:05:0752
Le Hoang Quyen703e9e32023-10-27 20:05:0753 CHECK(read_context.finished);
54
55 if (!read_context.async_result) {
56 return false;
57 }
58
59 SkPixmap pixmap(dst_info, read_context.async_result->data(0),
60 read_context.async_result->rowBytes(0));
61 return pixmap.readPixels(dst_info, dst_pointer, dst_bytes_per_row);
62}
63
64} // namespace
65
Maggie Chen5d35a0142025-04-17 18:35:2266void GraphiteFlush(GraphiteSharedContext* context,
Le Hoang Quyen703e9e32023-10-27 20:05:0767 skgpu::graphite::Recorder* recorder) {
68 auto recording = recorder->snap();
69 if (recording) {
70 context->insertRecording({recording.get()});
71 }
72}
73
Maggie Chen5d35a0142025-04-17 18:35:2274void GraphiteFlushAndSubmit(GraphiteSharedContext* context,
Le Hoang Quyen703e9e32023-10-27 20:05:0775 skgpu::graphite::Recorder* recorder) {
76 GraphiteFlush(context, recorder);
77 context->submit();
78}
79
Maggie Chen5d35a0142025-04-17 18:35:2280bool GraphiteReadPixelsSync(GraphiteSharedContext* context,
Le Hoang Quyen703e9e32023-10-27 20:05:0781 skgpu::graphite::Recorder* recorder,
82 SkImage* image,
83 const SkImageInfo& dst_info,
84 void* dst_pointer,
85 size_t dst_bytes_per_row,
86 int src_x,
87 int src_y) {
88 return GraphiteReadPixelsSyncImpl(context, recorder, image, dst_info,
89 dst_pointer, dst_bytes_per_row, src_x,
90 src_y);
91}
92
Maggie Chen5d35a0142025-04-17 18:35:2293bool GraphiteReadPixelsSync(GraphiteSharedContext* context,
Le Hoang Quyen703e9e32023-10-27 20:05:0794 skgpu::graphite::Recorder* recorder,
95 SkSurface* surface,
96 const SkImageInfo& dst_info,
97 void* dst_pointer,
98 size_t dst_bytes_per_row,
99 int src_x,
100 int src_y) {
101 return GraphiteReadPixelsSyncImpl(context, recorder, surface, dst_info,
102 dst_pointer, dst_bytes_per_row, src_x,
103 src_y);
104}
105
106} // namespace gpu