[Bug 49186] DXBC compiler generates incorrect spir-v code

WineHQ Bugzilla wine-bugs at winehq.org
Thu Jul 9 06:30:25 CDT 2020


https://bugs.winehq.org/show_bug.cgi?id=49186

--- Comment #3 from Henri Verbeet <hverbeet at gmail.com> ---
(In reply to Alex from comment #2)
> The patch doesn't help, although I didn't look at the produced shader binary.

I'm afraid I may need some more context on what you're trying to do in order to
reproduce the issue then. For what it's worth:

The issue the patch addresses is the following (from spirv-val):

    error: line 130: OpAccessChain result type (OpTypeVector) does not match
the type that results from indexing into the base <id> (OpTypeFloat).
      %52 = OpAccessChain %_ptr_Input_v4float %v1 %51

That happens because of the following bits in the .fxc:

    // Input signature:
    [...]
    // SV_CLIPDISTANCE          0   xyzw        1  CLIPDST   float
    [...]
    dcl_input v[5][1].xyzw
    [...]
    mov o1.xyzw, v[r0.x + 0][1].xyzw

v1 is a vec4 bound to SV_CLIPDISTANCE in the .fxc, but SpvBuiltInClipDistance
is a scalar. The patch handles that difference by filling the additional
components (.yzw) with zeroes; it may need to replicate the .x component
instead, that's the part that needs tests.

It's not entirely clear to me how you produced the quoted GLSL. You mention
spirv-dis, but at least the version I have here doesn't appear to have that
feature. (But, it's also more than two weeks old...) I know spirv-cross can
turn SPIR-V into GLSL, is that perhaps what you used?

In any case, the following line in the quoted GLSL appears to have been
incorrectly translated from the SPIR-V:

    out float gl_ClipDistance[5];

Specifically, the "out" there. From the SPIR-V:

    OpDecorate %v1 BuiltIn ClipDistance
    [...]
    %v1 = OpVariable %_ptr_Input__arr_float_uint_5 Input

ClipDistance is used as an input, not an output.

> Perhaps those error messages are relevant: 
> 
> fixme:vkd3d_dxbc_compiler_check_index_range: Unhandled index range write
> mask 0x1 (0xf).
> fixme:vkd3d_dxbc_compiler_emit_dcl_index_range: Ignoring dcl_index_range 0x6
> 2.

That's from this line in the .fxc:

    dcl_indexrange o0.x 2

In context:

    hs_fork_phase 
    dcl_hs_fork_phase_instance_count 2
    dcl_input vForkInstanceID
    dcl_output_siv o0.x, finalTriUeq0EdgeTessFactor
    dcl_output_siv o1.x, finalTriVeq0EdgeTessFactor
    dcl_temps 1
    dcl_indexrange o0.x 2
    mov r0.x, vForkInstanceID.x
    mov o[r0.x + 0].x, l(1.000000)
    ret

We should of course fix that, but it seems unlikely to be consequential for the
purposes of this bug report.

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list