mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
[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:
parent
767efe1ad7
commit
3b3ffcb8cd
@ -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
|
||||
|
||||
|
||||
@ -141,6 +141,11 @@ enum CullMode {
|
||||
backFace,
|
||||
}
|
||||
|
||||
enum WindingOrder {
|
||||
clockwise,
|
||||
counterClockwise,
|
||||
}
|
||||
|
||||
enum CompareFunction {
|
||||
/// Comparison test never passes.
|
||||
never,
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user