[PATCH vkd3d 4/4] tests: Introduce a Vulkan shader runner.

Zebediah Figura zfigura at codeweavers.com
Tue Apr 12 15:48:35 CDT 2022


On 4/12/22 13:57, Henri Verbeet wrote:
> On Tue, 12 Apr 2022 at 18:42, Zebediah Figura <zfigura at codeweavers.com> wrote:
>>>> +static void transition_image_layout(struct vulkan_shader_runner *runner,
>>>> +        VkImage image, VkImageLayout src_layout, VkImageLayout dst_layout)
>>>> +{
>>>> +    VkImageMemoryBarrier barrier = {.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER};
>>>> +
>>>> +    barrier.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
>>>> +    barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
>>>> +    barrier.oldLayout = src_layout;
>>>> +    barrier.newLayout = dst_layout;
>>>> +    barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
>>>> +    barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
>>>> +    barrier.image = image;
>>>> +    barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
>>>> +    barrier.subresourceRange.baseMipLevel = 0;
>>>> +    barrier.subresourceRange.levelCount = 1;
>>>> +    barrier.subresourceRange.baseArrayLayer = 0;
>>>> +    barrier.subresourceRange.layerCount = 1;
>>>> +
>>>> +    VK_CALL(vkCmdPipelineBarrier(runner->cmd_buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
>>>> +            VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, &barrier));
>>>> +}
>>>
>>> That function is a fair bit less generic than its name might suggest.
>>
>> I suppose so, although in what respect do you mean specifically?
> 
> levelCount and layerCount being 1, although those could easily be
> replaced with VK_REMAINING_MIP_LEVELS and VK_REMAINING_ARRAY_LAYERS.
> VK_IMAGE_ASPECT_COLOR_BIT wouldn't work for depth/stencil resources.

Okay, that seems sensible to adjust.

> 
>>>> +static bool compile_shader(const struct vulkan_shader_runner *runner, const char *source, const char *type,
>>>> +        struct vkd3d_shader_code *dxbc, struct vkd3d_shader_code *spirv)
>>>> +{
>>> [...]
>>>> +    info.next = &hlsl_info;
>>>> +    info.source.code = source;
>>>> +    info.source.size = strlen(source);
>>>> +    info.source_type = VKD3D_SHADER_SOURCE_HLSL;
>>>> +    info.target_type = VKD3D_SHADER_TARGET_DXBC_TPF;
>>>> +    info.log_level = VKD3D_SHADER_LOG_WARNING;
>>> [...]
>>>> +    info.next = &spirv_info;
>>>> +    info.source = *dxbc;
>>>> +    info.source_type = VKD3D_SHADER_SOURCE_DXBC_TPF;
>>>> +    info.target_type = VKD3D_SHADER_TARGET_SPIRV_BINARY;
>>>
>>> It should be relatively straightforward for vkd3d-shader to support
>>> compiling HLSL to SPIR-V. There may be a case for a more direct path,
>>> but for a start, compile_hlsl() could essentially just do what we're
>>> doing here.
>>
>> Yes, although in this case we need to reflect the DXBC anyway, in order
>> to retrieve vertex attribute bindings.
> 
> Well, we currently do, but I'm not sure that's a necessity. It
> shouldn't be too hard to get
> vkd3d_shader_scan()/vkd3d_shader_compile() to return
> input/output/patch signatures as well.

We do want a way to scan signatures from DXBC shaders regardless.

I'm not sure that helps us on the HLSL -> SPIRV front, though. I guess 
the solution there is "assume that inputs are allocated in order, one 
register per variable", which seems a bit tenuous but ends up working 
out, both for the reference compiler, and for native d3dcompiler (and 
for our DXBC -> SPIRV path.)



More information about the wine-devel mailing list