@@ -5701,6 +5701,7 @@ static void d3d12_command_list_reset_api_state(struct d3d12_command_list *list,
57015701
57025702 list->state = NULL;
57035703 list->rt_state = NULL;
5704+ memset(&list->wg_state, 0, sizeof(list->wg_state));
57045705 list->active_pipeline_type = VKD3D_PIPELINE_TYPE_NONE;
57055706
57065707 memset(list->so_buffers, 0, sizeof(list->so_buffers));
@@ -16869,14 +16870,52 @@ static void STDMETHODCALLTYPE d3d12_command_list_IASetIndexBufferStripCutValue(d
1686916870 }
1687016871}
1687116872
16872- static void STDMETHODCALLTYPE d3d12_command_list_SetProgram(d3d12_command_list_iface *iface, const D3D12_SET_PROGRAM_DESC *desc)
16873+ static void STDMETHODCALLTYPE d3d12_command_list_SetProgram(
16874+ d3d12_command_list_iface *iface, const D3D12_SET_PROGRAM_DESC *desc)
1687316875{
16874- FIXME("iface %p, desc %p, stub!\n", iface, desc);
16876+ struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList(iface);
16877+ struct d3d12_wg_state_object *wg_state;
16878+ uint32_t wg_state_program_index;
16879+ TRACE("iface %p, desc %p\n", iface, desc);
16880+
16881+ if (desc->Type != D3D12_PROGRAM_TYPE_WORK_GRAPH)
16882+ {
16883+ FIXME("Unsupported type %u.\n", desc->Type);
16884+ memset(&list->wg_state, 0, sizeof(list->wg_state));
16885+ return;
16886+ }
16887+
16888+ list->wg_state = desc->WorkGraph;
16889+
16890+ /* We only get program identifier, not the state object? Spicy ... */
16891+ wg_state = (struct d3d12_wg_state_object *)(uintptr_t)desc->WorkGraph.ProgramIdentifier.OpaqueData[1];
16892+ wg_state_program_index = desc->WorkGraph.ProgramIdentifier.OpaqueData[0];
16893+
16894+ if (wg_state)
16895+ {
16896+ if (wg_state_program_index >= wg_state->programs_count)
16897+ {
16898+ ERR("program index %u is out of bounds (%u programs).\n",
16899+ wg_state_program_index, wg_state->programs_count);
16900+ memset(&list->wg_state, 0, sizeof(list->wg_state));
16901+ return;
16902+ }
16903+
16904+ if (desc->WorkGraph.Flags & D3D12_SET_WORK_GRAPH_FLAG_INITIALIZE)
16905+ {
16906+ /* It's somewhat ambiguous if we should initialize scratch on SetProgram time or not.
16907+ * Assume we can. */
16908+ d3d12_command_list_workgraph_initialize_scratch(list);
16909+ }
16910+ }
1687516911}
1687616912
16877- static void STDMETHODCALLTYPE d3d12_command_list_DispatchGraph(d3d12_command_list_iface *iface, const D3D12_DISPATCH_GRAPH_DESC *desc)
16913+ static void STDMETHODCALLTYPE d3d12_command_list_DispatchGraph(
16914+ d3d12_command_list_iface *iface, const D3D12_DISPATCH_GRAPH_DESC *desc)
1687816915{
16879- FIXME("iface %p, desc %p, stub!\n", iface, desc);
16916+ struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList(iface);
16917+ TRACE("iface %p, desc %p\n", iface, desc);
16918+ d3d12_command_list_workgraph_dispatch(list, desc);
1688016919}
1688116920
1688216921#define VKD3D_DECLARE_D3D12_GRAPHICS_COMMAND_LIST_VARIANT(name, set_table_variant) \
0 commit comments