Mesa (main): crocus: expose ARB_blend_func_extended on gen 45/50

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Jul 4 21:07:15 UTC 2021


Module: Mesa
Branch: main
Commit: c71daec2604f1bac8e94dfcc4856f1b19c1a2273
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c71daec2604f1bac8e94dfcc4856f1b19c1a2273

Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Jul  1 10:52:52 2021 +1000

crocus: expose ARB_blend_func_extended on gen 45/50

In theory the docs say 965gm can support this but the original
965 can't, but we can't distinguish that yet.

Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11693>

---

 src/gallium/drivers/crocus/crocus_screen.c |  3 ++-
 src/gallium/drivers/crocus/crocus_state.c  | 22 +++++++++++++++++++++-
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/crocus/crocus_screen.c b/src/gallium/drivers/crocus/crocus_screen.c
index c61bfafc458..6c49fe59933 100644
--- a/src/gallium/drivers/crocus/crocus_screen.c
+++ b/src/gallium/drivers/crocus/crocus_screen.c
@@ -263,7 +263,8 @@ crocus_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_FBFETCH:
       return devinfo->verx10 >= 45 ? BRW_MAX_DRAW_BUFFERS : 0;
    case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
-      return devinfo->ver >= 6 ? 1 : 0;
+      /* in theory CL (965gm) can do this */
+      return devinfo->verx10 >= 45 ? 1 : 0;
    case PIPE_CAP_MAX_RENDER_TARGETS:
       return BRW_MAX_DRAW_BUFFERS;
    case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
diff --git a/src/gallium/drivers/crocus/crocus_state.c b/src/gallium/drivers/crocus/crocus_state.c
index da5fb7a80c2..de5e60ed751 100644
--- a/src/gallium/drivers/crocus/crocus_state.c
+++ b/src/gallium/drivers/crocus/crocus_state.c
@@ -1565,6 +1565,23 @@ set_blend_entry_bits(struct crocus_batch *batch, BLEND_ENTRY_GENXML *entry,
       entry->DestinationBlendFactor      = (int) dst_rgb;
       entry->DestinationAlphaBlendFactor = (int) dst_alpha;
    }
+#if GFX_VER <= 5
+   /*
+    * Gen4/GM45/ILK can't handle have ColorBufferBlendEnable == 0
+    * when a dual src blend shader is in use. Setup dummy blending.
+    */
+   struct crocus_compiled_shader *shader = ice->shaders.prog[MESA_SHADER_FRAGMENT];
+   struct brw_wm_prog_data *wm_prog_data = (void *) shader->prog_data;
+   if (idx == 0 && !blend_enabled && wm_prog_data->dual_src_blend) {
+      entry->ColorBufferBlendEnable = 1;
+      entry->ColorBlendFunction = PIPE_BLEND_ADD;
+      entry->AlphaBlendFunction = PIPE_BLEND_ADD;
+      entry->SourceBlendFactor = PIPE_BLENDFACTOR_ONE;
+      entry->SourceAlphaBlendFactor = PIPE_BLENDFACTOR_ONE;
+      entry->DestinationBlendFactor = PIPE_BLENDFACTOR_ZERO;
+      entry->DestinationAlphaBlendFactor = PIPE_BLENDFACTOR_ZERO;
+   }
+#endif
    return independent_alpha_blend;
 }
 
@@ -5341,11 +5358,14 @@ crocus_populate_binding_table(struct crocus_context *ice,
 #if GFX_VER <= 5
             const struct pipe_rt_blend_state *rt =
                &ice->state.cso_blend->cso.rt[ice->state.cso_blend->cso.independent_blend_enable ? i : 0];
+            struct crocus_compiled_shader *shader = ice->shaders.prog[MESA_SHADER_FRAGMENT];
+            struct brw_wm_prog_data *wm_prog_data = (void *) shader->prog_data;
             write_disables |= (rt->colormask & PIPE_MASK_A) ? 0x0 : 0x8;
             write_disables |= (rt->colormask & PIPE_MASK_R) ? 0x0 : 0x4;
             write_disables |= (rt->colormask & PIPE_MASK_G) ? 0x0 : 0x2;
             write_disables |= (rt->colormask & PIPE_MASK_B) ? 0x0 : 0x1;
-            blend_enable = rt->blend_enable;
+            /* Gen4/5 can't handle blending off when a dual src blend wm is enabled. */
+            blend_enable = rt->blend_enable || wm_prog_data->dual_src_blend;
 #endif
             if (cso_fb->cbufs[i]) {
                surf_offsets[s] = emit_surface(batch,



More information about the mesa-commit mailing list