From 8ef8cd5d0e72c66d9b3dab967e76101fcd17c5de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= <branimirkaradzic@gmail.com> Date: Wed, 19 Aug 2015 20:51:30 -0700 Subject: [PATCH] Cleanup. --- src/renderer_d3d11.cpp | 2 +- src/renderer_d3d12.cpp | 241 ++++++++++++++++++++++------------------- src/renderer_d3d12.h | 8 +- 3 files changed, 138 insertions(+), 113 deletions(-) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 3a972484..0ebda486 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -3958,7 +3958,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); FrameBufferHandle fbh = BGFX_INVALID_HANDLE; const uint64_t primType = _render->m_debug&BGFX_DEBUG_WIREFRAME ? BGFX_STATE_PT_LINES : 0; - uint8_t primIndex = uint8_t(primType>>BGFX_STATE_PT_SHIFT); + uint8_t primIndex = uint8_t(primType >> BGFX_STATE_PT_SHIFT); PrimInfo prim = s_primInfo[primIndex]; deviceCtx->IASetPrimitiveTopology(prim.m_type); diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 452854a9..89ac572b 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -469,19 +469,22 @@ namespace bgfx { namespace d3d12 memset(&m_resolution, 0, sizeof(m_resolution) ); #if USE_D3D12_DYNAMIC_LIB - void* kernel32 = bx::dlopen("kernel32.dll"); - if (NULL == kernel32) + m_kernel32dll = bx::dlopen("kernel32.dll"); + BX_WARN(NULL != m_kernel32dll, "Failed to load kernel32.dll."); + if (NULL == m_kernel32dll) { goto error; } - CreateEventExA = (PFN_CREATE_EVENT_EX_A)bx::dlsym(kernel32, "CreateEventExA"); - BX_WARN(NULL == CreateEventExA, "Function CreateEventExA not found."); + CreateEventExA = (PFN_CREATE_EVENT_EX_A)bx::dlsym(m_kernel32dll, "CreateEventExA"); + BX_WARN(NULL != CreateEventExA, "Function CreateEventExA not found."); if (NULL == CreateEventExA) { goto error; } + errorState = 1; + m_d3d12dll = bx::dlopen("d3d12.dll"); BX_WARN(NULL != m_d3d12dll, "Failed to load d3d12.dll."); if (NULL == m_d3d12dll) @@ -489,7 +492,7 @@ namespace bgfx { namespace d3d12 goto error; } - errorState = 1; + errorState = 2; D3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)bx::dlsym(m_d3d12dll, "D3D12CreateDevice"); BX_WARN(NULL != D3D12CreateDevice, "Function D3D12CreateDevice not found."); @@ -515,7 +518,7 @@ namespace bgfx { namespace d3d12 goto error; } - errorState = 2; + errorState = 3; CreateDXGIFactory1 = (PFN_CREATE_DXGI_FACTORY)bx::dlsym(m_dxgidll, "CreateDXGIFactory1"); BX_WARN(NULL != CreateDXGIFactory1, "Function CreateDXGIFactory1 not found."); @@ -525,7 +528,7 @@ namespace bgfx { namespace d3d12 goto error; } #else - errorState = 2; + errorState = 4; #endif // USE_D3D12_DYNAMIC_LIB HRESULT hr; @@ -538,57 +541,59 @@ namespace bgfx { namespace d3d12 goto error; } - errorState = 3; + errorState = 4; m_adapter = NULL; m_driverType = D3D_DRIVER_TYPE_HARDWARE; - IDXGIAdapter3* adapter; - for (uint32_t ii = 0; DXGI_ERROR_NOT_FOUND != m_factory->EnumAdapters(ii, reinterpret_cast<IDXGIAdapter**>(&adapter) ); ++ii) { - DXGI_ADAPTER_DESC desc; - hr = adapter->GetDesc(&desc); - if (SUCCEEDED(hr) ) + IDXGIAdapter3* adapter; + for (uint32_t ii = 0; DXGI_ERROR_NOT_FOUND != m_factory->EnumAdapters(ii, reinterpret_cast<IDXGIAdapter**>(&adapter) ); ++ii) { - BX_TRACE("Adapter #%d", ii); - - char description[BX_COUNTOF(desc.Description)]; - wcstombs(description, desc.Description, BX_COUNTOF(desc.Description) ); - BX_TRACE("\tDescription: %s", description); - BX_TRACE("\tVendorId: 0x%08x, DeviceId: 0x%08x, SubSysId: 0x%08x, Revision: 0x%08x" - , desc.VendorId - , desc.DeviceId - , desc.SubSysId - , desc.Revision - ); - BX_TRACE("\tMemory: %" PRIi64 " (video), %" PRIi64 " (system), %" PRIi64 " (shared)" - , desc.DedicatedVideoMemory - , desc.DedicatedSystemMemory - , desc.SharedSystemMemory - ); - - g_caps.gpu[ii].vendorId = (uint16_t)desc.VendorId; - g_caps.gpu[ii].deviceId = (uint16_t)desc.DeviceId; - ++g_caps.numGPUs; - - if ( (BGFX_PCI_ID_NONE != g_caps.vendorId || 0 != g_caps.deviceId) - && (BGFX_PCI_ID_NONE == g_caps.vendorId || desc.VendorId == g_caps.vendorId) - && (0 == g_caps.deviceId || desc.DeviceId == g_caps.deviceId) ) + DXGI_ADAPTER_DESC desc; + hr = adapter->GetDesc(&desc); + if (SUCCEEDED(hr) ) { - m_adapter = adapter; - m_adapter->AddRef(); - m_driverType = D3D_DRIVER_TYPE_UNKNOWN; + BX_TRACE("Adapter #%d", ii); + + char description[BX_COUNTOF(desc.Description)]; + wcstombs(description, desc.Description, BX_COUNTOF(desc.Description) ); + BX_TRACE("\tDescription: %s", description); + BX_TRACE("\tVendorId: 0x%08x, DeviceId: 0x%08x, SubSysId: 0x%08x, Revision: 0x%08x" + , desc.VendorId + , desc.DeviceId + , desc.SubSysId + , desc.Revision + ); + BX_TRACE("\tMemory: %" PRIi64 " (video), %" PRIi64 " (system), %" PRIi64 " (shared)" + , desc.DedicatedVideoMemory + , desc.DedicatedSystemMemory + , desc.SharedSystemMemory + ); + + g_caps.gpu[ii].vendorId = (uint16_t)desc.VendorId; + g_caps.gpu[ii].deviceId = (uint16_t)desc.DeviceId; + ++g_caps.numGPUs; + + if ( (BGFX_PCI_ID_NONE != g_caps.vendorId || 0 != g_caps.deviceId) + && (BGFX_PCI_ID_NONE == g_caps.vendorId || desc.VendorId == g_caps.vendorId) + && (0 == g_caps.deviceId || desc.DeviceId == g_caps.deviceId) ) + { + m_adapter = adapter; + m_adapter->AddRef(); + m_driverType = D3D_DRIVER_TYPE_UNKNOWN; + } + + if (BX_ENABLED(BGFX_CONFIG_DEBUG_PERFHUD) + && 0 != strstr(description, "PerfHUD") ) + { + m_adapter = adapter; + m_driverType = D3D_DRIVER_TYPE_REFERENCE; + } } - if (BX_ENABLED(BGFX_CONFIG_DEBUG_PERFHUD) - && 0 != strstr(description, "PerfHUD") ) - { - m_adapter = adapter; - m_driverType = D3D_DRIVER_TYPE_REFERENCE; - } + DX_RELEASE(adapter, adapter == m_adapter ? 1 : 0); } - - DX_RELEASE(adapter, adapter == m_adapter ? 1 : 0); } if (BX_ENABLED(BGFX_CONFIG_DEBUG) ) @@ -602,51 +607,67 @@ namespace bgfx { namespace d3d12 } } - static D3D_FEATURE_LEVEL featureLevel[] = { - D3D_FEATURE_LEVEL_12_1, - D3D_FEATURE_LEVEL_12_0, - D3D_FEATURE_LEVEL_11_1, - D3D_FEATURE_LEVEL_11_0, - }; + static D3D_FEATURE_LEVEL featureLevel[] = + { + D3D_FEATURE_LEVEL_12_1, + D3D_FEATURE_LEVEL_12_0, + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0, + }; - hr = E_FAIL; - for (uint32_t ii = 0; ii < BX_COUNTOF(featureLevel) && FAILED(hr); ++ii) - { - hr = D3D12CreateDevice(m_adapter - , featureLevel[ii] - , IID_ID3D12Device - , (void**)&m_device - ); + const char* featureLevelName[] = + { + "12.1", + "12.0", + "11.1", + "11.0", + }; + BX_STATIC_ASSERT(BX_COUNTOF(featureLevel) == BX_COUNTOF(featureLevelName) ); + BX_UNUSED(featureLevelName); + + hr = E_FAIL; + for (uint32_t ii = 0; ii < BX_COUNTOF(featureLevel) && FAILED(hr); ++ii) + { + hr = D3D12CreateDevice(m_adapter + , featureLevel[ii] + , IID_ID3D12Device + , (void**)&m_device + ); + BX_WARN(FAILED(hr), "Direct3D12 device feature level %s.", featureLevelName[ii]); + } + BX_WARN(SUCCEEDED(hr), "Unable to create Direct3D12 device."); } - BX_WARN(SUCCEEDED(hr), "Unable to create Direct3D12 device."); if (FAILED(hr) ) { goto error; } - errorState = 4; + errorState = 5; - memset(&m_adapterDesc, 0, sizeof(m_adapterDesc) ); - luid = m_device->GetAdapterLuid(); - 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) + memset(&m_adapterDesc, 0, sizeof(m_adapterDesc) ); + luid = m_device->GetAdapterLuid(); + IDXGIAdapter3* adapter; + for (uint32_t ii = 0; DXGI_ERROR_NOT_FOUND != m_factory->EnumAdapters(ii, reinterpret_cast<IDXGIAdapter**>(&adapter) ); ++ii) { - if (NULL == m_adapter) + adapter->GetDesc(&m_adapterDesc); + if (m_adapterDesc.AdapterLuid.LowPart == luid.LowPart + && m_adapterDesc.AdapterLuid.HighPart == luid.HighPart) { - m_adapter = adapter; + if (NULL == m_adapter) + { + m_adapter = adapter; + } + else + { + DX_RELEASE(adapter, 0); + } + break; } - else - { - DX_RELEASE(adapter, 0); - } - break; + DX_RELEASE(adapter, 0); } - DX_RELEASE(adapter, 0); } g_caps.vendorId = (uint16_t)m_adapterDesc.VendorId; @@ -749,7 +770,7 @@ namespace bgfx { namespace d3d12 filter.DenyList.pCategoryList = catlist; m_infoQueue->PushStorageFilter(&filter); - DX_RELEASE_WARNONLY(m_infoQueue, 19); + DX_RELEASE_WARNONLY(m_infoQueue, 0); } } @@ -1011,17 +1032,19 @@ namespace bgfx { namespace d3d12 switch (errorState) { default: - case 4: + case 5: m_cmd.shutdown(); DX_RELEASE(m_device, 0); - case 3: + case 4: DX_RELEASE(m_adapter, 0); DX_RELEASE(m_factory, 0); #if USE_D3D12_DYNAMIC_LIB - case 2: + case 3: bx::dlclose(m_dxgidll); - case 1: + case 2: bx::dlclose(m_d3d12dll); + case 1: + bx::dlclose(m_kernel32dll); #endif // USE_D3D12_DYNAMIC_LIB case 0: break; @@ -1079,8 +1102,9 @@ namespace bgfx { namespace d3d12 DX_RELEASE(m_factory, 0); #if USE_D3D12_DYNAMIC_LIB - bx::dlclose(m_d3d12dll); bx::dlclose(m_dxgidll); + bx::dlclose(m_d3d12dll); + bx::dlclose(m_kernel32dll); #endif // USE_D3D12_DYNAMIC_LIB } @@ -1357,7 +1381,7 @@ namespace bgfx { namespace d3d12 setResourceBarrier(m_commandList, backBuffer, D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_COPY_SOURCE); D3D12_TEXTURE_COPY_LOCATION dst = { readback, D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT, layout }; - D3D12_TEXTURE_COPY_LOCATION src = { backBuffer, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, { 0 } }; + D3D12_TEXTURE_COPY_LOCATION src = { backBuffer, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {} }; m_commandList->CopyTextureRegion(&dst, 0, 0, 0, &src, &box); setResourceBarrier(m_commandList, backBuffer, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_PRESENT); finish(); @@ -2125,7 +2149,7 @@ data.NumQualityLevels = 0; bx::seek(&wr, 0, bx::Whence::Begin); union { uint32_t offset; void* ptr; } cast = { - m_currentProgram->m_vsh->m_size/16 + uint32_t(m_currentProgram->m_vsh->m_size)/16 }; filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr); write(&wr, dxbc); @@ -2455,6 +2479,7 @@ data.NumQualityLevels = 0; m_commandList = NULL; } + void* m_kernel32dll; void* m_d3d12dll; void* m_dxgidll; @@ -2988,7 +3013,7 @@ data.NumQualityLevels = 0; m_size = _size; m_flags = _flags; - const bool needUav = 0 != (_flags & (BGFX_BUFFER_COMPUTE_WRITE|BGFX_BUFFER_DRAW_INDIRECT)); + const bool needUav = 0 != (_flags & (BGFX_BUFFER_COMPUTE_WRITE|BGFX_BUFFER_DRAW_INDIRECT) ); // const bool needSrv = 0 != (_flags & BGFX_BUFFER_COMPUTE_READ); const bool drawIndirect = 0 != (_flags & BGFX_BUFFER_DRAW_INDIRECT); m_dynamic = NULL == _data || needUav; @@ -3061,7 +3086,10 @@ data.NumQualityLevels = 0; m_ptr = createCommittedResource(device, HeapProperty::Default, _size, flags); m_gpuVA = m_ptr->GetGPUVirtualAddress(); - setState(commandList, D3D12_RESOURCE_STATE_GENERIC_READ); + setState(commandList, drawIndirect + ? D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT + : D3D12_RESOURCE_STATE_GENERIC_READ + ); if (!m_dynamic) { @@ -3646,8 +3674,9 @@ data.NumQualityLevels = 0; box.front = _z; box.back = _z+_depth; - D3D12_TEXTURE_COPY_LOCATION dst = { m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, { subres } }; - D3D12_TEXTURE_COPY_LOCATION src = { staging, D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT, layout }; + D3D12_TEXTURE_COPY_LOCATION dst = { m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {} }; + dst.SubresourceIndex = subres; + D3D12_TEXTURE_COPY_LOCATION src = { staging, D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT, layout }; _commandList->CopyTextureRegion(&dst, _rect.m_x, _rect.m_y, 0, &src, &box); setState(_commandList, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); @@ -3889,8 +3918,8 @@ data.NumQualityLevels = 0; float alphaRef = 0.0f; uint32_t blendFactor = 0; - const uint64_t pt = _render->m_debug&BGFX_DEBUG_WIREFRAME ? BGFX_STATE_PT_LINES : 0; - uint8_t primIndex = uint8_t(pt >> BGFX_STATE_PT_SHIFT); + const uint64_t primType = _render->m_debug&BGFX_DEBUG_WIREFRAME ? BGFX_STATE_PT_LINES : 0; + uint8_t primIndex = uint8_t(primType >> BGFX_STATE_PT_SHIFT); PrimInfo prim = s_primInfo[primIndex]; bool wasCompute = false; @@ -3992,12 +4021,12 @@ data.NumQualityLevels = 0; rc.bottom = viewScissorRect.m_y + viewScissorRect.m_height; m_commandList->RSSetScissorRects(1, &rc); - Clear& clear = _render->m_clear[view]; - if (BGFX_CLEAR_NONE != clear.m_flags) + Clear& clr = _render->m_clear[view]; + if (BGFX_CLEAR_NONE != clr.m_flags) { Rect clearRect = rect; clearRect.intersect(rect, viewScissorRect); - clearQuad(_clearQuad, clearRect, clear, _render->m_clearColor); + clearQuad(_clearQuad, clearRect, clr, _render->m_clearColor); } prim = s_primInfo[BX_COUNTOF(s_primName)]; // Force primitive type update. @@ -4011,7 +4040,6 @@ data.NumQualityLevels = 0; } const RenderCompute& compute = renderItem.compute; - bool programChanged = false; bool constantsChanged = compute.m_constBegin < compute.m_constEnd; rendererUpdateUniforms(this, _render->m_constantBuffer, compute.m_constBegin, compute.m_constEnd); @@ -4021,9 +4049,6 @@ data.NumQualityLevels = 0; ProgramD3D12& program = m_program[key.m_program]; m_currentProgram = &program; - - programChanged = - constantsChanged = true; } if (invalidHandle != programIdx) @@ -4140,6 +4165,7 @@ data.NumQualityLevels = 0; { if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) ) { + BX_UNUSED(s_viewNameW); // wchar_t* viewNameW = s_viewNameW[view]; // viewNameW[3] = L' '; // PIX_ENDEVENT(); @@ -4206,12 +4232,12 @@ data.NumQualityLevels = 0; { blendFactor = draw.m_rgba; - float blendFactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; - blendFactor[0] = ( (draw.m_rgba>>24) )/255.0f; - blendFactor[1] = ( (draw.m_rgba>>16)&0xff)/255.0f; - blendFactor[2] = ( (draw.m_rgba>> 8)&0xff)/255.0f; - blendFactor[3] = ( (draw.m_rgba )&0xff)/255.0f; - m_commandList->OMSetBlendFactor(blendFactor); + float bf[4]; + bf[0] = ( (draw.m_rgba>>24) )/255.0f; + bf[1] = ( (draw.m_rgba>>16)&0xff)/255.0f; + bf[2] = ( (draw.m_rgba>> 8)&0xff)/255.0f; + bf[3] = ( (draw.m_rgba )&0xff)/255.0f; + m_commandList->OMSetBlendFactor(bf); } if (BGFX_STATE_PT_MASK & changedFlags) @@ -4227,8 +4253,6 @@ data.NumQualityLevels = 0; if (isValid(draw.m_vertexBuffer) ) { - bool programChanged = false; - if (key.m_program != programIdx) { programIdx = key.m_program; @@ -4242,9 +4266,6 @@ data.NumQualityLevels = 0; ProgramD3D12& program = m_program[programIdx]; m_currentProgram = &program; } - - programChanged = - constantsChanged = true; } if (invalidHandle != programIdx) diff --git a/src/renderer_d3d12.h b/src/renderer_d3d12.h index 6755f80a..17b1315b 100644 --- a/src/renderer_d3d12.h +++ b/src/renderer_d3d12.h @@ -19,13 +19,17 @@ const GUID& __mingw_uuidof(); template<> const GUID& __mingw_uuidof<ID3D12Device>() { - static const GUID IID_ID3D12Device = { 0x189819f1, 0x1db6, 0x4b57, { 0xbe, 0x54, 0x18, 0x21, 0x33, 0x9b, 0x85, 0xf7 } }; - return IID_ID3D12Device; + static const GUID IID_ID3D12Device0 = { 0x189819f1, 0x1db6, 0x4b57, { 0xbe, 0x54, 0x18, 0x21, 0x33, 0x9b, 0x85, 0xf7 } }; + return IID_ID3D12Device0; } } #endif // defined(__MINGW32__) +BX_PRAGMA_DIAGNOSTIC_PUSH(); +BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wmissing-field-initializers"); #include <d3dx12.h> +BX_PRAGMA_DIAGNOSTIC_POP(); + #include <dxgi1_4.h> #include "renderer.h"