mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 11:28:05 +02:00
kk: Fix pre-gfx encoder dependency with gfx encoder
Signed-off-by: Aitor Camacho <aitor@lunarg.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40914>
This commit is contained in:
parent
d39d846cfa
commit
2ec0925bc1
2 changed files with 23 additions and 9 deletions
|
|
@ -66,12 +66,10 @@ kk_encoder_start_render(struct kk_cmd_buffer *cmd,
|
|||
* like triangle fans. For this, we signal the value pre_gfx will wait on,
|
||||
* and we wait on the value pre_gfx will signal once completed.
|
||||
*/
|
||||
encoder->signal_value_pre_gfx = encoder->event_value;
|
||||
mtl_encode_signal_event(encoder->main.cmd_buffer, encoder->event,
|
||||
++encoder->event_value);
|
||||
encoder->wait_value_pre_gfx = encoder->event_value;
|
||||
mtl_encode_wait_for_event(encoder->main.cmd_buffer, encoder->event,
|
||||
++encoder->event_value);
|
||||
encoder->signal_value_pre_gfx = encoder->event_value;
|
||||
|
||||
encoder->main.encoder = mtl_new_render_command_encoder_with_descriptor(
|
||||
encoder->main.cmd_buffer, descriptor);
|
||||
|
|
@ -116,9 +114,12 @@ kk_encoder_end(struct kk_cmd_buffer *cmd)
|
|||
upload_queue_writes(cmd);
|
||||
kk_encoder_signal_fence_and_end(cmd);
|
||||
|
||||
/* Let remaining render encoders run without waiting since we are done */
|
||||
mtl_encode_signal_event(cmd->encoder->pre_gfx.cmd_buffer,
|
||||
cmd->encoder->event, cmd->encoder->event_value);
|
||||
struct kk_encoder *encoder = cmd->encoder;
|
||||
if (encoder->last_signaled_value_pre_gfx != encoder->signal_value_pre_gfx) {
|
||||
mtl_encode_signal_event(encoder->pre_gfx.cmd_buffer, encoder->event,
|
||||
encoder->signal_value_pre_gfx);
|
||||
encoder->last_signaled_value_pre_gfx = encoder->signal_value_pre_gfx;
|
||||
}
|
||||
}
|
||||
|
||||
struct kk_imm_write_push {
|
||||
|
|
@ -217,12 +218,19 @@ kk_encoder_signal_fence_and_end(struct kk_cmd_buffer *cmd)
|
|||
|
||||
/* We can start rendering once all pre-graphics work is done */
|
||||
mtl_encode_signal_event(encoder->pre_gfx.cmd_buffer, encoder->event,
|
||||
encoder->event_value);
|
||||
encoder->signal_value_pre_gfx);
|
||||
encoder->last_signaled_value_pre_gfx = encoder->signal_value_pre_gfx;
|
||||
}
|
||||
|
||||
if (encoder->main.last_used != KK_ENC_NONE) {
|
||||
/* kk_encoder_internal_end_encoding will change this value to NONE */
|
||||
enum kk_encoder_type last = encoder->main.last_used;
|
||||
kk_encoder_signal_fence(encoder);
|
||||
kk_encoder_internal_end_encoding(&encoder->main);
|
||||
if (last == KK_ENC_RENDER) {
|
||||
mtl_encode_signal_event(encoder->main.cmd_buffer, encoder->event,
|
||||
++encoder->event_value);
|
||||
}
|
||||
}
|
||||
|
||||
if (cmd->drawable) {
|
||||
|
|
@ -334,8 +342,13 @@ kk_encoder_pre_gfx_encoder(struct kk_cmd_buffer *cmd)
|
|||
struct kk_encoder *encoder = cmd->encoder;
|
||||
if (!encoder->pre_gfx.encoder) {
|
||||
/* Fast-forward all previous render encoders and wait for the last one */
|
||||
mtl_encode_signal_event(encoder->pre_gfx.cmd_buffer, encoder->event,
|
||||
encoder->signal_value_pre_gfx);
|
||||
uint32_t last_signaled = (encoder->wait_value_pre_gfx - 1u);
|
||||
if (encoder->wait_value_pre_gfx != 0u &&
|
||||
encoder->last_signaled_value_pre_gfx != last_signaled) {
|
||||
mtl_encode_signal_event(encoder->pre_gfx.cmd_buffer, encoder->event,
|
||||
last_signaled);
|
||||
encoder->last_signaled_value_pre_gfx = last_signaled;
|
||||
}
|
||||
mtl_encode_wait_for_event(encoder->pre_gfx.cmd_buffer, encoder->event,
|
||||
encoder->wait_value_pre_gfx);
|
||||
encoder->pre_gfx.encoder =
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ struct kk_encoder {
|
|||
/* Track what values pre_gfx must wait/signal before starting the encoding */
|
||||
uint64_t wait_value_pre_gfx;
|
||||
uint64_t signal_value_pre_gfx;
|
||||
uint64_t last_signaled_value_pre_gfx;
|
||||
|
||||
/* uint64_t pairs with first being the address, second being the value to
|
||||
* write */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue