diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c index 7f0a18ab53d..4e7bbb7aa21 100644 --- a/src/mesa/state_tracker/st_atom_shader.c +++ b/src/mesa/state_tracker/st_atom_shader.c @@ -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; diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index a035d792ce0..e5ca9de1288 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -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] = diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index b8246ddb5dc..f7b5ef61d02 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -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 diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 3712f70ab5b..68f36facc7a 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -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; } diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index c8c812a6fe9..e1783e47b5e 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -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 */ diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index 157339e34a3..f87339a5472 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -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 */