HRESULT STDMETHODCALLTYPE CD3DX12AffinityFence::WaitOnFenceCompletion(
    UINT64 Value)
{
    std::vector<HANDLE> Events;

    UINT EventCount = 0;
    for (UINT i = 0; i < D3DX12_MAX_ACTIVE_NODES;i++)
    {
        if (((1 << i) & mAffinityMask) != 0)
        {
            ID3D12Fence* Fence = mFences[i];
            Events.push_back(0);
            Events[EventCount] = CreateEventEx(nullptr, FALSE, FALSE, EVENT_ALL_ACCESS);
            HRESULT const hr = Fence->SetEventOnCompletion(Value, Events[EventCount]);

            if (hr != S_OK)
            {
                return hr;
            }

            ++EventCount;
        }
    }
    WaitForMultipleObjects((DWORD)EventCount, &(Events[0]), TRUE, INFINITE);
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CD3DX12AffinityFence::SetEventOnCompletion(
    UINT64 Value,
    HANDLE hEvent)
{
    UINT i = GetActiveNodeIndex();
    ID3D12Fence* Fence = mFences[i];
    return Fence->SetEventOnCompletion(Value, hEvent);
}
示例#3
0
  void waitAtEndOfFrame()
  {
    uint64_t local_fence_value = fence_value;

    WINCHECK( commandQueue->Signal( fence, local_fence_value ) );
    ++fence_value;

    if( fence->GetCompletedValue() < local_fence_value )
    {
      WINCHECK( fence->SetEventOnCompletion( local_fence_value, fence_event ) );
      WaitForSingleObject( fence_event, INFINITE );
    }
  }
HRESULT STDMETHODCALLTYPE CD3DX12AffinityFence::Signal(
    UINT64 Value)
{
    for (UINT i = 0; i < D3DX12_MAX_ACTIVE_NODES;i++)
    {
        if (((1 << i) & mAffinityMask) != 0)
        {
            ID3D12Fence* Fence = mFences[i];

            HRESULT const hr = Fence->Signal(Value);

            if (hr != S_OK)
            {
                return hr;
            }
        }
    }

    return S_OK;
}
void* RenderAPI_D3D12::BeginModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int* outRowPitch)
{
	ID3D12Fence* fence = s_D3D12->GetFrameFence();

	// Wait on the previous job (example only - simplifies resource management)
	if (fence->GetCompletedValue() < s_D3D12FenceValue)
	{
		fence->SetEventOnCompletion(s_D3D12FenceValue, s_D3D12Event);
		WaitForSingleObject(s_D3D12Event, INFINITE);
	}

	// Begin a command list
	s_D3D12CmdAlloc->Reset();
	s_D3D12CmdList->Reset(s_D3D12CmdAlloc, nullptr);

	// Fill data
	const UINT64 kDataSize = textureWidth * textureHeight * 4;
	ID3D12Resource* upload = GetUploadResource(kDataSize);
	void* mapped = NULL;
	upload->Map(0, NULL, &mapped);
	*outRowPitch = textureWidth * 4;
	return mapped;
}