[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));
|
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
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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')
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user