diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 599a0183c47..cc19656b48f 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -469,6 +469,12 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z nir = nir_shader_clone(NULL, zs->nir); NIR_PASS_V(nir, lower_dual_blend); } + if (zink_fs_key(key)->coord_replace_bits) { + if (nir == zs->nir) + nir = nir_shader_clone(NULL, zs->nir); + NIR_PASS_V(nir, nir_lower_texcoord_replace, zink_fs_key(key)->coord_replace_bits, + false, zink_fs_key(key)->coord_replace_yinvert); + } } struct spirv_shader *spirv = nir_to_spirv(nir, streamout, shader_slot_map, shader_slots_reserved); assert(spirv); diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index 76e3d18898e..cd742eca3b0 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -664,6 +664,11 @@ zink_draw_vbo(struct pipe_context *pctx, if (drawid_broken != ctx->drawid_broken) ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_VERTEX); ctx->gfx_pipeline_state.vertices_per_patch = dinfo->vertices_per_patch; + if (ctx->rast_state->base.point_quad_rasterization && + ctx->gfx_prim_mode != dinfo->mode) { + if (ctx->gfx_prim_mode == PIPE_PRIM_POINTS || dinfo->mode == PIPE_PRIM_POINTS) + ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_FRAGMENT); + } ctx->gfx_prim_mode = dinfo->mode; struct zink_gfx_program *gfx_program = get_gfx_program(ctx); if (!gfx_program) diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 31d522dbf70..0e863842b1d 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -246,6 +246,11 @@ shader_key_fs_gen(struct zink_context *ctx, struct zink_shader *zs, fs_key->force_dual_color_blend = screen->driconf.dual_color_blend_by_location && ctx->gfx_pipeline_state.blend_state->dual_src_blend && ctx->gfx_pipeline_state.blend_state->attachments[1].blendEnable; + if (((shaders[PIPE_SHADER_GEOMETRY] && shaders[PIPE_SHADER_GEOMETRY]->nir->info.gs.output_primitive == GL_POINTS) || + ctx->gfx_prim_mode == PIPE_PRIM_POINTS) && ctx->rast_state->base.point_quad_rasterization && ctx->rast_state->base.sprite_coord_enable) { + fs_key->coord_replace_bits = ctx->rast_state->base.sprite_coord_enable; + fs_key->coord_replace_yinvert = !!ctx->rast_state->base.sprite_coord_mode; + } } static void diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 1433f90af1f..0710550bf8b 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -264,6 +264,9 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TEXTURE_MULTISAMPLE: return 1; + case PIPE_CAP_POINT_SPRITE: + return 1; + case PIPE_CAP_SAMPLE_SHADING: return screen->info.feats.features.sampleRateShading; diff --git a/src/gallium/drivers/zink/zink_shader_keys.h b/src/gallium/drivers/zink/zink_shader_keys.h index a9e396704e8..395f18e31b7 100644 --- a/src/gallium/drivers/zink/zink_shader_keys.h +++ b/src/gallium/drivers/zink/zink_shader_keys.h @@ -35,6 +35,8 @@ struct zink_vs_key { struct zink_fs_key { unsigned shader_id; + uint8_t coord_replace_bits; + bool coord_replace_yinvert; //bool flat_shade; bool samples; bool force_dual_color_blend; diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index 3e19114d0e9..a93c822f269 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -468,6 +468,7 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso) { struct zink_context *ctx = zink_context(pctx); bool clip_halfz = ctx->rast_state ? ctx->rast_state->base.clip_halfz : false; + bool point_quad_rasterization = ctx->rast_state ? ctx->rast_state->base.point_quad_rasterization : false; ctx->rast_state = cso; if (ctx->rast_state) { @@ -483,6 +484,8 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso) ctx->line_width = ctx->rast_state->line_width; ctx->gfx_pipeline_state.dirty = true; } + if (ctx->rast_state->base.point_quad_rasterization != point_quad_rasterization) + ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_FRAGMENT); } }