summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/renderer_d3d12.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d12.cpp')
-rw-r--r--3rdparty/bgfx/src/renderer_d3d12.cpp99
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;