You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.3 KiB
118 lines
3.3 KiB
// Copyright 2019 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
#pragma once
|
|
|
|
#include "AddressSpaceService.h"
|
|
|
|
#include "base/ring_buffer.h"
|
|
#include "base/MessageChannel.h"
|
|
#include "base/FunctorThread.h"
|
|
#include "address_space_device.h"
|
|
#include "address_space_graphics_types.h"
|
|
|
|
#include <functional>
|
|
#include <vector>
|
|
|
|
namespace android {
|
|
namespace emulation {
|
|
namespace asg {
|
|
|
|
struct Allocation {
|
|
char* buffer = nullptr;
|
|
size_t blockIndex = 0;
|
|
uint64_t offsetIntoPhys = 0;
|
|
uint64_t size = 0;
|
|
bool dedicated = false;
|
|
uint64_t hostmemId = 0;
|
|
bool isView = false;
|
|
};
|
|
|
|
class AddressSpaceGraphicsContext : public AddressSpaceDeviceContext {
|
|
public:
|
|
AddressSpaceGraphicsContext(bool isVirtio = false, bool fromSnapshot = false);
|
|
~AddressSpaceGraphicsContext();
|
|
|
|
static void setConsumer(ConsumerInterface);
|
|
static void init(const address_space_device_control_ops *ops);
|
|
static void clear();
|
|
|
|
void perform(AddressSpaceDevicePingInfo *info) override;
|
|
AddressSpaceDeviceType getDeviceType() const override;
|
|
|
|
void save(base::Stream* stream) const override;
|
|
bool load(base::Stream* stream) override;
|
|
|
|
void preSave() const override;
|
|
void postSave() const override;
|
|
|
|
static void globalStatePreSave();
|
|
static void globalStateSave(base::Stream*);
|
|
static void globalStatePostSave();
|
|
|
|
static bool globalStateLoad(base::Stream*);
|
|
|
|
enum AllocType {
|
|
AllocTypeRing,
|
|
AllocTypeBuffer,
|
|
AllocTypeCombined,
|
|
};
|
|
|
|
private:
|
|
|
|
void saveRingConfig(base::Stream* stream, const struct asg_ring_config& config) const;
|
|
void saveAllocation(base::Stream* stream, const Allocation& alloc) const;
|
|
|
|
void loadRingConfig(base::Stream* stream, struct asg_ring_config& config);
|
|
|
|
void loadAllocation(base::Stream* stream, Allocation& alloc, AllocType type);
|
|
|
|
// For consumer communication
|
|
enum ConsumerCommand {
|
|
Wakeup = 0,
|
|
Sleep = 1,
|
|
Exit = 2,
|
|
PausePreSnapshot = 3,
|
|
ResumePostSnapshot = 4,
|
|
};
|
|
|
|
// For ConsumerCallbacks
|
|
int onUnavailableRead();
|
|
|
|
// Data layout
|
|
uint32_t mVersion = 1;
|
|
Allocation mRingAllocation;
|
|
Allocation mBufferAllocation;
|
|
Allocation mCombinedAllocation;
|
|
struct asg_context mHostContext = {};
|
|
|
|
// Consumer storage
|
|
ConsumerCallbacks mConsumerCallbacks;
|
|
ConsumerInterface mConsumerInterface;
|
|
void* mCurrentConsumer = 0;
|
|
|
|
// Communication with consumer
|
|
mutable base::MessageChannel<ConsumerCommand, 4> mConsumerMessages;
|
|
uint32_t mExiting = 0;
|
|
// For onUnavailableRead
|
|
uint32_t mUnavailableReadCount = 0;
|
|
|
|
bool mIsVirtio = false;
|
|
// To save the ring config if it is cleared on hostmem map
|
|
struct asg_ring_config mSavedConfig;
|
|
};
|
|
|
|
} // namespace asg
|
|
} // namespace android
|
|
} // namespace emulation
|