From 4322cf34c4ce5badb410645b370ab33dbfea1a3c Mon Sep 17 00:00:00 2001 From: Jonathan Marek Date: Thu, 12 Dec 2019 17:13:55 -0500 Subject: [PATCH] turnip: add dirty bit for push constants Fixes push constants not updating in some cases. Signed-off-by: Jonathan Marek Reviewed-by: Eric Anholt --- src/freedreno/vulkan/tu_cmd_buffer.c | 33 ++++++++++++++++------------ src/freedreno/vulkan/tu_private.h | 1 + 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index 3af7c13ed09..9d466705469 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -2090,8 +2090,9 @@ tu_CmdPushConstants(VkCommandBuffer commandBuffer, uint32_t size, const void *pValues) { - TU_FROM_HANDLE(tu_cmd_buffer, cmd_buffer, commandBuffer); - memcpy((void*) cmd_buffer->push_constants + offset, pValues, size); + TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); + memcpy((void*) cmd->push_constants + offset, pValues, size); + cmd->state.dirty |= TU_CMD_DIRTY_PUSH_CONSTANTS; } VkResult @@ -3146,18 +3147,7 @@ tu6_bind_draw_states(struct tu_cmd_buffer *cmd, } if (cmd->state.dirty & - (TU_CMD_DIRTY_PIPELINE | TU_CMD_DIRTY_DESCRIPTOR_SETS)) { - bool needs_border = false; - struct tu_cs_entry vs_tex, fs_tex; - - result = tu6_emit_textures(cmd, MESA_SHADER_VERTEX, &vs_tex, &needs_border); - if (result != VK_SUCCESS) - return result; - - result = tu6_emit_textures(cmd, MESA_SHADER_FRAGMENT, &fs_tex, &needs_border); - if (result != VK_SUCCESS) - return result; - + (TU_CMD_DIRTY_PIPELINE | TU_CMD_DIRTY_DESCRIPTOR_SETS | TU_CMD_DIRTY_PUSH_CONSTANTS)) { draw_state_groups[draw_state_group_count++] = (struct tu_draw_state_group) { .id = TU_DRAW_STATE_VS_CONST, @@ -3170,6 +3160,21 @@ tu6_bind_draw_states(struct tu_cmd_buffer *cmd, .enable_mask = 0x6, .ib = tu6_emit_consts(cmd, pipeline, descriptors_state, MESA_SHADER_FRAGMENT) }; + } + + if (cmd->state.dirty & + (TU_CMD_DIRTY_PIPELINE | TU_CMD_DIRTY_DESCRIPTOR_SETS)) { + bool needs_border = false; + struct tu_cs_entry vs_tex, fs_tex; + + result = tu6_emit_textures(cmd, MESA_SHADER_VERTEX, &vs_tex, &needs_border); + if (result != VK_SUCCESS) + return result; + + result = tu6_emit_textures(cmd, MESA_SHADER_FRAGMENT, &fs_tex, &needs_border); + if (result != VK_SUCCESS) + return result; + draw_state_groups[draw_state_group_count++] = (struct tu_draw_state_group) { .id = TU_DRAW_STATE_VS_TEX, diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h index 1edc4a24d77..2d9051284e1 100644 --- a/src/freedreno/vulkan/tu_private.h +++ b/src/freedreno/vulkan/tu_private.h @@ -835,6 +835,7 @@ enum tu_cmd_dirty_bits TU_CMD_DIRTY_COMPUTE_PIPELINE = 1 << 1, TU_CMD_DIRTY_VERTEX_BUFFERS = 1 << 2, TU_CMD_DIRTY_DESCRIPTOR_SETS = 1 << 3, + TU_CMD_DIRTY_PUSH_CONSTANTS = 1 << 4, TU_CMD_DIRTY_DYNAMIC_LINE_WIDTH = 1 << 16, TU_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 17, -- 2.30.2