Переглянути джерело

v3d: add support for adjacency primitives

v2: remove obsolete comment (Alejandro)

Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
master
Iago Toral Quiroga 7 роки тому
джерело
коміт
e2f2263433
1 змінених файлів з 32 додано та 10 видалено
  1. 32
    10
      src/gallium/drivers/v3d/v3dx_draw.c

+ 32
- 10
src/gallium/drivers/v3d/v3dx_draw.c Переглянути файл

job->first_ez_state = job->ez_state; job->first_ez_state = job->ez_state;
} }


static uint32_t
v3d_hw_prim_type(enum pipe_prim_type prim_type)
{
switch (prim_type) {
case PIPE_PRIM_POINTS:
case PIPE_PRIM_LINES:
case PIPE_PRIM_LINE_LOOP:
case PIPE_PRIM_LINE_STRIP:
case PIPE_PRIM_TRIANGLES:
case PIPE_PRIM_TRIANGLE_STRIP:
case PIPE_PRIM_TRIANGLE_FAN:
return prim_type;

case PIPE_PRIM_LINES_ADJACENCY:
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
case PIPE_PRIM_TRIANGLES_ADJACENCY:
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
return 8 + (prim_type - PIPE_PRIM_LINES_ADJACENCY);

default:
unreachable("Unsupported primitive type");
}
}

static void static void
v3d_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) v3d_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
{ {
} }
} }


if (info->mode >= PIPE_PRIM_QUADS) {
if (info->mode >= PIPE_PRIM_QUADS && info->mode <= PIPE_PRIM_POLYGON) {
util_primconvert_save_rasterizer_state(v3d->primconvert, &v3d->rasterizer->base); util_primconvert_save_rasterizer_state(v3d->primconvert, &v3d->rasterizer->base);
util_primconvert_draw_vbo(v3d->primconvert, info); util_primconvert_draw_vbo(v3d->primconvert, info);
perf_debug("Fallback conversion for %d %s vertices\n", perf_debug("Fallback conversion for %d %s vertices\n",


v3d_update_primitives_generated_counter(v3d, info); v3d_update_primitives_generated_counter(v3d, info);


/* Note that the primitive type fields match with OpenGL/gallium
* definitions, up to but not including QUADS.
*/
uint32_t hw_prim_type = v3d_hw_prim_type(info->mode);
if (info->index_size) { if (info->index_size) {
uint32_t index_size = info->index_size; uint32_t index_size = info->index_size;
uint32_t offset = info->start * index_size; uint32_t offset = info->start * index_size;
prim.address_of_indices_list = prim.address_of_indices_list =
cl_address(rsc->bo, offset); cl_address(rsc->bo, offset);
#endif /* V3D_VERSION < 40 */ #endif /* V3D_VERSION < 40 */
prim.mode = info->mode | prim_tf_enable;
prim.mode = hw_prim_type | prim_tf_enable;
prim.enable_primitive_restarts = info->primitive_restart; prim.enable_primitive_restarts = info->primitive_restart;


prim.number_of_draw_indirect_indexed_records = info->indirect->draw_count; prim.number_of_draw_indirect_indexed_records = info->indirect->draw_count;
prim.address_of_indices_list = prim.address_of_indices_list =
cl_address(rsc->bo, offset); cl_address(rsc->bo, offset);
#endif /* V3D_VERSION < 40 */ #endif /* V3D_VERSION < 40 */
prim.mode = info->mode | prim_tf_enable;
prim.mode = hw_prim_type | prim_tf_enable;
prim.enable_primitive_restarts = info->primitive_restart; prim.enable_primitive_restarts = info->primitive_restart;


prim.number_of_instances = info->instance_count; prim.number_of_instances = info->instance_count;
prim.address_of_indices_list = prim.address_of_indices_list =
cl_address(rsc->bo, offset); cl_address(rsc->bo, offset);
#endif /* V3D_VERSION < 40 */ #endif /* V3D_VERSION < 40 */
prim.mode = info->mode | prim_tf_enable;
prim.mode = hw_prim_type | prim_tf_enable;
prim.enable_primitive_restarts = info->primitive_restart; prim.enable_primitive_restarts = info->primitive_restart;
} }
} }
} else { } else {
if (info->indirect) { if (info->indirect) {
cl_emit(&job->bcl, INDIRECT_VERTEX_ARRAY_INSTANCED_PRIMS, prim) { cl_emit(&job->bcl, INDIRECT_VERTEX_ARRAY_INSTANCED_PRIMS, prim) {
prim.mode = info->mode | prim_tf_enable;
prim.mode = hw_prim_type | prim_tf_enable;
prim.number_of_draw_indirect_array_records = info->indirect->draw_count; prim.number_of_draw_indirect_array_records = info->indirect->draw_count;


prim.stride_in_multiples_of_4_bytes = info->indirect->stride >> 2; prim.stride_in_multiples_of_4_bytes = info->indirect->stride >> 2;
v3d_stream_output_target_get_vertex_count(so) : v3d_stream_output_target_get_vertex_count(so) :
info->count; info->count;
cl_emit(&job->bcl, VERTEX_ARRAY_INSTANCED_PRIMS, prim) { cl_emit(&job->bcl, VERTEX_ARRAY_INSTANCED_PRIMS, prim) {
prim.mode = info->mode | prim_tf_enable;
prim.mode = hw_prim_type | prim_tf_enable;
prim.index_of_first_vertex = info->start; prim.index_of_first_vertex = info->start;
prim.number_of_instances = info->instance_count; prim.number_of_instances = info->instance_count;
prim.instance_length = vert_count; prim.instance_length = vert_count;
v3d_stream_output_target_get_vertex_count(so) : v3d_stream_output_target_get_vertex_count(so) :
info->count; info->count;
cl_emit(&job->bcl, VERTEX_ARRAY_PRIMS, prim) { cl_emit(&job->bcl, VERTEX_ARRAY_PRIMS, prim) {
prim.mode = info->mode | prim_tf_enable;
prim.mode = hw_prim_type | prim_tf_enable;
prim.length = vert_count; prim.length = vert_count;
prim.index_of_first_vertex = info->start; prim.index_of_first_vertex = info->start;
} }

Завантаження…
Відмінити
Зберегти