diff options
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d11.cpp')
-rw-r--r-- | 3rdparty/bgfx/src/renderer_d3d11.cpp | 113 |
1 files changed, 86 insertions, 27 deletions
diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp index 9fc75a8c452..4446d6b0324 100644 --- a/3rdparty/bgfx/src/renderer_d3d11.cpp +++ b/3rdparty/bgfx/src/renderer_d3d11.cpp @@ -487,6 +487,8 @@ namespace bgfx { namespace d3d11 return false; }; + // Reference: + // https://github.com/GPUOpen-LibrariesAndSDKs/AGS_SDK enum AGS_RETURN_CODE { AGS_SUCCESS, @@ -1465,6 +1467,8 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } BGFX_GPU_PROFILER_BIND(m_device, m_deviceCtx); + + g_internalData.context = m_device; return true; error: @@ -1742,7 +1746,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); tc.m_sides = 0; tc.m_depth = 0; tc.m_numMips = 1; - tc.m_format = texture.m_requestedFormat; + tc.m_format = TextureFormat::Enum(texture.m_requestedFormat); tc.m_cubeMap = false; tc.m_mem = NULL; bx::write(&writer, tc); @@ -1753,14 +1757,30 @@ BX_PRAGMA_DIAGNOSTIC_POP(); release(mem); } + void overrideInternal(TextureHandle _handle, uintptr_t _ptr) BX_OVERRIDE + { + // Resource ref. counts might be messed up outside of bgfx. + // Disabling ref. count check once texture is overridden. + setGraphicsDebuggerPresent(true); + m_textures[_handle.idx].overrideInternal(_ptr); + } + + uintptr_t getInternal(TextureHandle _handle) BX_OVERRIDE + { + // Resource ref. counts might be messed up outside of bgfx. + // Disabling ref. count check once texture is overridden. + setGraphicsDebuggerPresent(true); + return uintptr_t(m_textures[_handle.idx].m_ptr); + } + void destroyTexture(TextureHandle _handle) BX_OVERRIDE { m_textures[_handle.idx].destroy(); } - void createFrameBuffer(FrameBufferHandle _handle, uint8_t _num, const TextureHandle* _textureHandles) BX_OVERRIDE + void createFrameBuffer(FrameBufferHandle _handle, uint8_t _num, const Attachment* _attachment) BX_OVERRIDE { - m_frameBuffers[_handle.idx].create(_num, _textureHandles); + m_frameBuffers[_handle.idx].create(_num, _attachment); } void createFrameBuffer(FrameBufferHandle _handle, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _depthFormat) BX_OVERRIDE @@ -2224,6 +2244,9 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } else { + m_deviceCtx->ClearState(); + m_deviceCtx->Flush(); + if (resize) { m_deviceCtx->OMSetRenderTargets(1, s_zero.m_rtv, NULL); @@ -3078,6 +3101,13 @@ BX_PRAGMA_DIAGNOSTIC_POP(); D3D11_MAPPED_SUBRESOURCE mapped; DX_CHECK(m_deviceCtx->Map(m_captureTexture, 0, D3D11_MAP_READ, 0, &mapped) ); + imageSwizzleBgra8(getBufferWidth() + , getBufferHeight() + , mapped.RowPitch + , mapped.pData + , mapped.pData + ); + g_callback->captureFrame(mapped.pData, getBufferHeight()*mapped.RowPitch); m_deviceCtx->Unmap(m_captureTexture, 0); @@ -3367,7 +3397,6 @@ BX_PRAGMA_DIAGNOSTIC_POP(); void* m_uniforms[BGFX_CONFIG_MAX_UNIFORMS]; Matrix4 m_predefinedUniforms[PredefinedUniform::Count]; UniformRegistry m_uniformReg; - ViewState m_viewState; StateCacheT<ID3D11BlendState> m_blendStateCache; StateCacheT<ID3D11DepthStencilState> m_depthStencilStateCache; @@ -3999,7 +4028,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } } - const bool bufferOnly = 0 != (m_flags&(BGFX_TEXTURE_RT_BUFFER_ONLY|BGFX_TEXTURE_READ_BACK) ); + const bool writeOnly = 0 != (m_flags&(BGFX_TEXTURE_RT_WRITE_ONLY|BGFX_TEXTURE_READ_BACK) ); const bool computeWrite = 0 != (m_flags&BGFX_TEXTURE_COMPUTE_WRITE); const bool renderTarget = 0 != (m_flags&BGFX_TEXTURE_RT_MASK); const bool srgb = 0 != (m_flags&BGFX_TEXTURE_SRGB) || imageContainer.m_srgb; @@ -4043,7 +4072,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); desc.Format = format; desc.SampleDesc = msaa; desc.Usage = kk == 0 || blit ? D3D11_USAGE_DEFAULT : D3D11_USAGE_IMMUTABLE; - desc.BindFlags = bufferOnly ? 0 : D3D11_BIND_SHADER_RESOURCE; + desc.BindFlags = writeOnly ? 0 : D3D11_BIND_SHADER_RESOURCE; desc.CPUAccessFlags = 0; if (isDepth( (TextureFormat::Enum)m_textureFormat) ) @@ -4116,7 +4145,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); break; } - if (!bufferOnly) + if (!writeOnly) { DX_CHECK(s_renderD3D11->m_device->CreateShaderResourceView(m_ptr, &srvd, &m_srv) ); } @@ -4147,7 +4176,19 @@ BX_PRAGMA_DIAGNOSTIC_POP(); s_renderD3D11->m_srvUavLru.invalidateWithParent(getHandle().idx); DX_RELEASE(m_srv, 0); DX_RELEASE(m_uav, 0); - DX_RELEASE(m_ptr, 0); + if (0 == (m_flags & BGFX_TEXTURE_INTERNAL_SHARED) ) + { + DX_RELEASE(m_ptr, 0); + } + } + + void TextureD3D11::overrideInternal(uintptr_t _ptr) + { + destroy(); + m_flags |= BGFX_TEXTURE_INTERNAL_SHARED; + m_ptr = (ID3D11Resource*)_ptr; + + s_renderD3D11->m_device->CreateShaderResourceView(m_ptr, NULL, &m_srv); } void TextureD3D11::update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem) @@ -4175,7 +4216,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); if (convert) { temp = (uint8_t*)BX_ALLOC(g_allocator, rectpitch*_rect.m_height); - imageDecodeToBgra8(temp, data, _rect.m_width, _rect.m_height, srcpitch, m_requestedFormat); + imageDecodeToBgra8(temp, data, _rect.m_width, _rect.m_height, srcpitch, TextureFormat::Enum(m_requestedFormat) ); data = temp; } @@ -4211,7 +4252,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); return handle; } - void FrameBufferD3D11::create(uint8_t _num, const TextureHandle* _handles) + void FrameBufferD3D11::create(uint8_t _num, const Attachment* _attachment) { for (uint32_t ii = 0; ii < BX_COUNTOF(m_rtv); ++ii) { @@ -4221,7 +4262,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); m_swapChain = NULL; m_numTh = _num; - memcpy(m_th, _handles, _num*sizeof(TextureHandle) ); + memcpy(m_attachment, _attachment, _num*sizeof(Attachment) ); postReset(); } @@ -4314,7 +4355,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); m_num = 0; for (uint32_t ii = 0; ii < m_numTh; ++ii) { - TextureHandle handle = m_th[ii]; + TextureHandle handle = m_attachment[ii].handle; if (isValid(handle) ) { const TextureD3D11& texture = s_renderD3D11->m_textures[handle.idx]; @@ -4363,7 +4404,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); : D3D11_DSV_DIMENSION_TEXTURE2D ; dsvDesc.Flags = 0; - dsvDesc.Texture2D.MipSlice = 0; + dsvDesc.Texture2D.MipSlice = m_attachment[ii].mip; DX_CHECK(s_renderD3D11->m_device->CreateDepthStencilView(texture.m_ptr, &dsvDesc, &m_dsv) ); } break; @@ -4376,14 +4417,14 @@ BX_PRAGMA_DIAGNOSTIC_POP(); { dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY; dsvDesc.Texture2DMSArray.ArraySize = 1; - dsvDesc.Texture2DMSArray.FirstArraySlice = 0; + dsvDesc.Texture2DMSArray.FirstArraySlice = m_attachment[ii].layer; } else { dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; dsvDesc.Texture2DArray.ArraySize = 1; - dsvDesc.Texture2DArray.FirstArraySlice = 0; - dsvDesc.Texture2DArray.MipSlice = 0; + dsvDesc.Texture2DArray.FirstArraySlice = m_attachment[ii].layer; + dsvDesc.Texture2DArray.MipSlice = m_attachment[ii].mip; } dsvDesc.Flags = 0; DX_CHECK(s_renderD3D11->m_device->CreateDepthStencilView(texture.m_ptr, &dsvDesc, &m_dsv) ); @@ -4397,7 +4438,20 @@ BX_PRAGMA_DIAGNOSTIC_POP(); { default: case TextureD3D11::Texture2D: - DX_CHECK(s_renderD3D11->m_device->CreateRenderTargetView(texture.m_ptr, NULL, &m_rtv[m_num]) ); + { + D3D11_RENDER_TARGET_VIEW_DESC desc; + desc.Format = s_textureFormat[texture.m_textureFormat].m_fmt; + if (1 < msaa.Count) + { + desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS; + } + else + { + desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; + desc.Texture2D.MipSlice = m_attachment[ii].mip; + } + DX_CHECK(s_renderD3D11->m_device->CreateRenderTargetView(texture.m_ptr, &desc, &m_rtv[m_num]) ); + } break; case TextureD3D11::TextureCube: @@ -4408,14 +4462,14 @@ BX_PRAGMA_DIAGNOSTIC_POP(); { desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY; desc.Texture2DMSArray.ArraySize = 1; - desc.Texture2DMSArray.FirstArraySlice = 0; + desc.Texture2DMSArray.FirstArraySlice = m_attachment[ii].layer; } else { desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; desc.Texture2DArray.ArraySize = 1; - desc.Texture2DArray.FirstArraySlice = 0; - desc.Texture2DArray.MipSlice = 0; + desc.Texture2DArray.FirstArraySlice = m_attachment[ii].layer; + desc.Texture2DArray.MipSlice = m_attachment[ii].mip; } DX_CHECK(s_renderD3D11->m_device->CreateRenderTargetView(texture.m_ptr, &desc, &m_rtv[m_num]) ); } @@ -4426,9 +4480,9 @@ BX_PRAGMA_DIAGNOSTIC_POP(); D3D11_RENDER_TARGET_VIEW_DESC desc; desc.Format = s_textureFormat[texture.m_textureFormat].m_fmt; desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; - desc.Texture3D.MipSlice = 0; + desc.Texture3D.MipSlice = m_attachment[ii].mip; desc.Texture3D.WSize = 1; - desc.Texture3D.FirstWSlice = 0; + desc.Texture3D.FirstWSlice = m_attachment[ii].layer; DX_CHECK(s_renderD3D11->m_device->CreateRenderTargetView(texture.m_ptr, &desc, &m_rtv[m_num]) ); } break; @@ -4687,8 +4741,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); _render->m_hmdInitialized = m_ovr.isInitialized(); const bool hmdEnabled = m_ovr.isEnabled() || m_ovr.isDebug(); - ViewState& viewState = m_viewState; - viewState.reset(_render, hmdEnabled); + ViewState viewState(_render, hmdEnabled); bool wireframe = !!(_render->m_debug&BGFX_DEBUG_WIREFRAME); bool scissorEnabled = false; @@ -4727,7 +4780,8 @@ BX_PRAGMA_DIAGNOSTIC_POP(); { // reset the framebuffer to be the backbuffer; depending on the swap effect, // if we don't do this we'll only see one frame of output and then nothing - setFrameBuffer(fbh); + FrameBufferHandle invalid = BGFX_INVALID_HANDLE; + setFrameBuffer(invalid); bool viewRestart = false; uint8_t eye = 0; @@ -4887,12 +4941,18 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } else { + bool depthStencil = isDepth(TextureFormat::Enum(src.m_textureFormat) ); + BX_CHECK(!depthStencil + || (width == src.m_width && height == src.m_height) + , "When blitting depthstencil surface, source resolution must match destination." + ); + D3D11_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.bottom = blit.m_srcY + height; box.back = 1; const uint32_t srcZ = TextureD3D11::TextureCube == src.m_type @@ -4904,7 +4964,6 @@ BX_PRAGMA_DIAGNOSTIC_POP(); : 0 ; - bool depthStencil = isDepth(TextureFormat::Enum(src.m_textureFormat) ); deviceCtx->CopySubresourceRegion(dst.m_ptr , dstZ*dst.m_numMips+blit.m_dstMip , blit.m_dstX |