Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions lib/gpu/lib/src/render_pass.dart
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,11 @@ base class RenderPass extends NativeFieldWrapperClass1 {
_setCullMode(cullMode.index);
}


void setPrimitiveType(PrimitiveType primitiveType) {
_setPrimitiveType(primitiveType.index);
}

void setWindingOrder(WindingOrder windingOrder) {
_setWindingOrder(windingOrder.index);
}
Expand Down Expand Up @@ -421,9 +426,14 @@ base class RenderPass extends NativeFieldWrapperClass1 {
external void _setCullMode(int cullMode);

@Native<Void Function(Pointer<Void>, Int)>(
symbol: 'InternalFlutterGpu_RenderPass_SetPrimitiveType')
external void _setPrimitiveType(int primitiveType);

@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();
Expand Down
9 changes: 9 additions & 0 deletions lib/gpu/render_pass.cc
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,15 @@ void InternalFlutterGpu_RenderPass_SetCullMode(
pipeline_descriptor.SetCullMode(flutter::gpu::ToImpellerCullMode(cull_mode));
}

void InternalFlutterGpu_RenderPass_SetPrimitiveType(
flutter::gpu::RenderPass* wrapper,
int primitive_type) {
impeller::PipelineDescriptor& pipeline_descriptor =
wrapper->GetPipelineDescriptor();
pipeline_descriptor.SetPrimitiveType(
flutter::gpu::ToImpellerPrimitiveType(primitive_type));
}

void InternalFlutterGpu_RenderPass_SetWindingOrder(
flutter::gpu::RenderPass* wrapper,
int winding_order) {
Expand Down
5 changes: 5 additions & 0 deletions lib/gpu/render_pass.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,11 @@ extern void InternalFlutterGpu_RenderPass_SetCullMode(
flutter::gpu::RenderPass* wrapper,
int cull_mode);

FLUTTER_GPU_EXPORT
extern void InternalFlutterGpu_RenderPass_SetPrimitiveType(
flutter::gpu::RenderPass* wrapper,
int primitive_type);

FLUTTER_GPU_EXPORT
extern void InternalFlutterGpu_RenderPass_SetWindingOrder(
flutter::gpu::RenderPass* wrapper,
Expand Down
44 changes: 44 additions & 0 deletions testing/dart/gpu_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -499,4 +499,48 @@ void main() async {
final ui.Image image = state.renderTexture.asImage();
await comparer.addGoldenImage(image, 'flutter_gpu_test_cull_mode.png');
}, skip: !impellerEnabled);

// Renders a hexagon using line strip primitive type.
test('Can render hollow hexagon using line strip primitive type', () 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 primitive type
state.renderPass.setPrimitiveType(gpu.PrimitiveType.lineStrip);

final gpu.HostBuffer transients = gpu.gpuContext.createHostBuffer();
final gpu.BufferView vertices = transients.emplace(float32(<double>[
1.0, 0.0,
0.5, 0.8,
-0.5, 0.8,
-1.0, 0.0,
-0.5, -0.8,
0.5, -0.8,
1.0, 0.0
]));
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, 7);

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_hexgon_line_strip.png');
}, skip: !impellerEnabled);
}