aux/indices: break out primitive type conversion to separate function
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10965>
This commit is contained in:
parent
9d13d3e9ad
commit
cad2026b72
|
@ -59,6 +59,39 @@ static void translate_byte_to_ushort( const void *in,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum pipe_prim_type
|
||||||
|
u_index_prim_type_convert(unsigned hw_mask, enum pipe_prim_type prim)
|
||||||
|
{
|
||||||
|
if (hw_mask & (1<<prim))
|
||||||
|
return prim;
|
||||||
|
|
||||||
|
switch (prim) {
|
||||||
|
case PIPE_PRIM_POINTS:
|
||||||
|
return PIPE_PRIM_POINTS;
|
||||||
|
case PIPE_PRIM_LINES:
|
||||||
|
case PIPE_PRIM_LINE_STRIP:
|
||||||
|
case PIPE_PRIM_LINE_LOOP:
|
||||||
|
return PIPE_PRIM_LINES;
|
||||||
|
case PIPE_PRIM_TRIANGLES:
|
||||||
|
case PIPE_PRIM_TRIANGLE_STRIP:
|
||||||
|
case PIPE_PRIM_TRIANGLE_FAN:
|
||||||
|
case PIPE_PRIM_QUADS:
|
||||||
|
case PIPE_PRIM_QUAD_STRIP:
|
||||||
|
case PIPE_PRIM_POLYGON:
|
||||||
|
return PIPE_PRIM_TRIANGLES;
|
||||||
|
case PIPE_PRIM_LINES_ADJACENCY:
|
||||||
|
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
|
||||||
|
return PIPE_PRIM_LINES_ADJACENCY;
|
||||||
|
case PIPE_PRIM_TRIANGLES_ADJACENCY:
|
||||||
|
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
|
||||||
|
return PIPE_PRIM_TRIANGLES_ADJACENCY;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return PIPE_PRIM_POINTS;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Translate indexes when a driver can't support certain types
|
* Translate indexes when a driver can't support certain types
|
||||||
* of drawing. Example include:
|
* of drawing. Example include:
|
||||||
|
@ -127,81 +160,67 @@ u_index_translator(unsigned hw_mask,
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
|
*out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
|
||||||
|
*out_prim = u_index_prim_type_convert(hw_mask, prim);
|
||||||
|
|
||||||
switch (prim) {
|
switch (prim) {
|
||||||
case PIPE_PRIM_POINTS:
|
case PIPE_PRIM_POINTS:
|
||||||
*out_prim = PIPE_PRIM_POINTS;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_LINES:
|
case PIPE_PRIM_LINES:
|
||||||
*out_prim = PIPE_PRIM_LINES;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_LINE_STRIP:
|
case PIPE_PRIM_LINE_STRIP:
|
||||||
*out_prim = PIPE_PRIM_LINES;
|
|
||||||
*out_nr = (nr - 1) * 2;
|
*out_nr = (nr - 1) * 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_LINE_LOOP:
|
case PIPE_PRIM_LINE_LOOP:
|
||||||
*out_prim = PIPE_PRIM_LINES;
|
|
||||||
*out_nr = nr * 2;
|
*out_nr = nr * 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_TRIANGLES:
|
case PIPE_PRIM_TRIANGLES:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_TRIANGLE_STRIP:
|
case PIPE_PRIM_TRIANGLE_STRIP:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = (nr - 2) * 3;
|
*out_nr = (nr - 2) * 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_TRIANGLE_FAN:
|
case PIPE_PRIM_TRIANGLE_FAN:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = (nr - 2) * 3;
|
*out_nr = (nr - 2) * 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_QUADS:
|
case PIPE_PRIM_QUADS:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = (nr / 4) * 6;
|
*out_nr = (nr / 4) * 6;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_QUAD_STRIP:
|
case PIPE_PRIM_QUAD_STRIP:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = (nr - 2) * 3;
|
*out_nr = (nr - 2) * 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_POLYGON:
|
case PIPE_PRIM_POLYGON:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = (nr - 2) * 3;
|
*out_nr = (nr - 2) * 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_LINES_ADJACENCY:
|
case PIPE_PRIM_LINES_ADJACENCY:
|
||||||
*out_prim = PIPE_PRIM_LINES_ADJACENCY;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
|
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
|
||||||
*out_prim = PIPE_PRIM_LINES_ADJACENCY;
|
|
||||||
*out_nr = (nr - 3) * 4;
|
*out_nr = (nr - 3) * 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_TRIANGLES_ADJACENCY:
|
case PIPE_PRIM_TRIANGLES_ADJACENCY:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES_ADJACENCY;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
|
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES_ADJACENCY;
|
|
||||||
*out_nr = ((nr - 4) / 2) * 6;
|
*out_nr = ((nr - 4) / 2) * 6;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
*out_prim = PIPE_PRIM_POINTS;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
return U_TRANSLATE_ERROR;
|
return U_TRANSLATE_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -251,12 +270,12 @@ u_index_generator(unsigned hw_mask,
|
||||||
|
|
||||||
*out_index_size = ((start + nr) > 0xfffe) ? 4 : 2;
|
*out_index_size = ((start + nr) > 0xfffe) ? 4 : 2;
|
||||||
out_idx = out_size_idx(*out_index_size);
|
out_idx = out_size_idx(*out_index_size);
|
||||||
|
*out_prim = u_index_prim_type_convert(hw_mask, prim);
|
||||||
|
|
||||||
if ((hw_mask & (1<<prim)) &&
|
if ((hw_mask & (1<<prim)) &&
|
||||||
(in_pv == out_pv)) {
|
(in_pv == out_pv)) {
|
||||||
|
|
||||||
*out_generate = generate[out_idx][in_pv][out_pv][PIPE_PRIM_POINTS];
|
*out_generate = generate[out_idx][in_pv][out_pv][PIPE_PRIM_POINTS];
|
||||||
*out_prim = prim;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
return U_GENERATE_LINEAR;
|
return U_GENERATE_LINEAR;
|
||||||
}
|
}
|
||||||
|
@ -265,79 +284,64 @@ u_index_generator(unsigned hw_mask,
|
||||||
|
|
||||||
switch (prim) {
|
switch (prim) {
|
||||||
case PIPE_PRIM_POINTS:
|
case PIPE_PRIM_POINTS:
|
||||||
*out_prim = PIPE_PRIM_POINTS;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_LINES:
|
case PIPE_PRIM_LINES:
|
||||||
*out_prim = PIPE_PRIM_LINES;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_LINE_STRIP:
|
case PIPE_PRIM_LINE_STRIP:
|
||||||
*out_prim = PIPE_PRIM_LINES;
|
|
||||||
*out_nr = (nr - 1) * 2;
|
*out_nr = (nr - 1) * 2;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_LINE_LOOP:
|
case PIPE_PRIM_LINE_LOOP:
|
||||||
*out_prim = PIPE_PRIM_LINES;
|
|
||||||
*out_nr = nr * 2;
|
*out_nr = nr * 2;
|
||||||
return U_GENERATE_ONE_OFF;
|
return U_GENERATE_ONE_OFF;
|
||||||
|
|
||||||
case PIPE_PRIM_TRIANGLES:
|
case PIPE_PRIM_TRIANGLES:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_TRIANGLE_STRIP:
|
case PIPE_PRIM_TRIANGLE_STRIP:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = (nr - 2) * 3;
|
*out_nr = (nr - 2) * 3;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_TRIANGLE_FAN:
|
case PIPE_PRIM_TRIANGLE_FAN:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = (nr - 2) * 3;
|
*out_nr = (nr - 2) * 3;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_QUADS:
|
case PIPE_PRIM_QUADS:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = (nr / 4) * 6;
|
*out_nr = (nr / 4) * 6;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_QUAD_STRIP:
|
case PIPE_PRIM_QUAD_STRIP:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = (nr - 2) * 3;
|
*out_nr = (nr - 2) * 3;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_POLYGON:
|
case PIPE_PRIM_POLYGON:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES;
|
|
||||||
*out_nr = (nr - 2) * 3;
|
*out_nr = (nr - 2) * 3;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_LINES_ADJACENCY:
|
case PIPE_PRIM_LINES_ADJACENCY:
|
||||||
*out_prim = PIPE_PRIM_LINES_ADJACENCY;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
|
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
|
||||||
*out_prim = PIPE_PRIM_LINES_ADJACENCY;
|
|
||||||
*out_nr = (nr - 3) * 4;
|
*out_nr = (nr - 3) * 4;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_TRIANGLES_ADJACENCY:
|
case PIPE_PRIM_TRIANGLES_ADJACENCY:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES_ADJACENCY;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
|
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
|
||||||
*out_prim = PIPE_PRIM_TRIANGLES_ADJACENCY;
|
|
||||||
*out_nr = ((nr - 4) / 2) * 6;
|
*out_nr = ((nr - 4) / 2) * 6;
|
||||||
return U_GENERATE_REUSABLE;
|
return U_GENERATE_REUSABLE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
*out_generate = generate[out_idx][in_pv][out_pv][PIPE_PRIM_POINTS];
|
*out_generate = generate[out_idx][in_pv][out_pv][PIPE_PRIM_POINTS];
|
||||||
*out_prim = PIPE_PRIM_POINTS;
|
|
||||||
*out_nr = nr;
|
*out_nr = nr;
|
||||||
return U_TRANSLATE_ERROR;
|
return U_TRANSLATE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,6 +82,10 @@ enum indices_mode {
|
||||||
|
|
||||||
void u_index_init( void );
|
void u_index_init( void );
|
||||||
|
|
||||||
|
/* returns the primitive type resulting from index translation */
|
||||||
|
enum pipe_prim_type
|
||||||
|
u_index_prim_type_convert(unsigned hw_mask, enum pipe_prim_type prim);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For indexed drawing, this function determines what kind of primitive
|
* For indexed drawing, this function determines what kind of primitive
|
||||||
|
|
Loading…
Reference in New Issue