While some support for invariant shader attribute exisits in tgsi, it was never fully implemented. This patch adds a virgl cap for this feature in advance of the tgsi invariant implementation to insure backward compatibility. Current virglrenderer tgsi deserialization will error if invariant apprears in tgsi text stream.
Signed-off-by: Joe M. Kniss <d...@google.com> --- src/gallium/drivers/virgl/virgl_hw.h | 1 + src/gallium/drivers/virgl/virgl_tgsi.c | 5 +++++ src/gallium/drivers/virgl/virgl_winsys.h | 1 + 3 files changed, 7 insertions(+) diff --git a/src/gallium/drivers/virgl/virgl_hw.h b/src/gallium/drivers/virgl/virgl_hw.h index 93849c03dd..aaa4704b2a 100644 --- a/src/gallium/drivers/virgl/virgl_hw.h +++ b/src/gallium/drivers/virgl/virgl_hw.h @@ -286,6 +286,7 @@ struct virgl_caps_v2 { int32_t max_texture_gather_offset; uint32_t texture_buffer_offset_alignment; uint32_t uniform_buffer_offset_alignment; + uint32_t tgsi_invariant; }; union virgl_caps { diff --git a/src/gallium/drivers/virgl/virgl_tgsi.c b/src/gallium/drivers/virgl/virgl_tgsi.c index ff5abf6ddb..b0f9a73850 100644 --- a/src/gallium/drivers/virgl/virgl_tgsi.c +++ b/src/gallium/drivers/virgl/virgl_tgsi.c @@ -31,12 +31,14 @@ struct virgl_transform_context { struct tgsi_transform_context base; bool cull_enabled; + bool invariant_enabled; }; static void virgl_tgsi_transform_declaration(struct tgsi_transform_context *ctx, struct tgsi_full_declaration *decl) { + struct virgl_transform_context *vtctx = (struct virgl_transform_context *)ctx; switch (decl->Declaration.File) { case TGSI_FILE_CONSTANT: if (decl->Declaration.Dimension) { @@ -47,6 +49,8 @@ virgl_tgsi_transform_declaration(struct tgsi_transform_context *ctx, default: break; } + if (!vtctx->invariant_enabled) + decl->Declaration.Invariant = 0; ctx->emit_declaration(ctx, decl); } @@ -104,6 +108,7 @@ struct tgsi_token *virgl_tgsi_transform(struct virgl_context *vctx, const struct transform.base.transform_property = virgl_tgsi_transform_property; transform.base.transform_instruction = virgl_tgsi_transform_instruction; transform.cull_enabled = vscreen->caps.caps.v1.bset.has_cull; + transform.invariant_enabled = vscreen->caps.caps.v2.tgsi_invariant; tgsi_transform_shader(tokens_in, new_tokens, newLen, &transform.base); return new_tokens; diff --git a/src/gallium/drivers/virgl/virgl_winsys.h b/src/gallium/drivers/virgl/virgl_winsys.h index 99e98ad9c9..6ca2641e7a 100644 --- a/src/gallium/drivers/virgl/virgl_winsys.h +++ b/src/gallium/drivers/virgl/virgl_winsys.h @@ -134,5 +134,6 @@ static inline void virgl_ws_fill_new_caps_defaults(struct virgl_drm_caps *caps) caps->caps.v2.max_texture_gather_offset = 7; caps->caps.v2.texture_buffer_offset_alignment = 32; caps->caps.v2.uniform_buffer_offset_alignment = 256; + caps->caps.v2.tgsi_invariant = 0; } #endif -- 2.17.0.484.g0c8726318c-goog _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev