[PATCH vkd3d 1/3] vkd3d: Require D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT for stream output.
Józef Kucia
joseph.kucia at gmail.com
Wed Jan 16 05:44:57 CST 2019
From: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
libs/vkd3d/state.c | 12 ++++++++++--
libs/vkd3d/vkd3d_private.h | 2 ++
tests/d3d12.c | 16 ++++++++++++++++
3 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index a9a463de97e2..e9f73e82b44f 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -899,11 +899,12 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
root_signature->vk_push_set_layout = VK_NULL_HANDLE;
root_signature->vk_set_layout = VK_NULL_HANDLE;
root_signature->parameters = NULL;
+ root_signature->flags = desc->Flags;
root_signature->descriptor_mapping = NULL;
root_signature->static_sampler_count = 0;
root_signature->static_samplers = NULL;
- if (desc->Flags)
+ if (desc->Flags & ~D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT)
FIXME("Ignoring root signature flags %#x.\n", desc->Flags);
if (FAILED(hr = d3d12_root_signature_info_from_desc(&info, desc)))
@@ -2168,10 +2169,17 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
graphics->xfb_enabled = false;
if (so_desc->NumEntries)
{
+ if (!(root_signature->flags & D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT))
+ {
+ WARN("Stream output is used without D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT.\n");
+ hr = E_INVALIDARG;
+ goto fail;
+ }
+
if (!vk_info->EXT_transform_feedback)
{
- hr = E_NOTIMPL;
FIXME("Transform feedback is not supported by Vulkan implementation.\n");
+ hr = E_NOTIMPL;
goto fail;
}
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 65fcd9f5ce11..c4b0a4c06513 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -568,6 +568,8 @@ struct d3d12_root_signature
unsigned int parameter_count;
uint32_t main_set;
+ D3D12_ROOT_SIGNATURE_FLAGS flags;
+
unsigned int descriptor_count;
struct vkd3d_shader_resource_binding *descriptor_mapping;
struct vkd3d_shader_descriptor_binding dummy_sampler;
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 5be8e0d9b967..97af4c1a9f67 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -2425,6 +2425,12 @@ static void test_create_graphics_pipeline_state(void)
unsigned int i;
HRESULT hr;
+ static const D3D12_SO_DECLARATION_ENTRY so_declaration[] =
+ {
+ {0, "SV_Position", 0, 0, 4, 0},
+ };
+ static const unsigned int strides[] = {16};
+
if (!(device = create_device()))
{
skip("Failed to create device.\n");
@@ -2537,6 +2543,16 @@ static void test_create_graphics_pipeline_state(void)
&IID_ID3D12PipelineState, (void **)&pipeline_state);
ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+ /* Stream output without D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT. */
+ init_pipeline_state_desc(&pso_desc, root_signature, DXGI_FORMAT_R8G8B8A8_UNORM, NULL, NULL, NULL);
+ pso_desc.StreamOutput.NumEntries = ARRAY_SIZE(so_declaration);
+ pso_desc.StreamOutput.pSODeclaration = so_declaration;
+ pso_desc.StreamOutput.pBufferStrides = strides;
+ pso_desc.StreamOutput.NumStrides = ARRAY_SIZE(strides);
+ hr = ID3D12Device_CreateGraphicsPipelineState(device, &pso_desc,
+ &IID_ID3D12PipelineState, (void **)&pipeline_state);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
refcount = ID3D12RootSignature_Release(root_signature);
ok(!refcount, "ID3D12RootSignature has %u references left.\n", (unsigned int)refcount);
refcount = ID3D12Device_Release(device);
--
2.19.2
More information about the wine-devel
mailing list