2016-03-17 12:59 GMT+01:00 Paul Gofman gofmanp@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).
On 03/19/2016 12:55 AM, Matteo Bruni wrote:
2016-03-17 12:59 GMT+01:00 Paul Gofman gofmanp@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.
These constants currently match values in preshader bytecode. PRES_REGTAB_NONE is used as a placeholder for value 0. I can remove it, but then have PRES_REGTAB_IMMED = 1 explicitly, or introduce a separate mapping table between original constants and these enum.
+#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.
VS means "value set" :) Yes, I realize WORD is confusing (what MS calls DWORD is actually a halfword nowadays). I suggest to change unsigned int to uintptr_t (which is functionally more appropriate), and call it PRES_BITMASK_BLOCK_SIZE.
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).
It actually used to dump the whole binary blob, which can contains shader also (or just shader sometimes). I suggest I better use just dump_bytecode then.
2016-03-18 23:54 GMT+01:00 Paul Gofman gofmanp@gmail.com:
On 03/19/2016 12:55 AM, Matteo Bruni wrote:
2016-03-17 12:59 GMT+01:00 Paul Gofman gofmanp@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.
These constants currently match values in preshader bytecode. PRES_REGTAB_NONE is used as a placeholder for value 0. I can remove it, but then have PRES_REGTAB_IMMED = 1 explicitly, or introduce a separate mapping table between original constants and these enum.
I'm late on this one... Both options are fine with me, with a slight preference for the latter since that avoids allocating space for the unused tables in a number of places. Ah, I just noticed a couple more bits here. The enum name should be lowercase and I'd rename PRES_REGTAB_MAX to PRES_REGTAB_COUNT.