rhi: Report an "optimal capacity" from res.update batches
Change-Id: If47eddf3fe7d365c80b0a15712ef155a6898d904 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
parent
5fcd9a3ebf
commit
230be3c4d1
@ -4732,6 +4732,24 @@ void QRhiResourceUpdateBatch::merge(QRhiResourceUpdateBatch *other)
|
||||
d->merge(other->d);
|
||||
}
|
||||
|
||||
/*!
|
||||
\return true until the number of buffer and texture operations enqueued
|
||||
onto this batch is below a reasonable limit.
|
||||
|
||||
The return value is false when the number of buffer and/or texture
|
||||
operations added to this batch have reached, or are about to reach, a
|
||||
certain limit. The batch is fully functional afterwards as well, but may
|
||||
need to allocate additional memory. Therefore, a renderer that collects
|
||||
lots of buffer and texture updates in a single batch when preparing a frame
|
||||
may want to consider \l{QRhiCommandBuffer::resourceUpdate()}{submitting the
|
||||
batch} and \l{QRhi::nextResourceUpdateBatch()}{starting a new one} when
|
||||
this function returns false.
|
||||
*/
|
||||
bool QRhiResourceUpdateBatch::hasOptimalCapacity() const
|
||||
{
|
||||
return d->hasOptimalCapacity();
|
||||
}
|
||||
|
||||
/*!
|
||||
Enqueues updating a region of a QRhiBuffer \a buf created with the type
|
||||
QRhiBuffer::Dynamic.
|
||||
@ -4997,6 +5015,12 @@ void QRhiResourceUpdateBatchPrivate::merge(QRhiResourceUpdateBatchPrivate *other
|
||||
textureOps.append(op);
|
||||
}
|
||||
|
||||
bool QRhiResourceUpdateBatchPrivate::hasOptimalCapacity() const
|
||||
{
|
||||
return bufferOps.count() < BUFFER_OPS_STATIC_ALLOC - 16
|
||||
&& textureOps.count() < TEXTURE_OPS_STATIC_ALLOC - 16;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sometimes committing resource updates is necessary without starting a
|
||||
render pass. Not often needed, updates should typically be passed to
|
||||
|
@ -1403,6 +1403,7 @@ public:
|
||||
void release();
|
||||
|
||||
void merge(QRhiResourceUpdateBatch *other);
|
||||
bool hasOptimalCapacity() const;
|
||||
|
||||
void updateDynamicBuffer(QRhiBuffer *buf, int offset, int size, const void *data);
|
||||
void uploadStaticBuffer(QRhiBuffer *buf, int offset, int size, const void *data);
|
||||
|
@ -383,8 +383,10 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
QVarLengthArray<BufferOp, 1024> bufferOps;
|
||||
QVarLengthArray<TextureOp, 256> textureOps;
|
||||
static const int BUFFER_OPS_STATIC_ALLOC = 1024;
|
||||
QVarLengthArray<BufferOp, BUFFER_OPS_STATIC_ALLOC> bufferOps;
|
||||
static const int TEXTURE_OPS_STATIC_ALLOC = 256;
|
||||
QVarLengthArray<TextureOp, TEXTURE_OPS_STATIC_ALLOC> textureOps;
|
||||
|
||||
QRhiResourceUpdateBatch *q = nullptr;
|
||||
QRhiImplementation *rhi = nullptr;
|
||||
@ -392,6 +394,7 @@ public:
|
||||
|
||||
void free();
|
||||
void merge(QRhiResourceUpdateBatchPrivate *other);
|
||||
bool hasOptimalCapacity() const;
|
||||
|
||||
static QRhiResourceUpdateBatchPrivate *get(QRhiResourceUpdateBatch *b) { return b->d; }
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user