[Mesa-dev] [PATCH 3/3] meta: Avoid shader recompilation for msaa color resolve blit

Anuj Phogat anuj.phogat at gmail.com
Mon Sep 8 16:52:50 PDT 2014


On Sat, Sep 6, 2014 at 4:49 PM, Dave Airlie <airlied at gmail.com> wrote:
> coverity reported a use before NULL check for src_rb in the below code,
>
> maybe it was there already, but it noticed it now you changed it,
>
> we check src_rb->NumSamples then later src_rb is checked. Could you take a look.
>
Yes, the issue existed earlier as well. I'll take a look.

> Dave.
>
>>     const char *texcoord_type = "vec2";
>>     const int samples = MAX2(src_rb->NumSamples, 1);
>> +   int shader_offset = 0;
>> +
>> +   /* We expect only power of 2 samples in source multisample buffer. */
>> +   assert((samples & (samples - 1)) == 0);
>> +   while (samples >> (shader_offset + 1)) {
>> +      shader_offset++;
>> +   }
>> +   /* Update the assert if we plan to support more than 16X MSAA. */
>> +   assert(shader_offset >= 0 && shader_offset <= 4);
>>
>>     if (src_rb) {
>>        src_datatype = _mesa_get_format_datatype(src_rb->Format);
>> @@ -109,13 +118,15 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx,
>>        } else {
>>           if (dst_is_msaa)
>>              shader_index = BLIT_MSAA_SHADER_2D_MULTISAMPLE_COPY;
>> -         else
>> -            shader_index = BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE;
>> +         else {
>> +            shader_index = BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE +
>> +                           shader_offset;
>> +         }
>>        }
>>
>>        if (target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) {
>> -         shader_index += (BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE -
>> -                          BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE);
>> +         shader_index += (BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE -
>> +                          BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE);
>>           sampler_array_suffix = "Array";
>>           texcoord_type = "vec3";
>>        }
>> @@ -123,19 +134,19 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx,
>>     default:
>>        _mesa_problem(ctx, "Unkown texture target %s\n",
>>                      _mesa_lookup_enum_by_nr(target));
>> -      shader_index = BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE;
>> +      shader_index = BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE;
>>     }
>>
>>     /* We rely on the enum being sorted this way. */
>> -   STATIC_ASSERT(BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT ==
>> -                 BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE + 1);
>> -   STATIC_ASSERT(BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT ==
>> -                 BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE + 2);
>> +   STATIC_ASSERT(BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT ==
>> +                 BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE + 5);
>> +   STATIC_ASSERT(BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT ==
>> +                 BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE + 10);
>>     if (src_datatype == GL_INT) {
>> -      shader_index++;
>> +      shader_index += 5;
>>        vec4_prefix = "i";
>>     } else if (src_datatype == GL_UNSIGNED_INT) {
>> -      shader_index += 2;
>> +      shader_index += 10;
>>        vec4_prefix = "u";
>>     } else {
>>        vec4_prefix = "";
>> @@ -147,9 +158,7 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx,
>>        shader_index == BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_COPY ||
>>        shader_index == BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_COPY;
>>
>> -   if (blit->msaa_shaders[shader_index] &&
>> -       (is_shader_msaa_depth_resolve_or_copy ||
>> -        blit->samples == samples)) {
>> +   if (blit->msaa_shaders[shader_index]) {
>>        _mesa_UseProgram(blit->msaa_shaders[shader_index]);
>>        return;
>>     }
>> --
>> 1.9.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list