[PATCH vkd3d 5/7] libs/vkd3d: Fix rendering to DXGI_FORMAT_A8_UNORM.

Józef Kucia joseph.kucia at gmail.com
Thu May 24 06:08:36 CDT 2018


From: Józef Kucia <jkucia at codeweavers.com>

In Direct3D alpha is taken from the .r component.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 libs/vkd3d/state.c | 30 ++++++++++++++++++++++++++----
 tests/d3d12.c      |  2 +-
 2 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index 826d68f6f63c..9129d1214d46 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -1263,7 +1263,8 @@ static void dump_shader_stage(VkShaderStageFlagBits stage, const void *data, siz
 
 static HRESULT create_shader_stage(struct d3d12_device *device,
         struct VkPipelineShaderStageCreateInfo *stage_desc, enum VkShaderStageFlagBits stage,
-        const D3D12_SHADER_BYTECODE *code, const struct vkd3d_shader_interface *shader_interface)
+        const D3D12_SHADER_BYTECODE *code, const struct vkd3d_shader_interface *shader_interface,
+        const struct vkd3d_shader_compile_arguments *compile_args)
 {
     struct vkd3d_shader_code dxbc = {code->pShaderBytecode, code->BytecodeLength};
     const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
@@ -1284,7 +1285,7 @@ static HRESULT create_shader_stage(struct d3d12_device *device,
     shader_desc.flags = 0;
 
     dump_shader_stage(stage, code->pShaderBytecode, code->BytecodeLength);
-    if ((ret = vkd3d_shader_compile_dxbc(&dxbc, &spirv, 0, shader_interface, NULL)) < 0)
+    if ((ret = vkd3d_shader_compile_dxbc(&dxbc, &spirv, 0, shader_interface, compile_args)) < 0)
     {
         WARN("Failed to compile shader, vkd3d result %d.\n", ret);
         return hresult_from_vkd3d_result(ret);
@@ -1436,7 +1437,7 @@ static HRESULT d3d12_pipeline_state_init_compute(struct d3d12_pipeline_state *st
     pipeline_info.pNext = NULL;
     pipeline_info.flags = 0;
     if (FAILED(hr = create_shader_stage(device, &pipeline_info.stage,
-            VK_SHADER_STAGE_COMPUTE_BIT, &desc->CS, &shader_interface)))
+            VK_SHADER_STAGE_COMPUTE_BIT, &desc->CS, &shader_interface, NULL)))
     {
         if (state->vk_set_layout)
             VK_CALL(vkDestroyDescriptorSetLayout(device->vk_device, state->vk_set_layout, NULL));
@@ -1789,12 +1790,23 @@ static HRESULT compute_input_layout_offsets(const D3D12_INPUT_LAYOUT_DESC *input
     return S_OK;
 }
 
+static unsigned int vkd3d_get_rt_format_swizzle(const struct vkd3d_format *format)
+{
+    if (format->dxgi_format == DXGI_FORMAT_A8_UNORM)
+        return VKD3D_SWIZZLE(VKD3D_SWIZZLE_W, VKD3D_SWIZZLE_X, VKD3D_SWIZZLE_Y, VKD3D_SWIZZLE_Z);
+
+    return VKD3D_NO_SWIZZLE;
+}
+
 static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *state,
         struct d3d12_device *device, const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc)
 {
+    unsigned int ps_output_swizzle[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT];
     struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics;
     const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
+    const struct vkd3d_shader_compile_arguments *compile_args;
     uint32_t aligned_offsets[D3D12_VS_INPUT_REGISTER_COUNT];
+    struct vkd3d_shader_compile_arguments ps_compile_args;
     const struct d3d12_root_signature *root_signature;
     struct vkd3d_shader_interface shader_interface;
     struct vkd3d_shader_signature input_signature;
@@ -1907,6 +1919,8 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
             goto fail;
         }
 
+        ps_output_swizzle[i] = vkd3d_get_rt_format_swizzle(format);
+
         graphics->attachments[idx].flags = 0;
         graphics->attachments[idx].format = format->vk_format;
         graphics->attachments[idx].samples = VK_SAMPLE_COUNT_1_BIT;
@@ -1924,6 +1938,9 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
     }
     graphics->attachment_count = graphics->rt_idx + rt_count;
 
+    ps_compile_args.output_swizzles = ps_output_swizzle;
+    ps_compile_args.output_swizzle_count = rt_count;
+
     shader_interface.bindings = root_signature->descriptor_mapping;
     shader_interface.binding_count = root_signature->descriptor_count;
     shader_interface.push_constant_buffers = root_signature->root_constants;
@@ -1952,8 +1969,13 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
         if (shader_info.uav_counter_mask)
             FIXME("UAV counters not implemented for graphics pipelines.\n");
 
+        if (shader_stages[i].stage == VK_SHADER_STAGE_FRAGMENT_BIT)
+            compile_args = &ps_compile_args;
+        else
+            compile_args = NULL;
+
         if (FAILED(hr = create_shader_stage(device, &graphics->stages[graphics->stage_count],
-                shader_stages[i].stage, b, &shader_interface)))
+                shader_stages[i].stage, b, &shader_interface, compile_args)))
             goto fail;
 
         if (shader_stages[i].stage == VK_SHADER_STAGE_VERTEX_BIT
diff --git a/tests/d3d12.c b/tests/d3d12.c
index c7303f8d7ab9..0e35fc866bbc 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -694,7 +694,7 @@ static void check_readback_data_uint8_(unsigned int line, struct resource_readba
         if (!all_match)
             break;
     }
-    todo_(line)(all_match, "Got 0x%02x, expected 0x%02x at (%u, %u).\n", got, expected, x, y);
+    ok_(line)(all_match, "Got 0x%02x, expected 0x%02x at (%u, %u).\n", got, expected, x, y);
 }
 
 #define check_sub_resource_uint8(a, b, c, d, e, f) check_sub_resource_uint8_(__LINE__, a, b, c, d, e, f)
-- 
2.16.1




More information about the wine-devel mailing list