[PATCH 1/3] d3dx9: Do not support preshader instructions which output multiple registers.

Paul Gofman gofmanp at gmail.com
Thu Aug 31 08:08:29 CDT 2017


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
 dlls/d3dx9_36/preshader.c | 30 +++++++++++++-----------------
 1 file changed, 13 insertions(+), 17 deletions(-)

diff --git a/dlls/d3dx9_36/preshader.c b/dlls/d3dx9_36/preshader.c
index 58b8d62df6..4142c5212e 100644
--- a/dlls/d3dx9_36/preshader.c
+++ b/dlls/d3dx9_36/preshader.c
@@ -521,7 +521,13 @@ static unsigned int *parse_pres_ins(unsigned int *ptr, unsigned int count, struc
         FIXME("Relative addressing in output register not supported.\n");
         return NULL;
     }
-
+    if (get_reg_offset(ins->output.reg.table, ins->output.reg.offset
+            + (pres_op_info[ins->op].func_all_comps ? 0 : ins->component_count - 1))
+            != get_reg_offset(ins->output.reg.table, ins->output.reg.offset))
+    {
+        FIXME("Instructions outputting multiple registers are not supported.\n");
+        return NULL;
+    }
     return ptr;
 }
 
@@ -629,8 +635,7 @@ static void append_pres_const_sets_for_shader_input(struct d3dx_const_tab *const
             continue;
 
         const_set.register_index = get_reg_offset(reg->table, reg->offset);
-        const_set.register_count = max(get_reg_offset(reg->table,
-                pres_op_info[ins->op].func_all_comps ? 1 : ins->component_count), 1);
+        const_set.register_count = 1;
         const_set.table = reg->table;
         const_set.constant_class = D3DXPC_FORCE_DWORD;
         const_set.element_count = 1;
@@ -963,18 +968,10 @@ static HRESULT get_constants_desc(unsigned int *byte_code, struct d3dx_const_tab
                     && out->const_set[i].register_index + out->const_set[i].register_count
                     >= out->const_set[i + 1].register_index)
             {
-                if (out->const_set[i].register_index + out->const_set[i].register_count
-                        > out->const_set[i + 1].register_index + out->const_set[i + 1].register_count)
-                {
-                    WARN("Unexpected preshader register count %u, register index %u, "
-                            "next register count %u, register index %u, i %u.\n",
-                            out->const_set[i].register_count, out->const_set[i].register_index,
-                            out->const_set[i + 1].register_count, out->const_set[i + 1].register_index, i);
-                    hr = D3DERR_INVALIDCALL;
-                    goto cleanup;
-                }
-                out->const_set[i].register_count = out->const_set[i + 1].register_index
-                        + out->const_set[i + 1].register_count - out->const_set[i].register_index;
+                assert(out->const_set[i].register_index + out->const_set[i].register_count
+                        <= out->const_set[i + 1].register_index + 1);
+                out->const_set[i].register_count = out->const_set[i + 1].register_index + 1
+                        - out->const_set[i].register_index;
                 memmove(&out->const_set[i + 1], &out->const_set[i + 2], sizeof(out->const_set[i])
                         * (out->const_set_count - i - 2));
                 --out->const_set_count;
@@ -1216,8 +1213,7 @@ static HRESULT parse_preshader(struct d3dx_preshader *pres, unsigned int *ptr, u
             }
         }
         update_table_size(pres->regs.table_sizes, pres->ins[i].output.reg.table,
-                get_reg_offset(pres->ins[i].output.reg.table,
-                pres->ins[i].output.reg.offset + pres->ins[i].component_count - 1));
+                get_reg_offset(pres->ins[i].output.reg.table, pres->ins[i].output.reg.offset));
     }
     if (FAILED(regstore_alloc_table(&pres->regs, PRES_REGTAB_IMMED)))
         return E_OUTOFMEMORY;
-- 
2.13.5




More information about the wine-patches mailing list