st/mesa: create shaders which have only one variant immediatelly (v2)
authorMarek Olšák <marek.olsak@amd.com>
Sun, 27 Sep 2015 22:04:39 +0000 (00:04 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 20 Oct 2015 10:51:51 +0000 (12:51 +0200)
v2: fix the condition when lacking sample shading

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/mesa/state_tracker/st_cb_program.c
src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_context.h

index 708bdf5011e8faadc8776b2716c87a5dce9ef9cf..2c4eccf1e06ec47ae5162de72fcee38821fd27b0 100644 (file)
@@ -224,6 +224,7 @@ st_program_string_notify( struct gl_context *ctx,
                                            struct gl_program *prog )
 {
    struct st_context *st = st_context(ctx);
+   gl_shader_stage stage = _mesa_program_enum_to_shader_stage(target);
 
    if (target == GL_FRAGMENT_PROGRAM_ARB) {
       struct st_fragment_program *stfp = (struct st_fragment_program *) prog;
@@ -278,10 +279,10 @@ st_program_string_notify( struct gl_context *ctx,
          st->dirty.st |= ST_NEW_TESSEVAL_PROGRAM;
    }
 
-   if (ST_DEBUG & DEBUG_PRECOMPILE)
+   if (ST_DEBUG & DEBUG_PRECOMPILE ||
+       st->shader_has_one_variant[stage])
       st_precompile_shader_variant(st, prog);
 
-   /* XXX check if program is legal, within limits */
    return GL_TRUE;
 }
 
index 70e006912dc6702cb0f4bfbf6de6c212f2839f05..5abb17385c23d3559331800618b09f0039a6511e 100644 (file)
@@ -294,6 +294,20 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
          ctx->Const.ShaderCompilerOptions[i].EmitNoIndirectSampler = true;
    }
 
+   /* Set which shader types can be compiled at link time. */
+   st->shader_has_one_variant[MESA_SHADER_VERTEX] =
+         st->has_shareable_shaders &&
+         !st->clamp_vert_color_in_shader;
+
+   st->shader_has_one_variant[MESA_SHADER_FRAGMENT] =
+         st->has_shareable_shaders &&
+         !st->clamp_frag_color_in_shader &&
+         !st->force_persample_in_shader;
+
+   st->shader_has_one_variant[MESA_SHADER_TESS_CTRL] = st->has_shareable_shaders;
+   st->shader_has_one_variant[MESA_SHADER_TESS_EVAL] = st->has_shareable_shaders;
+   st->shader_has_one_variant[MESA_SHADER_GEOMETRY] = st->has_shareable_shaders;
+
    _mesa_compute_version(ctx);
 
    if (ctx->Version == 0) {
index ec95259b67a8d53535ac5bb22cb695285cc095dc..c243f5cd966cf0839aca6a8789e011ea333bb3f0 100644 (file)
@@ -101,6 +101,13 @@ struct st_context
    boolean force_persample_in_shader;
    boolean has_shareable_shaders;
 
+   /**
+    * If a shader can be created when we get its source.
+    * This means it has only 1 variant, not counting glBitmap and
+    * glDrawPixels.
+    */
+   boolean shader_has_one_variant[MESA_SHADER_STAGES];
+
    boolean needs_texcoord_semantic;
    boolean apply_texture_swizzle_to_border_color;