From 195768924920b21cc04d8c97fd136903eeab5186 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Wed, 13 May 2020 12:32:29 +0200 Subject: [PATCH] v3dv: fix dynamic blend constants We were pre-packing the constants from the pipeline state and then always emitting that at draw time, ignoring dynamic state. This makes it so we don't prepack at pipeline creation time and we always emit the correct constants directly the command buffer dynamic state. Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 9 ++++++++- src/broadcom/vulkan/v3dv_pipeline.c | 9 --------- src/broadcom/vulkan/v3dv_private.h | 2 -- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 9d87a1c..1f65498 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -23,6 +23,7 @@ #include "v3dv_private.h" #include "broadcom/cle/v3dx_pack.h" +#include "util/half_float.h" #include "util/u_pack_color.h" #include "vk_format_info.h" @@ -2633,7 +2634,13 @@ emit_blend(struct v3dv_cmd_buffer *cmd_buffer) if (pipeline->blend.needs_color_constants && cmd_buffer->state.dirty & V3DV_CMD_DIRTY_BLEND_CONSTANTS) { - cl_emit_prepacked(&job->bcl, &pipeline->blend.constant_color); + struct v3dv_dynamic_state *dynamic = &cmd_buffer->state.dynamic; + cl_emit(&job->bcl, BLEND_CONSTANT_COLOR, color) { + color.red_f16 = _mesa_float_to_half(dynamic->blend_constants[0]); + color.green_f16 = _mesa_float_to_half(dynamic->blend_constants[1]); + color.blue_f16 = _mesa_float_to_half(dynamic->blend_constants[2]); + color.alpha_f16 = _mesa_float_to_half(dynamic->blend_constants[3]); + } cmd_buffer->state.dirty &= ~V3DV_CMD_DIRTY_BLEND_CONSTANTS; } } diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 17e1631..ba0c390 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -1756,15 +1756,6 @@ pack_blend(struct v3dv_pipeline *pipeline, } } - if (pipeline->blend.needs_color_constants) { - v3dv_pack(pipeline->blend.constant_color, BLEND_CONSTANT_COLOR, color) { - color.red_f16 = _mesa_float_to_half(cb_info->blendConstants[0]); - color.green_f16 = _mesa_float_to_half(cb_info->blendConstants[1]); - color.blue_f16 = _mesa_float_to_half(cb_info->blendConstants[2]); - color.alpha_f16 = _mesa_float_to_half(cb_info->blendConstants[3]); - } - } - pipeline->blend.color_write_masks = color_write_masks; } diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 3a505fc..cfaf3d1 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1301,8 +1301,6 @@ struct v3dv_pipeline { * color constants. */ bool needs_color_constants; - /* Blend constants packet */ - uint8_t constant_color[cl_packet_length(BLEND_CONSTANT_COLOR)]; /* Mask with enabled color channels for each RT (4 bits per RT) */ uint32_t color_write_masks; } blend; -- 2.7.4