mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
72 lines
2.2 KiB
C++
72 lines
2.2 KiB
C++
// Copyright 2014 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "gpu/command_buffer/service/mailbox_manager_impl.h"
|
|
|
|
#include <algorithm>
|
|
|
|
#include "gpu/command_buffer/service/texture_manager.h"
|
|
|
|
namespace gpu {
|
|
namespace gles2 {
|
|
|
|
MailboxManagerImpl::MailboxManagerImpl() {
|
|
}
|
|
|
|
MailboxManagerImpl::~MailboxManagerImpl() {
|
|
DCHECK(mailbox_to_textures_.empty());
|
|
DCHECK(textures_to_mailboxes_.empty());
|
|
}
|
|
|
|
bool MailboxManagerImpl::UsesSync() {
|
|
return false;
|
|
}
|
|
|
|
Texture* MailboxManagerImpl::ConsumeTexture(const Mailbox& mailbox) {
|
|
MailboxToTextureMap::iterator it =
|
|
mailbox_to_textures_.find(mailbox);
|
|
if (it != mailbox_to_textures_.end())
|
|
return it->second->first;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void MailboxManagerImpl::ProduceTexture(const Mailbox& mailbox,
|
|
Texture* texture) {
|
|
MailboxToTextureMap::iterator it = mailbox_to_textures_.find(mailbox);
|
|
if (it != mailbox_to_textures_.end()) {
|
|
if (it->second->first == texture)
|
|
return;
|
|
TextureToMailboxMap::iterator texture_it = it->second;
|
|
mailbox_to_textures_.erase(it);
|
|
textures_to_mailboxes_.erase(texture_it);
|
|
}
|
|
InsertTexture(mailbox, texture);
|
|
}
|
|
|
|
void MailboxManagerImpl::InsertTexture(const Mailbox& mailbox,
|
|
Texture* texture) {
|
|
texture->SetMailboxManager(this);
|
|
TextureToMailboxMap::iterator texture_it =
|
|
textures_to_mailboxes_.insert(std::make_pair(texture, mailbox));
|
|
mailbox_to_textures_.insert(std::make_pair(mailbox, texture_it));
|
|
DCHECK_EQ(mailbox_to_textures_.size(), textures_to_mailboxes_.size());
|
|
}
|
|
|
|
void MailboxManagerImpl::TextureDeleted(Texture* texture) {
|
|
std::pair<TextureToMailboxMap::iterator,
|
|
TextureToMailboxMap::iterator> range =
|
|
textures_to_mailboxes_.equal_range(texture);
|
|
for (TextureToMailboxMap::iterator it = range.first;
|
|
it != range.second; ++it) {
|
|
size_t count = mailbox_to_textures_.erase(it->second);
|
|
DCHECK(count == 1);
|
|
}
|
|
textures_to_mailboxes_.erase(range.first, range.second);
|
|
DCHECK_EQ(mailbox_to_textures_.size(), textures_to_mailboxes_.size());
|
|
}
|
|
|
|
} // namespace gles2
|
|
} // namespace gpu
|