Zebediah Figura : wined3d: Check whether a register is a UAV before recording UAV reads.
Module: wine Branch: master Commit: 854b925d31a0938622dffbcc7c3fc6a923be884e URL: https://source.winehq.org/git/wine.git/?a=commit;h=854b925d31a0938622dffbcc7... Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Wed Mar 17 16:11:20 2021 -0500 wined3d: Check whether a register is a UAV before recording UAV reads. "Discovery Tour by Assassin's Creed: Ancient Egypt" uses atomic RMW instructions with TGSM. Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/shader.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index ff44969d022..42a3c108860 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -1649,23 +1649,28 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, DWORD co || (ins.handler_idx == WINED3DSIH_LD_RAW && ins.src[1].reg.type == WINED3DSPR_UAV) || (ins.handler_idx == WINED3DSIH_LD_STRUCTURED && ins.src[2].reg.type == WINED3DSPR_UAV)) { - unsigned int reg_idx; + const struct wined3d_shader_register *reg; + if (ins.handler_idx == WINED3DSIH_LD_UAV_TYPED || ins.handler_idx == WINED3DSIH_LD_RAW) - reg_idx = ins.src[1].reg.idx[0].offset; + reg = &ins.src[1].reg; else if (ins.handler_idx == WINED3DSIH_LD_STRUCTURED) - reg_idx = ins.src[2].reg.idx[0].offset; + reg = &ins.src[2].reg; else if (WINED3DSIH_ATOMIC_AND <= ins.handler_idx && ins.handler_idx <= WINED3DSIH_ATOMIC_XOR) - reg_idx = ins.dst[0].reg.idx[0].offset; + reg = &ins.dst[0].reg; else if (ins.handler_idx == WINED3DSIH_BUFINFO) - reg_idx = ins.src[0].reg.idx[0].offset; + reg = &ins.src[0].reg; else - reg_idx = ins.dst[1].reg.idx[0].offset; - if (reg_idx >= MAX_UNORDERED_ACCESS_VIEWS) + reg = &ins.dst[1].reg; + + if (reg->type == WINED3DSPR_UAV) { - ERR("Invalid UAV index %u.\n", reg_idx); - break; + if (reg->idx[0].offset >= MAX_UNORDERED_ACCESS_VIEWS) + { + ERR("Invalid UAV index %u.\n", reg->idx[0].offset); + break; + } + reg_maps->uav_read_mask |= (1u << reg->idx[0].offset); } - reg_maps->uav_read_mask |= (1u << reg_idx); } else if (ins.handler_idx == WINED3DSIH_NRM) {
participants (1)
-
Alexandre Julliard