CxbxSetIndices() never returns anything

Copied over example CreateDevice initialization (probably won't compile)
Leave out g_pDirect3D and g_D3DCaps globals (no longer required in D3D11)
Call CheckFormatSupport from g_pD3DDevice (not g_pDirect3D)
Ported CreateQuery (using a D3D11_QUERY_DESC argument)
This commit is contained in:
PatrickvL 2021-06-12 17:44:47 +02:00
parent cd0bf92e50
commit 11a0834b83
4 changed files with 128 additions and 20 deletions

View File

@ -104,7 +104,7 @@ HWND g_hEmuWindow = NULL; // rendering window
bool g_bClipCursor = false; // indicates that the mouse cursor should be confined inside the rendering window
IDirect3DDevice *g_pD3DDevice = nullptr; // Direct3D Device
#ifdef CXBX_USE_D3D11
ID3D11DeviceContext *g_pD3DDeviceContext = nullptr;
ID3D11DeviceContext *g_pD3DDeviceContext = nullptr; // Direct3D 11 Device Context
#endif
// Static Variable(s)
@ -133,8 +133,10 @@ static D3DSURFACE_DESC g_HostBackBufferDesc;
static Settings::s_video g_XBVideo;
// D3D based variables
#ifndef CXBX_USE_D3D11
static IDirect3D9Ex *g_pDirect3D = nullptr;
D3DCAPS g_D3DCaps = {}; // Direct3D Caps
#endif
static IDirect3DIndexBuffer *g_pClosingLineLoopHostIndexBuffer = nullptr;
static IDirect3DIndexBuffer *g_pQuadToTriangleHostIndexBuffer = nullptr;
@ -236,7 +238,7 @@ static void CxbxSetScissorRect(CONST RECT *pHostViewportRect)
#endif
}
static HRESULT CxbxSetIndices(IDirect3DIndexBuffer* pHostIndexBuffer)
static void CxbxSetIndices(IDirect3DIndexBuffer* pHostIndexBuffer)
{
LOG_INIT; // Allows use of DEBUG_D3DRESULT
@ -252,8 +254,6 @@ static HRESULT CxbxSetIndices(IDirect3DIndexBuffer* pHostIndexBuffer)
if (FAILED(hRet))
CxbxrAbort("CxbxSetIndices: SetIndices Failed!"); // +DxbxD3DErrorString(hRet));
return hRet;
}
static void CxbxImGui_RenderD3D9(ImGuiUI* m_imgui, IDirect3DSurface* renderTarget)
@ -353,8 +353,8 @@ typedef struct resource_key_hash {
struct EmuD3D8CreateDeviceProxyData
{
// Set by EmuD3DInit()
xbox::uint_xt Adapter;
D3DDEVTYPE DeviceType;
_9_11(xbox::uint_xt, IDXGIAdapter*) Adapter;
_9_11(D3DDEVTYPE, D3D_DRIVER_TYPE) DeviceType;
// Set by EmuCreateDeviceProxy()
D3DPRESENT_PARAMETERS HostPresentationParameters;
}
@ -1529,10 +1529,16 @@ void EmuD3DInit()
// Initialise CreateDevice Proxy Data struct
{
#ifdef CXBX_USE_D3D11
g_EmuCDPD.Adapter = nullptr; // Specify nullptr to use the default adapter. TODO : Use g_XBVideo.adapter
g_EmuCDPD.DeviceType = (g_XBVideo.direct3DDevice == 0) ? D3D_DRIVER_TYPE_HARDWARE : D3D_DRIVER_TYPE_REFERENCE;
#else
g_EmuCDPD.Adapter = g_XBVideo.adapter;
g_EmuCDPD.DeviceType = (g_XBVideo.direct3DDevice == 0) ? D3DDEVTYPE_HAL : D3DDEVTYPE_REF;
#endif
}
#ifndef CXBX_USE_D3D11 // Based on : https://docs.microsoft.com/en-us/windows/uwp/gaming/simple-port-from-direct3d-9-to-11-1-part-1--initializing-direct3d
// create Direct3D8 and retrieve caps
{
// xbox Direct3DCreate8 returns "1" always, so we need our own ptr
@ -1546,6 +1552,7 @@ void EmuD3DInit()
std::cout << "Host D3DCaps : " << g_D3DCaps << "\n";
std::cout << "----------------------------------------\n";
}
#endif
}
// cleanup Direct3D
@ -2123,7 +2130,7 @@ static void DetermineSupportedD3DFormats
// Index with Xbox D3DFormat, because host FourCC codes are too big to be used as indices
#ifdef CBXB_USE_D3D11
UINT FormatSupport = 0;
g_pDirect3D->CheckFormatSupport(Format, &FormatSupport);
g_pD3DDevice->CheckFormatSupport(Format, &FormatSupport);
g_bSupportsFormatSurface[X_Format] = FormatSupport & D3D10_FORMAT_SUPPORT_TEXTURE2D;
g_bSupportsFormatSurfaceRenderTarget[X_Format] = FormatSupport & D3D10_FORMAT_SUPPORT_RENDER_TARGET;
@ -2282,6 +2289,91 @@ static void CreateDefaultD3D9Device
displayMode.ScanLineOrdering = D3DSCANLINEORDERING_PROGRESSIVE;
}
#ifdef CXBX_USE_D3D11
// This flag adds support for surfaces with a different color channel
// ordering than the API default. It is required for compatibility with
// Direct2D.
UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; // See enum D3D11_CREATE_DEVICE_FLAG
#if defined(_DEBUG)
// If the project is in a debug build, enable debugging via SDK Layers.
creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
// only use feature level 11.1.
D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_1 };
// Create the Direct3D 11 API device object and a corresponding context.
ComPtr<ID3D11Device> device;
ComPtr<ID3D11DeviceContext> context;
HRESULT hr = D3D11CreateDevice(
g_EmuCDPD.Adapter,
g_EmuCDPD.DeviceType,
nullptr,
creationFlags,
featureLevels,
ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION, // UWP apps must set this to D3D11_SDK_VERSION.
&device, // Returns the Direct3D device created.
nullptr, // pFeatureLevel
&context // Returns the device immediate context.
);
DEBUG_D3DRESULT(hr, "D3D11CreateDevice");
// Store pointers to the Direct3D 11.2 API device and immediate context.
device.As(&g_pD3DDevice);
context.As(&g_pD3DDeviceContext);
// Create a swap chain
ComPtr<IDXGIDevice2> dxgiDevice;
g_pD3DDevice.As(&dxgiDevice);
// Then, the adapter hosting the device;
ComPtr<IDXGIAdapter> dxgiAdapter;
dxgiDevice->GetAdapter(&dxgiAdapter);
// Then, the factory that created the adapter interface:
ComPtr<IDXGIFactory2> dxgiFactory;
dxgiAdapter->GetParent(
__uuidof(IDXGIFactory2),
&dxgiFactory
);
ComPtr<IDXGISwapChain1> swapChain;
dxgiFactory->CreateSwapChainForCoreWindow(
g_pD3DDevice.Get(),
reinterpret_cast<IUnknown*>(window),
&swapChainDesc,
nullptr,
&swapChain
);
swapChain.As(&m_swapChain);
dxgiDevice->SetMaximumFrameLatency(1);
// Configure the back buffer as a render target
ComPtr<ID3D11Texture2D> backBuffer;
m_swapChain->GetBuffer(
0,
__uuidof(ID3D11Texture2D),
&backBuffer
);
// Create a render target view on the back buffer.
g_pD3DDevice->CreateRenderTargetView(
backBuffer.Get(),
nullptr,
&m_renderTargetView
);
D3D11_TEXTURE2D_DESC backBufferDesc = { 0 };
backBuffer->GetDesc(&backBufferDesc);
CD3D11_VIEWPORT viewport(
0.0f,
0.0f,
static_cast<float>(backBufferDesc.Width),
static_cast<float>(backBufferDesc.Height)
);
g_pD3DDeviceContext->RSSetViewports(1, &viewport);
#else
// IDirect3D9::CreateDevice must be called from the window message thread
// See https://docs.microsoft.com/en-us/windows/win32/direct3d9/multithreading-issues
HRESULT hr;
@ -2299,20 +2391,26 @@ static void CreateDefaultD3D9Device
if(FAILED(hr))
CxbxrAbort("IDirect3D::CreateDeviceEx failed");
#endif
// Which texture formats does this device support?
DetermineSupportedD3DFormats();
#ifdef CXBX_USE_D3D11
D3D11_QUERY_DESC QueryDesc;
QueryDesc.Query = D3D11_QUERY_EVENT;
QueryDesc.MiscFlags = 0;
#endif
// Can host driver create event queries?
if (SUCCEEDED(g_pD3DDevice->CreateQuery(D3DQUERYTYPE_EVENT, nullptr))) {
if (SUCCEEDED(g_pD3DDevice->CreateQuery(_9_11(D3DQUERYTYPE_EVENT, &QueryDesc), nullptr))) {
// Is host GPU query creation enabled?
if (!g_bHack_DisableHostGPUQueries) {
// Create a D3D event query to handle "wait-for-idle" with
hr = g_pD3DDevice->CreateQuery(D3DQUERYTYPE_EVENT, &g_pHostQueryWaitForIdle);
hr = g_pD3DDevice->CreateQuery(_9_11(D3DQUERYTYPE_EVENT, &QueryDesc), &g_pHostQueryWaitForIdle);
DEBUG_D3DRESULT(hr, "g_pD3DDevice->CreateQuery (wait for idle)");
// Create a D3D event query to handle "callback events" with
hr = g_pD3DDevice->CreateQuery(D3DQUERYTYPE_EVENT, &g_pHostQueryCallbackEvent);
hr = g_pD3DDevice->CreateQuery(_9_11(D3DQUERYTYPE_EVENT, &QueryDesc), &g_pHostQueryCallbackEvent);
DEBUG_D3DRESULT(hr, "g_pD3DDevice->CreateQuery (callback event)");
}
} else {
@ -2320,8 +2418,11 @@ static void CreateDefaultD3D9Device
}
// Can host driver create occlusion queries?
#ifdef CXBX_USE_D3D11
QueryDesc.Query = D3D11_QUERY_OCCLUSION;
#endif
g_bEnableHostQueryVisibilityTest = false;
if (SUCCEEDED(g_pD3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, nullptr))) {
if (SUCCEEDED(g_pD3DDevice->CreateQuery(_9_11(D3DQUERYTYPE_OCCLUSION, &QueryDesc), nullptr))) {
// Is host GPU query creation enabled?
if (!g_bHack_DisableHostGPUQueries) {
g_bEnableHostQueryVisibilityTest = true;
@ -2661,7 +2762,7 @@ ConvertedIndexBuffer& CxbxUpdateActiveIndexBuffer
}
// Activate the new native index buffer :
(void)CxbxSetIndices(CacheEntry.pHostIndexBuffer);
CxbxSetIndices(CacheEntry.pHostIndexBuffer);
return CacheEntry;
}
@ -3463,9 +3564,14 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(D3DDevice_BeginVisibilityTest)()
LOG_FUNC();
if (g_bEnableHostQueryVisibilityTest) {
#ifdef CXBX_USE_D3D11
D3D11_QUERY_DESC QueryDesc;
QueryDesc.Query = D3D11_QUERY_OCCLUSION;
QueryDesc.MiscFlags = 0;
#endif
// Create a D3D occlusion query to handle "visibility test" with
IDirect3DQuery* pHostQueryVisibilityTest = nullptr;
HRESULT hRet = g_pD3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, &pHostQueryVisibilityTest);
HRESULT hRet = g_pD3DDevice->CreateQuery(_9_11(D3DQUERYTYPE_OCCLUSION, &QueryDesc), &pHostQueryVisibilityTest);
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->CreateQuery (visibility test)");
if (pHostQueryVisibilityTest != nullptr) {
hRet = pHostQueryVisibilityTest->Issue(D3DISSUE_BEGIN);
@ -7098,8 +7204,6 @@ void CxbxAssureQuadListD3DIndexBuffer(UINT NrOfQuadIndices)
{
LOG_INIT // Allows use of DEBUG_D3DRESULT
HRESULT hRet;
if (g_QuadToTriangleHostIndexBuffer_Size < NrOfQuadIndices)
{
// Round the number of indices up so we'll allocate whole pages
@ -7119,7 +7223,7 @@ void CxbxAssureQuadListD3DIndexBuffer(UINT NrOfQuadIndices)
// Put quadlist-to-triangle-list index mappings into this buffer :
INDEX16* pHostIndexBufferData = nullptr;
hRet = g_pQuadToTriangleHostIndexBuffer->Lock(0, /*entire SizeToLock=*/0, (D3DLockData **)&pHostIndexBufferData, D3DLOCK_DISCARD);
HRESULT hRet = g_pQuadToTriangleHostIndexBuffer->Lock(0, /*entire SizeToLock=*/0, (D3DLockData **)&pHostIndexBufferData, D3DLOCK_DISCARD);
DEBUG_D3DRESULT(hRet, "g_pQuadToTriangleHostIndexBuffer->Lock");
if (pHostIndexBufferData == nullptr)
CxbxrAbort("CxbxAssureQuadListD3DIndexBuffer : Could not lock index buffer!");
@ -7130,7 +7234,7 @@ void CxbxAssureQuadListD3DIndexBuffer(UINT NrOfQuadIndices)
}
// Activate the new native index buffer :
hRet = CxbxSetIndices(g_pQuadToTriangleHostIndexBuffer);
CxbxSetIndices(g_pQuadToTriangleHostIndexBuffer);
}
// TODO : Move to own file
@ -7158,7 +7262,7 @@ void CxbxDrawIndexedClosingLine(INDEX16 LowIndex, INDEX16 HighIndex)
hRet = g_pClosingLineLoopHostIndexBuffer->Unlock();
DEBUG_D3DRESULT(hRet, "g_pClosingLineLoopHostIndexBuffer->Unlock");
hRet = CxbxSetIndices(g_pClosingLineLoopHostIndexBuffer);
CxbxSetIndices(g_pClosingLineLoopHostIndexBuffer);
hRet = g_pD3DDevice->DrawIndexedPrimitive(
/*PrimitiveType=*/D3DPT_LINELIST,

View File

@ -94,7 +94,7 @@
#define IDirect3DIndexBuffer _9_11(IDirect3DIndexBuffer9, ID3D11Buffer) // or ID3D11ShaderResourceView ?
#define IDirect3DSurface IDirect3DSurface9
#define IDirect3DVolume IDirect3DVolume9
#define IDirect3DQuery IDirect3DQuery9
#define IDirect3DQuery _9_11(IDirect3DQuery9, ID3D11Query)
typedef xbox::word_xt INDEX16; // TODO: Move INDEX16 into xbox namespace

View File

@ -232,8 +232,10 @@ void CxbxVertexBufferConverter::ConvertStream
UINT uiStream
)
{
#ifndef CXBX_USE_D3D11
extern D3DCAPS g_D3DCaps;
//X_D3DBaseTexture *pLinearBaseTexture[xbox::X_D3DTS_STAGECOUNT];
#endif
//X_D3DBaseTexture *pLinearBaseTexture[xbox::X_D3DTS_STAGECOUNT];
CxbxVertexShaderStreamInfo *pVertexShaderStreamInfo = nullptr;
UINT XboxStreamNumber = uiStream;

View File

@ -672,7 +672,9 @@ size_t GetVshFunctionSize(const xbox::dword_xt* pXboxFunction) {
// * Vertex shader declaration recompiler
// ****************************************************************************
#ifndef CXBX_USE_D3D11
extern D3DCAPS g_D3DCaps;
#endif
class XboxVertexDeclarationConverter
{