diff options
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d12.h')
-rw-r--r-- | 3rdparty/bgfx/src/renderer_d3d12.h | 80 |
1 files changed, 50 insertions, 30 deletions
diff --git a/3rdparty/bgfx/src/renderer_d3d12.h b/3rdparty/bgfx/src/renderer_d3d12.h index 216159f37d4..f578f1a385b 100644 --- a/3rdparty/bgfx/src/renderer_d3d12.h +++ b/3rdparty/bgfx/src/renderer_d3d12.h @@ -1,15 +1,17 @@ /* - * Copyright 2011-2018 Branimir Karadzic. All rights reserved. - * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause + * Copyright 2011-2022 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE */ #ifndef BGFX_RENDERER_D3D12_H_HEADER_GUARD #define BGFX_RENDERER_D3D12_H_HEADER_GUARD -#define USE_D3D12_DYNAMIC_LIB BX_PLATFORM_WINDOWS +#define USE_D3D12_DYNAMIC_LIB (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX) #include <sal.h> -#if BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT +#include <unknwn.h> + +#if BX_PLATFORM_LINUX || BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT # include <d3d12.h> #else # if !BGFX_CONFIG_DEBUG @@ -20,8 +22,14 @@ #if defined(__MINGW32__) // BK - temp workaround for MinGW until I nuke d3dx12 usage. extern "C++" { +# if defined(__cpp_constexpr) && __cpp_constexpr >= 200704L \ + && defined(__cpp_inline_variables) && __cpp_inline_variables >= 201606L + __extension__ template<typename Ty> + constexpr const GUID& __mingw_uuidof(); +# else __extension__ template<typename Ty> const GUID& __mingw_uuidof(); +# endif // __cpp_* template<> const GUID& __mingw_uuidof<ID3D12Device>() @@ -32,19 +40,6 @@ extern "C++" { } #endif // defined(__MINGW32__) -BX_PRAGMA_DIAGNOSTIC_PUSH(); -BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wmissing-field-initializers"); -#if BX_PLATFORM_XBOXONE -# include <d3dx12_x.h> -#else -# include <d3dx12.h> -#endif // BX_PLATFORM_XBOXONE -BX_PRAGMA_DIAGNOSTIC_POP(); - -#ifndef D3D12_TEXTURE_DATA_PITCH_ALIGNMENT -# define D3D12_TEXTURE_DATA_PITCH_ALIGNMENT 1024 -#endif // D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - #include "renderer.h" #include "renderer_d3d.h" #include "shader_dxbc.h" @@ -52,7 +47,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); #include "nvapi.h" #include "dxgi.h" -#if BGFX_CONFIG_DEBUG_PIX +#if BGFX_CONFIG_DEBUG_ANNOTATION && !BX_PLATFORM_LINUX # if BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT typedef struct PIXEventsThreadInfo* (WINAPI* PFN_PIX_GET_THREAD_INFO)(); typedef uint64_t (WINAPI* PFN_PIX_EVENTS_REPLACE_BLOCK)(bool _getEarliestTime); @@ -80,7 +75,25 @@ extern "C" uint64_t WINAPI bgfx_PIXEventsReplaceBlock(bool _g # define PIX3_BEGINEVENT(_commandList, _color, _name) BX_UNUSED(_commandList, _color, _name) # define PIX3_SETMARKER(_commandList, _color, _name) BX_UNUSED(_commandList, _color, _name) # define PIX3_ENDEVENT(_commandList) BX_UNUSED(_commandList) -#endif // BGFX_CONFIG_DEBUG_PIX +#endif // BGFX_CONFIG_DEBUG_ANNOTATION + +#define BGFX_D3D12_PROFILER_BEGIN(_view, _abgr) \ + BX_MACRO_BLOCK_BEGIN \ + PIX3_BEGINEVENT(m_commandList, _abgr, s_viewName[_view]); \ + BGFX_PROFILER_BEGIN(s_viewName[view], _abgr); \ + BX_MACRO_BLOCK_END + +#define BGFX_D3D12_PROFILER_BEGIN_LITERAL(_name, _abgr) \ + BX_MACRO_BLOCK_BEGIN \ + PIX3_BEGINEVENT(m_commandList, _abgr, "" _name); \ + BGFX_PROFILER_BEGIN_LITERAL("" _name, _abgr); \ + BX_MACRO_BLOCK_END + +#define BGFX_D3D12_PROFILER_END() \ + BX_MACRO_BLOCK_BEGIN \ + BGFX_PROFILER_END(); \ + PIX3_ENDEVENT(m_commandList); \ + BX_MACRO_BLOCK_END namespace bgfx { namespace d3d12 { @@ -206,9 +219,9 @@ namespace bgfx { namespace d3d12 struct VertexBufferD3D12 : public BufferD3D12 { - void create(uint32_t _size, void* _data, VertexDeclHandle _declHandle, uint16_t _flags); + void create(uint32_t _size, void* _data, VertexLayoutHandle _layoutHandle, uint16_t _flags); - VertexDeclHandle m_decl; + VertexLayoutHandle m_layoutHandle; }; struct ShaderD3D12 @@ -264,14 +277,14 @@ namespace bgfx { namespace d3d12 void create(const ShaderD3D12* _vsh, const ShaderD3D12* _fsh) { - BX_CHECK(NULL != _vsh->m_code, "Vertex shader doesn't exist."); + BX_ASSERT(NULL != _vsh->m_code, "Vertex shader doesn't exist."); m_vsh = _vsh; bx::memCopy(&m_predefined[0], _vsh->m_predefined, _vsh->m_numPredefined*sizeof(PredefinedUniform)); m_numPredefined = _vsh->m_numPredefined; if (NULL != _fsh) { - BX_CHECK(NULL != _fsh->m_code, "Fragment shader doesn't exist."); + BX_ASSERT(NULL != _fsh->m_code, "Fragment shader doesn't exist."); m_fsh = _fsh; bx::memCopy(&m_predefined[m_numPredefined], _fsh->m_predefined, _fsh->m_numPredefined*sizeof(PredefinedUniform)); m_numPredefined += _fsh->m_numPredefined; @@ -303,6 +316,7 @@ namespace bgfx { namespace d3d12 TextureD3D12() : m_ptr(NULL) + , m_singleMsaa(NULL) , m_directAccessPtr(NULL) , m_state(D3D12_RESOURCE_STATE_COMMON) , m_numMips(0) @@ -313,19 +327,22 @@ namespace bgfx { namespace d3d12 void* create(const Memory* _mem, uint64_t _flags, uint8_t _skip); void destroy(); + void overrideInternal(uintptr_t _ptr); void update(ID3D12GraphicsCommandList* _commandList, uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem); - void resolve(uint8_t _resolve) const; + void resolve(ID3D12GraphicsCommandList* _commandList, uint8_t _resolve, uint32_t _layer, uint32_t _numLayers, uint32_t _mip); D3D12_RESOURCE_STATES setState(ID3D12GraphicsCommandList* _commandList, D3D12_RESOURCE_STATES _state); D3D12_SHADER_RESOURCE_VIEW_DESC m_srvd; D3D12_UNORDERED_ACCESS_VIEW_DESC m_uavd; ID3D12Resource* m_ptr; + ID3D12Resource* m_singleMsaa; void* m_directAccessPtr; D3D12_RESOURCE_STATES m_state; uint64_t m_flags; uint32_t m_width; uint32_t m_height; uint32_t m_depth; + uint32_t m_numLayers; uint16_t m_samplerIdx; uint8_t m_type; uint8_t m_requestedFormat; @@ -390,7 +407,7 @@ namespace bgfx { namespace d3d12 void finish(uint64_t _waitFence = UINT64_MAX, bool _finishAll = false); bool tryFinish(uint64_t _waitFence); void release(ID3D12Resource* _ptr); - bool consume(uint32_t _ms = INFINITE); + bool consume(uint32_t _ms = UINT32_MAX); struct CommandList { @@ -500,29 +517,32 @@ namespace bgfx { namespace d3d12 void init(); void shutdown(); - uint32_t begin(uint32_t _resultIdx); + uint32_t begin(uint32_t _resultIdx, uint32_t _frameNum); void end(uint32_t _idx); bool update(); struct Query { uint32_t m_resultIdx; - bool m_ready; + uint32_t m_frameNum; uint64_t m_fence; + bool m_ready; }; struct Result { void reset() { - m_begin = 0; - m_end = 0; - m_pending = 0; + m_begin = 0; + m_end = 0; + m_pending = 0; + m_frameNum = 0; } uint64_t m_begin; uint64_t m_end; uint32_t m_pending; + uint32_t m_frameNum; }; uint64_t m_frequency; |