frontend/nine: Fix shader multi-use crash

Due to the driver live shader cache, it's possible
two different d3d9 shaders get the same cso.

As it's disallowed to destroy a shader cso being
bound, nine checks for this scenario. However it
was not taking into account the cso might be from
a different shader.

cc: mesa-stable

Signed-off-by: Axel Davy <davyaxel0@gmail.com>
Acked-by: David Heidelberg <david.heidelberg@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18021>
This commit is contained in:
Axel Davy 2022-07-30 10:09:05 +02:00
parent 4c65ccab6d
commit 93da6e9f34
2 changed files with 18 additions and 4 deletions

View file

@ -117,8 +117,13 @@ NinePixelShader9_dtor( struct NinePixelShader9 *This )
do {
if (var->cso) {
if (This->base.device->context.cso_shader.ps == var->cso)
if (This->base.device->context.cso_shader.ps == var->cso) {
/* unbind because it is illegal to delete something bound */
pipe->bind_fs_state(pipe, NULL);
/* This will rebind cso_shader.ps in case somehow actually
* an identical shader with same cso is bound */
This->base.device->context.commit |= NINE_STATE_COMMIT_PS;
}
pipe->delete_fs_state(pipe, var->cso);
FREE(var->const_ranges);
}
@ -126,8 +131,10 @@ NinePixelShader9_dtor( struct NinePixelShader9 *This )
} while (var);
if (This->ff_cso) {
if (This->ff_cso == This->base.device->context.cso_shader.ps)
if (This->ff_cso == This->base.device->context.cso_shader.ps) {
pipe->bind_fs_state(pipe, NULL);
This->base.device->context.commit |= NINE_STATE_COMMIT_PS;
}
pipe->delete_fs_state(pipe, This->ff_cso);
}
}

View file

@ -134,8 +134,13 @@ NineVertexShader9_dtor( struct NineVertexShader9 *This )
do {
if (var->cso) {
if (This->base.device->context.cso_shader.vs == var->cso)
if (This->base.device->context.cso_shader.vs == var->cso) {
/* unbind because it is illegal to delete something bound */
pipe->bind_vs_state(pipe, NULL);
/* This will rebind cso_shader.vs in case somehow actually
* an identical shader with same cso is bound */
This->base.device->context.commit |= NINE_STATE_COMMIT_VS;
}
pipe->delete_vs_state(pipe, var->cso);
FREE(var->const_ranges);
}
@ -150,8 +155,10 @@ NineVertexShader9_dtor( struct NineVertexShader9 *This )
}
if (This->ff_cso) {
if (This->ff_cso == This->base.device->context.cso_shader.vs)
if (This->ff_cso == This->base.device->context.cso_shader.vs) {
pipe->bind_vs_state(pipe, NULL);
This->base.device->context.commit |= NINE_STATE_COMMIT_VS;
}
pipe->delete_vs_state(pipe, This->ff_cso);
}
}