[Impeller] Added support to set polygon mode in Flutter GPU. (flutter/engine#55804)

Added support to set polygon mode in Flutter GPU. This fixes the issue [#142732](https://github.com/flutter/flutter/issues/142732).
This commit is contained in:
AthulJoseph 2024-10-12 06:37:36 +05:30 committed by GitHub
parent 96ab9b9e30
commit 3214f65fa3
6 changed files with 85 additions and 1 deletions

View File

@ -541,6 +541,25 @@ constexpr impeller::WindingOrder ToImpellerWindingOrder(int value) {
return ToImpellerWindingOrder(static_cast<FlutterGPUWindingOrder>(value)); return ToImpellerWindingOrder(static_cast<FlutterGPUWindingOrder>(value));
} }
enum class FlutterGPUPolygonMode {
kFill,
kLine,
};
constexpr impeller::PolygonMode ToImpellerPolygonMode(
FlutterGPUPolygonMode value) {
switch (value) {
case FlutterGPUPolygonMode::kFill:
return impeller::PolygonMode::kFill;
case FlutterGPUPolygonMode::kLine:
return impeller::PolygonMode::kLine;
}
}
constexpr impeller::PolygonMode ToImpellerPolygonMode(int value) {
return ToImpellerPolygonMode(static_cast<FlutterGPUPolygonMode>(value));
}
} // namespace gpu } // namespace gpu
} // namespace flutter } // namespace flutter

View File

@ -146,6 +146,11 @@ enum WindingOrder {
counterClockwise, counterClockwise,
} }
enum PolygonMode {
fill,
line
}
enum CompareFunction { enum CompareFunction {
/// Comparison test never passes. /// Comparison test never passes.
never, never,

View File

@ -262,6 +262,9 @@ base class RenderPass extends NativeFieldWrapperClass1 {
_setCullMode(cullMode.index); _setCullMode(cullMode.index);
} }
void setPolygonMode(PolygonMode polygonMode) {
_setPolygonMode(polygonMode.index);
}
void setPrimitiveType(PrimitiveType primitiveType) { void setPrimitiveType(PrimitiveType primitiveType) {
_setPrimitiveType(primitiveType.index); _setPrimitiveType(primitiveType.index);
@ -433,6 +436,9 @@ base class RenderPass extends NativeFieldWrapperClass1 {
symbol: 'InternalFlutterGpu_RenderPass_SetWindingOrder') symbol: 'InternalFlutterGpu_RenderPass_SetWindingOrder')
external void _setWindingOrder(int windingOrder); external void _setWindingOrder(int windingOrder);
@Native<Void Function(Pointer<Void>, Int)>(
symbol: 'InternalFlutterGpu_RenderPass_SetPolygonMode')
external void _setPolygonMode(int polygonMode);
@Native<Bool Function(Pointer<Void>)>( @Native<Bool Function(Pointer<Void>)>(
symbol: 'InternalFlutterGpu_RenderPass_Draw') symbol: 'InternalFlutterGpu_RenderPass_Draw')

View File

@ -617,6 +617,15 @@ void InternalFlutterGpu_RenderPass_SetWindingOrder(
flutter::gpu::ToImpellerWindingOrder(winding_order)); flutter::gpu::ToImpellerWindingOrder(winding_order));
} }
void InternalFlutterGpu_RenderPass_SetPolygonMode(
flutter::gpu::RenderPass* wrapper,
int polygon_mode) {
impeller::PipelineDescriptor& pipeline_descriptor =
wrapper->GetPipelineDescriptor();
pipeline_descriptor.SetPolygonMode(
flutter::gpu::ToImpellerPolygonMode(polygon_mode));
}
bool InternalFlutterGpu_RenderPass_Draw(flutter::gpu::RenderPass* wrapper) { bool InternalFlutterGpu_RenderPass_Draw(flutter::gpu::RenderPass* wrapper) {
return wrapper->Draw(); return wrapper->Draw();
} }

View File

@ -261,6 +261,11 @@ extern void InternalFlutterGpu_RenderPass_SetWindingOrder(
flutter::gpu::RenderPass* wrapper, flutter::gpu::RenderPass* wrapper,
int winding_order); int winding_order);
FLUTTER_GPU_EXPORT
extern void InternalFlutterGpu_RenderPass_SetPolygonMode(
flutter::gpu::RenderPass* wrapper,
int polygon_mode);
FLUTTER_GPU_EXPORT FLUTTER_GPU_EXPORT
extern bool InternalFlutterGpu_RenderPass_Draw( extern bool InternalFlutterGpu_RenderPass_Draw(
flutter::gpu::RenderPass* wrapper); flutter::gpu::RenderPass* wrapper);

View File

@ -371,6 +371,46 @@ void main() async {
await comparer.addGoldenImage(image, 'flutter_gpu_test_triangle.png'); await comparer.addGoldenImage(image, 'flutter_gpu_test_triangle.png');
}, skip: !impellerEnabled); }, skip: !impellerEnabled);
// Renders a green triangle pointing downwards using polygon mode line.
test('Can render triangle with polygon mode line.', () async {
final state = createSimpleRenderPass();
final gpu.RenderPipeline pipeline = createUnlitRenderPipeline();
state.renderPass.bindPipeline(pipeline);
// Configure blending with defaults (just to test the bindings).
state.renderPass.setColorBlendEnable(true);
state.renderPass.setColorBlendEquation(gpu.ColorBlendEquation());
// Set polygon mode.
state.renderPass.setPolygonMode(gpu.PolygonMode.line);
final gpu.HostBuffer transients = gpu.gpuContext.createHostBuffer();
final gpu.BufferView vertices = transients.emplace(float32(<double>[
-0.5, 0.5, //
0.0, -0.5, //
0.5, 0.5, //
]));
final gpu.BufferView vertInfoData = transients.emplace(float32(<double>[
1, 0, 0, 0, // mvp
0, 1, 0, 0, // mvp
0, 0, 1, 0, // mvp
0, 0, 0, 1, // mvp
0, 1, 0, 1, // color
]));
state.renderPass.bindVertexBuffer(vertices, 3);
final gpu.UniformSlot vertInfo =
pipeline.vertexShader.getUniformSlot('VertInfo');
state.renderPass.bindUniform(vertInfo, vertInfoData);
state.renderPass.draw();
state.commandBuffer.submit();
final ui.Image image = state.renderTexture.asImage();
await comparer.addGoldenImage(image, 'flutter_gpu_test_triangle_polygon_mode.png');
}, skip: !impellerEnabled);
// Renders a hollow green triangle pointing downwards. // Renders a hollow green triangle pointing downwards.
test('Can render hollowed out triangle using stencil ops', () async { test('Can render hollowed out triangle using stencil ops', () async {
final state = createSimpleRenderPass(); final state = createSimpleRenderPass();