Mesa (master): st/mesa: create shaders which have only one variant immediatelly (v2)
Marek Olšák
mareko at kemper.freedesktop.org
Tue Oct 20 11:29:04 UTC 2015
Module: Mesa
Branch: master
Commit: e57dd7a08bfeacab47d64c3adeb392f8c15ca793
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e57dd7a08bfeacab47d64c3adeb392f8c15ca793
Author: Marek Olšák <marek.olsak at amd.com>
Date: Mon Sep 28 00:04:39 2015 +0200
st/mesa: create shaders which have only one variant immediatelly (v2)
v2: fix the condition when lacking sample shading
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
---
src/mesa/state_tracker/st_cb_program.c | 5 +++--
src/mesa/state_tracker/st_context.c | 14 ++++++++++++++
src/mesa/state_tracker/st_context.h | 7 +++++++
3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c
index 708bdf5..2c4eccf 100644
--- a/src/mesa/state_tracker/st_cb_program.c
+++ b/src/mesa/state_tracker/st_cb_program.c
@@ -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;
}
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 70e0069..5abb173 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -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) {
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index ec95259..c243f5c 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -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;
More information about the mesa-commit
mailing list