ilo: speed up ilo_shader_select_kernel_routing() a bit
Remember the order of the source attributes and avoid recomputation when it does not change.
This commit is contained in:
@@ -900,20 +900,36 @@ ilo_shader_select_kernel_routing(struct ilo_shader_state *shader,
|
|||||||
src_semantics = source->shader->out.semantic_names;
|
src_semantics = source->shader->out.semantic_names;
|
||||||
src_indices = source->shader->out.semantic_indices;
|
src_indices = source->shader->out.semantic_indices;
|
||||||
src_len = source->shader->out.count;
|
src_len = source->shader->out.count;
|
||||||
|
|
||||||
/* skip PSIZE and POSITION (how about the optional CLIPDISTs?) */
|
|
||||||
assert(src_semantics[0] == TGSI_SEMANTIC_PSIZE);
|
|
||||||
assert(src_semantics[1] == TGSI_SEMANTIC_POSITION);
|
|
||||||
routing->source_skip = 2;
|
|
||||||
routing->source_len = src_len - routing->source_skip;
|
|
||||||
src_semantics += routing->source_skip;
|
|
||||||
src_indices += routing->source_skip;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
src_semantics = kernel->in.semantic_names;
|
src_semantics = kernel->in.semantic_names;
|
||||||
src_indices = kernel->in.semantic_indices;
|
src_indices = kernel->in.semantic_indices;
|
||||||
src_len = kernel->in.count;
|
src_len = kernel->in.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* no change */
|
||||||
|
if (kernel->routing_initialized &&
|
||||||
|
routing->source_skip + routing->source_len <= src_len &&
|
||||||
|
kernel->routing_sprite_coord_enable == sprite_coord_enable &&
|
||||||
|
!memcmp(kernel->routing_src_semantics,
|
||||||
|
&src_semantics[routing->source_skip],
|
||||||
|
sizeof(kernel->routing_src_semantics[0]) * routing->source_len) &&
|
||||||
|
!memcmp(kernel->routing_src_indices,
|
||||||
|
&src_indices[routing->source_skip],
|
||||||
|
sizeof(kernel->routing_src_indices[0]) * routing->source_len))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (source) {
|
||||||
|
/* skip PSIZE and POSITION (how about the optional CLIPDISTs?) */
|
||||||
|
assert(src_semantics[0] == TGSI_SEMANTIC_PSIZE);
|
||||||
|
assert(src_semantics[1] == TGSI_SEMANTIC_POSITION);
|
||||||
|
routing->source_skip = 2;
|
||||||
|
|
||||||
|
routing->source_len = src_len - routing->source_skip;
|
||||||
|
src_semantics += routing->source_skip;
|
||||||
|
src_indices += routing->source_skip;
|
||||||
|
}
|
||||||
|
else {
|
||||||
routing->source_skip = 0;
|
routing->source_skip = 0;
|
||||||
routing->source_len = src_len;
|
routing->source_len = src_len;
|
||||||
}
|
}
|
||||||
@@ -997,6 +1013,14 @@ ilo_shader_select_kernel_routing(struct ilo_shader_state *shader,
|
|||||||
*/
|
*/
|
||||||
routing->source_len = max_src_slot + 1;
|
routing->source_len = max_src_slot + 1;
|
||||||
|
|
||||||
|
/* remember the states of the source */
|
||||||
|
kernel->routing_initialized = true;
|
||||||
|
kernel->routing_sprite_coord_enable = sprite_coord_enable;
|
||||||
|
memcpy(kernel->routing_src_semantics, src_semantics,
|
||||||
|
sizeof(kernel->routing_src_semantics[0]) * routing->source_len);
|
||||||
|
memcpy(kernel->routing_src_indices, src_indices,
|
||||||
|
sizeof(kernel->routing_src_indices[0]) * routing->source_len);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -116,6 +116,10 @@ struct ilo_shader {
|
|||||||
void *kernel;
|
void *kernel;
|
||||||
int kernel_size;
|
int kernel_size;
|
||||||
|
|
||||||
|
bool routing_initialized;
|
||||||
|
int routing_src_semantics[PIPE_MAX_SHADER_OUTPUTS];
|
||||||
|
int routing_src_indices[PIPE_MAX_SHADER_OUTPUTS];
|
||||||
|
uint32_t routing_sprite_coord_enable;
|
||||||
struct ilo_kernel_routing routing;
|
struct ilo_kernel_routing routing;
|
||||||
|
|
||||||
/* what does the push constant buffer consist of? */
|
/* what does the push constant buffer consist of? */
|
||||||
|
Reference in New Issue
Block a user