mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-19 21:42:59 +01:00
Added init parameter for maximum allowed frame latency.
This commit is contained in:
@@ -605,6 +605,7 @@ namespace bgfx
|
||||
uint32_t width; //!< Backbuffer width.
|
||||
uint32_t height; //!< Backbuffer height.
|
||||
uint32_t reset; //!< Reset parameters.
|
||||
uint8_t maxFrameLatency; //!< Maximum frame latency.
|
||||
};
|
||||
|
||||
/// Initialization parameters used by `bgfx::init`.
|
||||
|
||||
@@ -603,6 +603,7 @@ typedef struct bgfx_resolution_s
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
uint32_t reset;
|
||||
uint8_t maxFrameLatency;
|
||||
|
||||
} bgfx_resolution_t;
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#ifndef BGFX_DEFINES_H_HEADER_GUARD
|
||||
#define BGFX_DEFINES_H_HEADER_GUARD
|
||||
|
||||
#define BGFX_API_VERSION UINT32_C(81)
|
||||
#define BGFX_API_VERSION UINT32_C(82)
|
||||
|
||||
/// Color RGB/alpha/depth write. When it's not specified write will be disabled.
|
||||
#define BGFX_STATE_WRITE_R UINT64_C(0x0000000000000001) //!< Enable R write.
|
||||
|
||||
@@ -2817,6 +2817,7 @@ namespace bgfx
|
||||
, width(1280)
|
||||
, height(720)
|
||||
, reset(BGFX_RESET_NONE)
|
||||
, maxFrameLatency(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
133
src/dxgi.cpp
133
src/dxgi.cpp
@@ -319,38 +319,6 @@ namespace bgfx
|
||||
: (uint16_t)m_adapterDesc.VendorId
|
||||
;
|
||||
_caps.deviceId = (uint16_t)m_adapterDesc.DeviceId;
|
||||
|
||||
{
|
||||
IDXGIDevice* dxgiDevice = NULL;
|
||||
hr = E_FAIL;
|
||||
for (uint32_t ii = 0; ii < BX_COUNTOF(s_dxgiDeviceIIDs) && FAILED(hr); ++ii)
|
||||
{
|
||||
hr = m_factory->QueryInterface(s_dxgiDeviceIIDs[ii], (void**)&dxgiDevice);
|
||||
BX_TRACE("DXGI device 11.%d, hr %x", BX_COUNTOF(s_dxgiDeviceIIDs) - 1 - ii, hr);
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
#if BX_COMPILER_MSVC
|
||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4530) // warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
|
||||
try
|
||||
{
|
||||
// QueryInterface above can succeed, but getting adapter call might crash on Win7.
|
||||
hr = dxgiDevice->GetAdapter(reinterpret_cast<IDXGIAdapter**>(&adapter) );
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
BX_TRACE("Failed to get adapter for IID_IDXGIDevice%d.", BX_COUNTOF(s_dxgiDeviceIIDs) - 1 - ii);
|
||||
DX_RELEASE(dxgiDevice, 0);
|
||||
hr = E_FAIL;
|
||||
}
|
||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||
#else
|
||||
hr = dxgiDevice->GetAdapter(reinterpret_cast<IDXGIAdapter**>(&adapter) );
|
||||
#endif // BX_COMPILER_MSVC
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -371,64 +339,26 @@ namespace bgfx
|
||||
|
||||
void Dxgi::update(IUnknown* _device)
|
||||
{
|
||||
IDXGIDevice* dxgiDevice = NULL;
|
||||
HRESULT hr = E_FAIL;
|
||||
for (uint32_t ii = 0; ii < BX_COUNTOF(s_dxgiDeviceIIDs) && FAILED(hr); ++ii)
|
||||
{
|
||||
hr = _device->QueryInterface(s_dxgiDeviceIIDs[ii], (void**)&dxgiDevice);
|
||||
BX_TRACE("DXGI device 11.%d, hr %x", BX_COUNTOF(s_dxgiDeviceIIDs) - 1 - ii, hr);
|
||||
}
|
||||
|
||||
if (NULL == m_factory)
|
||||
{
|
||||
IDXGIDevice* dxgiDevice = NULL;
|
||||
HRESULT hr = E_FAIL;
|
||||
for (uint32_t ii = 0; ii < BX_COUNTOF(s_dxgiDeviceIIDs) && FAILED(hr); ++ii)
|
||||
{
|
||||
hr = _device->QueryInterface(s_dxgiDeviceIIDs[ii], (void**)&dxgiDevice);
|
||||
BX_TRACE("DXGI device 11.%d, hr %x", BX_COUNTOF(s_dxgiDeviceIIDs) - 1 - ii, hr);
|
||||
|
||||
if (SUCCEEDED(hr) )
|
||||
{
|
||||
DX_CHECK(dxgiDevice->GetAdapter(reinterpret_cast<IDXGIAdapter**>(&m_adapter) ) );
|
||||
DX_RELEASE(dxgiDevice, 1);
|
||||
}
|
||||
}
|
||||
DX_CHECK(dxgiDevice->GetAdapter(reinterpret_cast<IDXGIAdapter**>(&m_adapter) ) );
|
||||
|
||||
bx::memSet(&m_adapterDesc, 0, sizeof(m_adapterDesc) );
|
||||
hr = m_adapter->GetDesc(&m_adapterDesc);
|
||||
BX_WARN(SUCCEEDED(hr), "Adapter GetDesc failed 0x%08x.", hr);
|
||||
|
||||
DX_CHECK(m_adapter->GetParent(IID_IDXGIFactory2, (void**)&m_factory) );
|
||||
|
||||
#if 0
|
||||
bx::memSet(&m_adapterDesc, 0, sizeof(m_adapterDesc) );
|
||||
// NOTICE:
|
||||
// LUID STDMETHODCALLTYPE ID3D12Device::GetAdapterLuid() has a different behaviour in gcc ,
|
||||
// because gcc64 returns small struct in RAX, but the microsoft implemention of ID3D12Device::GetAdapterLuid() in d3d12.dll
|
||||
// pass the struct LUID's address as the second parameter.
|
||||
typedef void (STDMETHODCALLTYPE ID3D12Device::*ID3D12Device_GetAdapterLuid_f)(LUID *);
|
||||
(m_device->*(ID3D12Device_GetAdapterLuid_f)(&ID3D12Device::GetAdapterLuid))(&luid);
|
||||
AdapterI* adapter;
|
||||
for (uint32_t ii = 0; DXGI_ERROR_NOT_FOUND != m_factory->EnumAdapters(ii, reinterpret_cast<IDXGIAdapter**>(&adapter) ); ++ii)
|
||||
{
|
||||
adapter->GetDesc(&m_adapterDesc);
|
||||
if (m_adapterDesc.AdapterLuid.LowPart == luid.LowPart
|
||||
&& m_adapterDesc.AdapterLuid.HighPart == luid.HighPart)
|
||||
{
|
||||
if (NULL == m_adapter)
|
||||
{
|
||||
m_adapter = adapter;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT
|
||||
DX_RELEASE(adapter, 0);
|
||||
#else
|
||||
DX_RELEASE(adapter, 2);
|
||||
#endif // BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT
|
||||
}
|
||||
break;
|
||||
}
|
||||
DX_RELEASE(adapter, 0);
|
||||
}
|
||||
|
||||
g_caps.vendorId = (uint16_t)m_adapterDesc.VendorId;
|
||||
g_caps.deviceId = (uint16_t)m_adapterDesc.DeviceId;
|
||||
#endif // 0
|
||||
}
|
||||
|
||||
DX_RELEASE(dxgiDevice, 1);
|
||||
}
|
||||
|
||||
static const GUID IID_ID3D12CommandQueue = { 0x0ec870a6, 0x5d7e, 0x4c22, { 0x8c, 0xfc, 0x5b, 0xaa, 0xe0, 0x76, 0x16, 0xed } };
|
||||
@@ -469,10 +399,21 @@ namespace bgfx
|
||||
;
|
||||
|
||||
hr = m_factory->CreateSwapChain(
|
||||
_device
|
||||
, &scd
|
||||
, reinterpret_cast<IDXGISwapChain**>(_swapChain)
|
||||
);
|
||||
_device
|
||||
, &scd
|
||||
, reinterpret_cast<IDXGISwapChain**>(_swapChain)
|
||||
);
|
||||
|
||||
if (SUCCEEDED(hr) )
|
||||
{
|
||||
IDXGIDevice1* dxgiDevice1;
|
||||
_device->QueryInterface(IID_IDXGIDevice1, (void**)&dxgiDevice1);
|
||||
if (NULL != dxgiDevice1)
|
||||
{
|
||||
dxgiDevice1->SetMaximumFrameLatency(_scd.maxFrameLatency);
|
||||
DX_RELEASE(dxgiDevice1, 1);
|
||||
}
|
||||
}
|
||||
#else
|
||||
DXGI_SWAP_CHAIN_DESC1 scd;
|
||||
scd.Width = _scd.width;
|
||||
@@ -491,12 +432,12 @@ namespace bgfx
|
||||
if (NULL == _scd.ndt)
|
||||
{
|
||||
hr = m_factory->CreateSwapChainForCoreWindow(
|
||||
_device
|
||||
, (::IUnknown*)_scd.nwh
|
||||
, &scd
|
||||
, NULL
|
||||
, reinterpret_cast<IDXGISwapChain1**>(_swapChain)
|
||||
);
|
||||
_device
|
||||
, (::IUnknown*)_scd.nwh
|
||||
, &scd
|
||||
, NULL
|
||||
, reinterpret_cast<IDXGISwapChain1**>(_swapChain)
|
||||
);
|
||||
}
|
||||
else if (reinterpret_cast<void*>(1) == _scd.ndt)
|
||||
{
|
||||
@@ -505,11 +446,11 @@ namespace bgfx
|
||||
else
|
||||
{
|
||||
hr = m_factory->CreateSwapChainForComposition(
|
||||
_device
|
||||
, &scd
|
||||
, NULL
|
||||
, reinterpret_cast<IDXGISwapChain1**>(_swapChain)
|
||||
);
|
||||
_device
|
||||
, &scd
|
||||
, NULL
|
||||
, reinterpret_cast<IDXGISwapChain1**>(_swapChain)
|
||||
);
|
||||
if (FAILED(hr) )
|
||||
{
|
||||
return hr;
|
||||
|
||||
@@ -38,6 +38,7 @@ namespace bgfx
|
||||
DXGI_SWAP_EFFECT swapEffect;
|
||||
DXGI_ALPHA_MODE alphaMode;
|
||||
uint32_t flags;
|
||||
uint8_t maxFrameLatency;
|
||||
void* nwh;
|
||||
void* ndt;
|
||||
bool windowed;
|
||||
|
||||
@@ -989,12 +989,14 @@ namespace bgfx { namespace d3d11
|
||||
? DXGI_SCALING_NONE
|
||||
: DXGI_SCALING_STRETCH
|
||||
;
|
||||
m_scd.swapEffect = m_swapEffect;
|
||||
m_scd.alphaMode = DXGI_ALPHA_MODE_IGNORE;
|
||||
m_scd.flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
|
||||
m_scd.nwh = g_platformData.nwh;
|
||||
m_scd.ndt = g_platformData.ndt;
|
||||
m_scd.windowed = true;
|
||||
m_scd.swapEffect = m_swapEffect;
|
||||
m_scd.alphaMode = DXGI_ALPHA_MODE_IGNORE;
|
||||
m_scd.flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
|
||||
|
||||
m_scd.maxFrameLatency = bx::min<uint8_t>(_init.resolution.maxFrameLatency, 3);
|
||||
m_scd.nwh = g_platformData.nwh;
|
||||
m_scd.ndt = g_platformData.ndt;
|
||||
m_scd.windowed = true;
|
||||
|
||||
m_msaaRt = NULL;
|
||||
|
||||
|
||||
@@ -898,9 +898,11 @@ namespace bgfx { namespace d3d12
|
||||
m_scd.swapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
|
||||
m_scd.alphaMode = DXGI_ALPHA_MODE_IGNORE;
|
||||
m_scd.flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
|
||||
m_scd.nwh = g_platformData.nwh;
|
||||
m_scd.ndt = g_platformData.ndt;
|
||||
m_scd.windowed = true;
|
||||
|
||||
m_scd.maxFrameLatency = bx::min<uint8_t>(_init.resolution.maxFrameLatency, 3);
|
||||
m_scd.nwh = g_platformData.nwh;
|
||||
m_scd.ndt = g_platformData.ndt;
|
||||
m_scd.windowed = true;
|
||||
|
||||
m_backBufferColorIdx = m_scd.bufferCount-1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user