[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:
parent
96ab9b9e30
commit
3214f65fa3
@ -541,6 +541,25 @@ constexpr impeller::WindingOrder ToImpellerWindingOrder(int 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 flutter
|
||||
|
||||
|
@ -146,6 +146,11 @@ enum WindingOrder {
|
||||
counterClockwise,
|
||||
}
|
||||
|
||||
enum PolygonMode {
|
||||
fill,
|
||||
line
|
||||
}
|
||||
|
||||
enum CompareFunction {
|
||||
/// Comparison test never passes.
|
||||
never,
|
||||
|
@ -262,10 +262,13 @@ base class RenderPass extends NativeFieldWrapperClass1 {
|
||||
_setCullMode(cullMode.index);
|
||||
}
|
||||
|
||||
void setPolygonMode(PolygonMode polygonMode) {
|
||||
_setPolygonMode(polygonMode.index);
|
||||
}
|
||||
|
||||
void setPrimitiveType(PrimitiveType primitiveType) {
|
||||
_setPrimitiveType(primitiveType.index);
|
||||
}
|
||||
}
|
||||
|
||||
void setWindingOrder(WindingOrder windingOrder) {
|
||||
_setWindingOrder(windingOrder.index);
|
||||
@ -433,6 +436,9 @@ base class RenderPass extends NativeFieldWrapperClass1 {
|
||||
symbol: 'InternalFlutterGpu_RenderPass_SetWindingOrder')
|
||||
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>)>(
|
||||
symbol: 'InternalFlutterGpu_RenderPass_Draw')
|
||||
|
@ -617,6 +617,15 @@ void InternalFlutterGpu_RenderPass_SetWindingOrder(
|
||||
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) {
|
||||
return wrapper->Draw();
|
||||
}
|
||||
|
@ -261,6 +261,11 @@ extern void InternalFlutterGpu_RenderPass_SetWindingOrder(
|
||||
flutter::gpu::RenderPass* wrapper,
|
||||
int winding_order);
|
||||
|
||||
FLUTTER_GPU_EXPORT
|
||||
extern void InternalFlutterGpu_RenderPass_SetPolygonMode(
|
||||
flutter::gpu::RenderPass* wrapper,
|
||||
int polygon_mode);
|
||||
|
||||
FLUTTER_GPU_EXPORT
|
||||
extern bool InternalFlutterGpu_RenderPass_Draw(
|
||||
flutter::gpu::RenderPass* wrapper);
|
||||
|
@ -371,6 +371,46 @@ void main() async {
|
||||
await comparer.addGoldenImage(image, 'flutter_gpu_test_triangle.png');
|
||||
}, 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.
|
||||
test('Can render hollowed out triangle using stencil ops', () async {
|
||||
final state = createSimpleRenderPass();
|
||||
|
Loading…
x
Reference in New Issue
Block a user