[v4 2/6] d3dx9: add preshaders to effect.
Matteo Bruni
matteo.mystral at gmail.com
Fri Mar 18 16:55:36 CDT 2016
2016-03-17 12:59 GMT+01:00 Paul Gofman <gofmanp at gmail.com>:
> +enum PRES_REG_TABLES
> +{
> + PRES_REGTAB_NONE,
> + PRES_REGTAB_IMMED, /* immediate double constants from CLIT */
> + PRES_REGTAB_CONST,
> + PRES_REGTAB_VERTEX, /* not used */
> + PRES_REGTAB_OCONST,
> + PRES_REGTAB_OBCONST,
> + PRES_REGTAB_OICONST,
> + PRES_REGTAB_REG,
> + PRES_REGTAB_MAX,
> + PRES_REGTAB_FIRST = PRES_REGTAB_IMMED,
> + PRES_REGTAB_LAST = PRES_REGTAB_REG,
> +};
You can drop PRES_REGTAB_NONE unless it's going to be used.
> +++ b/dlls/d3dx9_36/preshader.c
> @@ -0,0 +1,627 @@
> +/*
> + * FX preshader parsing & execution, setting shader constants
> + * from effect parameters.
> + *
It looks like that kind of general file description is omitted in
newer source files. Maybe drop it? I don't particularly care though.
> + /* TODO: use double precision for x64 arch */
> + {sizeof(float), 4, PRES_VT_FLOAT } /* PRES_REGTAB_REG */
Nitpick, just mention "64 bit" or something, we don't want to make all
the non-Intel archs angry ;)
> +#define PRES_VS_BITS_PER_WORD (sizeof(unsigned int) * 8)
What does the _VS_ part of the name mean?
I'm also a bit thrown off by the _WORD part, mostly because in Win32
WORD is a 16 bit while DWORD is 32 bit and unsigned int is also 32
bit. Maybe it's just me, I don't know.
> +static void dump_shader_bytecode(void *data, unsigned int size)
> +{
> + unsigned int *words = (unsigned int *)data;
Same here. I guess you could call it "bytecode" or such.
> +static unsigned int *find_bytecode_comment(unsigned int *ptr, unsigned int fourcc)
> +{
> + while ((*ptr & 0xFFFF) == 0xFFFE)
A couple leftover uppercase hexadecimal constants.
> + hr = D3DXGetShaderConstantTable(byte_code, &ctab);
> + if (FAILED(hr) || !ctab)
> + {
> + TRACE("Could not get CTAB data, hr %#x.\n", hr);
> + /* returning OK is not a typo */
> + return D3D_OK;
> + }
Sorry, back to that comment again. I guess it would be better to spell
out why that's the intended return value instead (e.g. "Not returning
an error, shaders without a CTAB are valid.").
> +static void dump_arg(struct d3dx_regstore *rs, struct d3dx_pres_operand *arg, int component_count)
> +{
> + static const char *xyzw_str = "xyzw";
> + unsigned int i, table;
> +
> + table = arg->table;
> + if (table == PRES_REGTAB_IMMED)
> + {
> + TRACE("(");
> + for (i = 0; i < component_count; ++i)
> + TRACE(i < component_count - 1 ? "%lf, " : "%lf",
> + ((double *)rs->tables[PRES_REGTAB_IMMED])[arg->offset + i]);
%lf is not right, %f already expects a double. I'd just use %.16e
(which has the added benefit of showing something different from 0 in
the "precision" test from the previous patch). Another option would be
to use the same format used by MS when disassembling shaders, although
this seems to be a case where it's worth diverging.
> +static void dump_ins(struct d3dx_regstore *rs, struct d3dx_pres_ins *ins)
> +{
> + unsigned int i;
> +
> + TRACE(" %s ", pres_op_info[ins->op].mnem);
> + dump_arg(rs, &ins->output, pres_op_info[ins->op].func_all_comps ? 1 : ins->component_count);
> + for (i = 0; i < pres_op_info[ins->op].input_count; ++i)
> + {
> + TRACE(",");
With a blank after the comma it would be prettier.
There is still some inconsistent formatting (e.g. "== NULL" vs "!",
uppercase hexadecimals, cnt vs count).
A possible idea to split this patch further: what if you move the
addition of (most of) the contents of the various functions in
preshader.c to a separate patch? That is, make a patch which adds the
various calls to d3dx_create_param_eval(), d3dx_free_param_eval() and
similar (i.e. most if not all the changes to effect.c) but only
introduces a skeleton implementation of those functions in
preshader.c. Those are actually fleshed out only in the next patch.
Many of the new preshader-related definitions can probably also go
into the second patch.
The traces of the disassembled preshader can also potentially go to a
separate patch (leaving only dump_shader_bytecode() in the initial
implementation - btw, I think it should be called
dump_preshader_bytecode() given the renaming of the other stuff).
More information about the wine-devel
mailing list