mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-08-29 01:26:33 +00:00
Don't put a transition barrier when states are matching + XeFG hack
This commit is contained in:
@@ -302,6 +302,9 @@ bool IFGFeature_Dx12::CreateBufferResource(ID3D12Device* device, ID3D12Resource*
|
||||
void IFGFeature_Dx12::ResourceBarrier(ID3D12GraphicsCommandList* cmdList, ID3D12Resource* resource,
|
||||
D3D12_RESOURCE_STATES beforeState, D3D12_RESOURCE_STATES afterState)
|
||||
{
|
||||
if (beforeState == afterState)
|
||||
return;
|
||||
|
||||
D3D12_RESOURCE_BARRIER barrier = {};
|
||||
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
|
||||
barrier.Transition.pResource = resource;
|
||||
|
||||
@@ -878,6 +878,15 @@ void XeFG_Dx12::SetResource(Dx12Resource* inputResource)
|
||||
if (fResource->cmdList == nullptr && resourceParam.validity == XEFG_SWAPCHAIN_RV_UNTIL_NEXT_PRESENT)
|
||||
fResource->cmdList = (ID3D12GraphicsCommandList*) 1;
|
||||
|
||||
// HACK: XeFG seems to crash if the resource is in COPY_SOURCE state
|
||||
// even though the docs say it's the preferred state
|
||||
if (inputResource->state == D3D12_RESOURCE_STATE_COPY_SOURCE)
|
||||
{
|
||||
ResourceBarrier(inputResource->cmdList, inputResource->resource, inputResource->state,
|
||||
D3D12_RESOURCE_STATE_COPY_DEST);
|
||||
resourceParam.incomingState = D3D12_RESOURCE_STATE_COPY_DEST;
|
||||
}
|
||||
|
||||
auto result =
|
||||
XeFGProxy::D3D12TagFrameResource()(_swapChainContext, fResource->cmdList, _frameCount, &resourceParam);
|
||||
if (result != XEFG_SWAPCHAIN_RESULT_SUCCESS)
|
||||
@@ -887,6 +896,13 @@ void XeFG_Dx12::SetResource(Dx12Resource* inputResource)
|
||||
return;
|
||||
}
|
||||
|
||||
// Potentially we don't need to restore but do it just to be safe
|
||||
if (inputResource->state == D3D12_RESOURCE_STATE_COPY_SOURCE)
|
||||
{
|
||||
ResourceBarrier(inputResource->cmdList, inputResource->resource, D3D12_RESOURCE_STATE_COPY_DEST,
|
||||
inputResource->state);
|
||||
}
|
||||
|
||||
SetResourceReady(type);
|
||||
|
||||
LOG_TRACE("_frameResources[{}][{}]: {:X}", fIndex, magic_enum::enum_name(type), (size_t) fResource->GetResource());
|
||||
|
||||
@@ -179,6 +179,9 @@ bool Hudfix_Dx12::CreateBufferResourceWithSize(ID3D12Device* InDevice, ResourceI
|
||||
void Hudfix_Dx12::ResourceBarrier(ID3D12GraphicsCommandList* InCommandList, ID3D12Resource* InResource,
|
||||
D3D12_RESOURCE_STATES InBeforeState, D3D12_RESOURCE_STATES InAfterState)
|
||||
{
|
||||
if (InBeforeState == InAfterState)
|
||||
return;
|
||||
|
||||
D3D12_RESOURCE_BARRIER barrier = {};
|
||||
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
|
||||
barrier.Transition.pResource = InResource;
|
||||
|
||||
@@ -136,6 +136,9 @@ static bool CreateBufferResource(ID3D12Device* InDevice, ID3D12Resource* InResou
|
||||
static void ResourceBarrier(ID3D12GraphicsCommandList* InCommandList, ID3D12Resource* InResource,
|
||||
D3D12_RESOURCE_STATES InBeforeState, D3D12_RESOURCE_STATES InAfterState)
|
||||
{
|
||||
if (InBeforeState == InAfterState)
|
||||
return;
|
||||
|
||||
D3D12_RESOURCE_BARRIER barrier = {};
|
||||
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
|
||||
barrier.Transition.pResource = InResource;
|
||||
|
||||
@@ -100,6 +100,9 @@ bool HC_Dx12::CreateBufferResource(UINT index, ID3D12Device* InDevice, ID3D12Res
|
||||
void HC_Dx12::ResourceBarrier(ID3D12GraphicsCommandList* cmdList, ID3D12Resource* resource,
|
||||
D3D12_RESOURCE_STATES beforeState, D3D12_RESOURCE_STATES afterState)
|
||||
{
|
||||
if (beforeState == afterState)
|
||||
return;
|
||||
|
||||
D3D12_RESOURCE_BARRIER barrier = {};
|
||||
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
|
||||
barrier.Transition.pResource = resource;
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
void IFeature_Dx11wDx12::ResourceBarrier(ID3D12GraphicsCommandList* commandList, ID3D12Resource* resource,
|
||||
D3D12_RESOURCE_STATES beforeState, D3D12_RESOURCE_STATES afterState)
|
||||
{
|
||||
if (beforeState == afterState)
|
||||
return;
|
||||
|
||||
D3D12_RESOURCE_BARRIER barrier = {};
|
||||
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
|
||||
barrier.Transition.pResource = resource;
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
void IFeature_Dx12::ResourceBarrier(ID3D12GraphicsCommandList* InCommandList, ID3D12Resource* InResource,
|
||||
D3D12_RESOURCE_STATES InBeforeState, D3D12_RESOURCE_STATES InAfterState) const
|
||||
{
|
||||
if (InBeforeState == InAfterState)
|
||||
return;
|
||||
|
||||
D3D12_RESOURCE_BARRIER barrier = {};
|
||||
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
|
||||
barrier.Transition.pResource = InResource;
|
||||
|
||||
Reference in New Issue
Block a user