diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2020-10-09 13:34:37 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2020-10-11 10:58:37 +0200 |
commit | 2ac2809ec36af238b3755f176ef45427c1d32467 (patch) | |
tree | 1567c3bba1db68c7e249d5a345f14f42ccc45804 /src/gui/rhi/qrhimetal.mm | |
parent | cd0b5bba9a1a76e03d4b9b5105c4d16d1e1dfd1e (diff) |
rhi: Add support for full, direct buffer updates
Change-Id: I02c1f8c32c08d39cde9845d20ba8b02541d9d325
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/gui/rhi/qrhimetal.mm')
-rw-r--r-- | src/gui/rhi/qrhimetal.mm | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/gui/rhi/qrhimetal.mm b/src/gui/rhi/qrhimetal.mm index 4caaca4a3a..5bbcd50047 100644 --- a/src/gui/rhi/qrhimetal.mm +++ b/src/gui/rhi/qrhimetal.mm @@ -2254,6 +2254,32 @@ QRhiBuffer::NativeBuffer QMetalBuffer::nativeBuffer() return { { &d->buf[0] }, 1 }; } +char *QMetalBuffer::beginFullDynamicUniformBufferUpdateForCurrentFrame() +{ + // Shortcut the entire buffer update mechanism and allow the client to do + // the host writes directly to the buffer. This will lead to unexpected + // results when combined with QRhiResourceUpdateBatch-based updates for the + // buffer, but provides a fast path for uniform buffers that have all their + // content changed in every frame. + Q_ASSERT(m_type == Dynamic && m_usage.testFlag(UniformBuffer)); + QRHI_RES_RHI(QRhiMetal); + Q_ASSERT(rhiD->inFrame); + const int slot = rhiD->currentFrameSlot; + void *p = [d->buf[slot] contents]; + return static_cast<char *>(p); +} + +void QMetalBuffer::endFullDynamicUniformBufferUpdateForCurrentFrame() +{ +#ifdef Q_OS_MACOS + if (d->managed) { + QRHI_RES_RHI(QRhiMetal); + const int slot = rhiD->currentFrameSlot; + [d->buf[slot] didModifyRange: NSMakeRange(0, NSUInteger(m_size))]; + } +#endif +} + static inline MTLPixelFormat toMetalTextureFormat(QRhiTexture::Format format, QRhiTexture::Flags flags, const QRhiMetalData *d) { const bool srgb = flags.testFlag(QRhiTexture::sRGB); |