<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">2013/5/3 Matteo Bruni <span dir="ltr"><<a href="mailto:matteo.mystral@gmail.com" target="_blank">matteo.mystral@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
2013/5/2 Christian Costa <<a href="mailto:titan.costa@gmail.com">titan.costa@gmail.com</a>>:<br>
<div class="im">><br>
> ---<br>
>  dlls/d3dcompiler_43/compiler.c            |  101 +++++++++++++++++++++++------<br>
>  dlls/d3dcompiler_43/d3dcompiler_private.h |    1<br>
>  2 files changed, 81 insertions(+), 21 deletions(-)<br>
><br>
> diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c<br>
> index 4942985..a6a9867 100644<br>
> --- a/dlls/d3dcompiler_43/compiler.c<br>
> +++ b/dlls/d3dcompiler_43/compiler.c<br>
> @@ -490,6 +490,66 @@ HRESULT WINAPI D3DAssemble(const void *data, SIZE_T datasize, const char *filena<br>
>      return hr;<br>
>  }<br>
><br>
> +struct {<br>
<br>
</div>Please make it static const.<br>
<div><div class="h5"><br>
> +    const char *name;<br>
> +    enum shader_type type;<br>
> +    DWORD sm_major;<br>
> +    DWORD sm_minor;<br>
> +    DWORD level_major;<br>
> +    DWORD level_minor;<br>
> +    BOOL sw;<br>
> +    BOOL support;<br>
> +} targets_info[] = {<br>
> +    /* SM 1 */<br>
> +    { "vs_1_0",            ST_VERTEX,  1, 0, 0, 0, FALSE, TRUE  },<br>
> +    { "vs_1_1",            ST_VERTEX,  1, 1, 0, 0, FALSE, TRUE  },<br>
> +    { "ps_1_0",            ST_PIXEL,   1, 0, 0, 0, FALSE, TRUE  },<br>
> +    { "ps_1_1",            ST_PIXEL,   1, 1, 0, 0, FALSE, FALSE },<br>
> +    { "ps_1_2",            ST_PIXEL,   1, 2, 0, 0, FALSE, FALSE },<br>
> +    { "ps_1_3",            ST_PIXEL,   1, 3, 0, 0, FALSE, FALSE },<br>
> +    { "ps_1_4",            ST_PIXEL,   1, 4, 0, 0, FALSE, FALSE },<br>
> +    { "tx_1_0",            ST_UNKNOWN, 1, 0, 0, 0, FALSE, FALSE },<br>
> +    /* SM 2 */<br>
> +    { "vs_2_0",            ST_VERTEX,  2, 0, 0, 0, FALSE, TRUE  },<br>
> +    { "vs_2_a",            ST_VERTEX,  2, 1, 0, 0, FALSE, FALSE },<br>
> +    { "vs_2_sw",           ST_VERTEX,  2, 0, 0, 0, TRUE,  FALSE },<br>
> +    { "ps_2_0",            ST_PIXEL,   2, 0, 0, 0, FALSE, TRUE  },<br>
> +    { "ps_2_a",            ST_PIXEL,   2, 1, 0, 0, FALSE, FALSE },<br>
> +    { "ps_2_b",            ST_PIXEL,   2, 2, 0, 0, FALSE, FALSE },<br>
> +    { "ps_2_sw",           ST_PIXEL,   2, 0, 0, 0, TRUE,  FALSE },<br>
> +    { "fx_2_0",            ST_UNKNOWN, 2, 0, 0, 0, FALSE, FALSE },<br>
> +    /* SM 3 */<br>
> +    { "vs_3_0",            ST_VERTEX,  3, 0, 0, 0, FALSE, TRUE  },<br>
> +    { "vs_3_sw",           ST_VERTEX,  3, 0, 0, 0, TRUE,  FALSE },<br>
> +    { "ps_3_0",            ST_PIXEL,   3, 0, 0, 0, FALSE, TRUE  },<br>
> +    { "ps_3_sw",           ST_PIXEL,   3, 0, 0, 0, TRUE,  FALSE },<br>
> +    /* SM 4 */<br>
> +    { "vs_4_0_level_9_0",  ST_VERTEX,  4, 0, 9, 0, FALSE, FALSE },<br>
> +    { "vs_4_0_level_9_1",  ST_VERTEX,  4, 0, 9, 1, FALSE, FALSE },<br>
> +    { "vs_4_0_level_9_3",  ST_VERTEX,  4, 0, 9, 3, FALSE, FALSE },<br>
> +    { "vs_4_0",            ST_VERTEX,  4, 0, 0, 0, FALSE, TRUE  },<br>
> +    { "vs_4_1",            ST_VERTEX,  4, 1, 0, 0, FALSE, TRUE  },<br>
> +    { "ps_4_0_level_9_0",  ST_PIXEL,   4, 0, 9, 0, FALSE, FALSE },<br>
> +    { "ps_4_0_level_9_1",  ST_PIXEL,   4, 0, 9, 1, FALSE, FALSE },<br>
> +    { "ps_4_0_level_9_3",  ST_PIXEL,   4, 0, 9, 3, FALSE, FALSE },<br>
> +    { "ps_4_0",            ST_PIXEL,   4, 0, 0, 0, FALSE, TRUE  },<br>
> +    { "ps_4_1",            ST_PIXEL,   4, 1, 0, 0, FALSE, TRUE  },<br>
> +    { "gs_4_0",            ST_UNKNOWN, 4, 0, 0, 0, FALSE, FALSE },<br>
> +    { "gs_4_1",            ST_UNKNOWN, 4, 1, 0, 0, FALSE, FALSE },<br>
> +    { "cs_4_0",            ST_UNKNOWN, 4, 0, 0, 0, FALSE, FALSE },<br>
> +    { "cs_4_1",            ST_UNKNOWN, 4, 1, 0, 0, FALSE, FALSE },<br>
> +    { "fx_4_0",            ST_UNKNOWN, 4, 0, 0, 0, FALSE, FALSE },<br>
> +    { "fx_4_1",            ST_UNKNOWN, 4, 1, 0, 0, FALSE, FALSE },<br>
> +    /* SM 5 */<br>
> +    { "vs_5_0",            ST_VERTEX,  5, 0, 0, 0, FALSE, TRUE  },<br>
> +    { "ps_5_0",            ST_PIXEL,   5, 0, 0, 0, FALSE, TRUE  },<br>
> +    { "hs_5_0",            ST_UNKNOWN, 5, 0, 0, 0, FALSE, FALSE },<br>
> +    { "gs_5_0",            ST_UNKNOWN, 5, 0, 0, 0, FALSE, FALSE },<br>
> +    { "ds_5_0",            ST_UNKNOWN, 5, 0, 0, 0, FALSE, FALSE },<br>
> +    { "cs_5_0",            ST_UNKNOWN, 5, 0, 0, 0, FALSE, FALSE },<br>
> +    { "fx_5_0",            ST_UNKNOWN, 5, 0, 0, 0, FALSE, FALSE },<br>
> +};<br>
> +<br>
>  static HRESULT compile_shader(const char *preproc_shader, const char *target, const char *entrypoint,<br>
>          ID3DBlob **shader_blob, ID3DBlob **error_messages)<br>
>  {<br>
> @@ -500,38 +560,37 @@ static HRESULT compile_shader(const char *preproc_shader, const char *target, co<br>
>      ID3DBlob *buffer;<br>
>      char *pos;<br>
>      enum shader_type shader_type;<br>
> +    ULONG i;<br>
> +    ULONG nb = sizeof(targets_info) / sizeof(targets_info[0]);<br>
><br>
>      TRACE("Preprocessed shader source: %s\n", debugstr_a(preproc_shader));<br>
><br>
>      TRACE("Parsing compilation target %s.\n", debugstr_a(target));<br>
> -    if (strlen(target) != 6 || target[1] != 's' || target[2] != '_' || target[4] != '_')<br>
> +    for (i = 0; i < nb; i++)<br>
>      {<br>
> -        FIXME("Unknown compilation target %s.\n", debugstr_a(target));<br>
> -        return D3DERR_INVALIDCALL;<br>
> +        if (!strcmp(target, targets_info[i].name))<br>
> +        {<br>
> +            if (!targets_info[i].support)<br>
> +            {<br>
> +                FIXME("Compilation target %s not yet supported\n", debugstr_a(target));<br>
> +                return D3DERR_INVALIDCALL;<br>
> +            }<br>
> +            else<br>
> +            {<br>
> +                shader_type = targets_info[i].type;<br>
> +                major = targets_info[i].sm_major;<br>
> +                minor = targets_info[i].sm_minor;<br>
> +                break;<br>
> +            }<br>
> +        }<br>
>      }<br>
><br>
> -    if (target[0] == 'v')<br>
> -        shader_type = ST_VERTEX;<br>
> -    else if (target[0] == 'p')<br>
> -        shader_type = ST_PIXEL;<br>
> -    else<br>
> +    if (i == nb)<br>
>      {<br>
> -        FIXME("Unsupported shader target type %s.\n", debugstr_a(target));<br>
> +        FIXME("Unknown compilation target %s\n", debugstr_a(target));<br>
>          return D3DERR_INVALIDCALL;<br>
>      }<br>
><br>
> -    major = target[3] - '0';<br>
> -    if (major == 0 || major > 5)<br>
> -    {<br>
> -        FIXME("Unsupported shader target major version %d.\n", major);<br>
> -        return D3DERR_INVALIDCALL;<br>
> -    }<br>
> -    minor = target[5] - '0';<br>
> -    if (minor > 1 || (minor == 1 && (shader_type != ST_VERTEX || major > 1)))<br>
> -    {<br>
> -        FIXME("Unsupported shader target minor version %d.\n", minor);<br>
> -        return D3DERR_INVALIDCALL;<br>
> -    }<br>
>      shader = parse_hlsl_shader(preproc_shader, shader_type, major, minor, entrypoint, &messages);<br>
><br>
>      if (messages)<br>
> diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h<br>
> index c8a92f1..63745e0 100644<br>
> --- a/dlls/d3dcompiler_43/d3dcompiler_private.h<br>
> +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h<br>
> @@ -51,6 +51,7 @@ enum shader_type<br>
>  {<br>
>      ST_VERTEX,<br>
>      ST_PIXEL,<br>
> +    ST_UNKNOWN<br>
>  };<br>
><br>
<br>
</div></div>I'd prefer ST_UNKNOWN to be in the first place here (so that it<br>
doesn't get pushed down when we'll add more target types) but it's not<br>
a big deal.<br></blockquote><div><br></div><div>Make sense. <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
>  typedef enum BWRITER_COMPARISON_TYPE {<br>
><br>
><br>
><br>
<br>
The patch is probably fine otherwise but can you check that targets in<br>
the form "vs.1.0" aren't accepted by native D3DCompile? I suppose<br>
those tokens are assembler-only, but better be safe than sorry.<br></blockquote><div><br></div><div>Just tested.The dot syntax is supported until SM 3.0 included for all targets except for fx_2_0 and ps_3_sw. It's seem the syntax has been dropped for SM 4.0 and above.<br>
</div><div>Note that the asm code generated use always the v/ps_x_y syntax.<br><br></div><div>I will add an altername name to support that. Thanks.<br><br></div><div>Christian<br></div></div><br></div></div>