Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit ed4c34a

Browse files
authored
[Flutter GPU] Add WindingOrder. (#55413)
Resolves flutter/flutter#155636. (Extends test in #55409)
1 parent 92b5b31 commit ed4c34a

6 files changed

Lines changed: 56 additions & 0 deletions

File tree

lib/gpu/formats.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,25 @@ constexpr impeller::CullMode ToImpellerCullMode(int value) {
522522
return ToImpellerCullMode(static_cast<FlutterGPUCullMode>(value));
523523
}
524524

525+
enum class FlutterGPUWindingOrder {
526+
kClockwise,
527+
kCounterClockwise,
528+
};
529+
530+
constexpr impeller::WindingOrder ToImpellerWindingOrder(
531+
FlutterGPUWindingOrder value) {
532+
switch (value) {
533+
case FlutterGPUWindingOrder::kClockwise:
534+
return impeller::WindingOrder::kClockwise;
535+
case FlutterGPUWindingOrder::kCounterClockwise:
536+
return impeller::WindingOrder::kCounterClockwise;
537+
}
538+
}
539+
540+
constexpr impeller::WindingOrder ToImpellerWindingOrder(int value) {
541+
return ToImpellerWindingOrder(static_cast<FlutterGPUWindingOrder>(value));
542+
}
543+
525544
} // namespace gpu
526545
} // namespace flutter
527546

lib/gpu/lib/src/formats.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ enum CullMode {
141141
backFace,
142142
}
143143

144+
enum WindingOrder {
145+
clockwise,
146+
counterClockwise,
147+
}
148+
144149
enum CompareFunction {
145150
/// Comparison test never passes.
146151
never,

lib/gpu/lib/src/render_pass.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,10 @@ base class RenderPass extends NativeFieldWrapperClass1 {
262262
_setCullMode(cullMode.index);
263263
}
264264

265+
void setWindingOrder(WindingOrder windingOrder) {
266+
_setWindingOrder(windingOrder.index);
267+
}
268+
265269
void draw() {
266270
if (!_draw()) {
267271
throw Exception("Failed to append draw");
@@ -416,6 +420,10 @@ base class RenderPass extends NativeFieldWrapperClass1 {
416420
symbol: 'InternalFlutterGpu_RenderPass_SetCullMode')
417421
external void _setCullMode(int cullMode);
418422

423+
@Native<Void Function(Pointer<Void>, Int)>(
424+
symbol: 'InternalFlutterGpu_RenderPass_SetWindingOrder')
425+
external void _setWindingOrder(int windingOrder);
426+
419427
@Native<Bool Function(Pointer<Void>)>(
420428
symbol: 'InternalFlutterGpu_RenderPass_Draw')
421429
external bool _draw();

lib/gpu/render_pass.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,15 @@ void InternalFlutterGpu_RenderPass_SetCullMode(
567567
pipeline_descriptor.SetCullMode(flutter::gpu::ToImpellerCullMode(cull_mode));
568568
}
569569

570+
void InternalFlutterGpu_RenderPass_SetWindingOrder(
571+
flutter::gpu::RenderPass* wrapper,
572+
int winding_order) {
573+
impeller::PipelineDescriptor& pipeline_descriptor =
574+
wrapper->GetPipelineDescriptor();
575+
pipeline_descriptor.SetWindingOrder(
576+
flutter::gpu::ToImpellerWindingOrder(winding_order));
577+
}
578+
570579
bool InternalFlutterGpu_RenderPass_Draw(flutter::gpu::RenderPass* wrapper) {
571580
return wrapper->Draw();
572581
}

lib/gpu/render_pass.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,11 @@ extern void InternalFlutterGpu_RenderPass_SetCullMode(
251251
flutter::gpu::RenderPass* wrapper,
252252
int cull_mode);
253253

254+
FLUTTER_GPU_EXPORT
255+
extern void InternalFlutterGpu_RenderPass_SetWindingOrder(
256+
flutter::gpu::RenderPass* wrapper,
257+
int winding_order);
258+
254259
FLUTTER_GPU_EXPORT
255260
extern bool InternalFlutterGpu_RenderPass_Draw(
256261
flutter::gpu::RenderPass* wrapper);

testing/dart/gpu_test.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,11 +479,21 @@ void main() async {
479479
state.renderPass.draw();
480480
}
481481

482+
// Draw the green rectangle.
483+
// Defaults to clockwise winding order. So frontface culling should not
484+
// impact the green triangle.
482485
state.renderPass.setCullMode(gpu.CullMode.frontFace);
483486
drawTriangle(Colors.lime);
487+
488+
// Backface cull a red triangle.
484489
state.renderPass.setCullMode(gpu.CullMode.backFace);
485490
drawTriangle(Colors.red);
486491

492+
// Invert the winding mode and frontface cull a red rectangle.
493+
state.renderPass.setWindingOrder(gpu.WindingOrder.counterClockwise);
494+
state.renderPass.setCullMode(gpu.CullMode.frontFace);
495+
drawTriangle(Colors.red);
496+
487497
state.commandBuffer.submit();
488498

489499
final ui.Image image = state.renderTexture.asImage();

0 commit comments

Comments
 (0)