Kaynağa Gözat

D3D12: Skip patching DXBC with Aon9 chunk.

Branimir Karadžić 9 yıl önce
ebeveyn
işleme
3afc13e521

+ 18 - 14
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;

+ 21 - 5
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;

+ 3 - 3
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;
 		}

+ 10 - 0
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<uint8_t> byteCode;
 	};
 
@@ -240,6 +248,8 @@ namespace bgfx
 
 	struct Dx9bc
 	{
+		Dx9bc() { /* not pod */ }
+
 		uint32_t version;
 		Dx9bcShader shader;
 	};

+ 10 - 6
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).

+ 9 - 0
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<uint8_t> byteCode;
 		bool shex;
+		bool aon9;
 	};
 
 	int32_t read(bx::ReaderSeekerI* _reader, DxbcShader& _shader, bx::Error* _err);

+ 8 - 0
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<uint8_t> byteCode;
 	};
 
@@ -607,6 +613,8 @@ namespace bgfx
 
 	struct SpirV
 	{
+		SpirV() { /* not pod */ }
+
 		struct Header
 		{
 			uint32_t magic;