fix command buffer agent (#3766)

This commit is contained in:
Yun Hsiao Wu
2021-07-26 17:08:42 +08:00
committed by GitHub
parent 9ffe3afe41
commit d64ab8d03b
3 changed files with 37 additions and 19 deletions

View File

@@ -141,23 +141,11 @@ void BufferAgent::doDestroy() {
}
void BufferAgent::update(const void *buffer, uint size) {
update(buffer, size, DeviceAgent::getInstance()->getMessageQueue());
}
void BufferAgent::update(const void *buffer, uint size, MessageQueue *mq) {
uint8_t *actorBuffer{nullptr};
bool needToFreeActorBuffer{false};
bool needFreeing{false};
auto * mq{DeviceAgent::getInstance()->getMessageQueue()};
uint frameIndex = DeviceAgent::getInstance()->getCurrentIndex();
if (!_stagingBuffers.empty()) { // for frequent updates on big buffers
actorBuffer = _stagingBuffers[frameIndex];
} else if (size > STAGING_BUFFER_THRESHOLD) { // less frequent updates on big buffers
actorBuffer = reinterpret_cast<uint8_t *>(malloc(size));
needToFreeActorBuffer = true;
} else { // for small enough buffers
actorBuffer = mq->allocate<uint8_t>(size);
}
getActorBuffer(this, mq, size, &actorBuffer, &needFreeing);
memcpy(actorBuffer, buffer, size);
ENQUEUE_MESSAGE_4(
@@ -165,12 +153,25 @@ void BufferAgent::update(const void *buffer, uint size, MessageQueue *mq) {
actor, getActor(),
buffer, actorBuffer,
size, size,
needToFreeActorBuffer, needToFreeActorBuffer,
needFreeing, needFreeing,
{
actor->update(buffer, size);
if (needToFreeActorBuffer) free(buffer);
if (needFreeing) free(buffer);
});
}
void BufferAgent::getActorBuffer(const BufferAgent *buffer, MessageQueue *mq, uint size, uint8_t **pActorBuffer, bool *pNeedFreeing) {
uint frameIndex = DeviceAgent::getInstance()->getCurrentIndex();
if (!buffer->_stagingBuffers.empty()) { // for frequent updates on big buffers
*pActorBuffer = buffer->_stagingBuffers[frameIndex];
} else if (size > STAGING_BUFFER_THRESHOLD) { // less frequent updates on big buffers
*pActorBuffer = reinterpret_cast<uint8_t *>(malloc(size));
*pNeedFreeing = true;
} else { // for small enough buffers
*pActorBuffer = mq->allocate<uint8_t>(size);
}
}
} // namespace gfx
} // namespace cc

View File

@@ -42,7 +42,7 @@ public:
void update(const void *buffer, uint size) override;
void update(const void *buffer, uint size, MessageQueue *mq);
static void getActorBuffer(const BufferAgent *buffer, MessageQueue *mq, uint size, uint8_t **pActorBuffer, bool *pNeedFreeing);
private:
void doInit(const BufferInfo &info) override;

View File

@@ -347,7 +347,24 @@ void CommandBufferAgent::draw(const DrawInfo &info) {
void CommandBufferAgent::updateBuffer(Buffer *buff, const void *data, uint size) {
auto *bufferAgent = static_cast<BufferAgent *>(buff);
bufferAgent->update(data, size, _messageQueue);
uint8_t *actorBuffer{nullptr};
bool needFreeing{false};
BufferAgent::getActorBuffer(bufferAgent, _messageQueue, size, &actorBuffer, &needFreeing);
memcpy(actorBuffer, data, size);
ENQUEUE_MESSAGE_5(
_messageQueue, CommandBufferUpdateBuffer,
actor, getActor(),
buff, bufferAgent->getActor(),
data, actorBuffer,
size, size,
needFreeing, needFreeing,
{
actor->updateBuffer(buff, data, size);
if (needFreeing) free(data);
});
}
void CommandBufferAgent::copyBuffersToTexture(const uint8_t *const *buffers, Texture *texture, const BufferTextureCopy *regions, uint count) {