Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
ImageWrapTextureMipmapsTest.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2024 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "tests/Test.h"
9
21
22using namespace skgpu;
23using namespace skgpu::graphite;
24
27 context,
28 testContext,
29 true,
31 auto recorder = context->makeRecorder();
32 if (!recorder) {
33 ERRORF(reporter, "Could not make recorder");
34 return;
35 }
36
37 skgpu::Protected isProtected = skgpu::Protected(context->priv().caps()->protectedSupport());
38
40 SkAutoPixmapStorage basePM, topPM;
41 basePM.alloc(info);
42 basePM.erase(SK_ColorGREEN);
43 topPM.alloc(info.makeDimensions({1, 1}));
44 topPM.erase(SK_ColorBLUE);
45
46 SkPixmap levelPMs[]{basePM, topPM};
47 auto mbet = sk_gpu_test::ManagedGraphiteTexture::MakeMipmappedFromPixmaps(recorder.get(),
48 levelPMs,
49 Renderable::kNo,
50 isProtected);
51
52 if (!mbet) {
53 ERRORF(reporter, "Could not make backend texture");
54 return;
55 }
56
57 std::unique_ptr<Recording> recording = recorder->snap();
58
59 auto recordingFinishProc = [](void* context, CallbackResult) {
60 std::unique_ptr<Recording>(static_cast<Recording*>(context));
61 };
62
64 recordingInfo.fFinishedProc = recordingFinishProc;
65 recordingInfo.fRecording = recording.get();
66 recordingInfo.fFinishedContext = recording.release();
67 if (!context->insertRecording(recordingInfo)) {
68 ERRORF(reporter, "Could not insert recording");
69 return;
70 }
71
72 static constexpr struct TestCase {
74 SkColor expectedColor;
75 } kTestCases[]{{SkImages::GenerateMipmapsFromBase::kNo , 0xFFFF0000},
77
78 for (const auto& testCase : kTestCases) {
79 recorder = context->makeRecorder();
80 if (!recorder) {
81 ERRORF(reporter, "Could not make recorder");
82 return;
83 }
84
85 auto image = SkImages::WrapTexture(recorder.get(),
86 mbet->texture(),
87 info.colorType(),
88 info.alphaType(),
89 info.refColorSpace(),
90 Origin::kTopLeft,
91 testCase.genMipmaps,
92 sk_gpu_test::ManagedGraphiteTexture::ImageReleaseProc,
93 mbet->releaseContext());
94 if (!recorder) {
95 ERRORF(reporter, "Could not make image");
96 return;
97 }
98
99 // We determe the contents of the image's top level by doing a downsampling draw to a
100 // surface and then reading the surface's contents.
101 auto surface = SkSurfaces::RenderTarget(recorder.get(), info.makeDimensions({1, 1}));
102 if (!recorder) {
103 ERRORF(reporter, "Could not make surface");
104 return;
105 }
106
107 auto shader = image->makeShader(
111
112 surface->getCanvas()->scale(0.05f, 0.05f);
114 paint.setShader(std::move(shader));
115 surface->getCanvas()->drawPaint(paint);
116
117 recording = recorder->snap();
118 recordingInfo.fRecording = recording.get();
119 recordingInfo.fFinishedContext = recording.release();
120 if (!context->insertRecording(recordingInfo)) {
121 ERRORF(reporter, "Could not insert recording");
122 return;
123 }
124
125 struct ReadContext {
126 bool called = false;
127 bool success = false;
128 uint32_t color;
129 };
130 auto readPixelsCallback = [](SkImage::ReadPixelsContext context,
131 std::unique_ptr<const SkImage::AsyncReadResult> result) {
132 auto& readContext = *static_cast<ReadContext*>(context);
133 readContext.called = true;
134 if (result) {
135 readContext.success = true;
136 readContext.color = *static_cast<const uint32_t*>(result->data(0));
137 }
138 };
139 ReadContext readContext;
140 context->asyncRescaleAndReadPixels(surface.get(),
141 surface->imageInfo(),
142 SkIRect::MakeSize(surface->imageInfo().dimensions()),
143 SkImage::RescaleGamma::kSrc,
144 SkImage::RescaleMode::kNearest,
145 readPixelsCallback,
146 &readContext);
147 context->submit();
148 while (!readContext.called) {
149 testContext->tick();
150 context->checkAsyncWorkCompletion();
151 }
152
153 if (!readContext.success) {
154 ERRORF(reporter, "Read pixels failed");
155 return;
156 }
157
158 REPORTER_ASSERT(reporter, readContext.color == testCase.expectedColor);
159 }
160}
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
reporter
SkColor4f color
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
Definition SkAlphaType.h:29
@ kRGBA_8888_SkColorType
pixel with 8 bits for red, green, blue, alpha; in 32-bit word
Definition SkColorType.h:24
uint32_t SkColor
Definition SkColor.h:37
constexpr SkColor SK_ColorBLUE
Definition SkColor.h:135
constexpr SkColor SK_ColorGREEN
Definition SkColor.h:131
#define DEF_CONDITIONAL_GRAPHITE_TEST_FOR_ALL_CONTEXTS(name, reporter, graphite_ctx, test_ctx, cond, ctsEnforcement)
Definition Test.h:352
#define REPORTER_ASSERT(r, cond,...)
Definition Test.h:286
#define ERRORF(r,...)
Definition Test.h:293
void alloc(const SkImageInfo &)
void * ReadPixelsContext
Definition SkImage.h:578
sk_sp< SkShader > makeShader(SkTileMode tmx, SkTileMode tmy, const SkSamplingOptions &, const SkMatrix *localMatrix=nullptr) const
Definition SkImage.cpp:179
const Paint & paint
VkSurfaceKHR surface
Definition main.cc:49
sk_sp< SkImage > image
Definition examples.cpp:29
GAsyncResult * result
GenerateMipmapsFromBase
Definition Image.h:31
SK_API sk_sp< SkImage > WrapTexture(skgpu::graphite::Recorder *, const skgpu::graphite::BackendTexture &, SkColorType colorType, SkAlphaType alphaType, sk_sp< SkColorSpace > colorSpace, skgpu::Origin origin, GenerateMipmapsFromBase generateMipmapsFromBase, TextureReleaseProc=nullptr, ReleaseContext=nullptr)
SK_API sk_sp< SkSurface > RenderTarget(GrRecordingContext *context, skgpu::Budgeted budgeted, const SkImageInfo &imageInfo, int sampleCount, GrSurfaceOrigin surfaceOrigin, const SkSurfaceProps *surfaceProps, bool shouldCreateWithMips=false, bool isProtected=false)
CallbackResult
Definition GpuTypes.h:45
Protected
Definition GpuTypes.h:61
static constexpr SkIRect MakeSize(const SkISize &size)
Definition SkRect.h:66
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)