diff options
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d12.cpp')
-rw-r--r-- | 3rdparty/bgfx/src/renderer_d3d12.cpp | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/3rdparty/bgfx/src/renderer_d3d12.cpp b/3rdparty/bgfx/src/renderer_d3d12.cpp index f66e735e38f..d7a449ea82d 100644 --- a/3rdparty/bgfx/src/renderer_d3d12.cpp +++ b/3rdparty/bgfx/src/renderer_d3d12.cpp @@ -987,12 +987,6 @@ namespace bgfx { namespace d3d12 , (void**)&m_rootSignature ) ); - UniformHandle handle = BGFX_INVALID_HANDLE; - for (uint32_t ii = 0; ii < PredefinedUniform::Count; ++ii) - { - m_uniformReg.add(handle, getPredefinedUniformName(PredefinedUniform::Enum(ii) ), &m_predefinedUniforms[ii]); - } - g_caps.supported |= ( 0 | BGFX_CAPS_TEXTURE_3D | BGFX_CAPS_TEXTURE_COMPARE_ALL @@ -1011,8 +1005,8 @@ namespace bgfx { namespace d3d12 | BGFX_CAPS_TEXTURE_2D_ARRAY | BGFX_CAPS_TEXTURE_CUBE_ARRAY ); - g_caps.maxTextureSize = 16384; - g_caps.maxFBAttachments = uint8_t(bx::uint32_min(16, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) ); + g_caps.limits.maxTextureSize = 16384; + g_caps.limits.maxFBAttachments = uint8_t(bx::uint32_min(16, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) ); for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii) { @@ -1407,7 +1401,7 @@ namespace bgfx { namespace d3d12 { } - void readTexture(TextureHandle _handle, void* _data) BX_OVERRIDE + void readTexture(TextureHandle _handle, void* _data, uint8_t _mip ) BX_OVERRIDE { const TextureD3D12& texture = m_textures[_handle.idx]; @@ -1418,7 +1412,7 @@ namespace bgfx { namespace d3d12 uint64_t total; uint64_t srcPitch; m_device->GetCopyableFootprints(&desc - , 0 + , _mip , 1 , 0 , &layout @@ -1444,16 +1438,18 @@ namespace bgfx { namespace d3d12 finish(); m_commandList = m_cmd.alloc(); + uint32_t srcWidth = bx::uint32_max(1, texture.m_width >>_mip); + uint32_t srcHeight = bx::uint32_max(1, texture.m_height>>_mip); uint8_t* src; readback->Map(0, NULL, (void**)&src); const uint8_t bpp = getBitsPerPixel(TextureFormat::Enum(texture.m_textureFormat) ); uint8_t* dst = (uint8_t*)_data; - uint32_t dstPitch = texture.m_width*bpp/8; + uint32_t dstPitch = srcWidth*bpp/8; uint32_t pitch = bx::uint32_min(uint32_t(srcPitch), dstPitch); - for (uint32_t yy = 0, height = texture.m_height; yy < height; ++yy) + for (uint32_t yy = 0, height = srcHeight; yy < height; ++yy) { memcpy(dst, src, pitch); @@ -1555,6 +1551,7 @@ namespace bgfx { namespace d3d12 { BX_FREE(g_allocator, m_uniforms[_handle.idx]); m_uniforms[_handle.idx] = NULL; + m_uniformReg.remove(_handle); } void saveScreenShot(const char* _filePath) BX_OVERRIDE @@ -3017,6 +3014,7 @@ data.NumQualityLevels = 0; D3D12_UNORDERED_ACCESS_VIEW_DESC tmpUavd; D3D12_UNORDERED_ACCESS_VIEW_DESC* uavd = &_texture.m_uavd; + if (0 != _mip) { memcpy(&tmpUavd, uavd, sizeof(tmpUavd) ); @@ -3029,6 +3027,10 @@ data.NumQualityLevels = 0; uavd->Texture2D.MipSlice = _mip; uavd->Texture2D.PlaneSlice = 0; break; + case D3D12_UAV_DIMENSION_TEXTURE2DARRAY: + uavd->Texture2DArray.MipSlice = _mip; + uavd->Texture2DArray.PlaneSlice = 0; + break; case D3D12_UAV_DIMENSION_TEXTURE3D: uavd->Texture3D.MipSlice = _mip; @@ -3436,10 +3438,10 @@ data.NumQualityLevels = 0; { Enum type = Enum(!!isValid(_draw.m_indexBuffer) ); - VertexBufferD3D12& vb = s_renderD3D12->m_vertexBuffers[_draw.m_vertexBuffer.idx]; + VertexBufferD3D12& vb = s_renderD3D12->m_vertexBuffers[_draw.m_stream[0].m_handle.idx]; vb.setState(_commandList, D3D12_RESOURCE_STATE_GENERIC_READ); - uint16_t declIdx = !isValid(vb.m_decl) ? _draw.m_vertexDecl.idx : vb.m_decl.idx; + uint16_t declIdx = !isValid(vb.m_decl) ? _draw.m_stream[0].m_decl.idx : vb.m_decl.idx; const VertexDecl& vertexDecl = s_renderD3D12->m_vertexDecls[declIdx]; uint32_t numIndices = 0; @@ -3469,7 +3471,7 @@ data.NumQualityLevels = 0; } cmd.draw.InstanceCount = _draw.m_numInstances; cmd.draw.VertexCountPerInstance = numVertices; - cmd.draw.StartVertexLocation = _draw.m_startVertex; + cmd.draw.StartVertexLocation = _draw.m_stream[0].m_startVertex; cmd.draw.StartInstanceLocation = 0; } else @@ -3511,7 +3513,7 @@ data.NumQualityLevels = 0; cmd.drawIndexed.IndexCountPerInstance = numIndices; cmd.drawIndexed.InstanceCount = _draw.m_numInstances; cmd.drawIndexed.StartIndexLocation = _draw.m_startIndex; - cmd.drawIndexed.BaseVertexLocation = _draw.m_startVertex; + cmd.drawIndexed.BaseVertexLocation = _draw.m_stream[0].m_startVertex; cmd.drawIndexed.StartInstanceLocation = 0; } @@ -3879,7 +3881,7 @@ data.NumQualityLevels = 0; else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) ) { const UniformInfo* info = s_renderD3D12->m_uniformReg.find(name); - BX_CHECK(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name); + BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name); if (NULL != info) { @@ -4244,6 +4246,14 @@ data.NumQualityLevels = 0; m_uavd.Texture2D.MipSlice = 0; m_uavd.Texture2D.PlaneSlice = 0; } + + if( m_type==TextureCube ) + { + m_uavd.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY; + m_uavd.Texture2DArray.MipSlice = 0; + m_uavd.Texture2DArray.ArraySize = 6; + } + break; case Texture3D: @@ -4766,7 +4776,7 @@ data.NumQualityLevels = 0; _render->m_hmdInitialized = false; const bool hmdEnabled = false; - ViewState viewState(_render, hmdEnabled); + static ViewState viewState; viewState.reset(_render, hmdEnabled); // bool wireframe = !!(_render->m_debug&BGFX_DEBUG_WIREFRAME); @@ -5205,7 +5215,7 @@ data.NumQualityLevels = 0; rendererUpdateUniforms(this, _render->m_uniformBuffer, draw.m_constBegin, draw.m_constEnd); - if (isValid(draw.m_vertexBuffer) ) + if (isValid(draw.m_stream[0].m_handle) ) { const uint64_t state = draw.m_stateFlags; bool hasFactor = 0 @@ -5215,8 +5225,8 @@ data.NumQualityLevels = 0; || f3 == (state & f3) ; - const VertexBufferD3D12& vb = m_vertexBuffers[draw.m_vertexBuffer.idx]; - uint16_t declIdx = !isValid(vb.m_decl) ? draw.m_vertexDecl.idx : vb.m_decl.idx; + const VertexBufferD3D12& vb = m_vertexBuffers[draw.m_stream[0].m_handle.idx]; + uint16_t declIdx = !isValid(vb.m_decl) ? draw.m_stream[0].m_decl.idx : vb.m_decl.idx; ID3D12PipelineState* pso = getPipelineState(state |