xref: /aosp_15_r20/external/skia/tests/VkProtectedContextTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2019 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker // This is a Vulkan protected memory specific test.
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
11*c8dee2aaSAndroid Build Coastguard Worker 
12*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_VULKAN)
13*c8dee2aaSAndroid Build Coastguard Worker 
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkAlphaType.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBlendMode.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBlurTypes.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorType.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMaskFilter.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "tests/CtsEnforcement.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/vk/VkTestHelper.h"
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH)
36*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
38*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/SkSurfaceGanesh.h"
39*c8dee2aaSAndroid Build Coastguard Worker #endif
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE)
42*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/BackendTexture.h"
43*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Context.h"
44*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Recorder.h"
45*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/TextureInfo.h"
46*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/vk/VulkanGraphiteTypes.h"
47*c8dee2aaSAndroid Build Coastguard Worker #endif
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
50*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions;
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker static const int kSize = 8;
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker namespace {
57*c8dee2aaSAndroid Build Coastguard Worker 
create_nonprotected_context(skiatest::Reporter * reporter,skiatest::TestType testType)58*c8dee2aaSAndroid Build Coastguard Worker void create_nonprotected_context(skiatest::Reporter* reporter, skiatest::TestType testType) {
59*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(testType, /* isProtected= */ false);
60*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper);
61*c8dee2aaSAndroid Build Coastguard Worker }
62*c8dee2aaSAndroid Build Coastguard Worker 
63*c8dee2aaSAndroid Build Coastguard Worker } // anonymous namespace
64*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_CreateNonprotectedContext,reporter,options,CtsEnforcement::kNever)65*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_CreateNonprotectedContext,
66*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
67*c8dee2aaSAndroid Build Coastguard Worker                 options,
68*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
69*c8dee2aaSAndroid Build Coastguard Worker     create_nonprotected_context(reporter, skiatest::TestType::kGanesh);
70*c8dee2aaSAndroid Build Coastguard Worker }
71*c8dee2aaSAndroid Build Coastguard Worker 
72*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE)
73*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_CreateNonprotectedContext_Graphite,reporter,CtsEnforcement::kNextRelease)74*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_CreateNonprotectedContext_Graphite,
75*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
76*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
77*c8dee2aaSAndroid Build Coastguard Worker     create_nonprotected_context(reporter, skiatest::TestType::kGraphite);
78*c8dee2aaSAndroid Build Coastguard Worker }
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker #endif
81*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_CreateProtectedContext,reporter,options,CtsEnforcement::kNever)82*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_CreateProtectedContext,
83*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
84*c8dee2aaSAndroid Build Coastguard Worker                 options,
85*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
86*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(skiatest::TestType::kGanesh,
87*c8dee2aaSAndroid Build Coastguard Worker                                                               /* isProtected= */ true);
88*c8dee2aaSAndroid Build Coastguard Worker }
89*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_CreateProtectedContext_Graphite,reporter,CtsEnforcement::kNextRelease)90*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_CreateProtectedContext_Graphite,
91*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
92*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
93*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(skiatest::TestType::kGraphite,
94*c8dee2aaSAndroid Build Coastguard Worker                                                               /* isProtected= */ true);
95*c8dee2aaSAndroid Build Coastguard Worker }
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker namespace {
98*c8dee2aaSAndroid Build Coastguard Worker 
create_protected_surface(skiatest::Reporter * reporter,skiatest::TestType testType)99*c8dee2aaSAndroid Build Coastguard Worker void create_protected_surface(skiatest::Reporter* reporter, skiatest::TestType testType) {
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(testType, /* isProtected= */ true);
102*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
103*c8dee2aaSAndroid Build Coastguard Worker         return;
104*c8dee2aaSAndroid Build Coastguard Worker     }
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
107*c8dee2aaSAndroid Build Coastguard Worker 
108*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> textureable = helper->createSurface({ kSize, kSize },
109*c8dee2aaSAndroid Build Coastguard Worker                                                          /* textureable= */ true,
110*c8dee2aaSAndroid Build Coastguard Worker                                                          /* isProtected= */ true);
111*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, textureable);
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> untextureable = helper->createSurface({ kSize, kSize },
114*c8dee2aaSAndroid Build Coastguard Worker                                                            /* textureable= */ false,
115*c8dee2aaSAndroid Build Coastguard Worker                                                            /* isProtected= */ true);
116*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, untextureable);
117*c8dee2aaSAndroid Build Coastguard Worker }
118*c8dee2aaSAndroid Build Coastguard Worker 
119*c8dee2aaSAndroid Build Coastguard Worker } // anonymous namespace
120*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_CreateProtectedSkSurface,reporter,options,CtsEnforcement::kNever)121*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_CreateProtectedSkSurface,
122*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
123*c8dee2aaSAndroid Build Coastguard Worker                 options,
124*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
125*c8dee2aaSAndroid Build Coastguard Worker     create_protected_surface(reporter, skiatest::TestType::kGanesh);
126*c8dee2aaSAndroid Build Coastguard Worker }
127*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_CreateProtectedSkSurface_Graphite,reporter,CtsEnforcement::kNextRelease)128*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_CreateProtectedSkSurface_Graphite,
129*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
130*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
131*c8dee2aaSAndroid Build Coastguard Worker     create_protected_surface(reporter, skiatest::TestType::kGraphite);
132*c8dee2aaSAndroid Build Coastguard Worker }
133*c8dee2aaSAndroid Build Coastguard Worker 
134*c8dee2aaSAndroid Build Coastguard Worker namespace {
135*c8dee2aaSAndroid Build Coastguard Worker 
create_backend_texture_ganesh(skiatest::Reporter * reporter,bool contextIsProtected,bool beTexIsProtected)136*c8dee2aaSAndroid Build Coastguard Worker void create_backend_texture_ganesh(skiatest::Reporter* reporter,
137*c8dee2aaSAndroid Build Coastguard Worker                                    bool contextIsProtected,
138*c8dee2aaSAndroid Build Coastguard Worker                                    bool beTexIsProtected) {
139*c8dee2aaSAndroid Build Coastguard Worker 
140*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(skiatest::TestType::kGanesh,
141*c8dee2aaSAndroid Build Coastguard Worker                                                               contextIsProtected);
142*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
143*c8dee2aaSAndroid Build Coastguard Worker         return;
144*c8dee2aaSAndroid Build Coastguard Worker     }
145*c8dee2aaSAndroid Build Coastguard Worker 
146*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
147*c8dee2aaSAndroid Build Coastguard Worker     GrDirectContext* dContext = helper->directContext();
148*c8dee2aaSAndroid Build Coastguard Worker 
149*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture backendTex = dContext->createBackendTexture(kSize,
150*c8dee2aaSAndroid Build Coastguard Worker                                                                  kSize,
151*c8dee2aaSAndroid Build Coastguard Worker                                                                  kRGBA_8888_SkColorType,
152*c8dee2aaSAndroid Build Coastguard Worker                                                                  skgpu::Mipmapped::kNo,
153*c8dee2aaSAndroid Build Coastguard Worker                                                                  GrRenderable::kNo,
154*c8dee2aaSAndroid Build Coastguard Worker                                                                  GrProtected(beTexIsProtected));
155*c8dee2aaSAndroid Build Coastguard Worker 
156*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, backendTex.isValid() == (contextIsProtected == beTexIsProtected));
157*c8dee2aaSAndroid Build Coastguard Worker     if (backendTex.isValid()) {
158*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, backendTex.isProtected() == beTexIsProtected);
159*c8dee2aaSAndroid Build Coastguard Worker     }
160*c8dee2aaSAndroid Build Coastguard Worker 
161*c8dee2aaSAndroid Build Coastguard Worker     dContext->deleteBackendTexture(backendTex);
162*c8dee2aaSAndroid Build Coastguard Worker }
163*c8dee2aaSAndroid Build Coastguard Worker 
164*c8dee2aaSAndroid Build Coastguard Worker } // anonymous namespace
165*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_CreateBackendTextures,reporter,options,CtsEnforcement::kNever)166*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_CreateBackendTextures,
167*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
168*c8dee2aaSAndroid Build Coastguard Worker                 options,
169*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
170*c8dee2aaSAndroid Build Coastguard Worker     for (bool contextIsProtected : { true, false }) {
171*c8dee2aaSAndroid Build Coastguard Worker         for (bool beTexIsProtected : { true, false }) {
172*c8dee2aaSAndroid Build Coastguard Worker             create_backend_texture_ganesh(reporter, contextIsProtected, beTexIsProtected);
173*c8dee2aaSAndroid Build Coastguard Worker         }
174*c8dee2aaSAndroid Build Coastguard Worker     }
175*c8dee2aaSAndroid Build Coastguard Worker }
176*c8dee2aaSAndroid Build Coastguard Worker 
177*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE)
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker namespace {
180*c8dee2aaSAndroid Build Coastguard Worker 
create_backend_texture_graphite(skiatest::Reporter * reporter,bool contextIsProtected,bool beTexIsProtected)181*c8dee2aaSAndroid Build Coastguard Worker void create_backend_texture_graphite(skiatest::Reporter* reporter,
182*c8dee2aaSAndroid Build Coastguard Worker                                      bool contextIsProtected,
183*c8dee2aaSAndroid Build Coastguard Worker                                      bool beTexIsProtected) {
184*c8dee2aaSAndroid Build Coastguard Worker     using namespace skgpu::graphite;
185*c8dee2aaSAndroid Build Coastguard Worker 
186*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(skiatest::TestType::kGraphite,
187*c8dee2aaSAndroid Build Coastguard Worker                                                               contextIsProtected);
188*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
189*c8dee2aaSAndroid Build Coastguard Worker         return;
190*c8dee2aaSAndroid Build Coastguard Worker     }
191*c8dee2aaSAndroid Build Coastguard Worker 
192*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
193*c8dee2aaSAndroid Build Coastguard Worker 
194*c8dee2aaSAndroid Build Coastguard Worker     VulkanTextureInfo vkTextureInfo;
195*c8dee2aaSAndroid Build Coastguard Worker     vkTextureInfo.fFlags = beTexIsProtected ? VK_IMAGE_CREATE_PROTECTED_BIT : 0;
196*c8dee2aaSAndroid Build Coastguard Worker     vkTextureInfo.fFormat = VK_FORMAT_R8G8B8A8_UNORM;
197*c8dee2aaSAndroid Build Coastguard Worker     vkTextureInfo.fImageUsageFlags = VK_IMAGE_USAGE_SAMPLED_BIT |
198*c8dee2aaSAndroid Build Coastguard Worker                                      VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
199*c8dee2aaSAndroid Build Coastguard Worker                                      VK_IMAGE_USAGE_TRANSFER_DST_BIT;
200*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo textureInfo = TextureInfos::MakeVulkan(vkTextureInfo);
201*c8dee2aaSAndroid Build Coastguard Worker 
202*c8dee2aaSAndroid Build Coastguard Worker     BackendTexture backendTex = helper->recorder()->createBackendTexture({ kSize, kSize },
203*c8dee2aaSAndroid Build Coastguard Worker                                                                          textureInfo);
204*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, backendTex.isValid() == (contextIsProtected == beTexIsProtected));
205*c8dee2aaSAndroid Build Coastguard Worker     if (backendTex.isValid()) {
206*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter,
207*c8dee2aaSAndroid Build Coastguard Worker                         backendTex.info().isProtected() == skgpu::Protected(beTexIsProtected));
208*c8dee2aaSAndroid Build Coastguard Worker     }
209*c8dee2aaSAndroid Build Coastguard Worker 
210*c8dee2aaSAndroid Build Coastguard Worker     helper->recorder()->deleteBackendTexture(backendTex);
211*c8dee2aaSAndroid Build Coastguard Worker }
212*c8dee2aaSAndroid Build Coastguard Worker 
213*c8dee2aaSAndroid Build Coastguard Worker } // anonymous namespace
214*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_CreateBackendTextures_Graphite,reporter,CtsEnforcement::kNextRelease)215*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_CreateBackendTextures_Graphite,
216*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
217*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
218*c8dee2aaSAndroid Build Coastguard Worker     for (bool contextIsProtected : { true, false }) {
219*c8dee2aaSAndroid Build Coastguard Worker         for (bool beTexIsProtected : { true, false }) {
220*c8dee2aaSAndroid Build Coastguard Worker             create_backend_texture_graphite(reporter, contextIsProtected, beTexIsProtected);
221*c8dee2aaSAndroid Build Coastguard Worker         }
222*c8dee2aaSAndroid Build Coastguard Worker     }
223*c8dee2aaSAndroid Build Coastguard Worker }
224*c8dee2aaSAndroid Build Coastguard Worker 
225*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_GRAPHITE
226*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_ReadFromProtectedSurface,reporter,options,CtsEnforcement::kNever)227*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_ReadFromProtectedSurface,
228*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
229*c8dee2aaSAndroid Build Coastguard Worker                 options,
230*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
231*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(skiatest::TestType::kGanesh,
232*c8dee2aaSAndroid Build Coastguard Worker                                                               /* isProtected= */ true);
233*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
234*c8dee2aaSAndroid Build Coastguard Worker         return;
235*c8dee2aaSAndroid Build Coastguard Worker     }
236*c8dee2aaSAndroid Build Coastguard Worker 
237*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
238*c8dee2aaSAndroid Build Coastguard Worker 
239*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface = helper->createSurface({ kSize, kSize },
240*c8dee2aaSAndroid Build Coastguard Worker                                                      /* textureable= */ true,
241*c8dee2aaSAndroid Build Coastguard Worker                                                      /* isProtected= */ true);
242*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface);
243*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, !surface->readPixels(SkImageInfo(), nullptr, 8, 0, 0));
244*c8dee2aaSAndroid Build Coastguard Worker }
245*c8dee2aaSAndroid Build Coastguard Worker 
246*c8dee2aaSAndroid Build Coastguard Worker // Graphite does not perform Copy-on-Write which is why there is no DEF_GRAPHITE_TEST correlate
DEF_GANESH_TEST(VkProtectedContext_CopyOnWrite,reporter,options,CtsEnforcement::kNever)247*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_CopyOnWrite,
248*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
249*c8dee2aaSAndroid Build Coastguard Worker                 options,
250*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
251*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(skiatest::TestType::kGanesh,
252*c8dee2aaSAndroid Build Coastguard Worker                                                               /* isProtected= */ true);
253*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
254*c8dee2aaSAndroid Build Coastguard Worker         return;
255*c8dee2aaSAndroid Build Coastguard Worker     }
256*c8dee2aaSAndroid Build Coastguard Worker 
257*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
258*c8dee2aaSAndroid Build Coastguard Worker 
259*c8dee2aaSAndroid Build Coastguard Worker     GrDirectContext* dContext = helper->directContext();
260*c8dee2aaSAndroid Build Coastguard Worker 
261*c8dee2aaSAndroid Build Coastguard Worker     SkImageInfo ii = SkImageInfo::Make({ kSize, kSize },
262*c8dee2aaSAndroid Build Coastguard Worker                                        kRGBA_8888_SkColorType,
263*c8dee2aaSAndroid Build Coastguard Worker                                        kPremul_SkAlphaType);
264*c8dee2aaSAndroid Build Coastguard Worker 
265*c8dee2aaSAndroid Build Coastguard Worker     // We can't use VkTestHelper::createSurface here bc that will wrap a backend
266*c8dee2aaSAndroid Build Coastguard Worker     // texture which blocks the copy-on-write-behavior
267*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface = SkSurfaces::RenderTarget(dContext,
268*c8dee2aaSAndroid Build Coastguard Worker                                                         skgpu::Budgeted::kNo,
269*c8dee2aaSAndroid Build Coastguard Worker                                                         ii,
270*c8dee2aaSAndroid Build Coastguard Worker                                                         /* sampleCount= */ 1,
271*c8dee2aaSAndroid Build Coastguard Worker                                                         kBottomLeft_GrSurfaceOrigin,
272*c8dee2aaSAndroid Build Coastguard Worker                                                         /* surfaceProps= */ nullptr,
273*c8dee2aaSAndroid Build Coastguard Worker                                                         /* shouldCreateWithMips= */ false,
274*c8dee2aaSAndroid Build Coastguard Worker                                                         /* isProtected= */ true);
275*c8dee2aaSAndroid Build Coastguard Worker 
276*c8dee2aaSAndroid Build Coastguard Worker 
277*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface);
278*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas* canvas = surface->getCanvas();
279*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, canvas);
280*c8dee2aaSAndroid Build Coastguard Worker 
281*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> imageBefore = surface->makeImageSnapshot();
282*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, imageBefore);
283*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, imageBefore->isProtected());
284*c8dee2aaSAndroid Build Coastguard Worker 
285*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
286*c8dee2aaSAndroid Build Coastguard Worker     paint.setColor(SK_ColorBLACK);
287*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawRect(SkRect::MakeWH(4, 4), paint);
288*c8dee2aaSAndroid Build Coastguard Worker 
289*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> imageAfter = surface->makeImageSnapshot();
290*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, imageAfter);
291*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, imageAfter->isProtected());
292*c8dee2aaSAndroid Build Coastguard Worker 
293*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, imageBefore != imageAfter);
294*c8dee2aaSAndroid Build Coastguard Worker 
295*c8dee2aaSAndroid Build Coastguard Worker     SkBitmap readback;
296*c8dee2aaSAndroid Build Coastguard Worker     readback.allocPixels(imageAfter->imageInfo());
297*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, !imageAfter->readPixels(dContext, readback.pixmap(), 0, 0));
298*c8dee2aaSAndroid Build Coastguard Worker }
299*c8dee2aaSAndroid Build Coastguard Worker 
300*c8dee2aaSAndroid Build Coastguard Worker namespace {
301*c8dee2aaSAndroid Build Coastguard Worker 
302*c8dee2aaSAndroid Build Coastguard Worker struct AsyncContext {
303*c8dee2aaSAndroid Build Coastguard Worker     bool fCalled = false;
304*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<const SkSurface::AsyncReadResult> fResult;
305*c8dee2aaSAndroid Build Coastguard Worker };
306*c8dee2aaSAndroid Build Coastguard Worker 
async_callback(void * c,std::unique_ptr<const SkSurface::AsyncReadResult> result)307*c8dee2aaSAndroid Build Coastguard Worker void async_callback(void* c, std::unique_ptr<const SkSurface::AsyncReadResult> result) {
308*c8dee2aaSAndroid Build Coastguard Worker     auto context = static_cast<AsyncContext*>(c);
309*c8dee2aaSAndroid Build Coastguard Worker     context->fResult = std::move(result);
310*c8dee2aaSAndroid Build Coastguard Worker     context->fCalled = true;
311*c8dee2aaSAndroid Build Coastguard Worker }
312*c8dee2aaSAndroid Build Coastguard Worker 
async_read_from_protected_surface(skiatest::Reporter * reporter,skiatest::TestType testType)313*c8dee2aaSAndroid Build Coastguard Worker void async_read_from_protected_surface(skiatest::Reporter* reporter, skiatest::TestType testType) {
314*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(testType, /* isProtected= */ true);
315*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
316*c8dee2aaSAndroid Build Coastguard Worker         return;
317*c8dee2aaSAndroid Build Coastguard Worker     }
318*c8dee2aaSAndroid Build Coastguard Worker 
319*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
320*c8dee2aaSAndroid Build Coastguard Worker 
321*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface = helper->createSurface({ kSize, kSize },
322*c8dee2aaSAndroid Build Coastguard Worker                                                      /* textureable= */ true,
323*c8dee2aaSAndroid Build Coastguard Worker                                                      /* isProtected= */ true);
324*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface);
325*c8dee2aaSAndroid Build Coastguard Worker     AsyncContext cbContext;
326*c8dee2aaSAndroid Build Coastguard Worker     const SkImageInfo imageInfo = SkImageInfo::Make(6, 6, kRGBA_8888_SkColorType,
327*c8dee2aaSAndroid Build Coastguard Worker                                                     kPremul_SkAlphaType, SkColorSpace::MakeSRGB());
328*c8dee2aaSAndroid Build Coastguard Worker 
329*c8dee2aaSAndroid Build Coastguard Worker     if (testType == skiatest::TestType::kGanesh) {
330*c8dee2aaSAndroid Build Coastguard Worker         surface->asyncRescaleAndReadPixelsYUV420(kIdentity_SkYUVColorSpace,
331*c8dee2aaSAndroid Build Coastguard Worker                                                  SkColorSpace::MakeSRGB(),
332*c8dee2aaSAndroid Build Coastguard Worker                                                  imageInfo.bounds(),
333*c8dee2aaSAndroid Build Coastguard Worker                                                  imageInfo.dimensions(),
334*c8dee2aaSAndroid Build Coastguard Worker                                                  SkSurface::RescaleGamma::kSrc,
335*c8dee2aaSAndroid Build Coastguard Worker                                                  SkSurface::RescaleMode::kNearest,
336*c8dee2aaSAndroid Build Coastguard Worker                                                  &async_callback,
337*c8dee2aaSAndroid Build Coastguard Worker                                                  &cbContext);
338*c8dee2aaSAndroid Build Coastguard Worker     }
339*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE)
340*c8dee2aaSAndroid Build Coastguard Worker     else {
341*c8dee2aaSAndroid Build Coastguard Worker         // Graphite deprecates SkSurface::asyncRescaleAndReadPixelsYUVA420 in favor of
342*c8dee2aaSAndroid Build Coastguard Worker         // Context::asyncRescaleAndReadPixelsYUV420.
343*c8dee2aaSAndroid Build Coastguard Worker         skgpu::graphite::Context* context = helper->context();
344*c8dee2aaSAndroid Build Coastguard Worker 
345*c8dee2aaSAndroid Build Coastguard Worker         context->asyncRescaleAndReadPixelsYUV420(surface.get(),
346*c8dee2aaSAndroid Build Coastguard Worker                                                  kIdentity_SkYUVColorSpace,
347*c8dee2aaSAndroid Build Coastguard Worker                                                  SkColorSpace::MakeSRGB(),
348*c8dee2aaSAndroid Build Coastguard Worker                                                  imageInfo.bounds(),
349*c8dee2aaSAndroid Build Coastguard Worker                                                  imageInfo.dimensions(),
350*c8dee2aaSAndroid Build Coastguard Worker                                                  SkSurface::RescaleGamma::kSrc,
351*c8dee2aaSAndroid Build Coastguard Worker                                                  SkSurface::RescaleMode::kNearest,
352*c8dee2aaSAndroid Build Coastguard Worker                                                  &async_callback,
353*c8dee2aaSAndroid Build Coastguard Worker                                                  &cbContext);
354*c8dee2aaSAndroid Build Coastguard Worker     }
355*c8dee2aaSAndroid Build Coastguard Worker #endif
356*c8dee2aaSAndroid Build Coastguard Worker 
357*c8dee2aaSAndroid Build Coastguard Worker     helper->submitAndWaitForCompletion(&cbContext.fCalled);
358*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, !cbContext.fResult);
359*c8dee2aaSAndroid Build Coastguard Worker }
360*c8dee2aaSAndroid Build Coastguard Worker 
361*c8dee2aaSAndroid Build Coastguard Worker }  // anonymous namespace
362*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_AsyncReadFromProtectedSurface,reporter,options,CtsEnforcement::kNever)363*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_AsyncReadFromProtectedSurface,
364*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
365*c8dee2aaSAndroid Build Coastguard Worker                 options,
366*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
367*c8dee2aaSAndroid Build Coastguard Worker     async_read_from_protected_surface(reporter, skiatest::TestType::kGanesh);
368*c8dee2aaSAndroid Build Coastguard Worker }
369*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_AsyncReadFromProtectedSurface_Graphite,reporter,CtsEnforcement::kNextRelease)370*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_AsyncReadFromProtectedSurface_Graphite,
371*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
372*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
373*c8dee2aaSAndroid Build Coastguard Worker     async_read_from_protected_surface(reporter, skiatest::TestType::kGraphite);
374*c8dee2aaSAndroid Build Coastguard Worker }
375*c8dee2aaSAndroid Build Coastguard Worker 
376*c8dee2aaSAndroid Build Coastguard Worker namespace {
377*c8dee2aaSAndroid Build Coastguard Worker 
draw_rectangle(skiatest::Reporter * reporter,skiatest::TestType testType)378*c8dee2aaSAndroid Build Coastguard Worker void draw_rectangle(skiatest::Reporter* reporter, skiatest::TestType testType) {
379*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(testType, /* isProtected= */ true);
380*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
381*c8dee2aaSAndroid Build Coastguard Worker         return;
382*c8dee2aaSAndroid Build Coastguard Worker     }
383*c8dee2aaSAndroid Build Coastguard Worker 
384*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
385*c8dee2aaSAndroid Build Coastguard Worker 
386*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface = helper->createSurface({ kSize, kSize },
387*c8dee2aaSAndroid Build Coastguard Worker                                                      /* textureable= */ true,
388*c8dee2aaSAndroid Build Coastguard Worker                                                      /* isProtected= */ true);
389*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface);
390*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas* canvas = surface->getCanvas();
391*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, canvas);
392*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
393*c8dee2aaSAndroid Build Coastguard Worker     paint.setColor(SK_ColorBLACK);
394*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawRect(SkRect::MakeWH(4, 4), paint);
395*c8dee2aaSAndroid Build Coastguard Worker }
396*c8dee2aaSAndroid Build Coastguard Worker 
397*c8dee2aaSAndroid Build Coastguard Worker }  // anonymous namespace
398*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_DrawRectangle,reporter,options,CtsEnforcement::kNever)399*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_DrawRectangle,
400*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
401*c8dee2aaSAndroid Build Coastguard Worker                 options,
402*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
403*c8dee2aaSAndroid Build Coastguard Worker     draw_rectangle(reporter, skiatest::TestType::kGanesh);
404*c8dee2aaSAndroid Build Coastguard Worker }
405*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_DrawRectangle_Graphite,reporter,CtsEnforcement::kNextRelease)406*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_DrawRectangle_Graphite,
407*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
408*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
409*c8dee2aaSAndroid Build Coastguard Worker     draw_rectangle(reporter, skiatest::TestType::kGraphite);
410*c8dee2aaSAndroid Build Coastguard Worker }
411*c8dee2aaSAndroid Build Coastguard Worker 
412*c8dee2aaSAndroid Build Coastguard Worker namespace {
413*c8dee2aaSAndroid Build Coastguard Worker 
draw_rectangle_with_aa(skiatest::Reporter * reporter,skiatest::TestType testType)414*c8dee2aaSAndroid Build Coastguard Worker void draw_rectangle_with_aa(skiatest::Reporter* reporter, skiatest::TestType testType) {
415*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(testType, /* isProtected= */ true);
416*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
417*c8dee2aaSAndroid Build Coastguard Worker         return;
418*c8dee2aaSAndroid Build Coastguard Worker     }
419*c8dee2aaSAndroid Build Coastguard Worker 
420*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
421*c8dee2aaSAndroid Build Coastguard Worker 
422*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface = helper->createSurface({ kSize, kSize },
423*c8dee2aaSAndroid Build Coastguard Worker                                                      /* textureable= */ true,
424*c8dee2aaSAndroid Build Coastguard Worker                                                      /* isProtected= */ true);
425*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface);
426*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas* canvas = surface->getCanvas();
427*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, canvas);
428*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
429*c8dee2aaSAndroid Build Coastguard Worker     paint.setColor(SK_ColorBLACK);
430*c8dee2aaSAndroid Build Coastguard Worker     paint.setAntiAlias(true);
431*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawRect(SkRect::MakeWH(4, 4), paint);
432*c8dee2aaSAndroid Build Coastguard Worker }
433*c8dee2aaSAndroid Build Coastguard Worker 
434*c8dee2aaSAndroid Build Coastguard Worker }  // anonymous namespace
435*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_DrawRectangleWithAntiAlias,reporter,options,CtsEnforcement::kNever)436*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_DrawRectangleWithAntiAlias,
437*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
438*c8dee2aaSAndroid Build Coastguard Worker                 options,
439*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
440*c8dee2aaSAndroid Build Coastguard Worker     draw_rectangle_with_aa(reporter, skiatest::TestType::kGanesh);
441*c8dee2aaSAndroid Build Coastguard Worker }
442*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_DrawRectangleWithAntiAlias_Graphite,reporter,CtsEnforcement::kNextRelease)443*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_DrawRectangleWithAntiAlias_Graphite,
444*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
445*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
446*c8dee2aaSAndroid Build Coastguard Worker     draw_rectangle_with_aa(reporter, skiatest::TestType::kGraphite);
447*c8dee2aaSAndroid Build Coastguard Worker }
448*c8dee2aaSAndroid Build Coastguard Worker 
449*c8dee2aaSAndroid Build Coastguard Worker namespace {
450*c8dee2aaSAndroid Build Coastguard Worker 
draw_rectangle_with_blendmode(skiatest::Reporter * reporter,skiatest::TestType testType)451*c8dee2aaSAndroid Build Coastguard Worker void draw_rectangle_with_blendmode(skiatest::Reporter* reporter, skiatest::TestType testType) {
452*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(testType, /* isProtected= */ true);
453*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
454*c8dee2aaSAndroid Build Coastguard Worker         return;
455*c8dee2aaSAndroid Build Coastguard Worker     }
456*c8dee2aaSAndroid Build Coastguard Worker 
457*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
458*c8dee2aaSAndroid Build Coastguard Worker 
459*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface = helper->createSurface({ kSize, kSize },
460*c8dee2aaSAndroid Build Coastguard Worker                                                      /* textureable= */ true,
461*c8dee2aaSAndroid Build Coastguard Worker                                                      /* isProtected= */ true);
462*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface);
463*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas* canvas = surface->getCanvas();
464*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, canvas);
465*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
466*c8dee2aaSAndroid Build Coastguard Worker     paint.setColor(SK_ColorBLACK);
467*c8dee2aaSAndroid Build Coastguard Worker     paint.setBlendMode(SkBlendMode::kColorDodge);
468*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawRect(SkRect::MakeWH(4, 4), paint);
469*c8dee2aaSAndroid Build Coastguard Worker }
470*c8dee2aaSAndroid Build Coastguard Worker 
471*c8dee2aaSAndroid Build Coastguard Worker }  // anonymous namespace
472*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_DrawRectangleWithBlendMode,reporter,options,CtsEnforcement::kNever)473*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_DrawRectangleWithBlendMode,
474*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
475*c8dee2aaSAndroid Build Coastguard Worker                 options,
476*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
477*c8dee2aaSAndroid Build Coastguard Worker     draw_rectangle_with_blendmode(reporter, skiatest::TestType::kGanesh);
478*c8dee2aaSAndroid Build Coastguard Worker }
479*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_DrawRectangleWithBlendMode_Graphite,reporter,CtsEnforcement::kNextRelease)480*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_DrawRectangleWithBlendMode_Graphite,
481*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
482*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
483*c8dee2aaSAndroid Build Coastguard Worker     draw_rectangle_with_blendmode(reporter, skiatest::TestType::kGraphite);
484*c8dee2aaSAndroid Build Coastguard Worker }
485*c8dee2aaSAndroid Build Coastguard Worker 
486*c8dee2aaSAndroid Build Coastguard Worker namespace {
487*c8dee2aaSAndroid Build Coastguard Worker 
draw_rectangle_with_filter(skiatest::Reporter * reporter,skiatest::TestType testType)488*c8dee2aaSAndroid Build Coastguard Worker void draw_rectangle_with_filter(skiatest::Reporter* reporter, skiatest::TestType testType) {
489*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(testType, /* isProtected= */ true);
490*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
491*c8dee2aaSAndroid Build Coastguard Worker         return;
492*c8dee2aaSAndroid Build Coastguard Worker     }
493*c8dee2aaSAndroid Build Coastguard Worker 
494*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
495*c8dee2aaSAndroid Build Coastguard Worker 
496*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface = helper->createSurface({ kSize, kSize },
497*c8dee2aaSAndroid Build Coastguard Worker                                                      /* textureable= */ true,
498*c8dee2aaSAndroid Build Coastguard Worker                                                      /* isProtected= */ true);
499*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface);
500*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas* canvas = surface->getCanvas();
501*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, canvas);
502*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
503*c8dee2aaSAndroid Build Coastguard Worker     paint.setColor(SK_ColorBLACK);
504*c8dee2aaSAndroid Build Coastguard Worker     paint.setStyle(SkPaint::kFill_Style);
505*c8dee2aaSAndroid Build Coastguard Worker     paint.setMaskFilter(SkMaskFilter::MakeBlur(SkBlurStyle::kOuter_SkBlurStyle, 30.0f));
506*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawRect(SkRect::MakeWH(4, 4), paint);
507*c8dee2aaSAndroid Build Coastguard Worker }
508*c8dee2aaSAndroid Build Coastguard Worker 
509*c8dee2aaSAndroid Build Coastguard Worker }  // anonymous namespace
510*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_DrawRectangleWithFilter,reporter,options,CtsEnforcement::kNever)511*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_DrawRectangleWithFilter,
512*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
513*c8dee2aaSAndroid Build Coastguard Worker                 options,
514*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
515*c8dee2aaSAndroid Build Coastguard Worker     draw_rectangle_with_filter(reporter, skiatest::TestType::kGanesh);
516*c8dee2aaSAndroid Build Coastguard Worker }
517*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_DrawRectangleWithFilter_Graphite,reporter,CtsEnforcement::kNextRelease)518*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_DrawRectangleWithFilter_Graphite,
519*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
520*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
521*c8dee2aaSAndroid Build Coastguard Worker     draw_rectangle_with_filter(reporter, skiatest::TestType::kGraphite);
522*c8dee2aaSAndroid Build Coastguard Worker }
523*c8dee2aaSAndroid Build Coastguard Worker 
524*c8dee2aaSAndroid Build Coastguard Worker namespace {
525*c8dee2aaSAndroid Build Coastguard Worker 
draw_thin_path(skiatest::Reporter * reporter,skiatest::TestType testType)526*c8dee2aaSAndroid Build Coastguard Worker void draw_thin_path(skiatest::Reporter* reporter, skiatest::TestType testType) {
527*c8dee2aaSAndroid Build Coastguard Worker     constexpr bool kIsProtected = true;
528*c8dee2aaSAndroid Build Coastguard Worker 
529*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(testType, kIsProtected);
530*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
531*c8dee2aaSAndroid Build Coastguard Worker         return;
532*c8dee2aaSAndroid Build Coastguard Worker     }
533*c8dee2aaSAndroid Build Coastguard Worker 
534*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
535*c8dee2aaSAndroid Build Coastguard Worker 
536*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface = helper->createSurface({ kSize, kSize },
537*c8dee2aaSAndroid Build Coastguard Worker                                                      /* textureable= */ true,
538*c8dee2aaSAndroid Build Coastguard Worker                                                      kIsProtected);
539*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface);
540*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas* canvas = surface->getCanvas();
541*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, canvas);
542*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
543*c8dee2aaSAndroid Build Coastguard Worker     paint.setColor(SK_ColorBLACK);
544*c8dee2aaSAndroid Build Coastguard Worker     paint.setStyle(SkPaint::kStroke_Style);
545*c8dee2aaSAndroid Build Coastguard Worker     paint.setAntiAlias(true);
546*c8dee2aaSAndroid Build Coastguard Worker     paint.setStrokeWidth(.4f);
547*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPath(SkPath().moveTo(4, 4).lineTo(6, 6), paint);
548*c8dee2aaSAndroid Build Coastguard Worker }
549*c8dee2aaSAndroid Build Coastguard Worker 
550*c8dee2aaSAndroid Build Coastguard Worker }  // anonymous namespace
551*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_DrawThinPath,reporter,options,CtsEnforcement::kNever)552*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_DrawThinPath,
553*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
554*c8dee2aaSAndroid Build Coastguard Worker                 options,
555*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
556*c8dee2aaSAndroid Build Coastguard Worker     draw_thin_path(reporter, skiatest::TestType::kGanesh);
557*c8dee2aaSAndroid Build Coastguard Worker }
558*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_DrawThinPath_Graphite,reporter,CtsEnforcement::kNextRelease)559*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_DrawThinPath_Graphite,
560*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
561*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
562*c8dee2aaSAndroid Build Coastguard Worker     draw_thin_path(reporter, skiatest::TestType::kGraphite);
563*c8dee2aaSAndroid Build Coastguard Worker }
564*c8dee2aaSAndroid Build Coastguard Worker 
565*c8dee2aaSAndroid Build Coastguard Worker namespace {
566*c8dee2aaSAndroid Build Coastguard Worker 
save_layer(skiatest::Reporter * reporter,skiatest::TestType testType)567*c8dee2aaSAndroid Build Coastguard Worker void save_layer(skiatest::Reporter* reporter, skiatest::TestType testType) {
568*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(testType, /* isProtected= */ true);
569*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
570*c8dee2aaSAndroid Build Coastguard Worker         return;
571*c8dee2aaSAndroid Build Coastguard Worker     }
572*c8dee2aaSAndroid Build Coastguard Worker 
573*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
574*c8dee2aaSAndroid Build Coastguard Worker 
575*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface = helper->createSurface({ kSize, kSize },
576*c8dee2aaSAndroid Build Coastguard Worker                                                      /* textureable= */ true,
577*c8dee2aaSAndroid Build Coastguard Worker                                                      /* isProtected= */ true);
578*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface);
579*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas* canvas = surface->getCanvas();
580*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, canvas);
581*c8dee2aaSAndroid Build Coastguard Worker     canvas->saveLayer(nullptr, nullptr);
582*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
583*c8dee2aaSAndroid Build Coastguard Worker     paint.setColor(SK_ColorBLACK);
584*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawRect(SkRect::MakeWH(4, 4), paint);
585*c8dee2aaSAndroid Build Coastguard Worker     canvas->restore();
586*c8dee2aaSAndroid Build Coastguard Worker }
587*c8dee2aaSAndroid Build Coastguard Worker 
588*c8dee2aaSAndroid Build Coastguard Worker }  // anonymous namespace
589*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_SaveLayer,reporter,options,CtsEnforcement::kNever)590*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_SaveLayer,
591*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
592*c8dee2aaSAndroid Build Coastguard Worker                 options,
593*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
594*c8dee2aaSAndroid Build Coastguard Worker     save_layer(reporter, skiatest::TestType::kGanesh);
595*c8dee2aaSAndroid Build Coastguard Worker }
596*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_SaveLayer_Graphite,reporter,CtsEnforcement::kNextRelease)597*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_SaveLayer_Graphite,
598*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
599*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
600*c8dee2aaSAndroid Build Coastguard Worker     save_layer(reporter, skiatest::TestType::kGraphite);
601*c8dee2aaSAndroid Build Coastguard Worker }
602*c8dee2aaSAndroid Build Coastguard Worker 
603*c8dee2aaSAndroid Build Coastguard Worker namespace {
604*c8dee2aaSAndroid Build Coastguard Worker 
draw_protected_image_on_protected_surface(skiatest::Reporter * reporter,skiatest::TestType testType)605*c8dee2aaSAndroid Build Coastguard Worker void draw_protected_image_on_protected_surface(skiatest::Reporter* reporter,
606*c8dee2aaSAndroid Build Coastguard Worker                                                skiatest::TestType testType) {
607*c8dee2aaSAndroid Build Coastguard Worker     constexpr bool kIsProtected = true;
608*c8dee2aaSAndroid Build Coastguard Worker 
609*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<VkTestHelper> helper = VkTestHelper::Make(testType, kIsProtected);
610*c8dee2aaSAndroid Build Coastguard Worker     if (!helper) {
611*c8dee2aaSAndroid Build Coastguard Worker         return;
612*c8dee2aaSAndroid Build Coastguard Worker     }
613*c8dee2aaSAndroid Build Coastguard Worker 
614*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, helper->isValid());
615*c8dee2aaSAndroid Build Coastguard Worker 
616*c8dee2aaSAndroid Build Coastguard Worker     // Create protected image.
617*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface1 = helper->createSurface({ kSize, kSize },
618*c8dee2aaSAndroid Build Coastguard Worker                                                       /* textureable= */ true,
619*c8dee2aaSAndroid Build Coastguard Worker                                                       kIsProtected);
620*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface1);
621*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> image = surface1->makeImageSnapshot();
622*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, image);
623*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, image->isProtected() == kIsProtected);
624*c8dee2aaSAndroid Build Coastguard Worker 
625*c8dee2aaSAndroid Build Coastguard Worker     // Create protected canvas.
626*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface2 = helper->createSurface({ kSize, kSize },
627*c8dee2aaSAndroid Build Coastguard Worker                                                       /* textureable= */ true,
628*c8dee2aaSAndroid Build Coastguard Worker                                                       kIsProtected);
629*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface2);
630*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas* canvas = surface2->getCanvas();
631*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, canvas);
632*c8dee2aaSAndroid Build Coastguard Worker 
633*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawImage(image, 0, 0);
634*c8dee2aaSAndroid Build Coastguard Worker }
635*c8dee2aaSAndroid Build Coastguard Worker 
636*c8dee2aaSAndroid Build Coastguard Worker }  // anonymous namespace
637*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GANESH_TEST(VkProtectedContext_DrawProtectedImageOnProtectedSurface,reporter,options,CtsEnforcement::kNever)638*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(VkProtectedContext_DrawProtectedImageOnProtectedSurface,
639*c8dee2aaSAndroid Build Coastguard Worker                 reporter,
640*c8dee2aaSAndroid Build Coastguard Worker                 options,
641*c8dee2aaSAndroid Build Coastguard Worker                 CtsEnforcement::kNever) {
642*c8dee2aaSAndroid Build Coastguard Worker     draw_protected_image_on_protected_surface(reporter, skiatest::TestType::kGanesh);
643*c8dee2aaSAndroid Build Coastguard Worker }
644*c8dee2aaSAndroid Build Coastguard Worker 
DEF_GRAPHITE_TEST(VkProtectedContext_DrawProtectedImageOnProtectedSurface_Graphite,reporter,CtsEnforcement::kNextRelease)645*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(VkProtectedContext_DrawProtectedImageOnProtectedSurface_Graphite,
646*c8dee2aaSAndroid Build Coastguard Worker                   reporter,
647*c8dee2aaSAndroid Build Coastguard Worker                   CtsEnforcement::kNextRelease) {
648*c8dee2aaSAndroid Build Coastguard Worker     draw_protected_image_on_protected_surface(reporter, skiatest::TestType::kGraphite);
649*c8dee2aaSAndroid Build Coastguard Worker }
650*c8dee2aaSAndroid Build Coastguard Worker 
651*c8dee2aaSAndroid Build Coastguard Worker #endif  // SK_VULKAN
652