[Flutter GPU] Add WindingOrder. (flutter/engine#55413)

Resolves https://github.com/flutter/flutter/issues/155636.

(Extends test in https://github.com/flutter/engine/pull/55409)
This commit is contained in:
Brandon DeRosier 2024-10-04 19:04:04 -07:00 committed by GitHub
parent 767efe1ad7
commit 3b3ffcb8cd
6 changed files with 56 additions and 0 deletions

View File

@ -522,6 +522,25 @@ constexpr impeller::CullMode ToImpellerCullMode(int value) {
return ToImpellerCullMode(static_cast<FlutterGPUCullMode>(value));
}
enum class FlutterGPUWindingOrder {
kClockwise,
kCounterClockwise,
};
constexpr impeller::WindingOrder ToImpellerWindingOrder(
FlutterGPUWindingOrder value) {
switch (value) {
case FlutterGPUWindingOrder::kClockwise:
return impeller::WindingOrder::kClockwise;
case FlutterGPUWindingOrder::kCounterClockwise:
return impeller::WindingOrder::kCounterClockwise;
}
}
constexpr impeller::WindingOrder ToImpellerWindingOrder(int value) {
return ToImpellerWindingOrder(static_cast<FlutterGPUWindingOrder>(value));
}
} // namespace gpu
} // namespace flutter

View File

@ -141,6 +141,11 @@ enum CullMode {
backFace,
}
enum WindingOrder {
clockwise,
counterClockwise,
}
enum CompareFunction {
/// Comparison test never passes.
never,

View File

@ -262,6 +262,10 @@ base class RenderPass extends NativeFieldWrapperClass1 {
_setCullMode(cullMode.index);
}
void setWindingOrder(WindingOrder windingOrder) {
_setWindingOrder(windingOrder.index);
}
void draw() {
if (!_draw()) {
throw Exception("Failed to append draw");
@ -416,6 +420,10 @@ base class RenderPass extends NativeFieldWrapperClass1 {
symbol: 'InternalFlutterGpu_RenderPass_SetCullMode')
external void _setCullMode(int cullMode);
@Native<Void Function(Pointer<Void>, Int)>(
symbol: 'InternalFlutterGpu_RenderPass_SetWindingOrder')
external void _setWindingOrder(int windingOrder);
@Native<Bool Function(Pointer<Void>)>(
symbol: 'InternalFlutterGpu_RenderPass_Draw')
external bool _draw();

View File

@ -567,6 +567,15 @@ void InternalFlutterGpu_RenderPass_SetCullMode(
pipeline_descriptor.SetCullMode(flutter::gpu::ToImpellerCullMode(cull_mode));
}
void InternalFlutterGpu_RenderPass_SetWindingOrder(
flutter::gpu::RenderPass* wrapper,
int winding_order) {
impeller::PipelineDescriptor& pipeline_descriptor =
wrapper->GetPipelineDescriptor();
pipeline_descriptor.SetWindingOrder(
flutter::gpu::ToImpellerWindingOrder(winding_order));
}
bool InternalFlutterGpu_RenderPass_Draw(flutter::gpu::RenderPass* wrapper) {
return wrapper->Draw();
}

View File

@ -251,6 +251,11 @@ extern void InternalFlutterGpu_RenderPass_SetCullMode(
flutter::gpu::RenderPass* wrapper,
int cull_mode);
FLUTTER_GPU_EXPORT
extern void InternalFlutterGpu_RenderPass_SetWindingOrder(
flutter::gpu::RenderPass* wrapper,
int winding_order);
FLUTTER_GPU_EXPORT
extern bool InternalFlutterGpu_RenderPass_Draw(
flutter::gpu::RenderPass* wrapper);

View File

@ -479,11 +479,21 @@ void main() async {
state.renderPass.draw();
}
// Draw the green rectangle.
// Defaults to clockwise winding order. So frontface culling should not
// impact the green triangle.
state.renderPass.setCullMode(gpu.CullMode.frontFace);
drawTriangle(Colors.lime);
// Backface cull a red triangle.
state.renderPass.setCullMode(gpu.CullMode.backFace);
drawTriangle(Colors.red);
// Invert the winding mode and frontface cull a red rectangle.
state.renderPass.setWindingOrder(gpu.WindingOrder.counterClockwise);
state.renderPass.setCullMode(gpu.CullMode.frontFace);
drawTriangle(Colors.red);
state.commandBuffer.submit();
final ui.Image image = state.renderTexture.asImage();