[PATCH vkd3d v2 5/6] vkd3d-shader: Write the SM1 constant table.

Zebediah Figura (she/her) zfigura at codeweavers.com
Tue Apr 20 15:15:38 CDT 2021


On 4/20/21 3:16 AM, Matteo Bruni wrote:
> On Fri, Apr 16, 2021 at 2:04 AM Zebediah Figura <zfigura at codeweavers.com> wrote:
>>
>> Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
>> ---
>>  Makefile.am                      |   2 +
>>  include/.gitignore               |   1 +
>>  include/vkd3d_d3d9types.h        |   6 +
>>  include/vkd3d_d3dx9shader.idl    |  76 +++++++++
>>  libs/vkd3d-shader/hlsl.h         |   7 +-
>>  libs/vkd3d-shader/hlsl.y         |   1 +
>>  libs/vkd3d-shader/hlsl_codegen.c | 254 ++++++++++++++++++++++++++++++-
>>  7 files changed, 344 insertions(+), 3 deletions(-)
>>  create mode 100644 include/vkd3d_d3dx9shader.idl
>>
>> diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
>> index 3a0bf38d..3dc7a26b 100644
>> --- a/libs/vkd3d-shader/hlsl.h
>> +++ b/libs/vkd3d-shader/hlsl.h
>> @@ -115,7 +115,6 @@ struct hlsl_type
>>      unsigned int modifiers;
>>      unsigned int dimx;
>>      unsigned int dimy;
>> -    unsigned int reg_size;
>>      union
>>      {
>>          struct list *elements;
>> @@ -125,6 +124,9 @@ struct hlsl_type
>>              unsigned int elements_count;
>>          } array;
>>      } e;
>> +
>> +    unsigned int reg_size;
>> +    unsigned int bytecode_offset;
>>  };
>>
>>  struct hlsl_struct_field
>> @@ -134,7 +136,9 @@ struct hlsl_struct_field
>>      struct hlsl_type *type;
>>      const char *name;
>>      const char *semantic;
>> +
>>      unsigned int reg_offset;
>> +    unsigned int name_offset;
> 
> Although these are indeed two offsets, they offset into very different
> things. I don't know that I have any good suggestions
> (name_bc_offset?) and I guess I'm not too disturbed by the current
> naming anyway, but I feel there is room for improvement.

Yes, you're right; honestly the mistake here is grouping them together
via whitespace I think, but of course the naming is what led me to do
that. "name_bytecode_offset" strikes me as at least a better name than
"name_offset".

I've vacillated for a while, also; it may make more sense not to store
reg_offset + reg_size but instead to calculate them as needed. But I've
tried that approach a couple times and the code doesn't look prettier :-(

> 
>> diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
>> index 25227057..73f8bdb0 100644
>> --- a/libs/vkd3d-shader/hlsl_codegen.c
>> +++ b/libs/vkd3d-shader/hlsl_codegen.c
> 
>> +    LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
>> +    {
>> +        if (!var->semantic && var->reg.allocated)
>> +        {
>> +            put_dword(buffer, 0); /* name */
>> +            put_dword(buffer, D3DXRS_FLOAT4 | (var->reg.id << 16));
> 
> This is fine for now, but maybe a comment mentioning that we might not
> always want the float register set here would be useful.
> Relatedly, we might have the same variable allocated to multiple
> register sets (e.g. if it's used in a MOV and in a FOR) so in theory
> there needs to be a loop (and we need to support multiple register
> allocations per var, or something to the same effect). Again, no need
> to change the code right away, just something that might be worth a
> comment.
> 

Fair enough. Actually I'd be inclined to handle this by creating
multiple hlsl_ir_var objects.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20210420/86d0cf3f/attachment.sig>


More information about the wine-devel mailing list