diff options
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d12.cpp')
-rw-r--r-- | 3rdparty/bgfx/src/renderer_d3d12.cpp | 99 |
1 files changed, 65 insertions, 34 deletions
diff --git a/3rdparty/bgfx/src/renderer_d3d12.cpp b/3rdparty/bgfx/src/renderer_d3d12.cpp index 06bc0632536..40366c59078 100644 --- a/3rdparty/bgfx/src/renderer_d3d12.cpp +++ b/3rdparty/bgfx/src/renderer_d3d12.cpp @@ -8,10 +8,6 @@ #if BGFX_CONFIG_RENDERER_DIRECT3D12 # include "renderer_d3d12.h" -# if !USE_D3D12_DYNAMIC_LIB -# pragma comment(lib, "D3D12.lib") -# endif // !USE_D3D12_DYNAMIC_LIB - namespace bgfx { namespace d3d12 { static wchar_t s_viewNameW[BGFX_CONFIG_MAX_VIEWS][256]; @@ -461,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) @@ -664,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; } @@ -907,6 +908,7 @@ namespace bgfx { namespace d3d12 | BGFX_CAPS_TEXTURE_BLIT | BGFX_CAPS_TEXTURE_READ_BACK | BGFX_CAPS_OCCLUSION_QUERY + | BGFX_CAPS_ALPHA_TO_COVERAGE ); g_caps.maxTextureSize = 16384; g_caps.maxFBAttachments = uint8_t(bx::uint32_min(16, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) ); @@ -1083,6 +1085,7 @@ namespace bgfx { namespace d3d12 bx::dlclose(m_kernel32dll); #endif // USE_D3D12_DYNAMIC_LIB case ErrorState::Default: + default: break; } @@ -1374,7 +1377,6 @@ namespace bgfx { namespace d3d12 bx::write(&writer, magic); TextureCreate tc; - tc.m_flags = texture.m_flags; tc.m_width = _width; tc.m_height = _height; tc.m_sides = 0; @@ -1386,7 +1388,7 @@ namespace bgfx { namespace d3d12 bx::write(&writer, tc); texture.destroy(); - texture.create(mem, tc.m_flags, 0); + texture.create(mem, texture.m_flags, 0); release(mem); } @@ -1770,7 +1772,12 @@ data.NumQualityLevels = 0; m_pipelineStateCache.invalidate(); } - uint32_t flags = _resolution.m_flags & ~(BGFX_RESET_HMD_RECENTER | BGFX_RESET_MAXANISOTROPY | BGFX_RESET_DEPTH_CLAMP); + uint32_t flags = _resolution.m_flags & ~(0 + | BGFX_RESET_HMD_RECENTER + | BGFX_RESET_MAXANISOTROPY + | BGFX_RESET_DEPTH_CLAMP + | BGFX_RESET_SUSPEND + ); if (m_resolution.m_width != _resolution.m_width || m_resolution.m_height != _resolution.m_height @@ -1855,7 +1862,7 @@ data.NumQualityLevels = 0; void commitShaderConstants(uint16_t _programIdx, D3D12_GPU_VIRTUAL_ADDRESS& _gpuAddress) { - ProgramD3D12& program = m_program[_programIdx]; + const ProgramD3D12& program = m_program[_programIdx]; uint32_t total = bx::strideAlign(0 + program.m_vsh->m_size + (NULL != program.m_fsh ? program.m_fsh->m_size : 0) @@ -1967,7 +1974,7 @@ data.NumQualityLevels = 0; void setBlendState(D3D12_BLEND_DESC& _desc, uint64_t _state, uint32_t _rgba = 0) { - _desc.AlphaToCoverageEnable = false; + _desc.AlphaToCoverageEnable = !!(BGFX_STATE_BLEND_ALPHA_TO_COVERAGE & _state); _desc.IndependentBlendEnable = !!(BGFX_STATE_BLEND_INDEPENDENT & _state); D3D12_RENDER_TARGET_BLEND_DESC* drt = &_desc.RenderTarget[0]; @@ -2052,14 +2059,17 @@ data.NumQualityLevels = 0; ; _desc.CullMode = s_cullMode[cull]; _desc.FrontCounterClockwise = false; - _desc.DepthBias = 0; - _desc.DepthBiasClamp = 0.0f; - _desc.SlopeScaledDepthBias = 0.0f; - _desc.DepthClipEnable = !m_depthClamp; - _desc.MultisampleEnable = !!(_state&BGFX_STATE_MSAA); - _desc.AntialiasedLineEnable = false; - _desc.ForcedSampleCount = 0; - _desc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF; + _desc.DepthBias = 0; + _desc.DepthBiasClamp = 0.0f; + _desc.SlopeScaledDepthBias = 0.0f; + _desc.DepthClipEnable = !m_depthClamp; + _desc.MultisampleEnable = !!(_state&BGFX_STATE_MSAA); + _desc.AntialiasedLineEnable = !!(_state&BGFX_STATE_LINEAA); + _desc.ForcedSampleCount = 0; + _desc.ConservativeRaster = !!(_state&BGFX_STATE_CONSERVATIVE_RASTER) + ? D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON + : D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF + ; } void setDepthStencilState(D3D12_DEPTH_STENCIL_DESC& _desc, uint64_t _state, uint64_t _stencil = 0) @@ -2204,8 +2214,11 @@ data.NumQualityLevels = 0; | BGFX_STATE_BLEND_MASK | BGFX_STATE_BLEND_EQUATION_MASK | BGFX_STATE_BLEND_INDEPENDENT + | BGFX_STATE_BLEND_ALPHA_TO_COVERAGE | BGFX_STATE_CULL_MASK | BGFX_STATE_MSAA + | BGFX_STATE_LINEAA + | BGFX_STATE_CONSERVATIVE_RASTER | BGFX_STATE_PT_MASK ; @@ -2259,8 +2272,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); @@ -2305,6 +2319,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; @@ -2641,6 +2660,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; @@ -2772,12 +2794,12 @@ data.NumQualityLevels = 0; DX_RELEASE(m_heap, 0); } - void ScratchBufferD3D12::reset(D3D12_GPU_DESCRIPTOR_HANDLE& gpuHandle) + void ScratchBufferD3D12::reset(D3D12_GPU_DESCRIPTOR_HANDLE& _gpuHandle) { m_pos = 0; m_cpuHandle = m_heap->GetCPUDescriptorHandleForHeapStart(); m_gpuHandle = m_heap->GetGPUDescriptorHandleForHeapStart(); - gpuHandle = m_gpuHandle; + _gpuHandle = m_gpuHandle; } void* ScratchBufferD3D12::allocCbv(D3D12_GPU_VIRTUAL_ADDRESS& _gpuAddress, uint32_t _size) @@ -4721,8 +4743,8 @@ data.NumQualityLevels = 0; box.bottom = blit.m_srcY + height;; box.back = blit.m_srcZ + bx::uint32_imax(1, depth); - D3D12_TEXTURE_COPY_LOCATION dstLocation = { dst.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ 0 }} }; - D3D12_TEXTURE_COPY_LOCATION srcLocation = { src.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ 0 }} }; + D3D12_TEXTURE_COPY_LOCATION dstLocation = { dst.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{}} }; + D3D12_TEXTURE_COPY_LOCATION srcLocation = { src.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{}} }; m_commandList->CopyTextureRegion(&dstLocation , blit.m_dstX , blit.m_dstY @@ -4734,12 +4756,12 @@ data.NumQualityLevels = 0; else { D3D12_BOX box; - box.left = blit.m_srcX; - box.top = blit.m_srcY; - box.front = 0; - box.right = blit.m_srcX + width; - box.bottom = blit.m_srcY + height;; - box.back = 1; + box.left = blit.m_srcX; + box.top = blit.m_srcY; + box.front = 0; + box.right = blit.m_srcX + width; + box.bottom = blit.m_srcY + height;; + box.back = 1; const uint32_t srcZ = TextureD3D12::TextureCube == src.m_type ? blit.m_srcZ @@ -4750,8 +4772,15 @@ data.NumQualityLevels = 0; : 0 ; - D3D12_TEXTURE_COPY_LOCATION dstLocation = { dst.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ dstZ*dst.m_numMips+blit.m_dstMip }} }; - D3D12_TEXTURE_COPY_LOCATION srcLocation = { src.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {{ srcZ*src.m_numMips+blit.m_srcMip }} }; + D3D12_TEXTURE_COPY_LOCATION dstLocation; + dstLocation.pResource = dst.m_ptr; + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = dstZ*dst.m_numMips+blit.m_dstMip; + D3D12_TEXTURE_COPY_LOCATION srcLocation; + srcLocation.pResource = src.m_ptr; + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + srcLocation.SubresourceIndex = srcZ*src.m_numMips+blit.m_srcMip; + bool depthStencil = isDepth(TextureFormat::Enum(src.m_textureFormat) ); m_commandList->CopyTextureRegion(&dstLocation , blit.m_dstX @@ -5271,8 +5300,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; |