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.cpp113
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