gallium/st: lower point-sprites if not supported

Not all drivers supports the texcoord replacement needed for
point-sprites, but all drivers support gl_PointCoord. So let's lower
this so we can support point-sprites for all drivers.

Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6473>
This commit is contained in:
Erik Faye-Lund 2020-08-26 18:48:52 +02:00 committed by Marge Bot
parent bc0222d471
commit 3b705ea511
6 changed files with 24 additions and 1 deletions

View file

@ -115,6 +115,11 @@ st_update_fp( struct st_context *st )
key.lower_two_sided_color = st->lower_two_sided_color &&
_mesa_vertex_program_two_side_enabled(st->ctx);
/* _NEW_POINT | _NEW_PROGRAM */
if (st->lower_texcoord_replace && st->ctx->Point.PointSprite &&
st->ctx->Point.CoordReplace)
key.lower_texcoord_replace = st->ctx->Point.CoordReplace;
/* gl_driver_flags::NewFragClamp */
key.clamp_color = st->clamp_frag_color_in_shader &&
st->ctx->Color._ClampFragmentColor;

View file

@ -234,6 +234,9 @@ st_invalidate_state(struct gl_context *ctx)
st_user_clip_planes_enabled(ctx))
st->dirty |= ST_NEW_CLIP_STATE;
if (new_state & _NEW_POINT && st->lower_texcoord_replace)
st->dirty |= ST_NEW_FS_STATE;
if (new_state & _NEW_PIXEL)
st->dirty |= ST_NEW_PIXEL_TRANSFER;
@ -713,6 +716,8 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
screen->get_param(screen, PIPE_CAP_PREFER_REAL_BUFFER_IN_CONSTBUF0);
st->has_conditional_render =
screen->get_param(screen, PIPE_CAP_CONDITIONAL_RENDER);
st->lower_texcoord_replace =
!screen->get_param(screen, PIPE_CAP_POINT_SPRITE);
st->allow_st_finalize_nir_twice = screen->finalize_nir != NULL;
st->has_hw_atomics =
@ -803,7 +808,8 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
!st->clamp_frag_color_in_shader &&
!st->clamp_frag_depth_in_shader &&
!st->force_persample_in_shader &&
!st->lower_two_sided_color;
!st->lower_two_sided_color &&
!st->lower_texcoord_replace;
st->shader_has_one_variant[MESA_SHADER_TESS_CTRL] = st->has_shareable_shaders;
st->shader_has_one_variant[MESA_SHADER_TESS_EVAL] =

View file

@ -160,6 +160,7 @@ struct st_context
boolean lower_ucp;
boolean prefer_real_buffer_in_constbuf0;
boolean has_conditional_render;
boolean lower_texcoord_replace;
/* There are consequences for drivers wanting to call st_finalize_nir
* twice, once before shader caching and once after lowering for shader

View file

@ -1781,4 +1781,7 @@ void st_init_extensions(struct pipe_screen *screen,
extensions->ARB_stencil_texturing &&
!(nir_options->lower_doubles_options & nir_lower_fp64_full_software))
extensions->NV_copy_depth_to_color = TRUE;
if (prefer_nir)
extensions->ARB_point_sprite = GL_TRUE;
}

View file

@ -1290,6 +1290,13 @@ st_create_fp_variant(struct st_context *st,
finalize = true;
}
if (key->lower_texcoord_replace) {
bool point_coord_is_sysval = st->ctx->Const.GLSLPointCoordIsSysVal;
NIR_PASS_V(state.ir.nir, nir_lower_texcoord_replace,
key->lower_texcoord_replace, point_coord_is_sysval);
finalize = true;
}
assert(!(key->bitmap && key->drawpixels));
/* glBitmap */

View file

@ -144,6 +144,7 @@ struct st_fp_variant_key
GLuint lower_two_sided_color:1;
GLuint lower_flatshade:1;
GLuint lower_texcoord_replace:MAX_TEXTURE_COORD_UNITS;
unsigned lower_alpha_func:3;
/** needed for ATI_fragment_shader */