diff options
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d11.cpp')
-rw-r--r-- | 3rdparty/bgfx/src/renderer_d3d11.cpp | 136 |
1 files changed, 90 insertions, 46 deletions
diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp index ea8e18bfb37..2a65c2a2c1d 100644 --- a/3rdparty/bgfx/src/renderer_d3d11.cpp +++ b/3rdparty/bgfx/src/renderer_d3d11.cpp @@ -70,7 +70,7 @@ namespace bgfx { namespace d3d11 { Zero() { - memset(this, 0, sizeof(Zero) ); + bx::memSet(this, 0, sizeof(Zero) ); } ID3D11Buffer* m_buffer[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; @@ -364,7 +364,7 @@ namespace bgfx { namespace d3d11 { if (UINT16_MAX != _decl.m_attributes[attr]) { - memcpy(elem, &s_attrib[attr], sizeof(D3D11_INPUT_ELEMENT_DESC) ); + bx::memCopy(elem, &s_attrib[attr], sizeof(D3D11_INPUT_ELEMENT_DESC) ); if (0 == _decl.m_attributes[attr]) { @@ -397,8 +397,8 @@ namespace bgfx { namespace d3d11 void clear() { - memset(m_srv, 0, sizeof(m_srv) ); - memset(m_sampler, 0, sizeof(m_sampler) ); + bx::memSet(m_srv, 0, sizeof(m_srv) ); + bx::memSet(m_sampler, 0, sizeof(m_sampler) ); } ID3D11ShaderResourceView* m_srv[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS]; @@ -463,7 +463,7 @@ namespace bgfx { namespace d3d11 char temp[2048]; va_list argList; va_start(argList, _format); - int size = bx::uint32_min(sizeof(temp)-1, vsnprintf(temp, sizeof(temp), _format, argList) ); + int size = bx::uint32_min(sizeof(temp)-1, bx::vsnprintf(temp, sizeof(temp), _format, argList) ); va_end(argList); temp[size] = '\0'; @@ -675,9 +675,9 @@ namespace bgfx { namespace d3d11 , m_timerQuerySupport(false) { m_fbh.idx = invalidHandle; - memset(&m_adapterDesc, 0, sizeof(m_adapterDesc) ); - memset(&m_scd, 0, sizeof(m_scd) ); - memset(&m_windows, 0xff, sizeof(m_windows) ); + bx::memSet(&m_adapterDesc, 0, sizeof(m_adapterDesc) ); + bx::memSet(&m_scd, 0, sizeof(m_scd) ); + bx::memSet(&m_windows, 0xff, sizeof(m_windows) ); } ~RendererContextD3D11() @@ -712,8 +712,8 @@ namespace bgfx { namespace d3d11 } m_fbh.idx = invalidHandle; - memset(m_uniforms, 0, sizeof(m_uniforms) ); - memset(&m_resolution, 0, sizeof(m_resolution) ); + bx::memSet(m_uniforms, 0, sizeof(m_uniforms) ); + bx::memSet(&m_resolution, 0, sizeof(m_resolution) ); m_ags = NULL; m_agsdll = bx::dlopen( @@ -1124,7 +1124,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); DX_RELEASE(device, 2); } - memset(&m_adapterDesc, 0, sizeof(m_adapterDesc) ); + bx::memSet(&m_adapterDesc, 0, sizeof(m_adapterDesc) ); hr = adapter->GetDesc(&m_adapterDesc); BX_WARN(SUCCEEDED(hr), "Adapter GetDesc failed 0x%08x.", hr); @@ -1145,7 +1145,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); goto error; } - memset(&m_scd, 0, sizeof(m_scd) ); + bx::memSet(&m_scd, 0, sizeof(m_scd) ); m_scd.Width = BGFX_DEFAULT_WIDTH; m_scd.Height = BGFX_DEFAULT_HEIGHT; m_scd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; @@ -1205,7 +1205,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); goto error; } - memset(&m_scd, 0, sizeof(m_scd) ); + bx::memSet(&m_scd, 0, sizeof(m_scd) ); m_scd.BufferDesc.Width = BGFX_DEFAULT_WIDTH; m_scd.BufferDesc.Height = BGFX_DEFAULT_HEIGHT; m_scd.BufferDesc.RefreshRate.Numerator = 60; @@ -1236,7 +1236,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } else { - memset(&m_scd, 0, sizeof(m_scd) ); + bx::memSet(&m_scd, 0, sizeof(m_scd) ); m_scd.SampleDesc.Count = 1; m_scd.SampleDesc.Quality = 0; setBufferSize(BGFX_DEFAULT_WIDTH, BGFX_DEFAULT_HEIGHT); @@ -1258,7 +1258,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); m_infoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_WARNING, false); D3D11_INFO_QUEUE_FILTER filter; - memset(&filter, 0, sizeof(filter) ); + bx::memSet(&filter, 0, sizeof(filter) ); D3D11_MESSAGE_CATEGORY catlist[] = { @@ -1763,7 +1763,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); void createVertexDecl(VertexDeclHandle _handle, const VertexDecl& _decl) BX_OVERRIDE { VertexDecl& decl = m_vertexDecls[_handle.idx]; - memcpy(&decl, &_decl, sizeof(VertexDecl) ); + bx::memCopy(&decl, &_decl, sizeof(VertexDecl) ); dump(decl); } @@ -1869,7 +1869,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); for (uint32_t yy = 0, height = srcHeight; yy < height; ++yy) { - memcpy(dst, src, pitch); + bx::memCopy(dst, src, pitch); src += srcPitch; dst += dstPitch; @@ -1963,7 +1963,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); uint32_t size = BX_ALIGN_16(g_uniformTypeSize[_type]*_num); void* data = BX_ALLOC(g_allocator, size); - memset(data, 0, size); + bx::memSet(data, 0, size); m_uniforms[_handle.idx] = data; m_uniformReg.add(_handle, _name, data); } @@ -1975,22 +1975,27 @@ BX_PRAGMA_DIAGNOSTIC_POP(); m_uniformReg.remove(_handle); } - void saveScreenShot(const char* _filePath) BX_OVERRIDE + void requestScreenShot(FrameBufferHandle _handle, const char* _filePath) BX_OVERRIDE { - if (NULL == m_swapChain) + IDXGISwapChain* swapChain = isValid(_handle) + ? m_frameBuffers[_handle.idx].m_swapChain + : m_swapChain + ; + + if (NULL == swapChain) { BX_TRACE("Unable to capture screenshot %s.", _filePath); return; } ID3D11Texture2D* backBuffer; - DX_CHECK(m_swapChain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&backBuffer) ); + DX_CHECK(swapChain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&backBuffer) ); D3D11_TEXTURE2D_DESC backBufferDesc; backBuffer->GetDesc(&backBufferDesc); D3D11_TEXTURE2D_DESC desc; - memcpy(&desc, &backBufferDesc, sizeof(desc) ); + bx::memCopy(&desc, &backBufferDesc, sizeof(desc) ); desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D11_USAGE_STAGING; @@ -2062,7 +2067,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) BX_OVERRIDE { - memcpy(m_uniforms[_loc], _data, _size); + bx::memCopy(m_uniforms[_loc], _data, _size); } void setMarker(const char* _marker, uint32_t _size) BX_OVERRIDE @@ -2076,6 +2081,11 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } } + void invalidateOcclusionQuery(OcclusionQueryHandle _handle) BX_OVERRIDE + { + m_occlusionQuery.invalidate(_handle); + } + void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) BX_OVERRIDE; void blitSetup(TextVideoMemBlitter& _blitter) BX_OVERRIDE @@ -2527,12 +2537,12 @@ BX_PRAGMA_DIAGNOSTIC_POP(); { if (_flags&BGFX_UNIFORM_FRAGMENTBIT) { - memcpy(&m_fsScratch[_regIndex], _val, _numRegs*16); + bx::memCopy(&m_fsScratch[_regIndex], _val, _numRegs*16); m_fsChanges += _numRegs; } else { - memcpy(&m_vsScratch[_regIndex], _val, _numRegs*16); + bx::memCopy(&m_vsScratch[_regIndex], _val, _numRegs*16); m_vsChanges += _numRegs; } } @@ -2661,7 +2671,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); D3D11_INPUT_ELEMENT_DESC vertexElements[Attrib::Count+1+BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT]; VertexDecl decl; - memcpy(&decl, &_vertexDecl, sizeof(VertexDecl) ); + bx::memCopy(&decl, &_vertexDecl, sizeof(VertexDecl) ); const uint16_t* attrMask = _program.m_vsh->m_attrMask; for (uint32_t ii = 0; ii < Attrib::Count; ++ii) @@ -2685,7 +2695,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); for (jj = 0; jj < num; ++jj) { curr = &vertexElements[jj]; - if (0 == strcmp(curr->SemanticName, "TEXCOORD") + if (0 == bx::strncmp(curr->SemanticName, "TEXCOORD") && curr->SemanticIndex == index) { break; @@ -2698,7 +2708,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); ++elem; } - memcpy(curr, &inst, sizeof(D3D11_INPUT_ELEMENT_DESC) ); + bx::memCopy(curr, &inst, sizeof(D3D11_INPUT_ELEMENT_DESC) ); curr->InputSlot = 1; curr->SemanticIndex = index; curr->AlignedByteOffset = ii*16; @@ -2798,7 +2808,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); { for (uint32_t ii = 1; ii < BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS; ++ii) { - memcpy(&desc.RenderTarget[ii], drt, sizeof(D3D11_RENDER_TARGET_BLEND_DESC) ); + bx::memCopy(&desc.RenderTarget[ii], drt, sizeof(D3D11_RENDER_TARGET_BLEND_DESC) ); } } @@ -2849,7 +2859,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); if (NULL == dss) { D3D11_DEPTH_STENCIL_DESC desc; - memset(&desc, 0, sizeof(desc) ); + bx::memSet(&desc, 0, sizeof(desc) ); desc.DepthEnable = 0 != func; desc.DepthWriteMask = !!(BGFX_STATE_DEPTH_WRITE & _state) ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO; desc.DepthFunc = s_cmpFunc[func]; @@ -2989,7 +2999,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); { D3D11_SAMPLER_DESC sd; sampler->GetDesc(&sd); - if (0 != memcmp(_rgba, sd.BorderColor, 16) ) + if (0 != bx::memCmp(_rgba, sd.BorderColor, 16) ) { // Sampler will be released when updated sampler // is added to cache. @@ -3229,7 +3239,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); backBuffer->GetDesc(&backBufferDesc); D3D11_TEXTURE2D_DESC desc; - memcpy(&desc, &backBufferDesc, sizeof(desc) ); + bx::memCopy(&desc, &backBufferDesc, sizeof(desc) ); desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D11_USAGE_STAGING; @@ -3327,7 +3337,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); else { UniformHandle handle; - memcpy(&handle, _uniformBuffer.read(sizeof(UniformHandle) ), sizeof(UniformHandle) ); + bx::memCopy(&handle, _uniformBuffer.read(sizeof(UniformHandle) ), sizeof(UniformHandle) ); data = (const char*)m_uniforms[handle.idx]; } @@ -3451,7 +3461,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); for (uint32_t ii = 0; ii < numMrt; ++ii) { uint8_t index = (uint8_t)bx::uint32_min(BGFX_CONFIG_MAX_COLOR_PALETTE-1, _clear.m_index[ii]); - memcpy(mrtClear[ii], _palette[index], 16); + bx::memCopy(mrtClear[ii], _palette[index], 16); } deviceCtx->UpdateSubresource(fsh->m_buffer, 0, 0, mrtClear, 0, 0); @@ -3672,7 +3682,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); , m_textureSwapChain(NULL) , m_mirrorTexture(NULL) { - memset(m_eyeRtv, 0, sizeof(m_eyeRtv)); + bx::memSet(m_eyeRtv, 0, sizeof(m_eyeRtv)); } bool VRImplOVRD3D11::createSwapChain(const VRDesc& _desc, int _msaaSamples, int _mirrorWidth, int _mirrorHeight) @@ -4085,7 +4095,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); : D3D11_MAP_WRITE_NO_OVERWRITE ; DX_CHECK(deviceCtx->Map(m_ptr, 0, type, 0, &mapped) ); - memcpy( (uint8_t*)mapped.pData + _offset, _data, _size); + bx::memCopy( (uint8_t*)mapped.pData + _offset, _data, _size); deviceCtx->Unmap(m_ptr, 0); #endif // 0 } @@ -4276,7 +4286,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); uint8_t numAttrs = 0; bx::read(&reader, numAttrs); - memset(m_attrMask, 0, sizeof(m_attrMask) ); + bx::memSet(m_attrMask, 0, sizeof(m_attrMask) ); for (uint32_t ii = 0; ii < numAttrs; ++ii) { @@ -4437,7 +4447,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); ; D3D11_SHADER_RESOURCE_VIEW_DESC srvd; - memset(&srvd, 0, sizeof(srvd) ); + bx::memSet(&srvd, 0, sizeof(srvd) ); DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; if (swizzle) @@ -4572,12 +4582,28 @@ BX_PRAGMA_DIAGNOSTIC_POP(); desc.CPUAccessFlags = 0; desc.MiscFlags = 0; + if (renderTarget) + { + desc.BindFlags |= D3D11_BIND_RENDER_TARGET; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.MiscFlags |= 0 + | (1 < numMips ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0) + ; + } + if (computeWrite) { desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS; desc.Usage = D3D11_USAGE_DEFAULT; } + if (readBack) + { + desc.BindFlags = 0; + desc.Usage = D3D11_USAGE_STAGING; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + } + srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; srvd.Texture3D.MipLevels = numMips; @@ -4740,7 +4766,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); m_denseIdx = UINT16_MAX; m_numTh = _num; m_needPresent = false; - memcpy(m_attachment, _attachment, _num*sizeof(Attachment) ); + bx::memCopy(m_attachment, _attachment, _num*sizeof(Attachment) ); postReset(); } @@ -4748,7 +4774,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); void FrameBufferD3D11::create(uint16_t _denseIdx, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _depthFormat) { DXGI_SWAP_CHAIN_DESC scd; - memcpy(&scd, &s_renderD3D11->m_scd, sizeof(DXGI_SWAP_CHAIN_DESC) ); + bx::memCopy(&scd, &s_renderD3D11->m_scd, sizeof(DXGI_SWAP_CHAIN_DESC) ); scd.BufferDesc.Width = _width; scd.BufferDesc.Height = _height; scd.OutputWindow = (HWND)_nwh; @@ -5215,18 +5241,36 @@ BX_PRAGMA_DIAGNOSTIC_POP(); { Query& query = m_query[m_control.m_read]; - uint64_t result = 0; - HRESULT hr = deviceCtx->GetData(query.m_ptr, &result, sizeof(result), _wait ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH); - if (S_FALSE == hr) + if (isValid(query.m_handle) ) { - break; + uint64_t result = 0; + HRESULT hr = deviceCtx->GetData(query.m_ptr, &result, sizeof(result), _wait ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH); + if (S_FALSE == hr) + { + break; + } + + _render->m_occlusion[query.m_handle.idx] = int32_t(result); } - _render->m_occlusion[query.m_handle.idx] = 0 < result; m_control.consume(1); } } + void OcclusionQueryD3D11::invalidate(OcclusionQueryHandle _handle) + { + const uint32_t size = m_control.m_size; + + for (uint32_t ii = 0, num = m_control.available(); ii < num; ++ii) + { + Query& query = m_query[(m_control.m_read + ii) % size]; + if (query.m_handle.idx == _handle.idx) + { + query.m_handle.idx = bgfx::invalidHandle; + } + } + } + void RendererContextD3D11::submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) { if (updateResolution(_render->m_resolution) ) @@ -5754,7 +5798,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); else { Rect scissorRect; - scissorRect.intersect(viewScissorRect, _render->m_rectCache.m_cache[scissor]); + scissorRect.setIntersect(viewScissorRect, _render->m_rectCache.m_cache[scissor]); if (scissorRect.isZeroArea() ) { continue; |