#pragma once /* * Copyright (C) 2017 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. */ #include "common/vsoc/shm/base.h" #include "common/vsoc/shm/lock.h" // Memory layout for screen region namespace vsoc { namespace layout { namespace screen { struct TimeSpec { static constexpr size_t layout_size = 16; int64_t ts_sec; uint32_t ts_nsec; // Host and guest compilers are giving the structure different sizes without // this field. uint32_t reserved; }; ASSERT_SHM_COMPATIBLE(TimeSpec); struct CompositionStats { static constexpr size_t layout_size = 4 + 2 * 2 + 5 * TimeSpec::layout_size; uint32_t num_prepare_calls; uint16_t num_layers; uint16_t num_hwcomposited_layers; TimeSpec last_vsync; TimeSpec prepare_start; TimeSpec prepare_end; TimeSpec set_start; TimeSpec set_end; }; ASSERT_SHM_COMPATIBLE(CompositionStats); struct ScreenLayout : public RegionLayout { static constexpr size_t layout_size = 24 + CompositionStats::layout_size; static const char* region_name; // Display properties uint32_t x_res; uint32_t y_res; uint16_t dpi; uint16_t refresh_rate_hz; // Protects access to the frame offset, sequential number and stats. // See the region implementation for more details. SpinLock bcast_lock; // The frame sequential number std::atomic<uint32_t> seq_num; // The index of the buffer containing the current frame. int32_t buffer_index; CompositionStats stats; uint8_t buffer[0]; }; ASSERT_SHM_COMPATIBLE(ScreenLayout); } // namespace screen } // namespace layout } // namespace vsoc