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

Zebediah Figura (she/her) zfigura at codeweavers.com
Thu Apr 15 18:40:28 CDT 2021


On 4/14/21 7:57 AM, Henri Verbeet wrote:
> On Wed, 14 Apr 2021 at 07:03, Zebediah Figura <zfigura at codeweavers.com> 
wrote:
>> diff --git a/include/vkd3d_d3dx9shader.h b/include/vkd3d_d3dx9shader.h
>> new file mode 100644
>> index 00000000..ba69efbd
>> --- /dev/null
>> +++ b/include/vkd3d_d3dx9shader.h
> Should this be an IDL file? I'm not sure how much of d3dx9shader.h we
> intend to provide, but it does have COM interfaces like
> ID3DXConstantTable.

I guess it depends if we want ID3DXConstantTable in vkd3d, which isn't
clear to me, but either way it seems quite easy to make it an IDL.

> 
>> +static void put_string(struct bytecode_buffer *buffer, const char *str)
>> +{
>> +    unsigned int len = (strlen(str) + 1 + 3) / sizeof(DWORD);
>> +
> sizeof(*buffer->data), perhaps.
> 
>> +    if (buffer->status)
>> +        return;
>> +
>> +    if (!vkd3d_array_reserve((void **)&buffer->data, &buffer->size, buffer->count + len, sizeof(*buffer->data)))
>> +    {
>> +        buffer->status = E_OUTOFMEMORY;
>> +        return;
>> +    }
>> +
>> +    buffer->data[buffer->count + len - 1] = 0xabababab;
>> +    strcpy((char *)(buffer->data + buffer->count), str);
>> +    buffer->count += len;
>> +}
> You pretty much never want to use strcpy(). In this particular case,
> we already calculated the string length above, and could use memcpy().
> 
>> +static void write_sm1_uniforms(struct hlsl_ctx *ctx, struct bytecode_buffer *buffer,
>> +        struct hlsl_ir_function_decl *entry_func)
>> +{
>> +    unsigned int ctab_start, vars_start;
>> +    unsigned int uniform_count = 0;
>> +    struct hlsl_ir_var *var;
>> +
>> +    LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
>> +    {
>> +        if (!var->semantic && var->reg.allocated)
>> +        {
>> +            ++uniform_count;
>> +
>> +            if (var->is_param && var->is_uniform)
>> +            {
>> +                char *name;
>> +
>> +                if (!(name = vkd3d_malloc(strlen(var->name) + 2)))
>> +                {
>> +                    buffer->status = VKD3D_ERROR_OUT_OF_MEMORY;
>> +                    return;
>> +                }
>> +                name[0] = '$';
>> +                strcpy(name + 1, var->name);
>> +                vkd3d_free((char *)var->name);
>> +                var->name = name;
>> +            }
>> +        }
>> +    }
>> +
> Likewise.
> 
>> +    set_dword(buffer, ctab_start + 1, (buffer->count - ctab_start) * sizeof(DWORD));
>> +    put_string(buffer, "vkd3d HLSL shader compiler");
>> +
> I imagine we would want to include the version here, perhaps even
> simply the output of vkd3d_shader_get_version().
> 


-------------- 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/20210415/e985a5f6/attachment.sig>


More information about the wine-devel mailing list