From 3afc13e5210bdb5ff2d4f4c47568783c10d86cdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 9 Mar 2016 21:33:20 -0800 Subject: [PATCH] D3D12: Skip patching DXBC with Aon9 chunk. --- src/renderer_d3d11.cpp | 32 ++++++++++++++++++-------------- src/renderer_d3d12.cpp | 26 +++++++++++++++++++++----- src/shader_dx9bc.cpp | 6 +++--- src/shader_dx9bc.h | 10 ++++++++++ src/shader_dxbc.cpp | 16 ++++++++++------ src/shader_dxbc.h | 9 +++++++++ src/shader_spirv.h | 8 ++++++++ 7 files changed, 79 insertions(+), 28 deletions(-) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index b092f447d..8b897b75a 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -747,10 +747,10 @@ namespace bgfx { namespace d3d11 #if USE_D3D11_DYNAMIC_LIB m_d3d11dll = bx::dlopen("d3d11.dll"); - BX_WARN(NULL != m_d3d11dll, "Failed to load d3d11.dll."); if (NULL == m_d3d11dll) { + BX_TRACE("Failed to load d3d11.dll."); goto error; } @@ -777,25 +777,25 @@ namespace bgfx { namespace d3d11 } D3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE)bx::dlsym(m_d3d11dll, "D3D11CreateDevice"); - BX_WARN(NULL != D3D11CreateDevice, "Function D3D11CreateDevice not found."); if (NULL == D3D11CreateDevice) { + BX_TRACE("Function D3D11CreateDevice not found."); goto error; } m_dxgidll = bx::dlopen("dxgi.dll"); - BX_WARN(NULL != m_dxgidll, "Failed to load dxgi.dll."); if (NULL == m_dxgidll) { + BX_TRACE("Failed to load dxgi.dll."); goto error; } errorState = ErrorState::LoadedDXGI; CreateDXGIFactory = (PFN_CREATE_DXGI_FACTORY)bx::dlsym(m_dxgidll, "CreateDXGIFactory"); - BX_WARN(NULL != CreateDXGIFactory, "Function CreateDXGIFactory not found."); if (NULL == CreateDXGIFactory) { + BX_TRACE("Function CreateDXGIFactory not found."); goto error; } @@ -828,9 +828,9 @@ namespace bgfx { namespace d3d11 hr = S_OK; factory = NULL; #endif // BX_PLATFORM_* - BX_WARN(SUCCEEDED(hr), "Unable to create DXGI factory."); if (FAILED(hr) ) { + BX_TRACE("Unable to create DXGI factory."); goto error; } @@ -910,8 +910,10 @@ namespace bgfx { namespace d3d11 D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, +#if BX_PLATFORM_WINRT D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, +#endif // BX_PLATFORM_WINRT }; for (;;) @@ -965,10 +967,10 @@ namespace bgfx { namespace d3d11 break; } - BX_WARN(SUCCEEDED(hr), "Unable to create Direct3D11 device."); if (FAILED(hr) ) { + BX_TRACE("Unable to create Direct3D11 device."); goto error; } @@ -980,10 +982,10 @@ namespace bgfx { namespace d3d11 else { m_device->GetImmediateContext(&m_deviceCtx); - BX_WARN(NULL != m_deviceCtx, "Unable to create Direct3D11 device."); if (NULL == m_deviceCtx) { + BX_TRACE("Unable to create Direct3D11 device."); goto error; } } @@ -1020,9 +1022,9 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } } - BX_WARN(SUCCEEDED(hr), "Unable to create Direct3D11 device."); if (FAILED(hr) ) { + BX_TRACE("Unable to create Direct3D11 device."); goto error; } @@ -1045,9 +1047,9 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } hr = adapter->GetDesc(&m_adapterDesc); - BX_WARN(SUCCEEDED(hr), "Unable to create Direct3D11 device."); if (FAILED(hr) ) { + BX_TRACE("Unable to create Direct3D11 device."); DX_RELEASE(adapter, 2); goto error; } @@ -1062,10 +1064,10 @@ BX_PRAGMA_DIAGNOSTIC_POP(); { #if !BX_PLATFORM_WINDOWS hr = adapter->GetParent(__uuidof(IDXGIFactory2), (void**)&m_factory); - BX_WARN(SUCCEEDED(hr), "Unable to create Direct3D11 device."); DX_RELEASE(adapter, 2); if (FAILED(hr) ) { + BX_TRACE("Unable to create Direct3D11 device."); goto error; } @@ -1122,10 +1124,10 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } #else hr = adapter->GetParent(IID_IDXGIFactory, (void**)&m_factory); - BX_WARN(SUCCEEDED(hr), "Unable to create Direct3D11 device."); DX_RELEASE(adapter, 2); if (FAILED(hr) ) { + BX_TRACE("Unable to create Direct3D11 device."); goto error; } @@ -1152,9 +1154,9 @@ BX_PRAGMA_DIAGNOSTIC_POP(); | DXGI_MWA_NO_ALT_ENTER ) ); #endif // BX_PLATFORM_* - BX_WARN(SUCCEEDED(hr), "Failed to create swap chain."); if (FAILED(hr) ) { + BX_TRACE("Failed to create swap chain."); goto error; } } @@ -1867,9 +1869,9 @@ BX_PRAGMA_DIAGNOSTIC_POP(); void saveScreenShot(const char* _filePath) BX_OVERRIDE { - BX_WARN(NULL != m_swapChain, "Unable to capture screenshot %s.", _filePath); if (NULL == m_swapChain) { + BX_TRACE("Unable to capture screenshot %s.", _filePath); return; } @@ -5722,8 +5724,10 @@ BX_PRAGMA_DIAGNOSTIC_POP(); tvm.clear(); uint16_t pos = 0; tvm.printf(0, pos++, BGFX_CONFIG_DEBUG ? 0x89 : 0x8f - , " %s / " BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME " " + , " %s (FL %d.%d) / " BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME " " , getRendererName() + , (m_featureLevel >> 12) & 0xf + , (m_featureLevel >> 8) & 0xf ); const DXGI_ADAPTER_DESC& desc = m_adapterDesc; diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index ac7f95f2f..b62bd5875 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -457,7 +457,11 @@ namespace bgfx { namespace d3d12 struct RendererContextD3D12 : public RendererContextI { RendererContextD3D12() - : m_wireframe(false) + : m_d3d12dll(NULL) + , m_dxgidll(NULL) + , m_renderdocdll(NULL) + , m_featureLevel(D3D_FEATURE_LEVEL(0) ) + , m_wireframe(false) , m_maxAnisotropy(1) , m_depthClamp(false) , m_fsChanges(0) @@ -660,12 +664,13 @@ namespace bgfx { namespace d3d12 , (featureLevel[ii] >> 12) & 0xf , (featureLevel[ii] >> 8) & 0xf ); + m_featureLevel = featureLevel[ii]; } - BX_WARN(SUCCEEDED(hr), "Unable to create Direct3D12 device."); } if (FAILED(hr) ) { + BX_TRACE("Unable to create Direct3D12 device."); goto error; } @@ -2261,8 +2266,9 @@ data.NumQualityLevels = 0; bx::Error err; read(&rd, dxbc, &err); - bool patchShader = true; - if (BX_ENABLED(BGFX_CONFIG_DEBUG) ) + bool patchShader = !dxbc.shader.aon9; + if (BX_ENABLED(BGFX_CONFIG_DEBUG) + && patchShader) { union { uint32_t offset; void* ptr; } cast = { 0 }; filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr); @@ -2307,6 +2313,11 @@ data.NumQualityLevels = 0; desc.PS.pShaderBytecode = temp->data; desc.PS.BytecodeLength = temp->size; } + else + { + desc.PS.pShaderBytecode = program.m_fsh->m_code->data; + desc.PS.BytecodeLength = program.m_fsh->m_code->size; + } desc.DS.pShaderBytecode = NULL; desc.DS.BytecodeLength = 0; @@ -2643,6 +2654,9 @@ data.NumQualityLevels = 0; void* m_kernel32dll; void* m_d3d12dll; void* m_dxgidll; + void* m_renderdocdll; + + D3D_FEATURE_LEVEL m_featureLevel; D3D_DRIVER_TYPE m_driverType; DXGI_ADAPTER_DESC m_adapterDesc; @@ -5273,8 +5287,10 @@ data.NumQualityLevels = 0; tvm.clear(); uint16_t pos = 0; tvm.printf(0, pos++, BGFX_CONFIG_DEBUG ? 0x89 : 0x8f - , " %s / " BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME " " + , " %s (FL %d.%d) / " BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME " " , getRendererName() + , (m_featureLevel >> 12) & 0xf + , (m_featureLevel >> 8) & 0xf ); const DXGI_ADAPTER_DESC& desc = m_adapterDesc; diff --git a/src/shader_dx9bc.cpp b/src/shader_dx9bc.cpp index bb2b6a0e4..122ff3aba 100644 --- a/src/shader_dx9bc.cpp +++ b/src/shader_dx9bc.cpp @@ -282,9 +282,9 @@ namespace bgfx size += bx::read(_reader, token, _err); _subOperand.type = Dx9bcOperandType::Enum( ( (token & UINT32_C(0x70000000) ) >> 28) - | ( (token & UINT32_C(0x00001800) ) >> 8) ); + | ( (token & UINT32_C(0x00001800) ) >> 8) ); _subOperand.regIndex = (token & UINT32_C(0x000007ff) ); - _subOperand.swizzleBits = uint8_t( (token & UINT32_C(0x00ff0000) ) >> 16); + _subOperand.swizzleBits = uint8_t( (token & UINT32_C(0x00ff0000) ) >> 16); return size; } @@ -741,7 +741,7 @@ namespace bgfx _fn(instruction, _userData); - write(&writer, instruction); + write(&writer, instruction, _err); token += instruction.length; } diff --git a/src/shader_dx9bc.h b/src/shader_dx9bc.h index 0680d641a..95338c8a8 100644 --- a/src/shader_dx9bc.h +++ b/src/shader_dx9bc.h @@ -187,6 +187,8 @@ namespace bgfx struct Dx9bcSubOperand { + Dx9bcSubOperand() { /* not pod */ } + Dx9bcOperandType::Enum type; uint32_t regIndex; uint8_t swizzleBits; @@ -194,6 +196,8 @@ namespace bgfx struct Dx9bcOperand { + Dx9bcOperand() { /* not pod */ } + Dx9bcOperandType::Enum type; uint32_t regIndex; @@ -214,6 +218,8 @@ namespace bgfx struct Dx9bcInstruction { + Dx9bcInstruction() { /* not pod */ } + Dx9bcOpcode::Enum opcode; uint16_t length; uint8_t numOperands; @@ -232,6 +238,8 @@ namespace bgfx struct Dx9bcShader { + Dx9bcShader() { /* not pod */ } + stl::vector byteCode; }; @@ -240,6 +248,8 @@ namespace bgfx struct Dx9bc { + Dx9bc() { /* not pod */ } + uint32_t version; Dx9bcShader shader; }; diff --git a/src/shader_dxbc.cpp b/src/shader_dxbc.cpp index 9f8b351e7..780688a3e 100644 --- a/src/shader_dxbc.cpp +++ b/src/shader_dxbc.cpp @@ -790,7 +790,7 @@ namespace bgfx case DxbcOperandAddrMode::Reg: { DxbcSubOperand subOperand; - size += read(_reader, subOperand); + size += read(_reader, subOperand, _err); } break; @@ -799,7 +799,7 @@ namespace bgfx size += bx::read(_reader, _subOperand.regIndex, _err); DxbcSubOperand subOperand; - size += read(_reader, subOperand); + size += read(_reader, subOperand, _err); } break; @@ -809,7 +809,7 @@ namespace bgfx size += bx::read(_reader, _subOperand.regIndex, _err); DxbcSubOperand subOperand; - size += read(_reader, subOperand); + size += read(_reader, subOperand, _err); } break; @@ -843,7 +843,7 @@ namespace bgfx case DxbcOperandAddrMode::Reg: { DxbcSubOperand subOperand; - size += write(_writer, subOperand); + size += write(_writer, subOperand, _err); } break; @@ -852,7 +852,7 @@ namespace bgfx size += bx::write(_writer, _subOperand.regIndex, _err); DxbcSubOperand subOperand; - size += write(_writer, subOperand); + size += write(_writer, subOperand, _err); } break; @@ -862,7 +862,7 @@ namespace bgfx size += bx::write(_writer, _subOperand.regIndex, _err); DxbcSubOperand subOperand; - size += write(_writer, subOperand); + size += write(_writer, subOperand, _err); } break; @@ -1747,6 +1747,7 @@ namespace bgfx int32_t size = 0; size += bx::read(_reader, _dxbc.header, _err); _dxbc.shader.shex = false; + _dxbc.shader.aon9 = false; for (uint32_t ii = 0; ii < _dxbc.header.numChunks; ++ii) { @@ -1785,6 +1786,9 @@ namespace bgfx break; case BX_MAKEFOURCC('A', 'o', 'n', '9'): // Contains DX9BC for feature level 9.x (*s_4_0_level_9_*) shaders. + _dxbc.shader.aon9 = true; + break; + case BX_MAKEFOURCC('I', 'F', 'C', 'E'): // Interface. case BX_MAKEFOURCC('R', 'D', 'E', 'F'): // Resource definition. case BX_MAKEFOURCC('S', 'D', 'G', 'B'): // Shader debugging info (old). diff --git a/src/shader_dxbc.h b/src/shader_dxbc.h index 381fd2f79..0216ec808 100644 --- a/src/shader_dxbc.h +++ b/src/shader_dxbc.h @@ -448,6 +448,8 @@ namespace bgfx struct DxbcSubOperand { + DxbcSubOperand() { /* not pod */ } + DxbcOperandType::Enum type; uint8_t mode; uint8_t modeBits; @@ -459,6 +461,8 @@ namespace bgfx struct DxbcOperand { + DxbcOperand() { /* not pod */ } + DxbcOperandType::Enum type; DxbcOperandMode::Enum mode; uint8_t modeBits; @@ -480,6 +484,8 @@ namespace bgfx struct DxbcInstruction { + DxbcInstruction() { /* not pod */ } + struct ExtendedType { enum Enum @@ -546,6 +552,8 @@ namespace bgfx struct DxbcSignature { + DxbcSignature() { /* not pod */ } + struct Element { stl::string name; @@ -570,6 +578,7 @@ namespace bgfx uint32_t version; stl::vector byteCode; bool shex; + bool aon9; }; int32_t read(bx::ReaderSeekerI* _reader, DxbcShader& _shader, bx::Error* _err); diff --git a/src/shader_spirv.h b/src/shader_spirv.h index 9a7c81b1a..a21bbf93f 100644 --- a/src/shader_spirv.h +++ b/src/shader_spirv.h @@ -524,6 +524,8 @@ namespace bgfx struct SpvOperand { + SpvOperand() { /* not pod */ } + enum Enum { AccessQualifier, @@ -575,6 +577,8 @@ namespace bgfx struct SpvInstruction { + SpvInstruction() { /* not pod */ } + SpvOpcode::Enum opcode; uint16_t length; uint16_t numOperands; @@ -593,6 +597,8 @@ namespace bgfx struct SpvShader { + SpvShader() { /* not pod */ } + stl::vector byteCode; }; @@ -607,6 +613,8 @@ namespace bgfx struct SpirV { + SpirV() { /* not pod */ } + struct Header { uint32_t magic;