Merge branch 'master' of github.com:bkaradzic/bgfx

This commit is contained in:
Бранимир Караџић 2020-05-08 12:54:56 -07:00
commit 25bf17fe3e
2 changed files with 60 additions and 30 deletions

View File

@ -826,7 +826,7 @@ namespace bgfx { namespace webgpu
void readback(ReadbackWgpu& readback, const TextureWgpu& texture, void* _data)
{
m_cmd.kick(false, true);
m_cmd.begin();
m_cmd.beginRender();
if (readback.m_mapped)
return;
@ -861,7 +861,7 @@ namespace bgfx { namespace webgpu
bufferCopyView.rowsPerImage = srcHeight;
wgpu::Extent3D extent3D = { srcWidth, srcHeight, 1 };
m_cmd.m_encoder.CopyTextureToBuffer(&textureCopyView, &bufferCopyView, &extent3D);
getBlitCommandEncoder().CopyTextureToBuffer(&textureCopyView, &bufferCopyView, &extent3D);
auto finish = [](WGPUBufferMapAsyncStatus status, void const* data, uint64_t dataLength, void* userdata)
{
@ -1135,7 +1135,7 @@ namespace bgfx { namespace webgpu
// : wgpu::StoreOp::Store
//;
wgpu::RenderPassEncoder rce = m_cmd.m_encoder.BeginRenderPass(&renderPassDescriptor.desc);
wgpu::RenderPassEncoder rce = m_cmd.m_renderEncoder.BeginRenderPass(&renderPassDescriptor.desc);
m_renderEncoder = rce;
rce.SetViewport(0.0f, 0.0f, (float)width, (float)height, 0.0f, 1.0f);
@ -1209,7 +1209,8 @@ namespace bgfx { namespace webgpu
}
}
m_cmd.m_encoder = NULL;
m_cmd.m_stagingEncoder = NULL;
m_cmd.m_renderEncoder = NULL;
}
void updateResolution(const Resolution& _resolution)
@ -1429,13 +1430,13 @@ namespace bgfx { namespace webgpu
void commitShaderConstants(ScratchBufferWgpu& _scratchBuffer, const ProgramWgpu& _program, uint32_t _vertexOffset, uint32_t _fragmentOffset)
{
const uint32_t size = _program.m_vsh->m_size;
const uint32_t size = _program.m_vsh->m_gpuSize;
if (0 != size)
_scratchBuffer.write(m_vsScratch, size);
if(NULL != _program.m_fsh)
{
const uint32_t size = _program.m_fsh->m_size;
const uint32_t size = _program.m_fsh->m_gpuSize;
if(0 != size)
_scratchBuffer.write(m_fsScratch, size);
}
@ -2205,15 +2206,28 @@ namespace bgfx { namespace webgpu
return sampler->m_sampler;
}
wgpu::CommandEncoder& getRenderEncoder()
{
if (!m_cmd.m_renderEncoder)
m_cmd.beginRender();
return m_cmd.m_renderEncoder;
}
wgpu::CommandEncoder& getStagingEncoder()
{
if (!m_cmd.m_stagingEncoder)
m_cmd.beginStaging();
return m_cmd.m_stagingEncoder;
}
wgpu::CommandEncoder& getBlitCommandEncoder()
{
if (!m_cmd.m_encoder)
m_cmd.begin();
if (m_renderEncoder || m_computeEncoder)
endEncoding();
return m_cmd.m_encoder;
return getRenderEncoder();
}
wgpu::RenderPassEncoder renderPass(bgfx::Frame* _render, bgfx::FrameBufferHandle fbh, bool clear, Clear clr, const char* name = NULL)
@ -2311,7 +2325,7 @@ namespace bgfx { namespace webgpu
}
}
wgpu::RenderPassEncoder rce = m_cmd.m_encoder.BeginRenderPass(&renderPassDescriptor.desc);
wgpu::RenderPassEncoder rce = m_cmd.m_renderEncoder.BeginRenderPass(&renderPassDescriptor.desc);
m_renderEncoder = rce;
return rce;
}
@ -3445,6 +3459,7 @@ namespace bgfx { namespace webgpu
uint32_t ScratchBufferWgpu::write(void* data, uint64_t _size, uint64_t _offset)
{
BX_CHECK(nullptr != m_staging, "Cannot write uniforms outside of begin()/submit() calls");
uint32_t offset = m_offset;
bx::memCopy((void*)((uint8_t*)m_staging->m_data + offset), data, _size);
m_offset += _offset;
@ -3453,6 +3468,7 @@ namespace bgfx { namespace webgpu
uint32_t ScratchBufferWgpu::write(void* data, uint64_t _size)
{
BX_CHECK(nullptr != m_staging, "Cannot write uniforms outside of begin()/submit() calls");
uint32_t offset = m_offset;
bx::memCopy((void*)((uint8_t*)m_staging->m_data + offset), data, _size);
m_offset += _size;
@ -3463,8 +3479,8 @@ namespace bgfx { namespace webgpu
{
m_staging->unmap();
wgpu::CommandEncoder& bce = s_renderWgpu->getBlitCommandEncoder();
bce.CopyBufferToBuffer(m_staging->m_buffer, 0, m_buffer, 0, m_size);
wgpu::CommandEncoder& bce = s_renderWgpu->getStagingEncoder();
bce.CopyBufferToBuffer(m_staging->m_buffer, 0, m_buffer, 0, m_offset);
}
void ScratchBufferWgpu::release()
@ -3754,9 +3770,14 @@ namespace bgfx { namespace webgpu
finish(true);
}
void CommandQueueWgpu::begin()
void CommandQueueWgpu::beginRender()
{
m_encoder = s_renderWgpu->m_device.CreateCommandEncoder();
m_renderEncoder = s_renderWgpu->m_device.CreateCommandEncoder();
}
void CommandQueueWgpu::beginStaging()
{
m_stagingEncoder = s_renderWgpu->m_device.CreateCommandEncoder();
}
inline void commandBufferFinishedCallback(void* _data)
@ -3774,7 +3795,7 @@ namespace bgfx { namespace webgpu
void CommandQueueWgpu::kick(bool _endFrame, bool _waitForFinish)
{
if (m_encoder)
if (m_renderEncoder)
{
if (_endFrame)
{
@ -3782,7 +3803,13 @@ namespace bgfx { namespace webgpu
//m_encoder.addCompletedHandler(commandBufferFinishedCallback, this);
}
wgpu::CommandBuffer commands = m_encoder.Finish();
if (m_stagingEncoder)
{
wgpu::CommandBuffer commands = m_stagingEncoder.Finish();
m_queue.Submit(1, &commands);
}
wgpu::CommandBuffer commands = m_renderEncoder.Finish();
m_queue.Submit(1, &commands);
if (_waitForFinish)
@ -3792,7 +3819,8 @@ namespace bgfx { namespace webgpu
#endif
}
m_encoder = NULL;
m_stagingEncoder = NULL;
m_renderEncoder = NULL;
}
}
@ -3800,7 +3828,7 @@ namespace bgfx { namespace webgpu
{
if (_finishAll)
{
uint32_t count = m_encoder
uint32_t count = m_renderEncoder
? 2
: 3
;
@ -3974,9 +4002,9 @@ namespace bgfx { namespace webgpu
m_cmd.finish(false);
if (!m_cmd.m_encoder)
if (!m_cmd.m_renderEncoder)
{
m_cmd.begin();
m_cmd.beginRender();
}
BGFX_WEBGPU_PROFILER_BEGIN_LITERAL("rendererSubmit", kColorFrame);
@ -4163,7 +4191,7 @@ namespace bgfx { namespace webgpu
if (BGFX_CLEAR_NONE != (clr.m_flags & BGFX_CLEAR_MASK)
&& !clearWithRenderPass)
&& !clearWithRenderPass)
{
clearQuad(_clearQuad, viewState.m_rect, clr, _render->m_colorPalette);
}
@ -4183,7 +4211,7 @@ namespace bgfx { namespace webgpu
BGFX_WEBGPU_PROFILER_END();
BGFX_WEBGPU_PROFILER_BEGIN(view, kColorCompute);
m_computeEncoder = m_cmd.m_encoder.BeginComputePass();
m_computeEncoder = m_cmd.m_renderEncoder.BeginComputePass();
}
else if (viewChanged)
{
@ -4193,7 +4221,7 @@ namespace bgfx { namespace webgpu
}
endEncoding();
m_computeEncoder = m_cmd.m_encoder.BeginComputePass();
m_computeEncoder = m_cmd.m_renderEncoder.BeginComputePass();
}
if (viewChanged)
@ -4540,7 +4568,7 @@ namespace bgfx { namespace webgpu
uint32_t numOffset = 0;
uint32_t offsets[2] = { 0, 0 };
if (constantsChanged
|| hasPredefined)
|| hasPredefined)
{
//viewState.setPredefined<4>(this, view, program, _render, draw, programChanged || viewChanged);
//commitShaderConstants(scratchBuffer, program, voffset, foffset);
@ -4850,10 +4878,10 @@ namespace bgfx { namespace webgpu
}
}
scratchBuffer.submit();
endEncoding();
scratchBuffer.submit();
m_cmd.kick(true);
scratchBuffer.release();

View File

@ -314,10 +314,10 @@ namespace bgfx
void release();
StagingBufferWgpu* m_staging = NULL;
wgpu::Buffer m_stagingAlloc;
wgpu::Buffer m_buffer;
uint32_t m_offset;
uint32_t m_size;
uint8_t m_stagingIndex = 0;
};
class BindStateCacheWgpu
@ -479,7 +479,8 @@ namespace bgfx
{
void init(wgpu::Queue _queue);
void shutdown();
void begin();
void beginRender();
void beginStaging();
void kick(bool _endFrame, bool _waitForFinish = false);
void finish(bool _finishAll = false);
void release(wgpu::Buffer _buffer);
@ -490,7 +491,8 @@ namespace bgfx
#endif
wgpu::Queue m_queue;
wgpu::CommandEncoder m_encoder;
wgpu::CommandEncoder m_stagingEncoder;
wgpu::CommandEncoder m_renderEncoder;
int m_releaseWriteIndex = 0;
int m_releaseReadIndex = 0;