5 #import <Cocoa/Cocoa.h>
6 #import <Metal/Metal.h>
11 #include "flutter/testing/testing.h"
12 #include "gtest/gtest.h"
17 - (nonnull instancetype)
init;
24 self = [
super initWithFrame:NSZeroRect];
26 [
self setWantsLayer:YES];
27 self.layer.contentsScale = 2.0;
32 - (void)onPresent:(CGSize)frameSize withBlock:(nonnull dispatch_block_t)block {
33 self.presentedFrameSize = frameSize;
42 id<MTLDevice> device = MTLCreateSystemDefaultDevice();
43 id<MTLCommandQueue> commandQueue = [device newCommandQueue];
44 CALayer* layer =
reinterpret_cast<CALayer*
>(testView.layer);
46 commandQueue:commandQueue
53 CGPoint offset = CGPointZero,
55 const std::vector<FlutterRect>& paintRegion = {}) {
69 auto surface = [surfaceManager
surfaceForSize:CGSizeMake(100, 50)];
71 id<MTLTexture> metalTexture = (__bridge id)texture.texture;
72 EXPECT_EQ(metalTexture.width, 100ul);
73 EXPECT_EQ(metalTexture.height, 50ul);
74 texture.destruction_callback(texture.user_data);
82 auto surface = [surfaceManager
surfaceForSize:CGSizeMake(100, 50)];
86 texture.destruction_callback(texture.user_data);
88 FlutterMetalTexture dummyTexture{.texture_id = 1, .texture =
nullptr, .user_data =
nullptr};
90 EXPECT_EQ(surface1, nil);
93 EXPECT_EQ(surface2, surface);
101 auto surface1 = [surfaceManager
surfaceForSize:CGSizeMake(100, 100)];
106 auto surface2 = [surfaceManager
surfaceForSize:CGSizeMake(110, 110)];
111 auto surface3 = [surfaceManager
surfaceForSize:CGSizeMake(120, 120)];
117 auto surfaceFromCache = [surfaceManager
surfaceForSize:CGSizeMake(110, 110)];
118 EXPECT_EQ(surfaceFromCache, surface2);
135 auto surface1 = [surfaceManager
surfaceForSize:CGSizeMake(100, 100)];
136 EXPECT_TRUE(CGSizeEqualToSize(surface1.size, CGSizeMake(100, 100)));
145 EXPECT_EQ(testView.layer.sublayers.count, 1ul);
149 auto surface2 = [surfaceManager
surfaceForSize:CGSizeMake(100, 100)];
150 EXPECT_TRUE(CGSizeEqualToSize(surface2.size, CGSizeMake(100, 100)));
159 EXPECT_EQ(testView.layer.sublayers.count, 1ull);
162 auto surface3 = [surfaceManager
surfaceForSize:CGSizeMake(100, 100)];
163 EXPECT_EQ(surface3, surface1);
166 inline bool operator==(
const CGRect& lhs,
const CGRect& rhs) {
167 return CGRectEqualToRect(lhs, rhs);
174 EXPECT_EQ(testView.layer.sublayers.count, 0ul);
176 auto surface1_1 = [surfaceManager
surfaceForSize:CGSizeMake(50, 30)];
177 [surfaceManager
presentSurfaces:@[ CreatePresentInfo(surface1_1, CGPointMake(20, 10)) ]
181 EXPECT_EQ(testView.layer.sublayers.count, 1ul);
184 auto surface2_1 = [surfaceManager
surfaceForSize:CGSizeMake(50, 30)];
185 auto surface2_2 = [surfaceManager
surfaceForSize:CGSizeMake(20, 20)];
187 CreatePresentInfo(surface2_1, CGPointMake(20, 10), 1),
188 CreatePresentInfo(surface2_2, CGPointMake(40, 50), 2,
190 FlutterRect{0, 0, 20, 20},
191 FlutterRect{40, 0, 60, 20},
197 EXPECT_EQ(testView.layer.sublayers.count, 2ul);
198 EXPECT_EQ(testView.layer.sublayers[0].zPosition, 1.0);
199 EXPECT_EQ(testView.layer.sublayers[1].zPosition, 2.0);
200 CALayer* firstOverlaySublayer;
202 NSArray<CALayer*>* sublayers = testView.layer.sublayers[1].sublayers;
203 EXPECT_EQ(sublayers.count, 2ul);
204 EXPECT_TRUE(CGRectEqualToRect(sublayers[0].frame, CGRectMake(0, 0, 10, 10)));
205 EXPECT_TRUE(CGRectEqualToRect(sublayers[1].frame, CGRectMake(20, 0, 10, 10)));
206 EXPECT_TRUE(CGRectEqualToRect(sublayers[0].contentsRect, CGRectMake(0, 0, 1, 1)));
207 EXPECT_TRUE(CGRectEqualToRect(sublayers[1].contentsRect, CGRectMake(2, 0, 1, 1)));
208 EXPECT_EQ(sublayers[0].contents, sublayers[1].contents);
209 firstOverlaySublayer = sublayers[0];
215 CreatePresentInfo(surface2_1, CGPointMake(20, 10), 1),
216 CreatePresentInfo(surface2_2, CGPointMake(40, 50), 2,
218 FlutterRect{0, 10, 20, 20},
223 EXPECT_EQ(testView.layer.sublayers.count, 2ul);
225 NSArray<CALayer*>* sublayers = testView.layer.sublayers[1].sublayers;
226 EXPECT_EQ(sublayers.count, 1ul);
227 EXPECT_EQ(sublayers[0], firstOverlaySublayer);
228 EXPECT_TRUE(CGRectEqualToRect(sublayers[0].frame, CGRectMake(0, 5, 10, 5)));
233 CreatePresentInfo(surface2_1, CGPointMake(20, 10), 1),
234 CreatePresentInfo(surface2_2, CGPointMake(40, 50), 2,
236 FlutterRect{0, 0, 20, 20},
237 FlutterRect{40, 0, 60, 20},
243 EXPECT_EQ(testView.layer.sublayers.count, 2ul);
245 NSArray<CALayer*>* sublayers = testView.layer.sublayers[1].sublayers;
246 EXPECT_EQ(sublayers.count, 2ul);
247 EXPECT_EQ(sublayers[0], firstOverlaySublayer);
248 EXPECT_TRUE(CGRectEqualToRect(sublayers[0].frame, CGRectMake(0, 0, 10, 10)));
249 EXPECT_TRUE(CGRectEqualToRect(sublayers[1].frame, CGRectMake(20, 0, 10, 10)));
250 EXPECT_EQ(sublayers[0].contents, sublayers[1].contents);
253 auto surface3_1 = [surfaceManager
surfaceForSize:CGSizeMake(50, 30)];
254 [surfaceManager
presentSurfaces:@[ CreatePresentInfo(surface3_1, CGPointMake(20, 10)) ]
258 EXPECT_EQ(testView.layer.sublayers.count, 1ul);
263 EXPECT_EQ(testView.layer.sublayers.count, 0ul);