mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 02:10:11 +01:00
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:
parent
bc0222d471
commit
3b705ea511
6 changed files with 24 additions and 1 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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] =
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue