summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/renderer_d3d11.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d11.cpp')
-rw-r--r--3rdparty/bgfx/src/renderer_d3d11.cpp205
1 files changed, 136 insertions, 69 deletions
diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp
index 20ac1323d98..24df2fd71d2 100644
--- a/3rdparty/bgfx/src/renderer_d3d11.cpp
+++ b/3rdparty/bgfx/src/renderer_d3d11.cpp
@@ -627,6 +627,7 @@ namespace bgfx { namespace d3d11
if (SUCCEEDED(hr) )
{
+#if BX_COMPILER_MSVC
BX_PRAGMA_DIAGNOSTIC_PUSH();
BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4530) // warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
try
@@ -641,6 +642,9 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4530) // warning C4530: C++ exception handler
hr = E_FAIL;
}
BX_PRAGMA_DIAGNOSTIC_POP();
+#else
+ hr = device->GetAdapter(&adapter);
+#endif // BX_COMPILER_MSVC
}
}
BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create Direct3D11 device.");
@@ -682,6 +686,12 @@ BX_PRAGMA_DIAGNOSTIC_POP();
, NULL
, &m_swapChain
);
+ BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Failed to create swap chain.");
+
+ DX_CHECK(m_factory->MakeWindowAssociation(g_bgfxHwnd, 0
+ | DXGI_MWA_NO_WINDOW_CHANGES
+ | DXGI_MWA_NO_ALT_ENTER
+ ) );
#else
hr = adapter->GetParent(IID_IDXGIFactory, (void**)&m_factory);
BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create Direct3D11 device.");
@@ -704,13 +714,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
, &m_scd
, &m_swapChain
);
-#endif // BX_PLATFORM_WINRT
BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Failed to create swap chain.");
-
- DX_CHECK(m_factory->MakeWindowAssociation(g_bgfxHwnd, 0
- | DXGI_MWA_NO_WINDOW_CHANGES
- | DXGI_MWA_NO_ALT_ENTER
- ) );
+#endif // BX_PLATFORM_WINRT
m_numWindows = 1;
@@ -765,6 +770,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
| (getIntelExtensions(m_device) ? BGFX_CAPS_FRAGMENT_ORDERING : 0)
| BGFX_CAPS_SWAP_CHAIN
| (m_ovr.isInitialized() ? BGFX_CAPS_HMD : 0)
+ | BGFX_CAPS_INDEX32
);
g_caps.maxTextureSize = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION;
g_caps.maxFBAttachments = uint8_t(bx::uint32_min(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) );
@@ -972,6 +978,35 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{
}
+ void resizeTexture(TextureHandle _handle, uint16_t _width, uint16_t _height) BX_OVERRIDE
+ {
+ TextureD3D11& texture = m_textures[_handle.idx];
+
+ uint32_t size = sizeof(uint32_t) + sizeof(TextureCreate);
+ const Memory* mem = alloc(size);
+
+ bx::StaticMemoryBlockWriter writer(mem->data, mem->size);
+ uint32_t magic = BGFX_CHUNK_MAGIC_TEX;
+ bx::write(&writer, magic);
+
+ TextureCreate tc;
+ tc.m_flags = texture.m_flags;
+ tc.m_width = _width;
+ tc.m_height = _height;
+ tc.m_sides = 0;
+ tc.m_depth = 0;
+ tc.m_numMips = 1;
+ tc.m_format = texture.m_requestedFormat;
+ tc.m_cubeMap = false;
+ tc.m_mem = NULL;
+ bx::write(&writer, tc);
+
+ texture.destroy();
+ texture.create(mem, tc.m_flags, 0);
+
+ release(mem);
+ }
+
void destroyTexture(TextureHandle _handle) BX_OVERRIDE
{
m_textures[_handle.idx].destroy();
@@ -1165,7 +1200,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
deviceCtx->IASetIndexBuffer(ib.m_ptr, DXGI_FORMAT_R16_UINT, 0);
float proj[16];
- mtxOrtho(proj, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 1000.0f);
+ bx::mtxOrtho(proj, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 1000.0f);
PredefinedUniform& predefined = program.m_predefined[0];
uint8_t flags = predefined.m_type;
@@ -1198,6 +1233,11 @@ BX_PRAGMA_DIAGNOSTIC_POP();
DX_RELEASE(m_backBufferDepthStencil, 0);
DX_RELEASE(m_backBufferColor, 0);
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_frameBuffers); ++ii)
+ {
+ m_frameBuffers[ii].preReset();
+ }
+
// invalidateCache();
capturePreReset();
@@ -1239,6 +1279,11 @@ BX_PRAGMA_DIAGNOSTIC_POP();
m_currentColor = m_backBufferColor;
m_currentDepthStencil = m_backBufferDepthStencil;
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_frameBuffers); ++ii)
+ {
+ m_frameBuffers[ii].postReset();
+ }
+
capturePostReset();
}
@@ -1252,7 +1297,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
;
}
- void flip() BX_OVERRIDE
+ void flip(HMD& _hmd) BX_OVERRIDE
{
if (NULL != m_swapChain)
{
@@ -1269,7 +1314,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
if (SUCCEEDED(hr) )
{
- if (!m_ovr.swap() )
+ if (!m_ovr.swap(_hmd) )
{
hr = m_swapChain->Present(syncInterval, 0);
}
@@ -1555,7 +1600,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
for (uint32_t ii = 0; ii < _numInstanceData; ++ii)
{
- uint32_t index = 8-_numInstanceData+ii;
+ uint32_t index = 7-ii; // TEXCOORD7 = i_data0, TEXCOORD6 = i_data1, etc.
uint32_t jj;
D3D11_INPUT_ELEMENT_DESC* curr = vertexElements;
@@ -2360,8 +2405,9 @@ BX_PRAGMA_DIAGNOSTIC_POP();
void BufferD3D11::create(uint32_t _size, void* _data, uint8_t _flags, uint16_t _stride, bool _vertex)
{
- m_uav = NULL;
- m_size = _size;
+ m_uav = NULL;
+ m_size = _size;
+ m_flags = _flags;
const bool needUav = 0 != (_flags & BGFX_BUFFER_COMPUTE_WRITE);
const bool needSrv = 0 != (_flags & BGFX_BUFFER_COMPUTE_READ);
@@ -2377,9 +2423,13 @@ BX_PRAGMA_DIAGNOSTIC_POP();
desc.MiscFlags = 0;
desc.StructureByteStride = 0;
- DXGI_FORMAT format = _vertex
+ const DXGI_FORMAT indexFormat = 0 == (_flags & BGFX_BUFFER_INDEX32)
+ ? DXGI_FORMAT_R16_UINT
+ : DXGI_FORMAT_R32_UINT
+ ;
+ const DXGI_FORMAT format = _vertex
? DXGI_FORMAT_R32G32B32A32_FLOAT
- : DXGI_FORMAT_R16_UINT
+ : indexFormat
;
ID3D11Device* device = s_renderD3D11->m_device;
@@ -2451,7 +2501,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
ID3D11DeviceContext* deviceCtx = s_renderD3D11->m_deviceCtx;
BX_CHECK(m_dynamic, "Must be dynamic!");
-#if 1
+#if 0
BX_UNUSED(_discard);
ID3D11Device* device = s_renderD3D11->m_device;
@@ -2508,7 +2558,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
: 0
;
- BufferD3D11::create(_size, _data, _flags, stride);
+ BufferD3D11::create(_size, _data, _flags, stride, true);
}
void ShaderD3D11::create(const Memory* _mem)
@@ -2921,15 +2971,15 @@ BX_PRAGMA_DIAGNOSTIC_POP();
ID3D11DeviceContext* deviceCtx = s_renderD3D11->m_deviceCtx;
D3D11_BOX box;
- box.left = _rect.m_x;
- box.top = _rect.m_y;
- box.right = box.left + _rect.m_width;
+ box.left = _rect.m_x;
+ box.top = _rect.m_y;
+ box.right = box.left + _rect.m_width;
box.bottom = box.top + _rect.m_height;
- box.front = _z;
- box.back = box.front + _depth;
+ box.front = _z;
+ box.back = box.front + _depth;
const uint32_t subres = _mip + (_side * m_numMips);
- const uint32_t bpp = getBitsPerPixel(TextureFormat::Enum(m_textureFormat) );
+ const uint32_t bpp = getBitsPerPixel(TextureFormat::Enum(m_textureFormat) );
const uint32_t rectpitch = _rect.m_width*bpp/8;
const uint32_t srcpitch = UINT16_MAX == _pitch ? rectpitch : _pitch;
@@ -2976,35 +3026,10 @@ BX_PRAGMA_DIAGNOSTIC_POP();
m_dsv = NULL;
m_swapChain = NULL;
- m_num = 0;
- for (uint32_t ii = 0; ii < _num; ++ii)
- {
- TextureHandle handle = _handles[ii];
- if (isValid(handle) )
- {
- const TextureD3D11& texture = s_renderD3D11->m_textures[handle.idx];
- if (isDepth( (TextureFormat::Enum)texture.m_textureFormat) )
- {
- BX_CHECK(NULL == m_dsv, "Frame buffer already has depth-stencil attached.");
+ m_numTh = _num;
+ memcpy(m_th, _handles, _num*sizeof(TextureHandle) );
- const uint32_t msaaQuality = bx::uint32_satsub( (texture.m_flags&BGFX_TEXTURE_RT_MSAA_MASK)>>BGFX_TEXTURE_RT_MSAA_SHIFT, 1);
- const DXGI_SAMPLE_DESC& msaa = s_msaa[msaaQuality];
-
- D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
- dsvDesc.Format = s_textureFormat[texture.m_textureFormat].m_fmtDsv;
- dsvDesc.ViewDimension = 1 < msaa.Count ? D3D11_DSV_DIMENSION_TEXTURE2DMS : D3D11_DSV_DIMENSION_TEXTURE2D;
- dsvDesc.Flags = 0;
- dsvDesc.Texture2D.MipSlice = 0;
- DX_CHECK(s_renderD3D11->m_device->CreateDepthStencilView(texture.m_ptr, &dsvDesc, &m_dsv) );
- }
- else
- {
- DX_CHECK(s_renderD3D11->m_device->CreateRenderTargetView(texture.m_ptr, NULL, &m_rtv[m_num]) );
- DX_CHECK(s_renderD3D11->m_device->CreateShaderResourceView(texture.m_ptr, NULL, &m_srv[m_num]) );
- m_num++;
- }
- }
- }
+ postReset();
}
void FrameBufferD3D11::create(uint16_t _denseIdx, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _depthFormat)
@@ -3036,6 +3061,21 @@ BX_PRAGMA_DIAGNOSTIC_POP();
uint16_t FrameBufferD3D11::destroy()
{
+ preReset();
+
+ DX_RELEASE(m_swapChain, 0);
+
+ m_num = 0;
+ m_numTh = 0;
+
+ uint16_t denseIdx = m_denseIdx;
+ m_denseIdx = UINT16_MAX;
+
+ return denseIdx;
+ }
+
+ void FrameBufferD3D11::preReset()
+ {
for (uint32_t ii = 0, num = m_num; ii < num; ++ii)
{
DX_RELEASE(m_srv[ii], 0);
@@ -3043,14 +3083,42 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
DX_RELEASE(m_dsv, 0);
- DX_RELEASE(m_swapChain, 0);
+ }
- m_num = 0;
+ void FrameBufferD3D11::postReset()
+ {
+ if (0 < m_numTh)
+ {
+ m_num = 0;
+ for (uint32_t ii = 0; ii < m_numTh; ++ii)
+ {
+ TextureHandle handle = m_th[ii];
+ if (isValid(handle) )
+ {
+ const TextureD3D11& texture = s_renderD3D11->m_textures[handle.idx];
+ if (isDepth( (TextureFormat::Enum)texture.m_textureFormat) )
+ {
+ BX_CHECK(NULL == m_dsv, "Frame buffer already has depth-stencil attached.");
- uint16_t denseIdx = m_denseIdx;
- m_denseIdx = UINT16_MAX;
+ const uint32_t msaaQuality = bx::uint32_satsub( (texture.m_flags&BGFX_TEXTURE_RT_MSAA_MASK)>>BGFX_TEXTURE_RT_MSAA_SHIFT, 1);
+ const DXGI_SAMPLE_DESC& msaa = s_msaa[msaaQuality];
- return denseIdx;
+ D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
+ dsvDesc.Format = s_textureFormat[texture.m_textureFormat].m_fmtDsv;
+ dsvDesc.ViewDimension = 1 < msaa.Count ? D3D11_DSV_DIMENSION_TEXTURE2DMS : D3D11_DSV_DIMENSION_TEXTURE2D;
+ dsvDesc.Flags = 0;
+ dsvDesc.Texture2D.MipSlice = 0;
+ DX_CHECK(s_renderD3D11->m_device->CreateDepthStencilView(texture.m_ptr, &dsvDesc, &m_dsv) );
+ }
+ else
+ {
+ DX_CHECK(s_renderD3D11->m_device->CreateRenderTargetView(texture.m_ptr, NULL, &m_rtv[m_num]) );
+ DX_CHECK(s_renderD3D11->m_device->CreateShaderResourceView(texture.m_ptr, NULL, &m_srv[m_num]) );
+ m_num++;
+ }
+ }
+ }
+ }
}
void FrameBufferD3D11::resolve()
@@ -3137,12 +3205,6 @@ BX_PRAGMA_DIAGNOSTIC_POP();
const bool hmdEnabled = m_ovr.isEnabled() || m_ovr.isDebug();
_render->m_hmdEnabled = hmdEnabled;
- if (hmdEnabled)
- {
- HMD& hmd = _render->m_hmd;
- m_ovr.getEyePose(hmd);
- }
-
ViewState viewState(_render, hmdEnabled);
bool wireframe = !!(_render->m_debug&BGFX_DEBUG_WIREFRAME);
@@ -3268,11 +3330,11 @@ BX_PRAGMA_DIAGNOSTIC_POP();
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
deviceCtx->RSSetViewports(1, &vp);
- Clear& clear = _render->m_clear[view];
+ Clear& clr = _render->m_clear[view];
- if (BGFX_CLEAR_NONE != (clear.m_flags & BGFX_CLEAR_MASK) )
+ if (BGFX_CLEAR_NONE != (clr.m_flags & BGFX_CLEAR_MASK) )
{
- clearQuad(_clearQuad, viewState.m_rect, clear, _render->m_clearColor);
+ clearQuad(_clearQuad, viewState.m_rect, clr, _render->m_clearColor);
prim = s_primInfo[BX_COUNTOF(s_primName)]; // Force primitive type update after clear quad.
}
}
@@ -3369,7 +3431,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
}
else
{
- srv[ii] = texture.m_srv;
+ srv[ii] = texture.m_srv;
sampler[ii] = texture.m_sampler;
}
}
@@ -3686,7 +3748,10 @@ BX_PRAGMA_DIAGNOSTIC_POP();
if (invalidHandle != handle)
{
const IndexBufferD3D11& ib = m_indexBuffers[handle];
- deviceCtx->IASetIndexBuffer(ib.m_ptr, DXGI_FORMAT_R16_UINT, 0);
+ deviceCtx->IASetIndexBuffer(ib.m_ptr
+ , 0 == (ib.m_flags & BGFX_BUFFER_INDEX32) ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT
+ , 0
+ );
}
else
{
@@ -3714,10 +3779,12 @@ BX_PRAGMA_DIAGNOSTIC_POP();
{
if (UINT32_MAX == draw.m_numIndices)
{
- numIndices = m_indexBuffers[draw.m_indexBuffer.idx].m_size/2;
+ const IndexBufferD3D11& ib = m_indexBuffers[draw.m_indexBuffer.idx];
+ const uint32_t indexSize = 0 == (ib.m_flags & BGFX_BUFFER_INDEX32) ? 2 : 4;
+ numIndices = ib.m_size/indexSize;
numPrimsSubmitted = numIndices/prim.m_div - prim.m_sub;
- numInstances = draw.m_numInstances;
- numPrimsRendered = numPrimsSubmitted*draw.m_numInstances;
+ numInstances = draw.m_numInstances;
+ numPrimsRendered = numPrimsSubmitted*draw.m_numInstances;
deviceCtx->DrawIndexedInstanced(numIndices
, draw.m_numInstances