free(data);
}
-#define APPEND_TO_HASH(state, field) \
- XXH64_update(state, &field, sizeof(field));
-
static uint64_t
hash_renderpass_instance(const struct tu_render_pass *pass,
const struct tu_framebuffer *framebuffer,
const struct tu_cmd_buffer *cmd) {
- XXH64_state_t hash_state;
- XXH64_reset(&hash_state, 0);
-
- APPEND_TO_HASH(&hash_state, framebuffer->width);
- APPEND_TO_HASH(&hash_state, framebuffer->height);
- APPEND_TO_HASH(&hash_state, framebuffer->layers);
+ uint32_t data[3 + pass->attachment_count * 5];
+ uint32_t* ptr = data;
- APPEND_TO_HASH(&hash_state, pass->attachment_count);
- XXH64_update(&hash_state, pass->attachments, pass->attachment_count * sizeof(pass->attachments[0]));
+ *ptr++ = framebuffer->width;
+ *ptr++ = framebuffer->height;
+ *ptr++ = framebuffer->layers;
for (unsigned i = 0; i < pass->attachment_count; i++) {
- APPEND_TO_HASH(&hash_state, cmd->state.attachments[i]->view.width);
- APPEND_TO_HASH(&hash_state, cmd->state.attachments[i]->view.height);
- APPEND_TO_HASH(&hash_state, cmd->state.attachments[i]->image->vk.format);
- APPEND_TO_HASH(&hash_state, cmd->state.attachments[i]->image->vk.array_layers);
- APPEND_TO_HASH(&hash_state, cmd->state.attachments[i]->image->vk.mip_levels);
- }
-
- APPEND_TO_HASH(&hash_state, pass->subpass_count);
- for (unsigned i = 0; i < pass->subpass_count; i++) {
- APPEND_TO_HASH(&hash_state, pass->subpasses[i].samples);
- APPEND_TO_HASH(&hash_state, pass->subpasses[i].input_count);
- APPEND_TO_HASH(&hash_state, pass->subpasses[i].color_count);
- APPEND_TO_HASH(&hash_state, pass->subpasses[i].resolve_count);
+ *ptr++ = cmd->state.attachments[i]->view.width;
+ *ptr++ = cmd->state.attachments[i]->view.height;
+ *ptr++ = cmd->state.attachments[i]->image->vk.format;
+ *ptr++ = cmd->state.attachments[i]->image->vk.array_layers;
+ *ptr++ = cmd->state.attachments[i]->image->vk.mip_levels;
}
- return XXH64_digest(&hash_state);
+ return XXH64(data, sizeof(data), pass->autotune_hash);
}
static void
}
static void
+tu_render_pass_calc_hash(struct tu_render_pass *pass)
+{
+ #define HASH(hash, data) XXH64(&(data), sizeof(data), hash)
+
+ uint64_t hash = HASH(0, pass->attachment_count);
+ hash = XXH64(pass->attachments,
+ pass->attachment_count * sizeof(pass->attachments[0]), hash);
+ hash = HASH(hash, pass->subpass_count);
+ for (unsigned i = 0; i < pass->subpass_count; i++) {
+ hash = HASH(hash, pass->subpasses[i].samples);
+ hash = HASH(hash, pass->subpasses[i].input_count);
+ hash = HASH(hash, pass->subpasses[i].color_count);
+ hash = HASH(hash, pass->subpasses[i].resolve_count);
+ }
+
+ pass->autotune_hash = hash;
+
+ #undef HASH
+}
+
+static void
tu_render_pass_cond_config(struct tu_render_pass *pass)
{
for (uint32_t i = 0; i < pass->attachment_count; i++) {
tu_render_pass_cond_config(pass);
tu_render_pass_gmem_config(pass, device->physical_device);
tu_render_pass_bandwidth_config(pass);
+ tu_render_pass_calc_hash(pass);
for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
tu_render_pass_add_subpass_dep(pass, &pCreateInfo->pDependencies[i]);
}
tu_render_pass_add_implicit_deps(pass, pCreateInfo);
-
+
*pRenderPass = tu_render_pass_to_handle(pass);
return VK_SUCCESS;
tu_render_pass_cond_config(pass);
tu_render_pass_gmem_config(pass, device->physical_device);
tu_render_pass_bandwidth_config(pass);
+ tu_render_pass_calc_hash(pass);
}
void