Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 72dca1b

Browse files
Added support to set primitive type (#55514)
Added a way to specify the PrimitiveType when encoding commands in the RenderPass. This partially fixes the issue #142732
1 parent 05c1677 commit 72dca1b

File tree

4 files changed

+68
-0
lines changed

4 files changed

+68
-0
lines changed

lib/gpu/lib/src/render_pass.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,11 @@ base class RenderPass extends NativeFieldWrapperClass1 {
262262
_setCullMode(cullMode.index);
263263
}
264264

265+
266+
void setPrimitiveType(PrimitiveType primitiveType) {
267+
_setPrimitiveType(primitiveType.index);
268+
}
269+
265270
void setWindingOrder(WindingOrder windingOrder) {
266271
_setWindingOrder(windingOrder.index);
267272
}
@@ -421,9 +426,14 @@ base class RenderPass extends NativeFieldWrapperClass1 {
421426
external void _setCullMode(int cullMode);
422427

423428
@Native<Void Function(Pointer<Void>, Int)>(
429+
symbol: 'InternalFlutterGpu_RenderPass_SetPrimitiveType')
430+
external void _setPrimitiveType(int primitiveType);
431+
432+
@Native<Void Function(Pointer<Void>, Int)>(
424433
symbol: 'InternalFlutterGpu_RenderPass_SetWindingOrder')
425434
external void _setWindingOrder(int windingOrder);
426435

436+
427437
@Native<Bool Function(Pointer<Void>)>(
428438
symbol: 'InternalFlutterGpu_RenderPass_Draw')
429439
external bool _draw();

lib/gpu/render_pass.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,15 @@ void InternalFlutterGpu_RenderPass_SetCullMode(
567567
pipeline_descriptor.SetCullMode(flutter::gpu::ToImpellerCullMode(cull_mode));
568568
}
569569

570+
void InternalFlutterGpu_RenderPass_SetPrimitiveType(
571+
flutter::gpu::RenderPass* wrapper,
572+
int primitive_type) {
573+
impeller::PipelineDescriptor& pipeline_descriptor =
574+
wrapper->GetPipelineDescriptor();
575+
pipeline_descriptor.SetPrimitiveType(
576+
flutter::gpu::ToImpellerPrimitiveType(primitive_type));
577+
}
578+
570579
void InternalFlutterGpu_RenderPass_SetWindingOrder(
571580
flutter::gpu::RenderPass* wrapper,
572581
int winding_order) {

lib/gpu/render_pass.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,11 @@ extern void InternalFlutterGpu_RenderPass_SetCullMode(
251251
flutter::gpu::RenderPass* wrapper,
252252
int cull_mode);
253253

254+
FLUTTER_GPU_EXPORT
255+
extern void InternalFlutterGpu_RenderPass_SetPrimitiveType(
256+
flutter::gpu::RenderPass* wrapper,
257+
int primitive_type);
258+
254259
FLUTTER_GPU_EXPORT
255260
extern void InternalFlutterGpu_RenderPass_SetWindingOrder(
256261
flutter::gpu::RenderPass* wrapper,

testing/dart/gpu_test.dart

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,4 +499,48 @@ void main() async {
499499
final ui.Image image = state.renderTexture.asImage();
500500
await comparer.addGoldenImage(image, 'flutter_gpu_test_cull_mode.png');
501501
}, skip: !impellerEnabled);
502+
503+
// Renders a hexagon using line strip primitive type.
504+
test('Can render hollow hexagon using line strip primitive type', () async {
505+
final state = createSimpleRenderPass();
506+
507+
final gpu.RenderPipeline pipeline = createUnlitRenderPipeline();
508+
state.renderPass.bindPipeline(pipeline);
509+
510+
// Configure blending with defaults (just to test the bindings).
511+
state.renderPass.setColorBlendEnable(true);
512+
state.renderPass.setColorBlendEquation(gpu.ColorBlendEquation());
513+
514+
// Set primitive type
515+
state.renderPass.setPrimitiveType(gpu.PrimitiveType.lineStrip);
516+
517+
final gpu.HostBuffer transients = gpu.gpuContext.createHostBuffer();
518+
final gpu.BufferView vertices = transients.emplace(float32(<double>[
519+
1.0, 0.0,
520+
0.5, 0.8,
521+
-0.5, 0.8,
522+
-1.0, 0.0,
523+
-0.5, -0.8,
524+
0.5, -0.8,
525+
1.0, 0.0
526+
]));
527+
final gpu.BufferView vertInfoData = transients.emplace(float32(<double>[
528+
1, 0, 0, 0, // mvp
529+
0, 1, 0, 0, // mvp
530+
0, 0, 1, 0, // mvp
531+
0, 0, 0, 1, // mvp
532+
0, 1, 0, 1, // color
533+
]));
534+
state.renderPass.bindVertexBuffer(vertices, 7);
535+
536+
final gpu.UniformSlot vertInfo =
537+
pipeline.vertexShader.getUniformSlot('VertInfo');
538+
state.renderPass.bindUniform(vertInfo, vertInfoData);
539+
state.renderPass.draw();
540+
541+
state.commandBuffer.submit();
542+
543+
final ui.Image image = state.renderTexture.asImage();
544+
await comparer.addGoldenImage(image, 'flutter_gpu_test_hexgon_line_strip.png');
545+
}, skip: !impellerEnabled);
502546
}

0 commit comments

Comments
 (0)