st/glsl: support clamping color outputs in compat for gs/tes
This support requires the driver to be a NIR driver as we use the NIR lowering pass to do the clamping. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -220,7 +220,25 @@ st_update_common_program(struct st_context *st, struct gl_program *prog,
|
|||||||
if (st->shader_has_one_variant[prog->info.stage] && stp->variants)
|
if (st->shader_has_one_variant[prog->info.stage] && stp->variants)
|
||||||
return stp->variants->driver_shader;
|
return stp->variants->driver_shader;
|
||||||
|
|
||||||
return st_get_basic_variant(st, pipe_shader, stp)->driver_shader;
|
struct st_basic_variant_key key;
|
||||||
|
|
||||||
|
/* use memset, not an initializer to be sure all memory is zeroed */
|
||||||
|
memset(&key, 0, sizeof(key));
|
||||||
|
|
||||||
|
key.st = st->has_shareable_shaders ? NULL : st;
|
||||||
|
|
||||||
|
if (pipe_shader == PIPE_SHADER_GEOMETRY ||
|
||||||
|
pipe_shader == PIPE_SHADER_TESS_EVAL) {
|
||||||
|
key.clamp_color = st->clamp_vert_color_in_shader &&
|
||||||
|
st->ctx->Light._ClampVertexColor &&
|
||||||
|
(stp->Base.info.outputs_written &
|
||||||
|
(VARYING_SLOT_COL0 |
|
||||||
|
VARYING_SLOT_COL1 |
|
||||||
|
VARYING_SLOT_BFC0 |
|
||||||
|
VARYING_SLOT_BFC1));
|
||||||
|
}
|
||||||
|
|
||||||
|
return st_get_basic_variant(st, pipe_shader, stp, &key)->driver_shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -238,8 +238,12 @@ st_invalidate_state(struct gl_context *ctx)
|
|||||||
st->dirty |= ST_NEW_VERTEX_ARRAYS;
|
st->dirty |= ST_NEW_VERTEX_ARRAYS;
|
||||||
|
|
||||||
/* Update the vertex shader if ctx->Light._ClampVertexColor was changed. */
|
/* Update the vertex shader if ctx->Light._ClampVertexColor was changed. */
|
||||||
if (st->clamp_vert_color_in_shader && (new_state & _NEW_LIGHT))
|
if (st->clamp_vert_color_in_shader && (new_state & _NEW_LIGHT)) {
|
||||||
st->dirty |= ST_NEW_VS_STATE;
|
st->dirty |= ST_NEW_VS_STATE;
|
||||||
|
if (st->ctx->API == API_OPENGL_COMPAT && ctx->Version >= 32) {
|
||||||
|
st->dirty |= ST_NEW_GS_STATE | ST_NEW_TES_STATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Which shaders are dirty will be determined manually. */
|
/* Which shaders are dirty will be determined manually. */
|
||||||
if (new_state & _NEW_PROGRAM) {
|
if (new_state & _NEW_PROGRAM) {
|
||||||
@@ -701,8 +705,12 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
|
|||||||
!st->force_persample_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_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_TESS_EVAL] =
|
||||||
st->shader_has_one_variant[MESA_SHADER_GEOMETRY] = st->has_shareable_shaders;
|
st->has_shareable_shaders &&
|
||||||
|
!st->clamp_vert_color_in_shader;
|
||||||
|
st->shader_has_one_variant[MESA_SHADER_GEOMETRY] =
|
||||||
|
st->has_shareable_shaders &&
|
||||||
|
!st->clamp_vert_color_in_shader;
|
||||||
st->shader_has_one_variant[MESA_SHADER_COMPUTE] = st->has_shareable_shaders;
|
st->shader_has_one_variant[MESA_SHADER_COMPUTE] = st->has_shareable_shaders;
|
||||||
|
|
||||||
st->bitmap.cache.empty = true;
|
st->bitmap.cache.empty = true;
|
||||||
|
|||||||
@@ -1632,14 +1632,12 @@ st_translate_geometry_program(struct st_context *st,
|
|||||||
struct st_basic_variant *
|
struct st_basic_variant *
|
||||||
st_get_basic_variant(struct st_context *st,
|
st_get_basic_variant(struct st_context *st,
|
||||||
unsigned pipe_shader,
|
unsigned pipe_shader,
|
||||||
struct st_common_program *prog)
|
struct st_common_program *prog,
|
||||||
|
const struct st_basic_variant_key *key)
|
||||||
{
|
{
|
||||||
struct pipe_context *pipe = st->pipe;
|
struct pipe_context *pipe = st->pipe;
|
||||||
struct st_basic_variant *v;
|
struct st_basic_variant *v;
|
||||||
struct st_basic_variant_key key;
|
|
||||||
struct pipe_shader_state tgsi = {0};
|
struct pipe_shader_state tgsi = {0};
|
||||||
memset(&key, 0, sizeof(key));
|
|
||||||
key.st = st->has_shareable_shaders ? NULL : st;
|
|
||||||
|
|
||||||
/* Search for existing variant */
|
/* Search for existing variant */
|
||||||
for (v = prog->variants; v; v = v->next) {
|
for (v = prog->variants; v; v = v->next) {
|
||||||
@@ -1656,6 +1654,10 @@ st_get_basic_variant(struct st_context *st,
|
|||||||
if (prog->tgsi.type == PIPE_SHADER_IR_NIR) {
|
if (prog->tgsi.type == PIPE_SHADER_IR_NIR) {
|
||||||
tgsi.type = PIPE_SHADER_IR_NIR;
|
tgsi.type = PIPE_SHADER_IR_NIR;
|
||||||
tgsi.ir.nir = nir_shader_clone(NULL, prog->tgsi.ir.nir);
|
tgsi.ir.nir = nir_shader_clone(NULL, prog->tgsi.ir.nir);
|
||||||
|
|
||||||
|
if (key->clamp_color)
|
||||||
|
NIR_PASS_V(tgsi.ir.nir, nir_lower_clamp_color_outputs);
|
||||||
|
|
||||||
tgsi.stream_output = prog->tgsi.stream_output;
|
tgsi.stream_output = prog->tgsi.stream_output;
|
||||||
} else
|
} else
|
||||||
tgsi = prog->tgsi;
|
tgsi = prog->tgsi;
|
||||||
@@ -1676,7 +1678,7 @@ st_get_basic_variant(struct st_context *st,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
v->key = key;
|
v->key = *key;
|
||||||
|
|
||||||
/* insert into list */
|
/* insert into list */
|
||||||
v->next = prog->variants;
|
v->next = prog->variants;
|
||||||
@@ -2058,19 +2060,34 @@ st_precompile_shader_variant(struct st_context *st,
|
|||||||
|
|
||||||
case GL_TESS_CONTROL_PROGRAM_NV: {
|
case GL_TESS_CONTROL_PROGRAM_NV: {
|
||||||
struct st_common_program *p = st_common_program(prog);
|
struct st_common_program *p = st_common_program(prog);
|
||||||
st_get_basic_variant(st, PIPE_SHADER_TESS_CTRL, p);
|
struct st_basic_variant_key key;
|
||||||
|
|
||||||
|
memset(&key, 0, sizeof(key));
|
||||||
|
|
||||||
|
key.st = st->has_shareable_shaders ? NULL : st;
|
||||||
|
st_get_basic_variant(st, PIPE_SHADER_TESS_CTRL, p, &key);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case GL_TESS_EVALUATION_PROGRAM_NV: {
|
case GL_TESS_EVALUATION_PROGRAM_NV: {
|
||||||
struct st_common_program *p = st_common_program(prog);
|
struct st_common_program *p = st_common_program(prog);
|
||||||
st_get_basic_variant(st, PIPE_SHADER_TESS_EVAL, p);
|
struct st_basic_variant_key key;
|
||||||
|
|
||||||
|
memset(&key, 0, sizeof(key));
|
||||||
|
|
||||||
|
key.st = st->has_shareable_shaders ? NULL : st;
|
||||||
|
st_get_basic_variant(st, PIPE_SHADER_TESS_EVAL, p, &key);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case GL_GEOMETRY_PROGRAM_NV: {
|
case GL_GEOMETRY_PROGRAM_NV: {
|
||||||
struct st_common_program *p = st_common_program(prog);
|
struct st_common_program *p = st_common_program(prog);
|
||||||
st_get_basic_variant(st, PIPE_SHADER_GEOMETRY, p);
|
struct st_basic_variant_key key;
|
||||||
|
|
||||||
|
memset(&key, 0, sizeof(key));
|
||||||
|
|
||||||
|
key.st = st->has_shareable_shaders ? NULL : st;
|
||||||
|
st_get_basic_variant(st, PIPE_SHADER_GEOMETRY, p, &key);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -241,6 +241,9 @@ struct st_vertex_program
|
|||||||
struct st_basic_variant_key
|
struct st_basic_variant_key
|
||||||
{
|
{
|
||||||
struct st_context *st; /**< variants are per-context */
|
struct st_context *st; /**< variants are per-context */
|
||||||
|
|
||||||
|
/** For compat profile */
|
||||||
|
bool clamp_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -401,7 +404,8 @@ st_get_cp_variant(struct st_context *st,
|
|||||||
extern struct st_basic_variant *
|
extern struct st_basic_variant *
|
||||||
st_get_basic_variant(struct st_context *st,
|
st_get_basic_variant(struct st_context *st,
|
||||||
unsigned pipe_shader,
|
unsigned pipe_shader,
|
||||||
struct st_common_program *p);
|
struct st_common_program *p,
|
||||||
|
const struct st_basic_variant_key *key);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
st_release_vp_variants( struct st_context *st,
|
st_release_vp_variants( struct st_context *st,
|
||||||
|
|||||||
Reference in New Issue
Block a user