[Mesa-dev] [PATCH 18/22] meta/blit: Replace the gl_FragColor write

Ian Romanick idr at freedesktop.org
Thu Feb 18 01:58:11 UTC 2016


From: Ian Romanick <ian.d.romanick at intel.com>

Explicitly write to each output.  This also resolves the issue from
commit a6022e54 for integer and uint targets too.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/drivers/common/meta.h      |  7 ++++-
 src/mesa/drivers/common/meta_blit.c | 60 +++++++++++++++++++++++++++++++++++--
 2 files changed, 63 insertions(+), 4 deletions(-)

diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
index 7a120b6..06fb798 100644
--- a/src/mesa/drivers/common/meta.h
+++ b/src/mesa/drivers/common/meta.h
@@ -301,7 +301,12 @@ struct blit_state
    struct gl_buffer_object *buf_obj;
    struct blit_shader_table shaders_with_depth;
    struct blit_shader_table shaders_without_depth;
-   GLuint msaa_shaders[BLIT_MSAA_SHADER_COUNT];
+
+   /* A unique shader is generated for each kind of blit and for each possible
+    * number target color draw buffers.
+    */
+   GLuint msaa_shaders[BLIT_MSAA_SHADER_COUNT * MAX_DRAW_BUFFERS];
+
    struct temp_texture depthTex;
    bool no_ctsi_fallback;
 };
diff --git a/src/mesa/drivers/common/meta_blit.c b/src/mesa/drivers/common/meta_blit.c
index 2e45231..551ed29 100644
--- a/src/mesa/drivers/common/meta_blit.c
+++ b/src/mesa/drivers/common/meta_blit.c
@@ -348,6 +348,57 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx,
       vec4_prefix = "";
    }
 
+
+   /* All of the non-depth resolve blits need to factor in the number of color
+    * draw buffers so that the source values can be broadcast correctly.
+    *
+    * Eventually this needs to expand to all non-depth blits.  See
+    * https://bugs.freedesktop.org/show_bug.cgi?id=94128.  It seems like
+    * before that happens the blit_msaa_shader enum should be reorganized as a
+    * bitfield to describe the blit using values that can easily be extracted
+    * from the shader index.
+    *
+    * Scaled blits are handled elsewhere.
+    */
+   switch (shader_index) {
+   case BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE:
+   case BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE:
+   case BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE:
+   case BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE:
+   case BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE:
+   case BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT:
+   case BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT:
+   case BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT:
+   case BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT:
+   case BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT:
+   case BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT:
+   case BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT:
+   case BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT:
+   case BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT:
+   case BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT:
+   case BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE:
+   case BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE:
+   case BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE:
+   case BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE:
+   case BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE:
+   case BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT:
+   case BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT:
+   case BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT:
+   case BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT:
+   case BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT:
+   case BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT:
+   case BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT:
+   case BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT:
+   case BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT:
+   case BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT:
+      assert(drawFb->_NumColorDrawBuffers > 0);
+      assert(!dst_is_msaa);
+      shader_index += (drawFb->_NumColorDrawBuffers - 1) * BLIT_MSAA_SHADER_COUNT;
+      break;
+   default:
+      break;
+   };
+
    if (blit->msaa_shaders[shader_index]) {
       _mesa_UseProgram(blit->msaa_shaders[shader_index]);
       return;
@@ -512,11 +563,13 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx,
          /* Scale the final result. */
          if (src_datatype == GL_UNSIGNED_INT || src_datatype == GL_INT) {
             ralloc_asprintf_append(&sample_resolve,
-                                   "   out_color = sample_%d_0;\n",
+                                   "   for (int i = 0; i < out_color.length(); i++)\n"
+                                   "      out_color[i] = sample_%d_0;\n",
                                    samples);
          } else {
             ralloc_asprintf_append(&sample_resolve,
-                                   "   gl_FragColor = sample_%d_0 / %f;\n",
+                                   "   for (int i = 0; i < out_color.length(); i++)\n"
+                                   "      out_color[i] = sample_%d_0 / %f;\n",
                                    samples, (float)samples);
          }
 
@@ -526,7 +579,7 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx,
                                      "#define gvec4 %svec4\n"
                                      "uniform %ssampler2DMS%s texSampler;\n"
                                      "in %s texCoords;\n"
-                                     "out gvec4 out_color;\n"
+                                     "out gvec4 out_color[%u];\n"
                                      "\n"
                                      "%s" /* merge_function */
                                      "void main()\n"
@@ -537,6 +590,7 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx,
                                      vec4_prefix,
                                      sampler_array_suffix,
                                      texcoord_type,
+                                     drawFb->_NumColorDrawBuffers,
                                      merge_function,
                                      sample_resolve);
       }
-- 
2.5.0



More information about the mesa-dev mailing list