mirror of
https://github.com/cocos/cocos-engine.git
synced 2026-10-02 13:45:57 +08:00
fix command buffer agent (#3766)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user