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,

Reply via email to