st/mesa: handling lower flatshading for NIR drivers.
This uses the NIR pass to lower flatshading when the driver requests it. Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:

committed by
Erik Faye-Lund

parent
731260de7d
commit
cce3ad166a
@@ -96,7 +96,8 @@ st_update_rasterizer(struct st_context *st)
|
|||||||
|
|
||||||
/* _NEW_LIGHT
|
/* _NEW_LIGHT
|
||||||
*/
|
*/
|
||||||
raster->flatshade = ctx->Light.ShadeModel == GL_FLAT;
|
raster->flatshade = !st->lower_flatshade &&
|
||||||
|
ctx->Light.ShadeModel == GL_FLAT;
|
||||||
|
|
||||||
raster->flatshade_first = ctx->Light.ProvokingVertex ==
|
raster->flatshade_first = ctx->Light.ProvokingVertex ==
|
||||||
GL_FIRST_VERTEX_CONVENTION_EXT;
|
GL_FIRST_VERTEX_CONVENTION_EXT;
|
||||||
|
@@ -119,6 +119,9 @@ st_update_fp( struct st_context *st )
|
|||||||
|
|
||||||
key.st = st->has_shareable_shaders ? NULL : st;
|
key.st = st->has_shareable_shaders ? NULL : st;
|
||||||
|
|
||||||
|
key.lower_flatshade = st->lower_flatshade &&
|
||||||
|
st->ctx->Light.ShadeModel == GL_FLAT;
|
||||||
|
|
||||||
/* _NEW_FRAG_CLAMP */
|
/* _NEW_FRAG_CLAMP */
|
||||||
key.clamp_color = st->clamp_frag_color_in_shader &&
|
key.clamp_color = st->clamp_frag_color_in_shader &&
|
||||||
st->ctx->Color._ClampFragmentColor;
|
st->ctx->Color._ClampFragmentColor;
|
||||||
|
@@ -227,6 +227,10 @@ st_invalidate_state(struct gl_context *ctx)
|
|||||||
_NEW_POINT))
|
_NEW_POINT))
|
||||||
st->dirty |= ST_NEW_RASTERIZER;
|
st->dirty |= ST_NEW_RASTERIZER;
|
||||||
|
|
||||||
|
if ((new_state & _NEW_LIGHT) &&
|
||||||
|
st->lower_flatshade)
|
||||||
|
st->dirty |= ST_NEW_FS_STATE;
|
||||||
|
|
||||||
if (new_state & _NEW_PROJECTION &&
|
if (new_state & _NEW_PROJECTION &&
|
||||||
st_user_clip_planes_enabled(ctx))
|
st_user_clip_planes_enabled(ctx))
|
||||||
st->dirty |= ST_NEW_CLIP_STATE;
|
st->dirty |= ST_NEW_CLIP_STATE;
|
||||||
@@ -664,6 +668,8 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
|
|||||||
screen->get_param(screen, PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND);
|
screen->get_param(screen, PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND);
|
||||||
st->has_signed_vertex_buffer_offset =
|
st->has_signed_vertex_buffer_offset =
|
||||||
screen->get_param(screen, PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET);
|
screen->get_param(screen, PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET);
|
||||||
|
st->lower_flatshade =
|
||||||
|
!screen->get_param(screen, PIPE_CAP_FLATSHADE);
|
||||||
|
|
||||||
st->has_hw_atomics =
|
st->has_hw_atomics =
|
||||||
screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
|
screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
|
||||||
@@ -731,6 +737,7 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
|
|||||||
|
|
||||||
st->shader_has_one_variant[MESA_SHADER_FRAGMENT] =
|
st->shader_has_one_variant[MESA_SHADER_FRAGMENT] =
|
||||||
st->has_shareable_shaders &&
|
st->has_shareable_shaders &&
|
||||||
|
!st->lower_flatshade &&
|
||||||
!st->clamp_frag_color_in_shader &&
|
!st->clamp_frag_color_in_shader &&
|
||||||
!st->clamp_frag_depth_in_shader &&
|
!st->clamp_frag_depth_in_shader &&
|
||||||
!st->force_persample_in_shader;
|
!st->force_persample_in_shader;
|
||||||
|
@@ -147,6 +147,7 @@ struct st_context
|
|||||||
boolean needs_rgb_dst_alpha_override;
|
boolean needs_rgb_dst_alpha_override;
|
||||||
boolean can_bind_const_buffer_as_vertex;
|
boolean can_bind_const_buffer_as_vertex;
|
||||||
boolean has_signed_vertex_buffer_offset;
|
boolean has_signed_vertex_buffer_offset;
|
||||||
|
boolean lower_flatshade;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If a shader can be created when we get its source.
|
* If a shader can be created when we get its source.
|
||||||
|
@@ -1161,6 +1161,9 @@ st_create_fp_variant(struct st_context *st,
|
|||||||
if (key->clamp_color)
|
if (key->clamp_color)
|
||||||
NIR_PASS_V(tgsi.ir.nir, nir_lower_clamp_color_outputs);
|
NIR_PASS_V(tgsi.ir.nir, nir_lower_clamp_color_outputs);
|
||||||
|
|
||||||
|
if (key->lower_flatshade)
|
||||||
|
NIR_PASS_V(tgsi.ir.nir, nir_lower_flatshade);
|
||||||
|
|
||||||
if (key->persample_shading) {
|
if (key->persample_shading) {
|
||||||
nir_shader *shader = tgsi.ir.nir;
|
nir_shader *shader = tgsi.ir.nir;
|
||||||
nir_foreach_variable(var, &shader->inputs)
|
nir_foreach_variable(var, &shader->inputs)
|
||||||
|
@@ -130,6 +130,8 @@ struct st_fp_variant_key
|
|||||||
char texture_targets[MAX_NUM_FRAGMENT_REGISTERS_ATI];
|
char texture_targets[MAX_NUM_FRAGMENT_REGISTERS_ATI];
|
||||||
|
|
||||||
struct st_external_sampler_key external;
|
struct st_external_sampler_key external;
|
||||||
|
|
||||||
|
GLuint lower_flatshade:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user