Paul Gofman : d3dx9: Get rid of table lookup for converting between register indexes and offsets.

Alexandre Julliard julliard at winehq.org
Tue May 30 16:05:13 CDT 2017


Module: wine
Branch: master
Commit: 2f72e9669f6b429528620b1c6659300501ca5e21
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2f72e9669f6b429528620b1c6659300501ca5e21

Author: Paul Gofman <gofmanp at gmail.com>
Date:   Wed May 24 12:46:51 2017 +0300

d3dx9: Get rid of table lookup for converting between register indexes and offsets.

Signed-off-by: Paul Gofman <gofmanp at gmail.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3dx9_36/preshader.c | 58 +++++++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 29 deletions(-)

diff --git a/dlls/d3dx9_36/preshader.c b/dlls/d3dx9_36/preshader.c
index 40a86fa..29a2346 100644
--- a/dlls/d3dx9_36/preshader.c
+++ b/dlls/d3dx9_36/preshader.c
@@ -199,18 +199,17 @@ enum pres_value_type
 static const struct
 {
     unsigned int component_size;
-    unsigned int reg_component_count;
     enum pres_value_type type;
 }
 table_info[] =
 {
-    {sizeof(double), 4, PRES_VT_DOUBLE}, /* PRES_REGTAB_IMMED */
-    {sizeof(float),  4, PRES_VT_FLOAT }, /* PRES_REGTAB_CONST */
-    {sizeof(float),  4, PRES_VT_FLOAT }, /* PRES_REGTAB_OCONST */
-    {sizeof(BOOL),   1, PRES_VT_BOOL  }, /* PRES_REGTAB_OBCONST */
-    {sizeof(int),    4, PRES_VT_INT,  }, /* PRES_REGTAB_OICONST */
+    {sizeof(double), PRES_VT_DOUBLE}, /* PRES_REGTAB_IMMED */
+    {sizeof(float),  PRES_VT_FLOAT }, /* PRES_REGTAB_CONST */
+    {sizeof(float),  PRES_VT_FLOAT }, /* PRES_REGTAB_OCONST */
+    {sizeof(BOOL),   PRES_VT_BOOL  }, /* PRES_REGTAB_OBCONST */
+    {sizeof(int),    PRES_VT_INT,  }, /* PRES_REGTAB_OICONST */
     /* TODO: use double precision for 64 bit */
-    {sizeof(float),  4, PRES_VT_FLOAT }  /* PRES_REGTAB_TEMP */
+    {sizeof(float),  PRES_VT_FLOAT }  /* PRES_REGTAB_TEMP */
 };
 
 static const char *table_symbol[] =
@@ -263,7 +262,12 @@ struct d3dx_pres_ins
 
 static unsigned int get_reg_offset(unsigned int table, unsigned int offset)
 {
-    return offset / table_info[table].reg_component_count;
+    return table == PRES_REGTAB_OBCONST ? offset : offset >> 2;
+}
+
+static unsigned int get_offset_reg(unsigned int table, unsigned int reg_idx)
+{
+    return table == PRES_REGTAB_OBCONST ? reg_idx : reg_idx << 2;
 }
 
 #define PRES_BITMASK_BLOCK_SIZE (sizeof(unsigned int) * 8)
@@ -274,7 +278,7 @@ static HRESULT regstore_alloc_table(struct d3dx_regstore *rs, unsigned int table
 {
     unsigned int size;
 
-    size = rs->table_sizes[table] * table_info[table].reg_component_count * table_info[table].component_size;
+    size = get_offset_reg(table, rs->table_sizes[table]) * table_info[table].component_size;
     if (size)
     {
         rs->tables[table] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
@@ -674,8 +678,7 @@ static void dump_arg(struct d3dx_regstore *rs, const struct d3dx_pres_operand *a
             index_reg = get_reg_offset(arg->index_reg.table, arg->index_reg.offset);
             TRACE("%s[%u + %s%u.%c].", table_symbol[table], get_reg_offset(table, arg->reg.offset),
                     table_symbol[arg->index_reg.table], index_reg,
-                    xyzw_str[arg->index_reg.offset
-                    - index_reg * table_info[arg->index_reg.table].reg_component_count]);
+                    xyzw_str[arg->index_reg.offset - get_offset_reg(arg->index_reg.table, index_reg)]);
         }
         for (i = 0; i < component_count; ++i)
             TRACE("%c", xyzw_str[(arg->reg.offset + i) % 4]);
@@ -804,14 +807,13 @@ static HRESULT parse_preshader(struct d3dx_preshader *pres, unsigned int *ptr, u
     if (FAILED(hr))
         return hr;
 
-    if (const_count % table_info[PRES_REGTAB_IMMED].reg_component_count)
+    if (const_count % get_offset_reg(PRES_REGTAB_IMMED, 1))
     {
         FIXME("const_count %u is not a multiple of %u.\n", const_count,
-                table_info[PRES_REGTAB_IMMED].reg_component_count);
+                get_offset_reg(PRES_REGTAB_IMMED, 1));
         return D3DXERR_INVALIDDATA;
     }
-    pres->regs.table_sizes[PRES_REGTAB_IMMED] = const_count
-            / table_info[PRES_REGTAB_IMMED].reg_component_count;
+    pres->regs.table_sizes[PRES_REGTAB_IMMED] = get_reg_offset(PRES_REGTAB_IMMED, const_count);
 
     update_table_sizes_consts(pres->regs.table_sizes, &pres->inputs);
     for (i = 0; i < pres->ins_count; ++i)
@@ -1008,16 +1010,16 @@ static void set_constants(struct d3dx_regstore *rs, struct d3dx_const_tab *const
             major = param->rows;
             minor = param->columns;
         }
-        start_offset = const_set->register_index * table_info[table].reg_component_count;
-        major_stride = max(minor, table_info[table].reg_component_count);
+        start_offset = get_offset_reg(table, const_set->register_index);
+        major_stride = max(minor, get_offset_reg(table, 1));
         n = min(major * major_stride,
-                const_set->register_count * table_info[table].reg_component_count + major_stride - 1) / major_stride;
+                get_offset_reg(table, const_set->register_count) + major_stride - 1) / major_stride;
         count = n * minor;
         if (((param->type == D3DXPT_FLOAT && table_type == PRES_VT_FLOAT)
                 || (param->type == D3DXPT_INT && table_type == PRES_VT_INT)
                 || (param->type == D3DXPT_BOOL && table_type == PRES_VT_BOOL))
                 && !transpose && minor == major_stride
-                && count == table_info[table].reg_component_count * const_set->register_count
+                && count == get_offset_reg(table, const_set->register_count)
                 && count * sizeof(unsigned int) <= param->bytes)
         {
             regstore_set_values(rs, table, param->data, start_offset, count);
@@ -1033,9 +1035,9 @@ static void set_constants(struct d3dx_regstore *rs, struct d3dx_const_tab *const
                 unsigned int offset;
 
                 offset = start_offset + i * major_stride + j;
-                if (offset / table_info[table].reg_component_count >= rs->table_sizes[table])
+                if (get_reg_offset(table, offset) >= rs->table_sizes[table])
                 {
-                    if (table_info[table].reg_component_count != 1)
+                    if (table != PRES_REGTAB_OBCONST)
                         FIXME("Output offset exceeds table size, name %s, component %u.\n",
                                 debugstr_a(param->name), i);
                     break;
@@ -1234,7 +1236,7 @@ static HRESULT init_set_constants(struct d3dx_const_tab *const_tab, ID3DXConstan
 
 static double exec_get_reg_value(struct d3dx_regstore *rs, enum pres_reg_tables table, unsigned int offset)
 {
-    if (!regstore_is_val_set_reg(rs, table, offset / table_info[table].reg_component_count))
+    if (!regstore_is_val_set_reg(rs, table, get_reg_offset(table, offset)))
         WARN("Using uninitialized input, table %u, offset %u.\n", table, offset);
 
     return regstore_get_double(rs, table, offset);
@@ -1251,8 +1253,8 @@ static double exec_get_arg(struct d3dx_regstore *rs, const struct d3dx_pres_oper
     else
         base_index = lrint(exec_get_reg_value(rs, opr->index_reg.table, opr->index_reg.offset));
 
-    offset = base_index * table_info[table].reg_component_count + opr->reg.offset + comp;
-    reg_index = offset / table_info[table].reg_component_count;
+    offset = get_offset_reg(table, base_index) + opr->reg.offset + comp;
+    reg_index = get_reg_offset(table, offset);
 
     if (reg_index >= rs->table_sizes[table])
     {
@@ -1276,8 +1278,7 @@ static double exec_get_arg(struct d3dx_regstore *rs, const struct d3dx_pres_oper
         if (reg_index >= rs->table_sizes[table])
             return 0.0;
 
-        offset = reg_index * table_info[table].reg_component_count
-                + offset % table_info[table].reg_component_count;
+        offset = get_offset_reg(table, reg_index) + offset % get_offset_reg(table, 1);
     }
 
     return exec_get_reg_value(rs, table, offset);
@@ -1390,8 +1391,7 @@ HRESULT d3dx_evaluate_parameter(struct d3dx_param_eval *peval, const struct d3dx
             return hr;
     }
 
-    elements_table = table_info[PRES_REGTAB_OCONST].reg_component_count
-            * peval->pres.regs.table_sizes[PRES_REGTAB_OCONST];
+    elements_table = get_offset_reg(PRES_REGTAB_OCONST, peval->pres.regs.table_sizes[PRES_REGTAB_OCONST]);
     elements_param = param->bytes / sizeof(unsigned int);
     elements = min(elements_table, elements_param);
     oc = (float *)peval->pres.regs.tables[PRES_REGTAB_OCONST];
@@ -1419,7 +1419,7 @@ static HRESULT set_shader_constants_device(ID3DXEffectStateManager *manager, str
         if (!count)
             break;
         TRACE("Setting %u constants at %u.\n", count, start);
-        ptr = (BYTE *)rs->tables[table] + start * table_info[table].reg_component_count
+        ptr = (BYTE *)rs->tables[table] + get_offset_reg(table, start)
                 * table_info[table].component_size;
         if (type == D3DXPT_VERTEXSHADER)
         {




More information about the wine-cvs mailing list