diff options
-rw-r--r-- | src/broadcom/cle/v3d_packet_v33.xml | 7 | ||||
-rw-r--r-- | src/gallium/drivers/vc5/vc5_draw.c | 15 |
2 files changed, 18 insertions, 4 deletions
diff --git a/src/broadcom/cle/v3d_packet_v33.xml b/src/broadcom/cle/v3d_packet_v33.xml index 06ca0365ef3..ba5ceb0d92e 100644 --- a/src/broadcom/cle/v3d_packet_v33.xml +++ b/src/broadcom/cle/v3d_packet_v33.xml @@ -60,6 +60,13 @@ <value name="TRIANGLES" value="4"/> <value name="TRIANGLE_STRIP" value="5"/> <value name="TRIANGLE_FAN" value="6"/> + <value name="POINTS_TF" value="16"/> + <value name="LINES_TF" value="17"/> + <value name="LINE_LOOP_TF" value="18"/> + <value name="LINE_STRIP_TF" value="19"/> + <value name="TRIANGLES_TF" value="20"/> + <value name="TRIANGLE_STRIP_TF" value="21"/> + <value name="TRIANGLE_FAN_TF" value="22"/> </enum> <packet code="0" name="Halt"/> diff --git a/src/gallium/drivers/vc5/vc5_draw.c b/src/gallium/drivers/vc5/vc5_draw.c index 953477817d8..8c6a753b271 100644 --- a/src/gallium/drivers/vc5/vc5_draw.c +++ b/src/gallium/drivers/vc5/vc5_draw.c @@ -409,6 +409,13 @@ vc5_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) } } + /* The HW only processes transform feedback on primitives with the + * flag set. + */ + uint32_t prim_tf_enable = 0; + if (vc5->prog.bind_vs->num_tf_outputs) + prim_tf_enable = (V3D_PRIM_POINTS_TF - V3D_PRIM_POINTS); + /* Note that the primitive type fields match with OpenGL/gallium * definitions, up to but not including QUADS. */ @@ -433,7 +440,7 @@ vc5_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) prim.maximum_index = (1u << 31) - 1; /* XXX */ prim.address_of_indices_list = cl_address(rsc->bo, offset); - prim.mode = info->mode; + prim.mode = info->mode | prim_tf_enable; prim.enable_primitive_restarts = info->primitive_restart; prim.number_of_instances = info->instance_count; @@ -446,7 +453,7 @@ vc5_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) prim.maximum_index = (1u << 31) - 1; /* XXX */ prim.address_of_indices_list = cl_address(rsc->bo, offset); - prim.mode = info->mode; + prim.mode = info->mode | prim_tf_enable; prim.enable_primitive_restarts = info->primitive_restart; } } @@ -458,14 +465,14 @@ vc5_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) } else { if (info->instance_count > 1) { cl_emit(&job->bcl, VERTEX_ARRAY_INSTANCED_PRIMITIVES, prim) { - prim.mode = info->mode; + prim.mode = info->mode | prim_tf_enable; prim.index_of_first_vertex = info->start; prim.number_of_instances = info->instance_count; prim.instance_length = info->count; } } else { cl_emit(&job->bcl, VERTEX_ARRAY_PRIMITIVES, prim) { - prim.mode = info->mode; + prim.mode = info->mode | prim_tf_enable; prim.length = info->count; prim.index_of_first_vertex = info->start; } |