Module: Mesa Branch: main Commit: 88e661db991ef932c2af689fab717a3c438b038b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=88e661db991ef932c2af689fab717a3c438b038b
Author: George Ouzounoudis <[email protected]> Date: Mon Aug 21 18:11:03 2023 +0300 nvk: Support extendedDynamicState3ColorBlendEquation This is needed for EXT_shader_object. Move state to dynamic. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24872> --- src/nouveau/vulkan/nvk_cmd_draw.c | 73 ++++++++++++++++++++++++++++- src/nouveau/vulkan/nvk_graphics_pipeline.c | 74 ------------------------------ src/nouveau/vulkan/nvk_physical_device.c | 2 +- 3 files changed, 73 insertions(+), 76 deletions(-) diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index 8bbf87e7db4..78ce274c136 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -447,6 +447,7 @@ nvk_cmd_buffer_dirty_render_pass(struct nvk_cmd_buffer *cmd) /* These depend on color attachment count */ BITSET_SET(dyn->dirty, MESA_VK_DYNAMIC_CB_COLOR_WRITE_ENABLES); BITSET_SET(dyn->dirty, MESA_VK_DYNAMIC_CB_BLEND_ENABLES); + BITSET_SET(dyn->dirty, MESA_VK_DYNAMIC_CB_BLEND_EQUATIONS); /* These depend on the depth/stencil format */ BITSET_SET(dyn->dirty, MESA_VK_DYNAMIC_DS_DEPTH_TEST_ENABLE); @@ -1532,6 +1533,55 @@ vk_to_nv9097_logic_op(VkLogicOp vk_op) return nv9097_op; } +static uint32_t +vk_to_nv9097_blend_op(VkBlendOp vk_op) +{ +#define OP(vk, nv) [VK_BLEND_OP_##vk] = NV9097_SET_BLEND_COLOR_OP_V_OGL_##nv + ASSERTED uint16_t vk_to_nv9097[] = { + OP(ADD, FUNC_ADD), + OP(SUBTRACT, FUNC_SUBTRACT), + OP(REVERSE_SUBTRACT, FUNC_REVERSE_SUBTRACT), + OP(MIN, MIN), + OP(MAX, MAX), + }; + assert(vk_op < ARRAY_SIZE(vk_to_nv9097)); +#undef OP + + return vk_to_nv9097[vk_op]; +} + +static uint32_t +vk_to_nv9097_blend_factor(VkBlendFactor vk_factor) +{ +#define FACTOR(vk, nv) [VK_BLEND_FACTOR_##vk] = \ + NV9097_SET_BLEND_COLOR_SOURCE_COEFF_V_##nv + ASSERTED uint16_t vk_to_nv9097[] = { + FACTOR(ZERO, OGL_ZERO), + FACTOR(ONE, OGL_ONE), + FACTOR(SRC_COLOR, OGL_SRC_COLOR), + FACTOR(ONE_MINUS_SRC_COLOR, OGL_ONE_MINUS_SRC_COLOR), + FACTOR(DST_COLOR, OGL_DST_COLOR), + FACTOR(ONE_MINUS_DST_COLOR, OGL_ONE_MINUS_DST_COLOR), + FACTOR(SRC_ALPHA, OGL_SRC_ALPHA), + FACTOR(ONE_MINUS_SRC_ALPHA, OGL_ONE_MINUS_SRC_ALPHA), + FACTOR(DST_ALPHA, OGL_DST_ALPHA), + FACTOR(ONE_MINUS_DST_ALPHA, OGL_ONE_MINUS_DST_ALPHA), + FACTOR(CONSTANT_COLOR, OGL_CONSTANT_COLOR), + FACTOR(ONE_MINUS_CONSTANT_COLOR, OGL_ONE_MINUS_CONSTANT_COLOR), + FACTOR(CONSTANT_ALPHA, OGL_CONSTANT_ALPHA), + FACTOR(ONE_MINUS_CONSTANT_ALPHA, OGL_ONE_MINUS_CONSTANT_ALPHA), + FACTOR(SRC_ALPHA_SATURATE, OGL_SRC_ALPHA_SATURATE), + FACTOR(SRC1_COLOR, OGL_SRC1COLOR), + FACTOR(ONE_MINUS_SRC1_COLOR, OGL_INVSRC1COLOR), + FACTOR(SRC1_ALPHA, OGL_SRC1ALPHA), + FACTOR(ONE_MINUS_SRC1_ALPHA, OGL_INVSRC1ALPHA), + }; + assert(vk_factor < ARRAY_SIZE(vk_to_nv9097)); +#undef FACTOR + + return vk_to_nv9097[vk_factor]; +} + void nvk_mme_set_write_mask(struct mme_builder *b) { @@ -1598,7 +1648,7 @@ nvk_flush_cb_state(struct nvk_cmd_buffer *cmd) &cmd->vk.dynamic_graphics_state; struct nv_push *p = - nvk_cmd_buffer_push(cmd, 13 + 2 * render->color_att_count); + nvk_cmd_buffer_push(cmd, 13 + 10 * render->color_att_count); if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_CB_LOGIC_OP_ENABLE)) P_IMMD(p, NV9097, SET_LOGIC_OP, dyn->cb.logic_op_enable); @@ -1614,6 +1664,27 @@ nvk_flush_cb_state(struct nvk_cmd_buffer *cmd) } } + if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_CB_BLEND_EQUATIONS)) { + for (uint8_t a = 0; a < render->color_att_count; a++) { + const struct vk_color_blend_attachment_state *att = + &dyn->cb.attachments[a]; + P_MTHD(p, NV9097, SET_BLEND_PER_TARGET_SEPARATE_FOR_ALPHA(a)); + P_NV9097_SET_BLEND_PER_TARGET_SEPARATE_FOR_ALPHA(p, a, ENABLE_TRUE); + P_NV9097_SET_BLEND_PER_TARGET_COLOR_OP(p, a, + vk_to_nv9097_blend_op(att->color_blend_op)); + P_NV9097_SET_BLEND_PER_TARGET_COLOR_SOURCE_COEFF(p, a, + vk_to_nv9097_blend_factor(att->src_color_blend_factor)); + P_NV9097_SET_BLEND_PER_TARGET_COLOR_DEST_COEFF(p, a, + vk_to_nv9097_blend_factor(att->dst_color_blend_factor)); + P_NV9097_SET_BLEND_PER_TARGET_ALPHA_OP(p, a, + vk_to_nv9097_blend_op(att->alpha_blend_op)); + P_NV9097_SET_BLEND_PER_TARGET_ALPHA_SOURCE_COEFF(p, a, + vk_to_nv9097_blend_factor(att->src_alpha_blend_factor)); + P_NV9097_SET_BLEND_PER_TARGET_ALPHA_DEST_COEFF(p, a, + vk_to_nv9097_blend_factor(att->dst_alpha_blend_factor)); + } + } + if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_CB_COLOR_WRITE_ENABLES)) { uint32_t color_write_enables = 0x0; for (uint8_t a = 0; a < render->color_att_count; a++) { diff --git a/src/nouveau/vulkan/nvk_graphics_pipeline.c b/src/nouveau/vulkan/nvk_graphics_pipeline.c index d634bcefba8..577fc2dca02 100644 --- a/src/nouveau/vulkan/nvk_graphics_pipeline.c +++ b/src/nouveau/vulkan/nvk_graphics_pipeline.c @@ -92,79 +92,6 @@ emit_pipeline_ms_state(struct nv_push *p, }); } -static uint32_t -vk_to_nv9097_blend_op(VkBlendOp vk_op) -{ -#define OP(vk, nv) [VK_BLEND_OP_##vk] = NV9097_SET_BLEND_COLOR_OP_V_OGL_##nv - ASSERTED uint16_t vk_to_nv9097[] = { - OP(ADD, FUNC_ADD), - OP(SUBTRACT, FUNC_SUBTRACT), - OP(REVERSE_SUBTRACT, FUNC_REVERSE_SUBTRACT), - OP(MIN, MIN), - OP(MAX, MAX), - }; - assert(vk_op < ARRAY_SIZE(vk_to_nv9097)); -#undef OP - - return vk_to_nv9097[vk_op]; -} - -static uint32_t -vk_to_nv9097_blend_factor(VkBlendFactor vk_factor) -{ -#define FACTOR(vk, nv) [VK_BLEND_FACTOR_##vk] = \ - NV9097_SET_BLEND_COLOR_SOURCE_COEFF_V_##nv - ASSERTED uint16_t vk_to_nv9097[] = { - FACTOR(ZERO, OGL_ZERO), - FACTOR(ONE, OGL_ONE), - FACTOR(SRC_COLOR, OGL_SRC_COLOR), - FACTOR(ONE_MINUS_SRC_COLOR, OGL_ONE_MINUS_SRC_COLOR), - FACTOR(DST_COLOR, OGL_DST_COLOR), - FACTOR(ONE_MINUS_DST_COLOR, OGL_ONE_MINUS_DST_COLOR), - FACTOR(SRC_ALPHA, OGL_SRC_ALPHA), - FACTOR(ONE_MINUS_SRC_ALPHA, OGL_ONE_MINUS_SRC_ALPHA), - FACTOR(DST_ALPHA, OGL_DST_ALPHA), - FACTOR(ONE_MINUS_DST_ALPHA, OGL_ONE_MINUS_DST_ALPHA), - FACTOR(CONSTANT_COLOR, OGL_CONSTANT_COLOR), - FACTOR(ONE_MINUS_CONSTANT_COLOR, OGL_ONE_MINUS_CONSTANT_COLOR), - FACTOR(CONSTANT_ALPHA, OGL_CONSTANT_ALPHA), - FACTOR(ONE_MINUS_CONSTANT_ALPHA, OGL_ONE_MINUS_CONSTANT_ALPHA), - FACTOR(SRC_ALPHA_SATURATE, OGL_SRC_ALPHA_SATURATE), - FACTOR(SRC1_COLOR, OGL_SRC1COLOR), - FACTOR(ONE_MINUS_SRC1_COLOR, OGL_INVSRC1COLOR), - FACTOR(SRC1_ALPHA, OGL_SRC1ALPHA), - FACTOR(ONE_MINUS_SRC1_ALPHA, OGL_INVSRC1ALPHA), - }; - assert(vk_factor < ARRAY_SIZE(vk_to_nv9097)); -#undef FACTOR - - return vk_to_nv9097[vk_factor]; -} - -static void -emit_pipeline_cb_state(struct nv_push *p, - const struct vk_color_blend_state *cb) -{ - for (uint32_t a = 0; a < cb->attachment_count; a++) { - const struct vk_color_blend_attachment_state *att = &cb->attachments[a]; - - P_MTHD(p, NV9097, SET_BLEND_PER_TARGET_SEPARATE_FOR_ALPHA(a)); - P_NV9097_SET_BLEND_PER_TARGET_SEPARATE_FOR_ALPHA(p, a, ENABLE_TRUE); - P_NV9097_SET_BLEND_PER_TARGET_COLOR_OP(p, a, - vk_to_nv9097_blend_op(att->color_blend_op)); - P_NV9097_SET_BLEND_PER_TARGET_COLOR_SOURCE_COEFF(p, a, - vk_to_nv9097_blend_factor(att->src_color_blend_factor)); - P_NV9097_SET_BLEND_PER_TARGET_COLOR_DEST_COEFF(p, a, - vk_to_nv9097_blend_factor(att->dst_color_blend_factor)); - P_NV9097_SET_BLEND_PER_TARGET_ALPHA_OP(p, a, - vk_to_nv9097_blend_op(att->alpha_blend_op)); - P_NV9097_SET_BLEND_PER_TARGET_ALPHA_SOURCE_COEFF(p, a, - vk_to_nv9097_blend_factor(att->src_alpha_blend_factor)); - P_NV9097_SET_BLEND_PER_TARGET_ALPHA_DEST_COEFF(p, a, - vk_to_nv9097_blend_factor(att->dst_alpha_blend_factor)); - } -} - static void emit_pipeline_ct_write_state(struct nv_push *p, const struct vk_color_blend_state *cb, @@ -491,7 +418,6 @@ nvk_graphics_pipeline_create(struct nvk_device *dev, if (state.vp) emit_pipeline_vp_state(&push, state.vp); if (state.rs) emit_pipeline_rs_state(&push, state.rs); if (state.ms) emit_pipeline_ms_state(&push, state.ms, force_max_samples); - if (state.cb) emit_pipeline_cb_state(&push, state.cb); emit_pipeline_ct_write_state(&push, state.cb, state.rp); pipeline->push_dw_count = nv_push_dw_count(&push); diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index 7b6b870b111..4e0d81ef06b 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -398,7 +398,7 @@ nvk_get_device_features(const struct nv_device_info *info, .extendedDynamicState3AlphaToOneEnable = false, .extendedDynamicState3LogicOpEnable = true, .extendedDynamicState3ColorBlendEnable = true, - .extendedDynamicState3ColorBlendEquation = false, + .extendedDynamicState3ColorBlendEquation = true, .extendedDynamicState3ColorWriteMask = false, .extendedDynamicState3RasterizationStream = false, .extendedDynamicState3ConservativeRasterizationMode = false,
